> For the complete documentation index, see [llms.txt](https://hacking-3.gitbook.io/barre/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-3.gitbook.io/barre/write-up/forense/trinity-of-secrets.md).

# Trinity Of Secrets

<figure><img src="/files/feYBi0Y9iDMXmJbUldHA" alt=""><figcaption></figcaption></figure>

{% embed url="<https://github.com/Azr43lKn1ght/DFIR-LABS/tree/main/Trinity%20Of%20Secrets>" %}

> **Description:** Somebody is leaving out riddles across Gotham. When the Dark Knight reaches back to his Bat Cave he finds a suspicious looking laptop with a note reading :
>
> > There is some unfinished business Mr.Wayne Hope your efforts are not in vain To the riddler you bowed, trapped for the secrets lying in your code.
>
> Can you help Mr. Wayne solve the riddle?

***

## 1. Identificación del Sistema (`imageinfo`)

El primer paso en cualquier análisis de memoria es identificar el perfil correcto del sistema operativo. Esto nos da una visión más clara del activo que vamos a analizar y define cómo Volatility interpretará las estructuras de memoria raw.

```bash
vol3 -f DFIRLABS.raw windows.info
```

```bash
Variable	Value

Kernel Base	0xf80680e00000
DTB	0x1aa000
Symbols	file:///opt/vol3_dir/volatility3/symbols/windows/ntkrnlmp.pdb/81BC5C377C525081645F9958F209C527-1.json.xz
Is64Bit	True
IsPAE	False
layer_name	0 WindowsIntel32e
memory_layer	1 FileLayer
KdVersionBlock	0xf80681a0f2a8
Major/Minor	15.19041
MachineType	34404
KeNumberProcessors	4
SystemTime	2024-05-22 16:22:06+00:00
NtSystemRoot	C:\\Windows
NtProductType	NtProductWinNt
NtMajorVersion	10
NtMinorVersion	0
PE MajorOperatingSystemVersion	10
PE MinorOperatingSystemVersion	0
PE Machine	34404
PE TimeDateStamp	Sun Aug 11 05:47:24 2069
```

Vemos que se trata de un Windows 10

## 2. Mapeo de Procesos

### Listado de procesos (`pslist`)

Con esto ya podemos ver qué procesos estaban abiertos en el momento exacto en el que se realizó el volcado (DUMP) de memoria.

```bash
vol3 -f DFIRLABS.raw windows.pslist
```

```bash
6176	832	SkypeBackgroun	0xcb0f5ec83180	4	-	1	False	2024-05-22 16:20:50.000000 UTC	N/A	Disabled
6204	832	SkypeApp.exe	0xcb0f5ec770c0	15	-	1	False	2024-05-22 16:20:50.000000 UTC	N/A	Disabled
7384	4676	OneDrive.exe	0xcb0f5f1e40c0	30	-	1	True	2024-05-22 16:21:02.000000 UTC	N/A	Disabled
7672	7556	Discord.exe	0xcb0f5f3810c0	61	-	1	False	2024-05-22 16:21:04.000000 UTC	N/A	Disabled
7764	7672	Discord.exe	0xcb0f5f20a080	8	-	1	False	2024-05-22 16:21:05.000000 UTC	N/A	Disabled
7872	7672	Discord.exe	0xcb0f5f114080	19	-	1	False	2024-05-22 16:21:05.000000 UTC	N/A	Disabled
7908	7672	Discord.exe	0xcb0f5f117080	15	-	1	False	2024-05-22 16:21:05.000000 UTC	N/A	Disabled
8076	7672	Discord.exe	0xcb0f5f09c080	41	-	1	False	2024-05-22 16:21:08.000000 UTC	N/A	Disabled
7580	7672	Discord.exe	0xcb0f5eda9080	9	-	1	False	2024-05-22 16:21:12.000000 UTC	N/A	Disabled
6252	4676	Code.exe	0xcb0f5f4c7080	50	-	1	False	2024-05-22 16:21:44.000000 UTC	N/A	Disabled
2972	6252	Code.exe	0xcb0f5664a340	9	-	1	False	2024-05-22 16:21:44.000000 UTC	N/A	Disabled
6868	6252	Code.exe	0xcb0f5f7ba340	18	-	1	False	2024-05-22 16:21:44.000000 UTC	N/A	Disabled
1868	6252	Code.exe	0xcb0f5e899300	18	-	1	False	2024-05-22 16:21:44.000000 UTC	N/A	Disabled
9132	6252	Code.exe	0xcb0f58f6e300	16	-	1	False	2024-05-22 16:21:44.000000 UTC	N/A	Disabled
8680	6252	Code.exe	0xcb0f55e69300	21	-	1	False	2024-05-22 16:21:46.000000 UTC	N/A	Disabled
2088	6252	Code.exe	0xcb0f5d4ba2c0	21	-	1	False	2024-05-22 16:21:46.000000 UTC	N/A	Disabled
9060	6252	Code.exe	0xcb0f5d2dd0c0	20	-	1	False	2024-05-22 16:21:46.000000 UTC	N/A	Disabled
```

## 3. Análisis de `Discord.exe` (PID 7672)

Discord es una aplicación basada en **Electron** (esencialmente un navegador web Chrome camuflado). Por lo tanto, no guarda las cosas en un solo archivo limpio, sino que reparte el texto, las imágenes y las bases de datos por toda la memoria.

### Dump del proceso

```jsx
vol3 -f DFIRLABS.raw windows.memmap --pid 7672 --dump
```

### Extracción de texto

Extraer conversaciones e interacciones (Búsqueda de texto)

Ahora atacamos el archivo `.dmp` que acabamos de sacar. Como Discord usa JSON para comunicarse con sus servidores, buscamos las etiquetas clave de esos JSON.

#### Buscar mensajes enviados/recibidos:

```jsx
strings pid.7672.dmp | grep -iE '"content":"[^"]+"'
```

No encontramos nada en cuanto a conversaciones.

#### Buscar la actividad del usuario (qué clicó, qué ventanas abrió):

```jsx
strings pid.7672.dmp | grep -iE '"category":"(electron|ui\\.click)"'
```

Haciendo un análisis de los datos extraídos deducimos que:

En un lapso de menos de 30 segundos (16:21:15 - 16:21:37.886 UTC), el usuario `alfr3dx0x` (usando el correo electrónico `frogmanfire@gmail.com`) abrió Discord, leyó un mensaje directo no leído del usuario `r1ddl3r`, se preparó para responderle e inmediatamente minimizó la aplicación para ocultarla.

#### Buscar archivos físicos en memoria (Local Storage y Caché)

Además de la memoria viva, Discord guarda cosas en el "disco duro" . Buscamos dónde están las bases de datos de texto y la caché de imágenes.

```jsx
vol3 -f DFIRLABS.raw windows.filescan | grep -iE "discord.*(leveldb|Cache_Data)"
```

```jsx
0xcb0f5f40ae80.0\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\MANIFEST-000001
0xcb0f5f413670	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\index
0xcb0f5f41bb40	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\LOCK
0xcb0f5f41cc70	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\LOG
0xcb0f5f41e890	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\000009.log
0xcb0f5f421900	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\000007.ldb
0xcb0f5f421c20	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\000005.ldb
0xcb0f5f423e80	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\000010.ldb
0xcb0f5f4241a0	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\000009.log
0xcb0f5f425780	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\000005.ldb
0xcb0f5f4260e0	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\MANIFEST-000001
0xcb0f5f4273a0	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\CURRENT
0xcb0f5f4276c0	\\Users\\User\\AppData\\Roaming\\discord\\Local Storage\\leveldb\\LOG
0xcb0f5f42f870	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\index
0xcb0f5f433880	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\index
0xcb0f5f435180	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\data_0
0xcb0f5f437d40	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\data_3
0xcb0f5f437ed0	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\data_1
0xcb0f5f438510	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\data_3
0xcb0f5f439af0	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\data_2
0xcb0f5f439c80	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\data_0
0xcb0f5f439e10	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\data_1
0xcb0f5f43a130	\\Users\\User\\AppData\\Roaming\\discord\\Cache\\Cache_Data\\data_2
```

Discord almacena todo su texto (mensajes cacheados, configuraciones del usuario, tokens de sesión) utilizando una base de datos llamada **LevelDB**. En la lista, encontramos la estructura completa de esta base de datos en la ruta `\\Local Storage\\leveldb\\`.

* **Los archivos `.ldb` (Ej: `000007.ldb`, `000010.ldb`, `000005.ldb`):** Son las tablas principales de la base de datos. Aquí están comprimidos los datos antiguos y persistentes. El hecho de que haya varios indica que la base de datos ha estado activa y consolidando información.
* **Los archivos `.log` (Ej: `000009.log`):** *Forensicamente, este es el archivo de texto más importante.* Antes de que LevelDB comprima la información en los `.ldb`, escribe todo lo que ocurre "en vivo" en este archivo de registro (Write-Ahead Log) en texto plano. Si hubo conversaciones recientes o actividad justo antes del volcado, estarán aquí.
* **Otros (`MANIFEST`, `CURRENT`, `LOCK`):** Son archivos de control que le dicen al sistema operativo qué versión de la base de datos se está usando. No suelen contener chats.

Procedemos a dumpear los archivos de texto que nos interesan:

```jsx
vol3 -f DFIRLABS.raw -o discord_texto windows.dumpfiles --virtaddr 0xcb0f5f41e890 0xcb0f5f4241a0 0xcb0f5f421900 0xcb0f5f423e80
```

En este caso no encontramos datos en el texto.

Como Discord renderiza como un navegador web, todo lo que el usuario ve (fotos de perfil, imágenes enviadas por chat, archivos adjuntos) se guarda físicamente en la caché para no tener que descargarlo dos veces. Lo has encontrado en la ruta `\\Cache\\Cache_Data\\`.

* **Los archivos `data_0`, `data_1`, `data_2`, `data_3`:** Son "contenedores" o bloques gigantes donde Discord va metiendo las imágenes y archivos uno detrás de otro.
* **El archivo `index`:** Es el "mapa" o índice que indica en qué contenedor (`data_X`) y en qué posición exacta se encuentra cada imagen.

### Archivos de Caché (Imágenes y Multimedia)

Para sacar todas las imágenes usaremos

```jsx
foremost -t png,jpg,gif -i pid.7672.dmp -o recovery_discord
```

<figure><img src="/files/X8npBgkDf6QVrE29N0bt" alt=""><figcaption></figcaption></figure>

Es **el código del Alfabeto Semáforo (Semaphore Flag Alphabet)** utilizado en el mundo marítimo. Cada posición de las banderas representa una letra o un símbolo de control.

El mensaje que dice:

```jsx
Fila 1: (alphabetic) C N N Q
```

```jsx
Fila 2: O W R (Numerical sign) Z
```

Esto es un poco rarro ya que la Z no tiene numero, asi que despues de varias pruebas si lo damos la vuelta en efcto espejo el mensaje dice: `PENNYWORTH`

```jsx
Fila 1: P E N N Y
```

```jsx
Fila 2: W O R T H
```

## 4. Análisis de `Code.exe` (PID 4676)

**¿Cuáles son los objetivos que esperamos encontrar en esta lista?**

1. **La carpeta `Backups`:** Es el Santo Grial forense de VS Code. Aquí es donde guarda los archivos temporales y los famosos "Untitled" (archivos sin guardar). Si el usuario estaba escribiendo un script y no le dio a "Guardar", estará aquí.
2. **La base de datos `Local Storage\\leveldb`:** Igual que en Discord, guarda configuraciones, pero en VS Code también guarda el estado de los *workspaces* (espacios de trabajo) y el historial de archivos recientes.
3. **La caché de `User\\History`:** Mantiene un registro de las modificaciones de los archivos locales.

```jsx
vol3 -f DFIRLABS.raw windows.filescan | grep -iE "AppData.*Roaming.*Code"
```

### **Archivos No Guardados (Backups)**

VS Code tiene una función de autoguardado para archivos temporales (los famosos "Untitled").

* `0xcb0f58c6b890 \\Users\\User\\AppData\\Roaming\\Code\\Backups\\1716390920783\\untitled\\-7f9c1a2e`*.*

### **Base de Datos Principal (LevelDB)**

Aquí se guarda el estado general del editor, las rutas recientes y la configuración global de VS Code.

* `0xcb0f58c5c4d0 \\Users\\User\\AppData\\Roaming\\Code\\Local Storage\\leveldb\\000003.log`
* `0xcb0f58c5e8c0 \\Users\\User\\AppData\\Roaming\\Code\\Local Storage\\leveldb\\LOG`
* `0xcb0f5fa882d0 \\Users\\User\\AppData\\Roaming\\Code\\Local Storage\\leveldb\\LOG`

### **Estado de los Espacios de Trabajo (Workspaces)**

Estos archivos SQLite (`.vscdb`) guardan información sobre los proyectos que el usuario tenía abiertos.

* `0xcb0f58c54af0 \\Users\\User\\AppData\\Roaming\\Code\\User\\workspaceStorage\\1716390920783\\state.vscdb`
* `0xcb0f5fa923c0 \\Users\\User\\AppData\\Roaming\\Code\\User\\workspaceStorage\\1716390920783\\state.vscdb`

### **Logs de Actividad**

VS Code registra muchísima información sobre lo que hace el usuario (qué ventanas abre, errores de red, etc.).

* `0xcb0f58c53380 \\Users\\User\\AppData\\Roaming\\Code\\logs\\20240522T215144\\window1\\renderer.log`
* `0xcb0f58c79b20 \\Users\\User\\AppData\\Roaming\\Code\\logs\\20240522T215144\\terminal.log` (Si usó la terminal de VS Code, estará aquí).

### Extracción del archivo "Untitled”

```jsx
vol3 -f DFIRLABS.raw -o dump/code windows.dumpfiles --virtaddr 0xcb0f58c6b890  
```

```jsx
file file.0xcb0f58c6b890.0xcb0f58945af0.DataSectionObject.-7f9c1a2e.dat
```

```jsx
file.0xcb0f58c6b890.0xcb0f58945af0.DataSectionObject.-7f9c1a2e.dat: ASCII text, with very long lines (2695), with CRLF, LF line terminators
```

Parece que podemos ver el código con un simple `cat`:

```python
untitled:Untitled-1 {"typeId":""}
untitled:Untitled-2 {"typeId":""}
Function Decrypt(message, password)
    Dim key
    Dim i
    Dim encrypted_message
    Dim char

    key = Hash(password)

    For i = 1 To 10
        encrypted_message = ""
        For j = 1 To Len(message)
            char = Mid(message, j, 1)
            encrypted_message = encrypted_message & Chr(Asc(char) Xor Asc(Mid(key, (i - 1) Mod Len(key) + 1, 1)))
        Next
        message = encrypted_message
    Next

    Encrypt = encrypted_message
End Function

Function Hash(text)
    Dim sha256
    Dim bytes
    Dim i

    Set sha256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    bytes = sha256.ComputeHash_2((StrConv(text, vbFromUnicode)))

    Hash = ""
    For i = 1 To LenB(bytes)
        Hash = Hash & Right("0" & Hex(AscB(MidB(bytes, i, 1))), 2)
    Next
End Function

Dim password, ciphertext, decrypted
password = " "
ciphertext = " "
decrypted = Decrypt(ciphertext, password)
WScript.Echo "Decrypted:", decrypted

"""
Deep within the gamer's lore 
Is a secret waiting to be unlocked

Find the file that holds the cached key
Maybe what you are looking for is data_3
It might hold the images that you seek

Conversations notified but left unseen.
And within the quiet pings, where alerts softly chime,
Another piece awaits, revealing the r1ddl3r's crime. 
"""   
```

Parece que el código que hemos encontrado nos pide 2 valores:

`password`, que por lo que dice en el texto de abajo parece que es la que hemos sacado de `Discord`

`ciphertext`, para este parece que la pista es:

> *"Conversations notified but left unseen.*
>
> *And within the quiet pings, where alerts softly chime,*
>
> *Another piece awaits, revealing the r1ddl3r's crime."*

Sabiendo que estamos analizando un volcado de memoria de Windows 10, ¿hacia qué componente del sistema operativo o tipo de artefacto crees que debemos apuntar nuestra búsqueda ahora para encontrar esas "notificaciones" o "alertas"?

El componente de Windows 10 al que debemos apuntar es **el sistema de notificaciones de Windows (Windows Push Notification Service - WNS) o el Action Center.**

Cuando Discord (o cualquier app) lanza un mensaje nuevo y el usuario no tiene la ventana abierta o activa (como vimos que Alfred la minimizó), Windows muestra un *Toast* (notificación emergente) y actualiza un *Tile* (mosaico) o un contador (badge). Incluso si la notificación no se clica ("left unseen"), el texto de esa notificación **se guarda en la memoria RAM y en una base de datos local** (`wpndatabase.db`).

Para encontrar esto podemos buscar directamente en el volcado:

```bash
strings DFIRLABS.raw | grep -iE "<toast>" -A 5
```

Y la notificación exacta directamente de la base de datos temporal de Windows (`wpndatabase.db` / `NotificationHandler`), tal y como indicaba el poema ("Conversations notified but left unseen") es:

```xml
<toast><visual><binding template="ToastImageAndText02"><image id="1" src="C:\\Users\\User\\AppData\\Local\\Temp\\scoped_dir7336_1005206194\\0cf7ef46d8cca4a9ddffebd58a0877e2.png"/><text id="1">r1ddl3r</text><text id="2">Y2lwaGVydGV4dCA9ICI6MD07J1x4MTFoLyhvLlx4MGJoJTJvXHgwM1x4MGI0M1x4MTUvXHgwODQ5XHgwOC4pb1x4MTFoLyhvLjFtMjhceDAzXHgwZW04ODBvXHgxMW9ceDA4NGgoISIK</text></binding></visual><audio silent="true"/></toast>n#<https://discord.com#1242874610479796254Notifications>
```

que es un mensaje de discord enviado por `r1ddl3r` con el contenido:

```xml
Y2lwaGVydGV4dCA9ICI6MD07J1x4MTFoLyhvLlx4MGJoJTJvXHgwM1x4MGI0M1x4MTUvXHgwODQ5XHgwOC4pb1x4MTFoLyhvLjFtMjhceDAzXHgwZW04ODBvXHgxMW9ceDA4NGgoISIK
```

Que si lo traducimos de base 64:

```bash
ciphertext = ":0=;'\\x11h/(o.\\x0bh%2o\\x03\\x0b43\\x15/\\x0849\\x08.)o\\x11h/(o.1m28\\x03\\x0em880o\\x11o\\x084h(!"
```

Con todo esto ya podemos probar el código que hemos encontrado y ver el resultado:

## 5. Desencriptación

### Explicación del código

1. Genera una clave: Calcula el hash SHA256 de la `password`
2. **XOR Multi-pasada**: El bucle exterior realiza 10 iteraciones. En cada iteración, toma un carácter de la cadena hexadecimal del hash y lo aplica mediante una operación XOR a todo el mensaje.
3. **Resultado**: Debido a que el XOR es reversible, aplicar el mismo proceso al `ciphertext` con la `password` correcta te devolverá el texto original.

Sabiendo como hace el script para encriptar hacemos uno que desencripte

```python
import hashlib

password = "PENNYWORTH"
ciphertext = ":0=;'\\x11h/(o.\\x0bh%2o\\x03\\x0b43\\x15/\\x0849\\x08.)o\\x11h/(o.1m28\\x03\\x0em880o\\x11o\\x084h(!"

# función Hash (SHA-256 en Hexadecimal Mayúscula)
hash_obj = hashlib.sha256(password.encode('latin-1'))
key = hash_obj.hexdigest().upper()

# función Decrypt (Bucle de 10 rondas con XOR)
message = list(ciphertext)

for i in range(1, 11):
    # Selecciona el caracter de la key igual que en VBScript: Mid(key, (i - 1) Mod Len(key) + 1, 1)
    key_char = key[(i - 1) % len(key)]
    
    # XOR a cada caracter del mensaje
    for j in range(len(message)):
        message[j] = chr(ord(message[j]) ^ ord(key_char))

# Juntamos los caracteres para revelar el secreto
flag = "".join(message)

print("--------------------------------------------------")
print(flag)
print("--------------------------------------------------\\n")
```

```bash
--------------------------------------------------
FLAG[mSTRwYNwHOiStHEtRUmSTRMNDrDDLmtHT]
--------------------------------------------------
```
