DEFCON DFIR CTF 2019 (IV): Triage VM Questions

Las evidencias son un precioso fichero .7z (que en Debian no se puede abrir con unzip, hay que usar p7zip, ojo), que una vez descomprimido nos deja los siguientes ficheros:


# ls -laht
total 27G
drwxr-xr-x 2 root root 4.0K Aug 27 18:10 .
drwxr-xr-x 5 root root 4.0K Aug 27 17:43 ..
-rw-r--r-- 1 root root 4.0G Mar 22 22:21 DFA_CTF_Triage-0.vmdk
-rw-r--r-- 1 root root  23G Mar 22 22:21 DFA_CTF_Triage.vmdk
-rw-r--r-- 1 root root 2.0K Mar 22 22:14 DFA_CTF_Triage.vmx

Podríamos arrancar la máquina virtual en VMWare, pero vamos a tratar la VM como una evidencia muerta, para ver si somos capaces de sacar todas las evidencias de un modo más formal.

La forma más rápida de montar en Debian un .vmdk es, si tienes qemu instalado, la siguiente:

Insertamos el módulo de NBD (Network Block Devices) y montamos las imagenes:

# sudo modprobe nbd
# qemu-nbd -r -c /dev/nbd0 DFA_CTF_Triage-0.vmdk
# qemu-nbd -r -c /dev/nbd1 DFA_CTF_Triage.vmdk

Identificamos las particiones de cada uno de los discos:

# fdisk -l /dev/nbd0
Disk /dev/nbd0: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8e796ee0

Device      Boot Start      End  Sectors Size Id Type
/dev/nbd0p1       2048 20967423 20965376  10G  7 HPFS/NTFS/exFAT

root@MOX:/fast/defcon/vm# fdisk -l /dev/nbd1
Disk /dev/nbd1: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1e3eccd3

Device      Boot  Start      End  Sectors  Size Id Type
/dev/nbd1p1 *      2048   206847   204800  100M  7 HPFS/NTFS/exFAT
/dev/nbd1p2      206848 62910463 62703616 29.9G  7 HPFS/NTFS/exFAT

Creamos los puntos de montaje correspondientes:

# mkdir /mnt/win1
# mkdir /mnt/win2
# mkdir /mnt/win3

y montamos las particiones correspondientes:

# mount /dev/nbd0p1 /mnt/win1
# mount /dev/nbd1p1 /mnt/win2
# mount /dev/nbd1p2 /mnt/win3

Win1 parece una partición extra que solo contiene un volcado de memoria (parece como si fuera un servidor en la nube al que se le hubiera añadido un disco nuevo solo para poder guardar ahí el volcado de memoria). Win2 parece la partición de boot de un Windows 10, y Win3 es nuestra partición de sistema.

Ahora que ya tenemos todo identificado… ¡al lío!

1. ¿Cuál es el nombre del usuario?
Tenemos montado el disco, así que es cuestión de acceder a la carpeta Users y comprobar que Bob es nuestro único usuario.

* Respuesta: Bob

2. ¿A qué hora se realizó el inicio de sesión más reciente? La respuesta es en formato UTC as MM/DD/YYYY HH:MM:SS (24h).

Las cosas que han pasado se quedan en los logs (casi siempre). En nuestro caso, los inicios de sesión son tarea de Security, por lo que podemos abrirlo con un Visor de Eventos de cualquier Windows moderno. Nos cuesta bien poco encontrar el primer login de Bob, pero saber la hora en UTC es algo más complejo (recuerda que Visor de Eventos funciona con la hora local del equipo, ojo).

Lo más sencillo es seleccionar las propiedades del evento, y dentro de los detalles nos aparece la fecha en UTC (indicado por el «Z» al final de la fecha).

* Respuesta: 03/22/2019 20:50:51

3. ¿Cuándo se apagó el equipo por última vez? La respuesta es en formato UTC as MM/DD/YYYY HH:MM:SS (24h).
Más valores molones del registro:

HKLM\SYSTEM\CurrentControlSet\Control\Windows -> ShutdownTime

Podemos abrir el registro con RegistryExplorer y acceder fácilmente a la clave del registro indicada, que sin embargo está codificada. Sin embargo, su funcionalidad de intérprete de datos es una gozada, ya que nos traduce sin problemas el formato binario a UTC.

* Respuesta: 03/22/2019 21:11:14

4. Un fichero .7z fue borrado. ¿Cuál es el hash CRC32 del fichero que contenía en su interior?
Ahora es cuando nos toca sacarle brillo a Scalpel para hacer un carving salvaje de varias horas que no se deje ni un bit por rebuscar. O también podemos ir y mirar lo que hay en la papelera de Windows. Lo que nos pida el cuerpo, vamos.

# ls -laht
total 3.2M
-r-------- 1 root root  544 Mar 22 04:29 $I9C7G1J.asd
dr-x------ 1 root root 4.0K Mar 22 04:29 .
-r-------- 1 root root  544 Mar  8 04:34 $ILUERRD.exe
-r-------- 1 root root 2.9M Mar  8 04:34 $RLUERRD.exe
-r-------- 1 root root  27K Mar  8 04:10 $R9C7G1J.asd
-r-------- 1 root root  544 Mar  8 03:54 $IATGMO5.7z
-r-------- 1 root root 252K Mar  8 03:34 $RATGMO5.7z
dr-x------ 1 root root    0 Jan 26  2019 ..
-r-------- 1 root root  129 Jan 26  2019 desktop.ini

Si nos copiamos los dos .7z y los abrimos con un 7Zip, el segundo de ellos nos da la respuesta:

* Respuesta: AD96120C

5. ¿En qué timezone está el equipo (en formato UTC)
Otra pregunta de configuración del sistema, otra clave del registro que revisar:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

Un poco de Registry Explorer nos da la respuesta.

Eastern Standard Time se traduce en términos de UTC a UTC-5, que es nuestra respuesta. Aquí podríamos que ser un poco puntillosos, porque la fecha del equipo es el 22 de Marzo de 2019, por lo que estaríamos en horario de verano, en el que aplicaríamos en UTC-4 (ya que se aplica en el segundo domingo de Marzo):

https://en.wikipedia.org/wiki/Eastern_Time_Zone#Daylight_saving_time

Observando los datos de RegistryExplorer comprobamos que tenemos 3 valores implicados:

  • Bias: 300 (el valor por defecto de ajuste horario, en minutos)
  • DaylightBias: 4294967236 (las modificaciones por horario de verano, que con el intérprete de datos de RegistryExplorer queda en cristiano en -60)
  • ActiveTimeBias: 240 (Bias + DaylightBias)

Las cuentas nos salen. Aunque la timezone sera UTC-5, nuestra hora real tiene que ser UTC-4.

* Respuesta: UTC-5

6. ¿Cuántos usuarios tienen un RID igual o superior en el equipo?
Esta casi la podíamos haber respondido de cabeza: dado que solo hay un usuario en el equipo, y que las cuentas conocidas (Administrador, Guest) tienen RID < 1000 … la respuesta es 1. Pero vamos a sacar a pasear a RegRipper sobre el hive SAM para asegurarnos:

* Respuesta: 1

7. ¿Cuál es el ID de la extensión de Chrome instalada?
Chrome guarda las extensiones en la siguiente carpeta:

C:\Users\[login_name]\AppData\Local\Google\Chrome\User Data\Default\Extensions

Si nos vamos a ese directorio encontramos una buena pila de extensiones instaladas.

# ls -laht
total 36K
dr-x------ 1 root root  32K Mar 22 22:11 ..
dr-x------ 1 root root 4.0K Mar 21 17:57 .
dr-x------ 1 root root    0 Mar 21 17:57 hdokiejnpimakedhajhdlcegeplioahd
dr-x------ 1 root root    0 Mar  8 04:26 hnbmfljfohghaepamnfokgggaejlmfol
dr-x------ 1 root root    0 Feb  9  2019 ghbmnnjooekpmoecnnnilnnbdlolhkhi
dr-x------ 1 root root    0 Feb  9  2019 pjkljhegncpnkpknbcohdijeoejaedia
dr-x------ 1 root root    0 Feb  9  2019 blpcfgokakmgnkcojhhkbfbldkacnbeo
dr-x------ 1 root root    0 Feb  9  2019 apdfllckaahabafndbhieahigkjlhalf
dr-x------ 1 root root    0 Feb  9  2019 aohghmighlieiainnegkcijnfilokake
dr-x------ 1 root root    0 Feb  9  2019 nmmhkkegccagdldgiimedpiccmgmieda
dr-x------ 1 root root    0 Feb  9  2019 pkedcjkdefgpdelpbcmbmeomcjbeemfm
dr-x------ 1 root root    0 Feb  9  2019 felcaaldnbdncclmgdcncolpebgiejap
dr-x------ 1 root root    0 Feb  9  2019 aapocclcgogkmnckokdopfmhonfmgoek

hdokiejnpimakedhajhdlcegeplioahd –> LastPass … pero no nos la da como válida
hnbmfljfohghaepamnfokgggaejlmfol –> ncage, que es la respuesta correcta.

Para los curiosos, ncage es una extensión que reemplaza todas las imágenes de la página visitada por fotos de Nicholas Cage. No es coña:

https://37.187.124.60/ext/hnbmfljfohghaepamnfokgggaejlmfol.html

* Respuesta: hnbmfljfohghaepamnfokgggaejlmfol

8. ¿Cuántas veces se ejecutó Adobe Reader?

Prefetch nos va a dar la respuesta en 3 segundos… si no fuera porque la carpeta está vacía. Es más que posible que Windows haya sido instalado en un disco duro SSD, motivo por el cual no se crea la carpeta (las aplicaciones ya se cargan a toda pastilla por lo que no tiene sentido).

Nos toca recurrir a los registros de UserAssist, algo que RegRipper nos solventa ágilmente con su plugin userassist y el NTUSER.dat del usuario en cuestión.

De las ejecuciones de Mimikatz y Powershell que hemos visto poco después hablaremos más tarde (espero) … ;)

* Respuesta: 7

9. Existen un ejecutable escondido en el escritorio. ¿Cuál es el nombre del fichero (extensión incluida)?

Cuando lo tienes montado en Linux eso de que esté escondido siempre es relativo. Si hacemos un file en el directorio Desktop del usuario Bob encontramos dos ejecutables:

# file * |grep PE32
hfs.exe:                         PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed
howudoin.exe:                    PE32+ executable (GUI) x86-64, for MS Windows

Aunque si abrimos la carpeta desde un Windows parece que lo de «escondido» tiene su explicación (sobre todo porque una de las cosas que hace servidor con un equipo Windows es desactivar esa opción de «esconder las extensiones de los ficheros»):

* Respuesta: howudoin.exe

10. ¿A qué hora accedió el usuario a contenido en placerholder.com? Responde en formato HH:MM

Vamos a emplear ChromeHistoryView para revisar el historial (vamos a tirarnos un triple y asumir que, ya que en una pregunta anterior preguntaban sobre Chrome, es el navegador usado).

Y en efecto, acertamos ya que encontramos un acceso a via.placeholder.com:

Ahora viene cuando tenemos que calcular con cuidado. El acceso se ha producido a las 17:12h (hemos sido previsores y configurado ChromeHistoryView en formato UTC). En preguntas anteriores hemos visto que se estaba trabajando en UTC-4, por lo que tendremos que restarle cuatro horas al resultado. Sin embargo, 13:12 no le gusta al reto como resultado.

Después de darle un millón de vueltas al tema y de tirarme de los pelos, encuentro la respuesta: la pregunta no indica hora en UTC, ni especifica formato de horas. Aunque en España estemos acostumbrados al formato de 24h, en los países sajones se emplea el formato de 12h, en el que las 13:13 equivalen a 1:12h. Siendo exactos, a 01:12.

El próximo reto forense me las voy a apañar para hacer preguntas que tengan metros, kilómetros, euros y conducir por la derecha. Para que sufran.

https://en.wikipedia.org/wiki/24-hour_clock

* Respuesta: 01:12

11. ¿Cuál es el hostname del equipo?

La verdad está en el registro:

HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName.


* Respuesta: IM-A-COMPOOTA

12. ¿Qué aplicación de mensajería ha sido descargada en este equipo?

No nos vamos a negar a un par de preguntas facilonas. Si entramos en la carpeta de Downloads de Bob vemos que se ha descargado muchas cosas… pero ahí tenemos un precioso Skype que nos da la flag que buscábamos.

* Respuesta: Skype.

13. ¿Cuántas veces visitó Bob Outlook.com?

Lo primero es ver qué navegadores se han usado. De los datos del UserAssist que hemos obtenido gracias a RegRipper en preguntas anteriores tenemos los siguientes valores:

Fri Mar 22 20:56:25 2019 Z  Chrome (34)
Thu Mar 21 16:19:13 2019 Z  Microsoft.InternetExplorer.Default (7)
Value names with no time stamps:  OperaSoftware.OperaWebBrowser.1549736806

El historial de Chrome se guarda en:

C:\Users\Bob\AppData\Local\Google\Chrome\User Data\Default\History

y lo podemos ver fácilmente con ChromeHistoryView:

obteniendo en total 18 hits.

El de Opera lo tenemos en:

C:\Users\antonio\Desktop\Defcon_DFIR_CTF_2019\windows\bob\AppData\Roaming\Opera Software\Opera Stable\History

y lo podemos ver también con ChromeHistory View, en este caso sin tener resultados.

Nos queda Internet Explorer. Después de un buen rato intentando encontrar los directorios WebCache/INetCache sin éxito pienso … ¿seguro que esto es un Windows 10, chombatta? Y resulta que no, que es un Windows 7. Y en Windows 7 no tenemos de esas moderneces, tenemos el Internet Explorer viejuno de toda la vida, con su historial en:

C:\Users\Bob\AppData\Local\Microsoft\Windows\History\

La herramiente IEHistoryView nos permite ver el historial, pero no tenemos visitas a Outlook.com. 18 hits serán … !fail!

Después de mucho darle vueltas al asunto y de hacer varias pruebas, descubro esta pequeña joya escondida en un rincón de Internet:

https://www.lowmanio.co.uk/blog/entries/how-google-chrome-stores-web-history/

que indica que el valor «Visit_Count» almacena el total de visitas para dicha URL. Es decir, que por mucho que tengamos varias líneas con una URL, el Visit_Count va a ser el mismo si la URL es la misma. Esto nos reduce el resultado de 18 a 3, que es la respuesta correcta.

* Respuesta: 3

14. Parece que Bob ha estado haciendo de RRHH. ¿Puedes encontrar el número de la seguridad social para una persona con las iniciales R.C. ?

Rebuscando un poco en la carpeta de usuario de Bob encontramos el directorio EmployeeDocuments, y dentro el fichero EmployeeInformation.xlsx, que nos da nuestra respuesta

* Respuesta: 601-25-0735

15. Bob estaba viendo vídeos de YouTube en el trabajo. La captura de red indica que el ID del vídeo es N9NCyGaxoDY. ¿Cuál es el título del vídeo?

Esta parece que tiene truco de lo sencilla que es. La estructura estándar de una URL de un vídeo de Youtube es:

https://www.youtube[.]com/watch?v=ddp70SjsiNw

donde el valor «ddp70SjsiNw» corresponde al identificador del vídeo (que por cierto, no debéis abrir si sois fácilmente impresionables).

Si abrimos la URL https://www.youtube[.]com/watch?v=ddp70SjsiNw

nos encontramos con una deliciosa actuación de Rowan Atkinson, y de paso nuestra flag.

* Respuesta: Rowan Atkinson Toby the Devil – Welcome to Hell

16. Bob ha escondido una presentación en PowerPoint. ¿Cuál es el hash CRC32 del fichero?

Después de revisar todos los ficheros en busca de PowerPoint, y de descomprimir con lupa todos y cada uno de ellos, me doy por vencido.

* Respuesta: N/A

17. ¿Cuál es la flag en el fichero C:\Users\Bob\Desktop\WABBIT\1 ?

Como al parecer tenemos varios retos relacionados con la carpeta WABBIT, vamos a sacar algo de info de los mismos:

# file *
1: PE32+ executable (GUI) x86-64, for MS Windows
2: data
3: data
4: data
5: JPEG image data

# exiftool *
======== 1
ExifTool Version Number         : 10.40
File Name                       : 1
Directory                       : .
File Size                       : 189 kB
File Modification Date/Time     : 2019:03:08 04:14:58+01:00
File Access Date/Time           : 2019:03:08 04:03:23+01:00
File Inode Change Date/Time     : 2019:03:08 04:14:58+01:00
File Permissions                : r--------
File Type                       : Win64 EXE
File Type Extension             : exe
MIME Type                       : application/octet-stream
Machine Type                    : AMD AMD64
Time Stamp                      : 2009:07:14 01:56:35+02:00
PE Type                         : PE32+
Linker Version                  : 9.0
Code Size                       : 43008
Initialized Data Size           : 153600
Uninitialized Data Size         : 0
Entry Point                     : 0x3570
OS Version                      : 6.1
Image Version                   : 6.1
Subsystem Version               : 6.1
Subsystem                       : Windows GUI
File Version Number             : 6.1.7600.16385
Product Version Number          : 6.1.7600.16385
File Flags Mask                 : 0x003f
File Flags                      : (none)
File OS                         : Windows NT 32-bit
Object File Type                : Executable application
File Subtype                    : 0
Language Code                   : English (U.S.)
Character Set                   : Unicode
Company Name                    : Microsoft Corporation
File Description                : Notepad
File Version                    : 6.1.7600.16385 (win7_rtm.090713-1255)
Internal Name                   : Notepad
Legal Copyright                 : © Microsoft Corporation. All rights reserved.
Original File Name              : NOTEPAD.EXE
Product Name                    : Microsoft® Windows® Operating System
Product Version                 : 6.1.7600.16385
======== 2
ExifTool Version Number         : 10.40
File Name                       : 2
Directory                       : .
File Size                       : 48 kB
File Modification Date/Time     : 2019:03:08 03:54:54+01:00
File Access Date/Time           : 2019:03:08 03:47:06+01:00
File Inode Change Date/Time     : 2019:03:08 03:54:54+01:00
File Permissions                : r--------
Error                           : Unknown file type
======== 3
ExifTool Version Number         : 10.40
File Name                       : 3
Directory                       : .
File Size                       : 35 kB
File Modification Date/Time     : 2019:03:08 04:01:55+01:00
File Access Date/Time           : 2019:03:08 04:01:29+01:00
File Inode Change Date/Time     : 2019:03:08 04:01:55+01:00
File Permissions                : r--------
Error                           : Unknown file type
======== 4
ExifTool Version Number         : 10.40
File Name                       : 4
Directory                       : .
File Size                       : 116 kB
File Modification Date/Time     : 2019:03:08 03:58:23+01:00
File Access Date/Time           : 2019:03:08 03:56:52+01:00
File Inode Change Date/Time     : 2019:03:08 03:58:23+01:00
File Permissions                : r--------
Error                           : Unknown file type
======== 5
ExifTool Version Number         : 10.40
File Name                       : 5
Directory                       : .
File Size                       : 22 kB
File Modification Date/Time     : 2019:03:08 03:59:34+01:00
File Access Date/Time           : 2019:03:08 03:52:21+01:00
File Inode Change Date/Time     : 2019:03:08 03:59:34+01:00
File Permissions                : r--------
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
Warning                         : JPEG format error
    5 image files read

# md5sum *
2b6f256aa3b70c8be799a23826fb92bd  1
a86dfe127b8d5a9dbfaedd9b96af2a77  2
dc90f97b5152b707b28168ccad9da409  3
5528514fa047070578da87e55f70d448  4
44abefbcb058ce5ebd17296a6a6e416f  5

Los metadatos dicen que es un Notepad… pero no hay que fiarse de nada de lo que te diga un ejecutable. VirusTotal lo marca como «ligeramente» malicioso, y no está firmado digitalmente por Microsoft, así que ojito al parche:

https://www.virustotal.com/gui/file/5199a352dce04e8c50a1ad3048fb44347634bbd52ea2a7a902c3f77d44cfc7dc/behavior/VirusTotal%20Jujubox

¿Lo tiramos en una sandbox? ¿Nos pegamos 5 años de nuestra vida en un retiro espiritual y nos hacemos uno con IDA? ¿O quizás le tiramos un strings sucísimo y miramos a ver qué dice? Los últimos serán los primeros:

# strings 1 |grep -i flag
!flag<program cannot be run in DOS>ode.

* Respuesta: program cannot be run in DOS

18. ¿Cuál es la flag en el fichero C:\Users\Bob\Desktop\WABBIT\2 ?

Si le hacemos un strings sucio sucio para ver si cae premio lo único que tenemos es una pista:

# strings -n 8 2 
NETSCAPE2.0
3+33+f3+
3U33Uf3U
f+3f+ff+
fU3fUffU
Y7[$/^aR
&2Hct.Eo
Dm8t)"s`h 
m840\WDt
%*D\dLAhP
i(u3zB~#
&n|7R(5}ZQ
2?C_ddJ~6
)9Cp\mCw

Si buscamos NETSCAPE2.0 nos encontramos una oscura referencia al formato de GIF animados:

http://fileformats.archiveteam.org/wiki/GIF

Lo renombramos a .gif a ver si tenemos suerte … y nada. Nos lo vamos a tener que currar un poco más. Vamos a ver un poco el hexadecimal que tiene dentro con hexdump:

00000000  00 00 00 00 00 00 1c 02  95 01 85 00 00 19 5c 4a  |..............\J|
00000010  3a d3 aa 00 00 00 37 c9  a2 3d dd b2 2c a6 85 1c  |:.....7..=..,...|
00000020  74 5c 33 be 99 22 87 6c  28 97 79 30 b2 8f 0f 41  |t\3..".l(.y0...A|
00000030  34 3b d8 ae 32 b8 94 2b  a6 84 18 69 53 24 87 6c  |4;..2..+...iS$.l|
00000040  35 c3 9d 23 87 6c 29 9f  7f 3d df b4 38 ce a6 36  |5..#.l)..=..8..6|
00000050  c9 a2 25 90 73 27 97 79  2e ac 8a 20 7e 65 1e 74  |..%.s'.y... ~e.t|
00000060  5d 2f b2 8f 3c dc b1 05  2d 22 0e 41 33 0d 41 33  |]/..<...-".A3.A3|
00000070  11 4f 3f 26 97 79 3c dc  b2 27 98 79 3b d9 af 2d  |.O?&.y<..'.y;..-|
00000080  ac 8a 3a d6 ac 32 bb 96  00 00 00 00 00 00 00 00  |..:..2..........|
00000090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000c0  00 00 00 00 00 00 00 00  00 00 00 00 00 21 ff 0b  |.............!..|
000000d0  4e 45 54 53 43 41 50 45  32 2e 30 03 01 00 00 00  |NETSCAPE2.0.....|
000000e0  21 f9 04 00 07 00 00 00  2c 00 00 00 00 1c 02 95  |!.......,.......|
000000f0  01 87 00 00 00 00 00 33  00 00 66 00 00 99 00 00  |.......3..f.....|
00000100  cc 00 00 ff 00 2b 00 00  2b 33 00 2b 66 00 2b 99  |.....+..+3.+f.+.|
00000110  00 2b cc 00 2b ff 00 55  00 00 55 33 00 55 66 00  |.+..+..U..U3.Uf.|
00000120  55 99 00 55 cc 00 55 ff  00 80 00 00 80 33 00 80  |U..U..U......3..|
00000130  66 00 80 99 00 80 cc 00  80 ff 00 aa 00 00 aa 33  |f..............3|
00000140  00 aa 66 00 aa 99 00 aa  cc 00 aa ff 00 d5 00 00  |..f.............|
00000150  d5 33 00 d5 66 00 d5 99  00 d5 cc 00 d5 ff 00 ff  |.3..f...........|
00000160  00 00 ff 33 00 ff 66 00  ff 99 00 ff cc 00 ff ff  |...3..f.........|

Mmm … esa cadena «21 ff 0b» según esta documentación parece la del formato gif

http://glup2.blogspot.com/2017/04/aclaracion.html

Tiene toda la pinta de que la cabecera del fichero se ha eliminado de forma deliberada para ofuscar el tipo de fichero (nótese el hueco perfecto de «00 00 00 00 00 00» que tenemos al principio del fichero, justo donde tendría que estar el Magic: «47 49 46 38 39 61»

Si modificamos el fichero con un editor hexadecimal (Bless en mi caso), y lo dejamos como tiene que estar:

nos aparece un taco sonriente junto con nuestra flag. Juzgad vosotros según la imagen, pero yo tuve que llamar a un amigo médico para que me descifrara el elegante garabato a mano alzada de los creadores del reto:

* Respuesta: taco_bout

19. ¿Cuál es la flag en el fichero C:\Users\Bob\Desktop\WABBIT\3 ?

Empezamos con el strings a ver qué pista tenemos en este caso:

# strings -n 8 3 
yayeet..
eFile source: https://commons.wikimedia.org/wiki/File:DragonForce_-_Wacken_Open_Air_2016-AL8703.jpg
ICC_PROFILE
mntrRGB XYZ 
9acspAPPL
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
pZ;^<3]^I&

Yayeet es al parecer es jerga moderna para decir «Yahoo!» «Yihaa!» o cualquier cosa afirmativo-festiva (vamos, lo que es equivalente en friki español a gritar «wiiiii» y montarte en tu unicornio para cabalgar hacia el horizonte).

https://www.urbandictionary.com/define.php?term=Ya%20yeet

El enlace lleva a un grupo heavy (DragonForce) actuando en el Wacken (un festival con tanta concentración de METAL que algún día acabará modificando el campo magnético de la tierra).

Las dos líneas siguientes son interesantes porque suenan a que tenemos un formato de imagen. Y en efecto, parece que corresponden al JFIF (JPEG File Interchange Format).

https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format

Si lo abrimos con un editor hexadecimal parece que la cabecera se ha ido a por tabaco y no ha vuelto:

Después de intentar identificar el sitio correcto por donde cortar, optamos por una opción burda: eliminamos todo antes del ICC_PROFILE, y añadimos antes el magic de un JFIF «FF D8». Y esperemos que el visor de imágenes sea más bien laxo con los formatos apaleados… que lo es :)

* Respuesta: dragonforce

20. ¿Cuál es la flag en el fichero C:\Users\Bob\Desktop\WABBIT\4 ?

En este caso el strings no nos da ninguna pista:

# strings -n 8 4
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
pk>]Lv5ZMH
U9u`NK}*
hg-5GCmv
=x5<>%V9
iUpM"*AKVe]/
xf&nP~T*)
)M.IJNRq{
lH=1_[t~.
(BzJ*M)/

pero si lo abrimos con el editor hexadecimal vemos que es otro JFIF al que le han cambiado el magic (FF D9 en lugar de FF D8).

Corregimos el magic y obtenemos nuestra flag dentro de la imagen (!auuuuuuuuu!):

* Respuesta: wof_on_champ

21. Un dispositivo con la letra de unidad “U” fue conectado. ¿Cuál era la etiqueta del volumen?

Si se ha conectado un dispositivo (posiblemente un USB) es para usarlo, por lo que posiblemente tengamos algo en los documentos recientes. Si empleamos el plugin de RegRipper recentdocs obtenemos rápidamente nuestra respuesta:

* Respuesta: ZOOM

22. ¿Cuál es la flag en el fichero C:\Users\Bob\Desktop\WABBIT\5 ?

Tanto analizar malware acaba permitiendo cosas como reconocer formatos así de un vistazo. Aunque el magic sea «FF D8» (el de un JPEG/JFIF) parece a todas luces un PDF. Si regeneramos el header cambiando el existente por «25 50 44 46 2d» logramos que el Adobe Reader nos lo muestre pero sin contenido (habremos hecho mal el formato, que los PDF son muy suyos).

Después de una buena media hora de prueba y error modificando la cabecera y metiendo y quitando bytes, sin querer hago doble click en el PDF y veo que ha seleccionado algo ¿Texto transparente? ¿De verdad? De verdad.

flag<pdf_LOLZ>

* Respuesta: pdf_LOLZ

23. Un fichero con MD5 981FACC75E052A981519ABB48E2144EC existe en algún lugar del equipo. ¿Cuál es el nombre del fichero (con extensión)?

En Linux algunas cosas son muuuy sencillas. Vamos a asumir en primer lugar que el fichero está en la carpeta de Bob, por lo que podemos calcular el hash MD5 de todos los ficheros y volcarlo a un .txt

# find . -exec md5sum {} \; > /fast/defcon/vm/bob_filelist_md5.txt

Luego es tan simple como tirar un grep y encontrar nuestra respuesta:

# fgrep -i 981FACC75E052A981519ABB48E2144EC /fast/defcon/vm/bob_filelist_md5.txt
981facc75e052a981519abb48e2144ec  ./AppData/Roaming/Microsoft/Windows/Recent/sleepy.png.lnk

* Respuesta: sleepy.png

24. El liderazgo de DFA se cansó … ¿Cuál es la flag EN el escritorio?

Después de buscar como un loco y de rebuscar todos los ficheros del Desktop del usuario, me doy por vencido

* Respuesta: N/A

25. Parece que Bob se está volviendo un poco loco escondiendo ficheros dentro de diferentes ficheros ¿Puedes encontrar una flag dentro de un powerpoint relacionado con un argumento de ventas (sales pitch)? Copia la flag exactamente como la encuentres (sin usar el formato de flag actual).

El documento salespitch.pptx lo tenemos localizado en la carpeta Documents. Para el que no lo sepa, los documentos de versiones modernas de Office (entendiendo como moderno desde Office 2010 para arriba) son en realidad ficheros comprimidos en .zip, por lo que podemos descomprimirlo en una carpeta temporal.

# ls -laht
total 24K
drwxr-xr-x 5 root root 4.0K Aug 29 17:19 .
drwxr-xr-x 4 root root 4.0K Aug 29 17:19 ..
drwxr-xr-x 2 root root 4.0K Aug 29 17:18 _rels
drwxr-xr-x 7 root root 4.0K Aug 29 17:18 ppt
drwxr-xr-x 2 root root 4.0K Aug 29 17:18 docProps
-rw-r--r-- 1 root root 3.1K Jan  1  1980 [Content_Types].xml

Como nos han dicho que hay una flag, buscamos una flag:

# fgrep flag -R *
ppt/slides/slide1.xml:Some new product!<flag="welikeslidestoo"></flag="welikeslidestoo">

* Respuesta: <flag=»welikeslidestoo»></flag=»welikeslidestoo»>

26. jerry was a racecar driver

Tenemos un fichero con ese nombre en el Desktop del usuario Bob, así que vamos a ver de qué pie cojea:

# file "jerry was a race car driver"
jerry was a race car driver: DOS/MBR boot sector MS-MBR Windows 7 english at offset 0x163 "Invalid partition table" at offset 0x17b "Error loading operating system" at offset 0x19a "Missing operating system", disk signature 0x9005b55b; partition 1 : ID=0x7, start-CHS (0x0,2,3), end-CHS (0x2,254,63), startsector 128, 55296 sectors

No tengo del todo claro qué es lo que es, ni cómo voy a abrirlo, pero por si acaso le voy a tirar un strings nada más empezar a ver si suena la flauta:

# strings -n 8 "jerry was a race car driver" |grep flag
flag<nascar_murica>

Tri-lu-lí (dedicada al niño de dos plantas más abajo de mi casa que está aprendiendo a jugar la flauta)

* Respuesta: nascar_murica

Conclusiones

Dada la limitación temporal que me había autoimpuesto, este año le he terminado dedicando unas 30-35h al reto. Un poco menos que el año pasado, pero también nos hemos dejado algunas preguntas en el tintero…

Sí que he apreciado una clara diferencia de la dificultad de los cuatro niveles disponibles: el nivel de Linux era MUY sencillo, el de análisis de la memoria era bastante asequible (y lo recomiendo para cualquiera que trabaje con Volatility, es un entrenamiento al alcance de todos). Dentro de los dos Windows teníamos preguntas muy sencillas y algunas de las que se llaman en los CTF “de idea feliz” (o se te aparece la Virgen o no las sacas). Pero bueno, es algo habitual en casi todos los retos.

Sigo manteniendo mi idea del año pasado: estos CTF forenses son una oportunidad excelente para hacer didáctica de cómo gestionar un incidente. A lo largo de todas las preguntas he ido descubriendo evidencias del incidente que, aunque he dejado de lado porque no correspondían a ninguna pregunta, me habían dado una cierta idea de lo que había ocurrido realmente.

Si se orquestaran las preguntas alrededor del “¿qué ha pasado aquí?”, se podría crear una narrativa que guiara a los participantes del reto en la misma línea en la que lo haría un investigador, conformando una herramienta de entrenamiento estupenda (sí, me sale la vena docente, es lo que tiene).

Como conclusión final, el reto deja un buen sabor de boca (aunque 84 preguntas hace que a veces sea como correr una maratón), y deja algunas herramientas nuevas e ideas para aprender a hacer mejores retos… así que el año que viene, volveremos a por más.