Post

Management Wants a Word

Análisis forense de un triage KAPE de Windows: extracción de credenciales de Chrome mediante DPAPI, descifrado de contenedores VeraCrypt y recuperación de evidencia oculta.

Management Wants a Word

📌 Ficha Técnica

  • Plataforma: TryHackMe
  • Evento/Sala: Hacker Holidays — Management Wants a Word
  • Dificultad: Hard
  • Categoría: Forensics / Windows / Cryptography
  • Técnicas Clave: DPAPI Master Key decryption, Chrome credential extraction (AES-256-GCM), VeraCrypt container mounting, Windows Registry forensics (SAM/SYSTEM/SECURITY), KAPE triage analysis

Introducción

Este reto nos presenta un escenario de housekeeping forense: el equipo de limpieza encontró una laptop olvidada en la habitación 214, registrada a nombre de Vera. El departamento de IT realizó un triage completo con KAPE antes de limpiar el equipo. Nuestra misión es reconstruir la cadena de evidencia a partir de los artefactos dispersos en la imagen forense.

La narrativa del reto insinúa que Vera no era solo una huésped común, sino alguien con secretos bien guardados. La clave está en entender cómo Windows protege los secretos de Chrome mediante DPAPI y cómo un contenedor VeraCrypt puede ocultar la evidencia definitiva.

El hint de la comunidad mencionaba la versión 1.26.29. Ese número no era un PIM, sino la versión exacta de VeraCrypt utilizada para crear el contenedor.


Reconocimiento Inicial

Tras descomprimir el archivo descargado, obtenemos un árbol de directorios generado por KAPE con los artefactos típicos de un sistema Windows:

1
tree -a management-wants-a-word-forensics-hh-day-14/

Los artefactos más relevantes identificados fueron:

ArtefactoRutaPropósito
SYSTEM / SAM / SECURITYWindows/System32/config/Hives del registro para extraer DPAPI_SYSTEM
NTUSER.DATUsers/vera/Actividad del usuario Vera
Login DataUsers/vera/.../Chrome/.../Default/Base de datos SQLite con credenciales de Chrome
Local StateUsers/vera/.../Chrome/.../Clave AES de Chrome encriptada con DPAPI
Master Keys DPAPIRoaming/Microsoft/Protect/<SID>/Claves maestras para descifrar blobs DPAPI
backupUsers/vera/Documents/Archivo de 100 MiB, sospechoso de ser contenedor
1
2
ls -la management-wants-a-word-forensics-hh-day-14/KAPE/C/Users/vera/Documents/backup
# Resultado: 104857600 bytes (exactamente 100 MiB)

Un tamaño redondo como 100 MiB es un indicador clásico de un contenedor cifrado (VeraCrypt, TrueCrypt, etc.).


Extracción de la DPAPI_SYSTEM Key

El Data Protection API (DPAPI) de Windows protege secretos a nivel de usuario y máquina. Para descifrar los secretos de Vera offline, necesitamos la DPAPI_SYSTEM key, almacenada en el hive SYSTEM.

Utilizamos Impacket para extraerla:

1
secretsdump.py   -system management-wants-a-word-forensics-hh-day-14/KAPE/C/Windows/System32/config/SYSTEM   -security management-wants-a-word-forensics-hh-day-14/KAPE/C/Windows/System32/config/SECURITY   LOCAL

La salida reveló dos piezas críticas:

1
2
3
4
5
6
[*] DefaultPassword
(Unknown User):minivera

[*] DPAPI_SYSTEM
dpapi_machinekey:0x875427f6426f5dc4e318d1e6cfed17291295e4f7
dpapi_userkey:0xb0536fa518944b2520b5a5b9f5b513e3892224a1
  • minivera: Contraseña del usuario Vera.
  • dpapi_machinekey / dpapi_userkey: Claves necesarias para descifrar las Master Keys DPAPI.

Descifrado de la Master Key DPAPI

Cada usuario tiene un directorio de Master Keys bajo Protect/<SID>/. Identificamos el SID y el GUID de la master key de Vera:

1
find management-wants-a-word-forensics-hh-day-14/KAPE/C/Users/vera/AppData/Roaming/Microsoft/Protect   -type f -printf '%f\n'
  • SID: S-1-5-21-2529683458-431225740-1723070931-1000
  • Master Key GUID: c90719ef-5b98-474e-b934-136d606a702a

Desciframos la master key utilizando la contraseña del usuario:

1
dpapi.py masterkey   -file 'management-wants-a-word-forensics-hh-day-14/KAPE/C/Users/vera/AppData/Roaming/Microsoft/Protect/S-1-5-21-2529683458-431225740-1723070931-1000/c90719ef-5b98-474e-b934-136d606a702a'   -sid 'S-1-5-21-2529683458-431225740-1723070931-1000'   -password 'minivera'

Resultado:

1
2
Decrypted key with User Key (SHA1)
Decrypted key: 0x5e5715ec9b6df5a86e97902692a66d28e691f05d5bc1e04d0159cfe960e94c978c07e5004a0179d3a96df2468885a28175b0b02cc064445f116a752d2b3e9d40

Guardamos esta clave, ya que es el pilar para descifrar todo lo protegido por DPAPI en el perfil de Vera.


Extracción y Descifrado de la Clave AES de Chrome

Chrome almacena una clave AES de 32 bytes en el archivo Local State, protegida por un blob DPAPI. El blob está codificado en Base64 y prefijado con los bytes literales DPAPI.

Paso 1: Extraer el blob DPAPI

1
jq -r '.os_crypt.encrypted_key'   "management-wants-a-word-forensics-hh-day-14/KAPE/C/Users/vera/AppData/Local/Google/Chrome For Testing/User Data/Local State" |   base64 -d |   tail -c +6 > /tmp/chrome_blob.bin

Paso 2: Descifrar con la Master Key

1
2
3
4
5
6
7
8
9
10
11
12
from impacket.dpapi import DPAPI_BLOB

with open("/tmp/chrome_blob.bin", "rb") as f:
    blob = DPAPI_BLOB(f.read())

masterkey = bytes.fromhex(
    "5e5715ec9b6df5a86e97902692a66d28e691f05d5bc1e04d0159cfe960e94c978c07e5004a0179d3a96df2468885a28175b0b02cc064445f116a752d2b3e9d40"
)

decrypted = blob.decrypt(masterkey)
print(f"Chrome AES Key: {decrypted.hex()}")
# Resultado: 206a39a0971327ea9487e4aea9844f5d3670162456982276939a712646da0b02

Chrome v80+ utiliza el prefijo v10 o v11 en las contraseñas encriptadas, seguido de un nonce de 12 bytes y el ciphertext con tag de autenticación GCM.


Descifrado de Credenciales Guardadas en Chrome

Con la clave AES de 32 bytes, procedemos a descifrar la base de datos Login Data de Chrome. Las contraseñas se almacenan con el formato:

1
[v10/v11][nonce:12 bytes][ciphertext][tag:16 bytes]

Utilizamos AES-256-GCM para descifrar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sqlite3
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

DB_PATH = "management-wants-a-word-forensics-hh-day-14/KAPE/C/Users/vera/AppData/Local/Google/Chrome For Testing/User Data/Default/Login Data"
KEY = bytes.fromhex("206a39a0971327ea9487e4aea9844f5d3670162456982276939a712646da0b02")

db = sqlite3.connect(DB_PATH)

for url, username, encrypted in db.execute("""
    SELECT origin_url, username_value, password_value FROM logins
"""):
    blob = bytes(encrypted)
    if not blob.startswith((b"v10", b"v11")):
        continue

    nonce = blob[3:15]
    ciphertext_and_tag = blob[15:]

    password = AESGCM(KEY).decrypt(nonce, ciphertext_and_tag, None).decode("utf-8")
    print(f"URL:      {url}")
    print(f"Username: {username}")
    print(f"Password: {password}")

Resultado:

1
2
3
URL:      http://bytelotus.thm:8080/
Username: VeraSecretVault
Password: Wh4t1sV3raD0inG0nTh1sH0st

La contraseña Wh4t1sV3raD0inG0nTh1sH0st es la llave que abre el contenedor final. El historial de Chrome confirmaba que Vera visitaba un portal llamado “SecureVault” en bytelotus.thm:8080.


Montaje del Contenedor VeraCrypt

El archivo backup (100 MiB) no tenía firma de ZIP ni 7z. Dado el nombre del personaje (Vera) y el hint de versión 1.26.29, identificamos un contenedor VeraCrypt.

En Linux, podemos usar el binario de consola de VeraCrypt. Primero lo descargamos y extraemos:

1
2
3
4
5
cd /tmp
wget "https://launchpad.net/veracrypt/trunk/1.26.29/+download/veracrypt-1.26.29-setup.tar.bz2"
tar -xjf veracrypt-1.26.29-setup.tar.bz2
# Seleccionar opción 2 para extraer sin instalar
tar -xzf veracrypt_1.26.29_console_amd64.tar.gz

Creamos el punto de montaje y montamos el volumen:

1
2
3
sudo mkdir -p /mnt/vera

sudo /tmp/usr/bin/veracrypt -t   ~/tryhackme/hackerHoliday/managementWantsAWord/management-wants-a-word-forensics-hh-day-14/KAPE/C/Users/vera/Documents/backup   /mnt/vera

Parámetros interactivos:

  • Password: Wh4t1sV3raD0inG0nTh1sH0st
  • PIM: (Enter para usar el valor por defecto)
  • Keyfile: (Enter para ninguno)
  • Protect hidden volume: n

Aunque Linux tiene cryptsetup con soporte para tcrypt, en este caso el binario oficial de VeraCrypt fue necesario porque la versión de cryptsetup disponible no reconoció la cabecera del contenedor con los parámetros estándar.


Recuperación de la Evidencia Final

Una vez montado, exploramos el contenido del volumen:

1
tree /mnt/vera

Estructura encontrada:

1
2
3
4
5
6
/mnt/vera/
├── $RECYCLE.BIN/
├── secret_financial_documents/
│   ├── important_invoice_byte_lotus.pdf
│   └── transactions_q3.csv
└── System Volume Information/

La evidencia definitiva estaba en el PDF. Al extraer las cadenas de texto del documento, encontramos la flag:

1
strings /mnt/vera/secret_financial_documents/important_invoice_byte_lotus.pdf | grep "THM{"

Flag:

1
THM{1t_w4s_V3r4_A11_Al0ng?!}

Limpieza y Cierre

Tras recuperar la flag, es buena práctica desmontar el volumen y eliminar artefactos temporales:

1
2
3
sudo umount /mnt/vera
sudo /tmp/usr/bin/veracrypt -t -d
rm -rf /tmp/usr /tmp/veracrypt* /tmp/chrome_blob.bin

Conclusión / Retroalimentación

Management Wants a Word es un reto forense excepcionalmente bien diseñado que simula una cadena de evidencia realista. La dificultad radica no en la complejidad individual de cada paso, sino en ensamblar correctamente la cadena de descifrado:

  1. Registry Hives → DPAPI_SYSTEM
  2. DPAPI_SYSTEM + Password → Master Key
  3. Master Key → Chrome AES Key
  4. Chrome AES Key → Vault Password
  5. Vault Password → VeraCrypt Container → Flag

Aprendizajes clave

  • DPAPI es el mecanismo central de protección de secretos en Windows. Comprender cómo se encadenan las claves (System → User → Master → Application) es fundamental para forense en Windows.
  • Chrome no almacena contraseñas en texto plano; requiere descifrar primero la clave del perfil (Local State) antes de poder atacar Login Data.
  • VeraCrypt deja muy pocas huellas forenses. Sin el historial de navegación y la contraseña extraída, identificar el contenedor como tal sería extremadamente difícil.
  • El hint de la versión 1.26.29 fue crucial. En retos de CTF, los números de versión no son decorativos; apuntan a herramientas, exploits o formatos específicos.

Feedback de la sala

La narrativa del reto (la concierge Vera, los tickets de quejas, el “business model”) añade una capa de inmersión que eleva la experiencia más allá de un simple ejercicio técnico. La progresión de pistas es justa: cada artefacto descubierto naturalmente conduce al siguiente. Altamente recomendado para practicar análisis de triage KAPE y criptografía aplicada a forense.


¡Gracias por leer! Si tienes dudas o encontraste otra forma de resolverlo, déjala en los comentarios.

This post is licensed under CC BY 4.0 by the author.