> 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/never-too-late-mister.md).

# Never Too Late Mister

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

{% embed url="<https://github.com/stuxnet999/MemLabs/tree/master/Lab%200>" %}

> **Challenge Description:** My friend John is an "environmental" activist and a humanitarian. He hated the ideology of Thanos from the Avengers: Infinity War. He sucks at programming. He used too many variables while writing any program. One day, John gave me a memory dump and asked me to find out what he was doing while he took the dump. Can you figure it out for me?

***

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

El comando `imageinfo` es fundamental y siempre el primer paso en el análisis de memoria. Escanea el volcado (`Challenge.raw`) buscando estructuras de datos específicas del kernel (como el bloque KDBG en Windows) para identificar el sistema operativo exacto.

```bash
vol2 -f Challenge.raw imageinfo
```

```bash
          Suggested Profile(s) : Win7SP1x86_23418, Win7SP0x86, Win7SP1x86_24000, Win7SP1x86
                     AS Layer1 : IA32PagedMemoryPae (Kernel AS)
                     AS Layer2 : FileAddressSpace (/home/barre/Labs/forense/NeverTooLateMister/Challenge.raw)
                      PAE type : PAE
                           DTB : 0x185000L
                          KDBG : 0x8273cb78L
          Number of Processors : 1
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0x80b96000L
             KUSER_SHARED_DATA : 0xffdf0000L
           Image date and time : 2018-10-23 08:30:51 UTC+0000
     Image local date and time : 2018-10-23 14:00:51 +0530

```

En este caso, Volatility sugiere usar el perfil `Win7SP1x86_23418`. Sin este perfil, Volatility no sabría cómo interpretar los bloques de memoria cruda en los pasos siguientes.

## 2. Mapeo de procesos (`pslist`)

El comando `pslist` recorre la lista de procesos activos en memoria (la estructura `EPROCESS` de Windows). Esto nos permite ver qué estaba corriendo la máquina en el momento de la captura.

```bash
vol2 -f Challenge.raw --profile=Win7SP1x86_23418 pslist
```

```bash
Offset(V)  Name                    PID   PPID   Thds     Hnds   Sess  Wow64 Start                          Exit                          
---------- -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------------
0x83d09c58 System                    4      0     85      483 ------      0 2018-10-23 08:29:16 UTC+0000                                 
0x8437db18 smss.exe                260      4      2       29 ------      0 2018-10-23 08:29:16 UTC+0000                                 
0x84d69030 csrss.exe               340    332      8      347      0      0 2018-10-23 08:29:21 UTC+0000                                 
0x84d8d030 csrss.exe               380    372      9      188      1      0 2018-10-23 08:29:23 UTC+0000                                 
0x84d93c68 wininit.exe             388    332      3       79      0      0 2018-10-23 08:29:23 UTC+0000                                 
0x84dcbd20 winlogon.exe            424    372      6      117      1      0 2018-10-23 08:29:23 UTC+0000                                 
0x84debd20 services.exe            484    388     10      191      0      0 2018-10-23 08:29:25 UTC+0000                                 
0x84def3d8 lsass.exe               492    388      7      480      0      0 2018-10-23 08:29:25 UTC+0000                                 
0x84df2378 lsm.exe                 500    388     10      146      0      0 2018-10-23 08:29:25 UTC+0000                                 
0x84e23030 svchost.exe             592    484     12      358      0      0 2018-10-23 08:29:30 UTC+0000                                 
0x84e41708 VBoxService.ex          652    484     12      116      0      0 2018-10-23 08:29:31 UTC+0000                                 
0x84e54030 svchost.exe             716    484      9      243      0      0 2018-10-23 08:29:32 UTC+0000                                 
0x84e7ad20 svchost.exe             804    484     19      378      0      0 2018-10-23 08:29:32 UTC+0000                                 
0x84e84898 svchost.exe             848    484     20      400      0      0 2018-10-23 08:29:33 UTC+0000                                 
0x84e89c68 svchost.exe             872    484     19      342      0      0 2018-10-23 08:29:33 UTC+0000                                 
0x84e8c648 svchost.exe             896    484     30      809      0      0 2018-10-23 08:29:33 UTC+0000                                 
0x84ea7d20 audiodg.exe             988    804      6      127      0      0 2018-10-23 08:29:35 UTC+0000                                 
0x84f033c8 svchost.exe            1192    484     15      365      0      0 2018-10-23 08:29:40 UTC+0000                                 
0x84f323f8 spoolsv.exe            1336    484     16      295      0      0 2018-10-23 08:29:43 UTC+0000                                 
0x84f4dca0 svchost.exe            1364    484     19      307      0      0 2018-10-23 08:29:43 UTC+0000                                 
0x84f7d578 svchost.exe            1460    484     11      148      0      0 2018-10-23 08:29:44 UTC+0000                                 
0x84f828f8 svchost.exe            1488    484      8      170      0      0 2018-10-23 08:29:44 UTC+0000                                 
0x850b2538 taskhost.exe            308    484      8      151      1      0 2018-10-23 08:29:55 UTC+0000                                 
0x850d0030 sppsvc.exe             1164    484      6      154      0      0 2018-10-23 08:29:57 UTC+0000                                 
0x85109030 dwm.exe                1992    848      5      132      1      0 2018-10-23 08:30:04 UTC+0000                                 
0x85097870 explorer.exe            324   1876     33      827      1      0 2018-10-23 08:30:04 UTC+0000                                 
0x85135af8 VBoxTray.exe           1000    324     14      159      1      0 2018-10-23 08:30:08 UTC+0000                                 
0x85164030 SearchIndexer.         2032    484     14      614      0      0 2018-10-23 08:30:14 UTC+0000                                 
0x8515ad20 SearchProtocol          284   2032      7      235      0      0 2018-10-23 08:30:16 UTC+0000                                 
0x8515cd20 SearchFilterHo         1292   2032      5       80      0      0 2018-10-23 08:30:17 UTC+0000                                 
0x851a6610 cmd.exe                2096    324      1       22      1      0 2018-10-23 08:30:18 UTC+0000                                 
0x851a5cd8 conhost.exe            2104    380      2       52      1      0 2018-10-23 08:30:18 UTC+0000                                 
0x845a8d20 DumpIt.exe             2412    324      2       38      1      0 2018-10-23 08:30:48 UTC+0000                                 
0x84d83d20 conhost.exe            2424    380      2       51      1      0 2018-10-23 08:30:48 UTC+0000  
```

Destacan `cmd.exe` y `conhost.exe`, indicando que el usuario tenía una consola abierta.

También vemos `DumpIt.exe`, que es la herramienta legítima utilizada para generar el propio archivo `.raw` de memoria, por lo que no la tendremos en cuenta para el analisis.

## 3. Análisis de comandos

### Buffer de consola (`consoles`)

El plugin `consoles` es extremadamente potente. No solo busca los comandos tecleados, sino que reconstruye el *buffer* de pantalla de la consola (lo que el usuario vio en su monitor).

```bash
vol2 -f Challenge.raw --profile=Win7SP1x86_23418 consoles
```

```bash
ConsoleProcess: conhost.exe Pid: 2104
Console: 0xe981c0 CommandHistorySize: 50
HistoryBufferCount: 2 HistoryBufferMax: 4
OriginalTitle: %SystemRoot%\\system32\\cmd.exe
Title: C:\\Windows\\system32\\cmd.exe
AttachedProcess: cmd.exe Pid: 2096 Handle: 0x5c
----
CommandHistory: 0x300690 Application: python.exe Flags:
CommandCount: 0 LastAdded: -1 LastDisplayed: -1
FirstCommand: 0 CommandCountMax: 50
ProcessHandle: 0x0
----
CommandHistory: 0x300498 Application: cmd.exe Flags: Allocated, Reset
CommandCount: 1 LastAdded: 0 LastDisplayed: 0
FirstCommand: 0 CommandCountMax: 50
ProcessHandle: 0x5c
Cmd #0 at 0x2f43c0: C:\\Python27\\python.exe C:\\Users\\hello\\Desktop\\demon.py.txt
----
Screen 0x2e6368 X:80 Y:300
Dump:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\\Users\\hello>C:\\Python27\\python.exe C:\\Users\\hello\\Desktop\\demon.py.txt
335d366f5d6031767631707f
```

Aquí descubrimos la ejecución de un script en Python (`demon.py.txt`) y su salida directa: una cadena hexadecimal `335d366f5d6031767631707f`.

### Historial de comandos (`cmdscan`)

A diferencia de `consoles`, `cmdscan` extrae el historial de comandos directamente de la estructura `COMMAND_HISTORY` que Windows mantiene en memoria.

```bash
vol2 -f Challenge.raw --profile=Win7SP1x86_23418 cmdscan
```

```bash
CommandProcess: conhost.exe Pid: 2104
CommandHistory: 0x300498 Application: cmd.exe Flags: Allocated, Reset
CommandCount: 1 LastAdded: 0 LastDisplayed: 0
FirstCommand: 0 CommandCountMax: 50
ProcessHandle: 0x5c
Cmd #0 @ 0x2f43c0: C:\\Python27\\python.exe C:\\Users\\hello\\Desktop\\demon.py.txt
Cmd #12 @ 0x2d0039: ???
Cmd #19 @ 0x300030: ???
Cmd #22 @ 0xff818488: ?
Cmd #25 @ 0xff818488: ?
Cmd #36 @ 0x2d00c4: /?0?-???-
Cmd #37 @ 0x2fd058: 0?-????
```

Confirma que el usuario ejecutó explícitamente el script de Python.

## 4. Archivos en Memoria

### Busqueda de archivos (`filescan`)

`filescan` busca en la memoria objetos de tipo archivo (`FILE_OBJECT`). Como sabemos el nombre del archivo sospechoso (`demon.py.txt`), filtramos por él para encontrar su dirección física (Offset) en la RAM, que resulta ser `0x000000003d4d1dc8`.

```bash
vol2 -f Challenge.raw --profile=Win7SP1x86_23418 filescan | grep "demon.py.txt"
```

```bash
0x000000003d4d1dc8      1      0 R--rw- \\Device\\HarddiskVolume2\\Users\\hello\\Desktop\\demon.py.txt
```

### Volcado del archivo (`dumpfiles`)

Con el Offset obtenido en el paso anterior, usamos `dumpfiles` para extraer el archivo de la memoria RAM y guardarlo en nuestro disco duro local para poder analizarlo de manera estática.

```bash
vol2 -f Challenge.raw --profile=Win7SP1x86_23418 dumpfiles -Q 0x000000003d4d1dc8 -D ./dump/
```

```bash
file.None.0x84dde548.dat
```

Este archivo esta vacío por lo que no nos sirve.

## 5. Búsqueda de Código Inyectado (`malfind`)

`mftparser` escanea la memoria en busca de entradas de la Tabla Maestra de Archivos (MFT) del sistema NTFS. Debido a que el archivo `demon.py.txt` es muy pequeño, Windows lo guarda como "datos residentes", es decir, mete el contenido del archivo directamente dentro del registro de la MFT (en el atributo `$DATA`), en lugar de apuntar a un sector del disco. Gracias a esto, podemos ver el código fuente en la columna de la derecha.

```bash
vol2 -f Challenge.raw --profile=Win7SP1x86_23418 mftparser | grep -A 30 "demon.py.txt"
```

```bash
2018-10-19 09:37:37 UTC+0000 2018-10-19 09:42:24 UTC+0000   2018-10-19 09:42:24 UTC+0000   2018-10-19 09:37:37 UTC+0000   Users\\hello\\Desktop\\demon.py.txt

$FILE_NAME
Creation                       Modified                       MFT Altered                    Access Date                    Name/Path
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------
2018-10-19 09:37:37 UTC+0000 2018-10-19 09:42:24 UTC+0000   2018-10-19 09:42:24 UTC+0000   2018-10-19 09:37:37 UTC+0000   Users\\hello\\Desktop\\DEMONP~1.TXT

$OBJECT_ID
Object ID: 4a7c2bee-7dd3-e811-aa46-080027b4bf34
Birth Volume ID: 80000000-7800-0000-0000-180000000100
Birth Object ID: 5f000000-1800-0000-6120-3d2022315f34
Birth Domain ID: 6d5f6233-7474-3372-7d22-0d0a0d0a6220

$DATA
0000000000: 61 20 3d 20 22 31 5f 34 6d 5f 62 33 74 74 33 72   a.=."1_4m_b3tt3r
0000000010: 7d 22 0d 0a 0d 0a 62 20 3d 20 22 22 0d 0a 0d 0a   }"....b.=.""....
0000000020: 66 6f 72 20 69 20 69 6e 20 61 3a 0d 0a 20 20 20   for.i.in.a:.....
0000000030: 20 62 20 3d 20 62 20 2b 20 63 68 72 28 6f 72 64   .b.=.b.+.chr(ord
0000000040: 28 69 29 5e 32 29 0d 0a 0d 0a 70 72 69 6e 74 20   (i)^2)....print.
0000000050: 62 2e 65 6e 63 6f 64 65 28 22 68 65 78 22 29      b.encode("hex")

***************************************************************************
***************************************************************************
MFT entry found at offset 0x7cc3000
Attribute: In Use & File
Record Number: 17200
Link count: 2
```

Vemos el script

```python
a = "1_4m_b3tt3r}"
b = ""
for i in a:
    b = b + chr(ord(i)^2)
print b.encode("hex")
```

> flag0.2 = 1\_4m\_b3tt3r}

El script toma la cadena `1_4m_b3tt3r}` (que es parte de la flag) y realiza una operación lógica XOR (`^`) con el valor `2` para cada carácter. Finalmente, codifica el resultado en hexadecimal. Esto explica por qué en el paso del comando `consoles` veíamos que el output generaba `335d366f5d6031767631707f`. Afortunadamente, tenemos la variable `a` en texto claro dentro del código.

## 6. Extracción de Hashes de Contraseñas (`hashdump`)

El comando `hashdump` busca en la memoria las colmenas del registro de Windows (SAM y SYSTEM) y extrae los hashes de las contraseñas de los usuarios locales. .

```bash
vol2 -f Challenge.raw --profile=Win7SP1x86_23418 hashdump
```

```bash
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
hello:1000:aad3b435b51404eeaad3b435b51404ee:101da33f44e92c27835e64322d72e8b7:::
```

El hash NTLM del usuario activo (`hello`) es `101da33f44e92c27835e64322d72e8b7`. Al crackearlo por fuerza bruta o mediante tablas rainbow, se descubre que la contraseña real en texto plano es la primera parte de la flag

```bash
flag0.1=flag{you_are_good_but
```

## 7. Reconstrucción de la Flag Final

Concatenando la contraseña crackeada del usuario con la variable extraída del código se reconstruye y se completa la flag del desafío.

```bash
flag{you_are_good_but 1_4m_b3tt3r}
```
