Forensic CTF Writeup: Baud, James Baud (I)

La informática forense es una disciplina amplia y compleja, que requiere de conocimientos profundos y en muchos casos casi milimétricos de algunas áreas. Afortunadamente, de un tiempo a esta parte los retos forenses para afinar nuestras habilidades han aumentado, y a día de hoy tenemos una buena cantidad disponible de ellos para aprender, practicar y mejorar.
Aquí tenéis los últimos que han llegado a mis manos:

Con un día libre por delante, he decidido jugar un poco con el último. ¿Por qué? Porque simple y llanamente, Bond es mucho Bond y me ha picado la curiosidad :D

Para hacer el reto más interesante, vamos a intentar resolverlo por duplicado, empleando en un caso únicamente Windows y en el otro solo Linux. El objetivo es presentar las distintas formas de hacer las cosas en cada uno de los SO, centrándonos primero en qué información tenemos que conseguir y luego en cómo conseguirla (uno de los mandamientos de la informática forense).

0 – Despliegue inicial

Vamos a partir del siguiente despliegue inicial:

  • Windows: Máquina virtual con Windows 7, 2 cores y 4Gb de RAM.
  • Linux: Máquina virtual con DEFT 8.1, 2 cores y 2Gb de RAM. Esta versión de DEFT tiene problemas con VirtualBox, así que tendrás que usar VMWare o una versión un poco más antigua (aunque SIFT o CAINE deberían ser prácticamente equivalentes).

Si descargamos los ficheros del CTF nos encontramos con un .zip de 1.6Gb que tiene la siguiente información:

  • roger_image.ad1: Captura del disco realizada por el FTK Imager.
  • roger_image.ad1.txt: Información de la captura del disco.
  • roger.mem: Volcado de memoria del equipo.
  • Img1.png: Captura de pantalla del equipo afectado.
  • Img2.png: Otra captura de pantalla.

Un análisis rápido de estos datos nos permite extraer la siguiente información inicial:

  • El fichero .ad1 es de menos de 2Gb, por lo que no vamos a tener una imagen de disco completa (así que nada de forenses en frío completos). Si abrimos el fichero de información de la captura comprobamos que se ha realizado únicamente una captura del perfil del usuario y de algunas carpetas de Windows (registro, prefetch, tasks, logs) que deberían de bastarnos para lograr nuestro fin (aunque al analista junior se le debería enseñar a fuego cómo realizar una correcta adquisición de datos).
  • Las imágenes muestran que el equipo es un Windows 10, y que un proceso de sistema está generando pop-ups no solicitadas (lo que indica que el equipo está bien trufado).
  • Tenemos un volcado de memoria, por lo que vamos a tener que tirar de Volatility. Afortunadamente desde hace un par de semanas está disponible la versión 2.5, que ofrece soporte a Windows 10, lo que nos va a permitir probar qué tal funciona en este SO.

Para extraer el volcado de disco .ad1 necesitaremos instalar FTK Imager: (Windows / Linux ), y seleccionar la opción de “Image Mounting” para poder montarlo como una unidad del sistema. En esta unidad tendremos dos carpetas: “Users” y “Windows”, que tendrán toda la información necesaria (consejo: borra la carpeta “Evidence” del Escritorio del usuario ya que contiene un duplicado de la imagen y así te ahorrarás 1.5Gb de espacio en el disco duro). Nos la copiamos a un USB para poderlo ir moviendo de una VM a otra, y podemos empezar el CTF en condiciones.

[Nota previa 1: Como casi todos los CTF, en muchos puntos hay más de una forma de obtener los resultados. Este writeup no pretende abarcar todas las soluciones posibles, optando en la medida de lo posible por la manera más sencilla/elegante/divertida. Si quieres compartir cómo resolverías el punto N, eres más que bienvenido en los comentarios].

[Nota previa 2: Este writeup tampoco quiere ser una comparativa de SO. Seguro que alguien es capaz de resolver el reto con una Gentoo compilada en su MacBook Pro a la pata coja. El propósito del artículo es resaltar que ambos SO son válidos para hacer un análisis forense, y que un buen analista tiene que conocer AMBOS entornos, eligiendo en cada caso el SO, técnica y herramienta más apropiada].

1. ¿De quién es este equipo?

Vamos a empezar con Volatility, que podemos descargar como ejecutable sin dependencias (recuerda, versión 2.5). De las imágenes ya sabemos que es un Windows 10, por lo que la forma más rápida de saber el perfil correcto es simplemente probando 32 y 64bits (imageinfo siempre tarda un verano):

# ./volatility_2.5_linux_x64 -f ../James_Baud/roger.mem --profile=Win10x86 pslist

… y bingo, ya tenemos Volatility listo para funcionar. Lo siguiente es verificar que podemos leer el registro de Windows cargado en memoria con hivelist:

# ./volatility_2.5_linux_x64 -f ../James_Baud/roger.mem --profile=Win10x86 hivelist
Volatility Foundation Volatility Framework 2.5
Virtual    Physical   Name
---------- ---------- ----
0x88239008 0x2aef3008 \REGISTRY\MACHINE\HARDWARE
0x8f23f008 0x35c53008 \Device\HarddiskVolume1\Boot\BCD
0x8f23d008 0x04b5c008 \SystemRoot\System32\Config\SOFTWARE
0x8f486008 0x3234a008 \SystemRoot\System32\Config\DEFAULT
0x95e27008 0x12474008 \SystemRoot\System32\Config\SECURITY
0x95e93008 0x0c21b008 \SystemRoot\System32\Config\SAM
0x95ee8008 0x220b5008 \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0x95f9b008 0x3e276008 \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0x98b19008 0x2d777008 \SystemRoot\System32\Config\BBI
0x9dbb8008 0x342ba008 \??\C:\Windows\AppCompat\Programs\Amcache.hve
0xa264f008 0x18278008 \??\C:\Users\defaultuser0\ntuser.dat
0xa52f20e0 0x267660e0 \??\C:\Users\RogerMoore\ntuser.dat
0xa4911008 0x33e81008 \??\C:\Users\RogerMoore\AppData\Local\Microsoft\Windows\UsrClass.dat
0xab582008 0x30117008 \??\C:\ProgramData\Microsoft\Windows\AppRepository\Packages\Microsoft.Windows.ShellExperienceHost_10.0.14393.0_neutral_neutral_cw5n1h2txyewy\ActivationStore.dat
0xadf74008 0x1667b008 \??\C:\Users\RogerMoore\AppData\Local\Packages\Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy\Settings\settings.dat
0xa52a8008 0x0ca87008 \??\C:\ProgramData\Microsoft\Windows\AppRepository\Packages\Microsoft.Windows.Cortana_1.7.0.14393_neutral_neutral_cw5n1h2txyewy\ActivationStore.dat
0xa5158008 0x0e50f008 \??\C:\Users\RogerMoore\AppData\Local\Packages\Microsoft.Windows.Cortana_cw5n1h2txyewy\Settings\settings.dat
0x88215008 0x001f6008 [no name]
0x8821e008 0x001ff008 \REGISTRY\MACHINE\SYSTEM

Tenemos el registro completo, por lo que ahora solo toca preguntarle al registro el nombre de la máquina con printkey:

# ./volatility_2.5_linux_x64 -f ../James_Baud/roger.mem --profile=Win10x86 printkey -o 0x8821e008 -K 'ControlSet001\Control\ComputerName\ComputerName'
Volatility Foundation Volatility Framework 2.5
Legend: (S) = Stable   (V) = Volatile
----------------------------
Registry: \REGISTRY\MACHINE\SYSTEM
Key name: ComputerName (S)
Last updated: 2016-10-30 04:15:55 UTC+0000
Subkeys:
Values:
REG_SZ                        : (S) mnmsrvc
REG_SZ        ComputerName    : (S) DESKTOP-8P787RI

Respuesta: DESKTOP-8P787RI. Aunque si aprendemos a leer, nos preguntaban por el dueño, no por el nombre del equipo. Así que a lo mejor la respuesta correcta sería el nombre de usuario del equipo. Sin embargo, tenemos suerte ya que aparece en la salida de hivelist.
Respuesta 2: “Roger Moore”.

Windows way

Abrimos regedit con privilegios de administrador (botón derecho sobre el icono + “Ejecutar como Administrador”) y aplicamos un truco sucio que podemos hacer con regedit: cargar hives como subárboles de un registro activo. Para ello seleccionamos HKEY_LOCAL_MACHINE y vamos a “Archivo –> Cargar subárbol” y elegimos el fichero que se ha recogido de las evidencias:

JamesBaud\Windows\System32\Config\SYSTEM

Una vez cargado, es tan fácil como acceder a la siguiente clave del registro:

SYSTEM2\ControlSet\Control\ComputerName\ComputerName

jamesbaud

Respuesta: DESKTOP-8P787RI. Pero como ya dijimos que esta no valía, vamos a resolverla de nuevo. Tenemos la carpeta de usuario pero sin la ruta completa (nos falta justo el valor del nombre de usuario), pero tenemos el NTUSER.DAT, la parte del registro donde se guardan la configuración y preferencias de cada usuario.

Lo más sucio en este caso es cargar como subárbol el fichero

JamesBaud\Users\NTUSER.DAT

Y hacer una búsqueda en el registro cargado por “C:\Users”. En un periquete tenemos el fondo de pantalla cargado por el usuario con su ruta completa.

jamesbaud2

Respuesta 2: “RogerMoore”

Conclusiones: Es necesario leer bien las cuestiones requeridas, ya que en un escenario real habríamos perdido tiempo que bien podríamos no disponer (en mi caso eran las 8.00AM y la cafeína no me había hecho efecto). En este caso la información se puede obtener fácilmente tanto en Windows (sobre todo con el truco de “Cargar Subárbol”) como en Linux.

2. Who is the other actor?

Linux way

Vamos a presumir que no estamos en un dominio de Windows, y que por lo tanto las cuentas de usuario están almacenadas de forma local en la SAM (Security Account Manager, el hive del registro de Windows donde se guardan las cuentas de usuario).

Para obtenerlas vamos a usar RegRipper (viene ya por defecto en DEFT 8.1, pero se puede desplegar sin problemas en Windows también) con el plugin samparse.pl:

# perl rip.pl -r ../James_Baud/Windows/System32/config/SAM -p samparse
Username        : defaultuser0 [1000]
Full Name       : 
User Comment    : 
Account Type    : 
Account Created: Sun Oct 30 04:15:56 2016 Z
Last Login Date : Sun Oct 30 01:16:52 2016 Z
Pwd Reset Date : Sun Oct 30 04:15:56 2016 Z
Pwd Fail Date   : Never
Login Count     : 2
  --> Password does not expire
  --> Account Disabled
  --> Normal user account

Name            :  
Username        : RogerMoore [1001]
Full Name       : 
User Comment    : 
Account Type    : 
Account Created: Sun Oct 30 01:18:52 2016 Z
Password Hint   : ConneryCantTouchThis
Last Login Date: Sun Oct 30 01:19:10 2016 Z
Pwd Reset Date: Sun Oct 30 01:18:52 2016 Z
Pwd Fail Date   : Sun Oct 30 01:25:09 2016 Z
Login Count     : 2
  --> Password does not expire
  --> Password not required
  --> Normal user account

Username        : SConWuzHere [1002]
Full Name       : SConWuzHere
User Comment    : 
Account Type    : 
Account Created: Sun Oct 30 02:46:58 2016 Z
Name            :  
Last Login Date: Never
Pwd Reset Date: Sun Oct 30 02:46:58 2016 Z
Pwd Fail Date   : Never
Login Count     : 0
  --> Normal user account

Respuesta: “SConWuzHere”. No hay que ser muy fan de James Bond para saber que SConWuzHere=Sean Connery.

Windows way

Cargamos con el procedimiento que ya conocemos el hive Software, y accedemos a:

\SOFTWARE2\Microsoft\Windows NT\CurrentVersion\ProfileList\

El lugar donde se almacenan los perfiles de usuario, y buscamos en las claves disponibles los distintos directorios base que permiten identificar al usuario.

jamesbaud3

¡Nos falta un usuario! ¿Dónde se ha metido SConWuzHere? Si analizamos con detalle la salida de rip.pl un poco más arriba encontramos dos detalles muy interesantes en su cuenta de usuario:

Last Login Date: Never
Login Count : 0

Es decir, existe una cuenta pero el usuario nunca una ha iniciado sesión de forma standard, y por ello nunca se ha creado un perfil (¿te acuerdas de la primera vez que inicias sesión con un nuevo usuario y Windows tarda un buen rato en darte una pantalla de inicio? El motivo es porque está creando tu perfil de usuario). Y al no existir el perfil, no tenemos en esa clave del registro.

No obstante, tenemos más formas de obtener esta información. La forma más directa es cargando la hive SAM, pero nos sale vacía (tocará investigar porqué). Tomamos en este caso la opción de abrirla mediante la herramienta WRR (Windows Registry Recovery), que nos resuelve la papeleta con rapidez.

jamesbaud4

Respuesta: “SConWuzHere”.

Conclusiones: A veces creemos que una técnica va a funcionar porque pensamos que sigue un curso de acción natural… y no siempre tiene que ser así. Todos los datos críticos, en la medida de lo posible, tiene que ser contrastados obteniendo la información por otro medio (otra técnica, otra herramienta, etc…) para que no nos pase lo que en este caso.

En la comparativa Windows/Linux, aquí ha sido mucho más sencillo Linux porque RegRipper ya venía por defecto con la distro (y hemos tenido que trastear un poco para obtener los resultados en Windows).

3. What email service are they using (include TLD)?

Linux way
Volatility nos da la primera en la frente al no soportar el plugin para extraer el historial de Internet Explorer en Windows 10:

# ./volatility_2.5_linux_x64 -f ../James_Baud/roger.mem --profile=Win10x86 iehistory

Volatility Foundation Volatility Framework 2.5
ERROR   : volatility.debug    : This command does not support the profile Win10x86

El plugin netscan (que nos muestra las conexiones activas y en memoria, y que tampoco parece dar un resultado muy estable en Windows 10) nos confirma sin embargo que se está ejecutando Chrome, así que podemos ir a la fuente directamente, extrayendo el historial de Chrome de:

James_Baud\User\AppData\Local\Google\Chrome\User Data\Default\History

El fichero es una base de datos SQLite3, así que instalamos sqlitebrowser a golpe de apt-get y examinamos la BD. Se observa con facilidad la tabla “urls”, y la consulta: “SELECT * FROM urls” nos devuelve con el id 63 la respuesta.

jamesbaud5

Respuesta: “protonmail.com”

Windows way

Si buscamos en Windows\Prefetch tenemos el listado de los programas que se han ejecutado en el equipo. No se observan clientes de correo de escritorio, por lo que asumimos que se ha hecho uso de un cliente web. El mismo listado de Prefetch nos indica que se han ejecutado los siguientes navegadores:

  • Internet Explorer
  • Microsoft Edge
  • Chrome

Es el momento de jugar con los historiales de navegación. Para ello lo más sencillo es usar BrowsingHistoryView, que con su modo offline permite indicar un perfil de usuario del que extraer el historial de navegación (Options–> Advanced Options–> Load History From), por lo que la respuesta salta a la vista en el historial de Chrome:

jamesbaud6

Respuesta: “protonmail.com”

Conclusiones: Las utilidades de NirSoft para Windows son una maravilla, y nos hacen la vida muy sencilla. El ir un poco más a bajo nivel en Linux es más costoso en este caso (pero nos da otra forma de acceder a los datos en un formato más raw, y de comprender la estructura interna de algunas estructuras de datos, algo que siempre viene bien).

Ya hemos abierto boca con un entrante. El primer plato en el siguiente artículo…

(Este post consta de 4 partes. Esta es el 1/4. Accede al siguiente pinchando aquí.)