Write-ups del Ciberseg '17: forense
Estos son los retos de análisis forense que formaron parte del CTF organizado en el Ciberseg 2017, un congreso sobre ciberseguridad que tiene lugar cada año en nuestra universidad.
El año pasado fue la primera edición (y espero que haya más, pues fue bastante divertido) del CTF (y yo gané el primer premio :D).
Primer reto: Living in the fast lane
Materiales
Para este reto, nos dieron un juego que puede ser descargado en las siguientes versiones:
El reto
Tras examinar todos los ficheros y buscar cadenas en ellos, sin ningún resultado, podemos empezar a intentar mirar en los archivos del juegos.
Este juego fue escrito con el motor renpy. Este motor usa
un archivo especial para almacenar todos los datos usados en el juego. En este fichero,
archive.rpa
, la información se guarda comprimida. Para descomprimirla, podemos usar
una de las herramientas disponibles, como
rpatool.
Descomprimiendo este fichero, podemos ver la siguiente lista de archivos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ ./rpatool -l archive.rpa
icon.png
resources/backgrounds/bedroom.jpg
resources/backgrounds/bedroom_dark.jpg
resources/backgrounds/dorm_hallway.jpg
resources/backgrounds/lecture_front.png
resources/backgrounds/lecture_hall.jpg
resources/backgrounds/menu.png
resources/backgrounds/uni.jpg
resources/characters/jobs/jobs.png
resources/characters/jobs/jobs_gun.png
resources/characters/jobs/jobs_gun_fire.png
resources/characters/jobs/jobs_side.jpg
resources/characters/lain/lain_relaxed_side.png
resources/characters/stallman/stallman.png
resources/characters/stallman/stallman_angry - Copy.png
resources/characters/stallman/stallman_angry.png
resources/characters/stallman/stallman_embarrassed.png
resources/characters/stallman/stallman_embarrassed_side.png
resources/characters/stallman/stallman_shocked.png
resources/characters/stallman/stallman_shocked_side.png
resources/characters/stallman/stallman_sicp.png
resources/characters/stallman/stallman_side.png
resources/characters/stallman/stallman_side_angry.png
resources/characters/torvalds/torvalds.png
resources/characters/torvalds/torvalds_angry.png
resources/characters/torvalds/torvalds_card.png
resources/characters/torvalds/torvalds_side.png
resources/flag.png
resources/music/main_menu.ogg
resources/sounds/breathing.ogg
resources/sounds/door-open.wav
resources/sounds/reee.ogg
$
Y ahí está, en la línea 29: resources/flag.png
. Y es una imagen. Por eso no podíamos
obtener la respuesta buscando strings.
Al extraer los ficheros obtenemos la siguiente imagen con la respuesta:
La bandera es: flag{4077fb6a74ea5a5b6ac7d0b74e5a379d}
Segundo reto: Mimikatz
Materiales
Para este segundo reto, tenemos que descargar una imagen de una RAM (159.5 MB), donde se nos dice que quizá podamos ‘recuperar algunas contraseñas’. Parece que la bandera es una de las contraseñas.
El reto
En este reto usaremos volatility, un framework para herramientas de análisis forense de memoria. Antes que nada, vamos a determinar el perfile de la imagen de memoria para poder realizar el resto de las pruebas con precisión. Para ello, podemos usar el plugin ‘imageinfo’:
$ volatility -f ram1.mem imageinfo
Volatility Foundation Volatility Framework 2.5
INFO : volatility.debug : Determining profile based on KDBG search...
Suggested Profile(s) : Win7SP0x86, Win7SP1x86
AS Layer1 : IA32PagedMemoryPae (Kernel AS)
AS Layer2 : FileAddressSpace (./ram1.mem)
PAE type : PAE
DTB : 0x185000L
KDBG : 0x82961c30L
Number of Processors : 1
Image Type (Service Pack) : 1
KPCR for CPU 0 : 0x82962c00L
KUSER_SHARED_DATA : 0xffdf0000L
Image date and time : 2017-01-09 13:03:38 UTC+0000
Image local date and time : 2017-01-09 05:03:38 -0800
Aunque puede ser incorrecto (en cuyo caso deberíamos intentar otro perfil), empezaremos a trabajar bajo el supuesto de que es una imagen de Windows 7, ServicePack 0, x86.
En este punto hay dos aproximaciones diferentes que podemos tomar.
Primera aproximación
El método más directo (pero no el mejor) es volcar todas las contraseñas e intentar crackearlas, esperando que una de ellas tenga el formato ‘flag{…}’. Con este objetivo en mente, volcamos primero las contraseñas en el sistema:
$ volatility -f ram1.mem --profile Win7SP0x86 hashdump
Volatility Foundation Volatility Framework 2.5
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
IEUser:1000:aad3b435b51404eeaad3b435b51404ee:ea0026d2bc07d7f56ea8e3599cabed43:::
Ahora sólo tenemos que crackear los hashes usando la herramienta que queramos, como
hashcat, usando el filtro incremental flag{?a?a?a?a?a?a?a?a?a?a}
, que buscará todas
las posibilidades desde flag{a}
hasta flag{~~~~~~~~~~~}
. Con esta regla, la
contraseña se saca en un par de horas. Sin embargo, este incremento se puede (y debería)
hacerse de manera manual, para evitar que hashcat pruebe contraseñas que no acaben en
‘}’. Esto no es un problema hasta que alcanza una máscara con 6 elementos ‘?a’, donde
tarda horas en realizar la búsqueda. Afortunadamente, encontramos la bandera en el primer
intento usando hashcat -m 1000 -a 3 -o cracked ctf.hashes flag{?a?a?a?a?a}
, tardando
sólo un par de minutos:
Segunda aproximación
Tal y como sugiere el nombre del reto, también podemos usar mimikatz, una herramienta para sacar las contraseñas de los usuarios con una sesión iniciada (explotando vlnerabilidades de Windows, por supuesto). Hay un plugin para volatility que podemos usar; y podemos obtener la respuesta en segundos:
$ volatility --plugins=/usr/share/volatility/contrib/plugins/ -f ram1.mem --profile=Win7SP0x86 mimikatz
Volatility Foundation Volatility Framework 2.5
Module User Domain Password
-------- ---------------- ---------------- ----------------------------------------
wdigest IEUser IE8Win7 flag{cadia}
wdigest IE8WIN7$ WORKGROUP
En cualquier caso, la bandera es: flag{cadia}
.
Tercer reto: TrueCrypt
Materiales
De nuevo, debemos descargar (55 MB + 1.2 GB) una imagen de una RAM y un directorio cifrado, “MyDocuments”; y debemos recuperar la contraseña de la memoria para poder descifrar estos archivos.
El reto
Para este reto vakos a usar de nuevo el framework volatility, ya que el título de este reto sugiere que tiene algo que ver con TrueCrypt (quizá tenemos que encontrar las claves de cifrado…), y volatility tiene un par de plugins para obtener las contraseñas, que son almacenadas en claro en la memoria.
La imagen parece estar corrupta, porque no puedo leer los datos de ella. En cualquier
caso, la solución es bastante simple: usando el plugin truecryptpassphrase
se obtienen
las contraseñas para descifrar el archivo. La clave debería ser GetRektTrueCrypt7.0
.
Después sólo tenemos que usar TrueCrypt para descifrar MyDocuments
y encontrar el .txt
con la bandera:
flag{useVeracrypt}
.
Cuarto reto: MrRobot
Materiales
Para este reto sólo necesitamos este archivo zip, con un archivo de audio dentro.
El reto
Después de trastear un rato, no podemos encontrar nada interesante (ni en los metadatos, ni buscando strings, ni en el espectrograma).
El nombre de este reto nos da una pista, puesto que el personaje principal de la serie Mr. Robot usa un programa llamado DeepSound para ocultar información en archivos de música.
Como los datos están sin cifrar, podemos simplemente extraerlos y obtener la bandera:
Y tenemos la última bandera de este conjunto de retos:
flag{thelannistersendtheirregards}
.