Oracle injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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/.
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.
Aby znaleźć jakiekolwiek pakiety i funkcje, które wspierają specyfikację hosta i portu, przeprowadziłem wyszukiwanie w Google na Dokumentacji Online Oracle Database. Konkretne,
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
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
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.
A ORA-29276: transfer timeout
pokazuje, że port jest otwarty, ale nie nawiązano połączenia SMTP, podczas gdy ORA-29278: SMTP transient error: 421 Service not available
pokazuje, ż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.
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.
Możesz dodatkowo użyć tego do przeprowadzenia podstawowego skanowania portów za pomocą zapytań takich jak
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;
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)