WriteUp Forensic100 - Nuit Du Hack 2011
Abril 3, 2011
Este fin de semana se llevó a cabo las prequals para Nuit Du Hack, una de las conferencias de seguridad informática más antiguas de Francia.
La modalidad de la prequal: CTF, que consiste en una serie de retos donde se debe encontrar una bandera para ir escalando posiciones en el ranking.
En este caso nos enfrentamos a doce retos en cuatro categorías, este es el resumen de los retos que logramos realizar, logrando 1400 puntos y ocupando el puesto número doce.
Web
Inyección + serialize
Inyección a través de imágenes
Inyección a través de cookies
Forensics
Análisis del dump de memoria encontrando la clave del servidor VNC
Obtención de clave de usuario encontrada en ntds.dit (Active Directory)
Análisis del dump de memoria encontrando el proceso sospechoso
Crypto
Texto cifrado con Vigenere
RCE
Ingeniería inversa al archivo para encontrar la clave de acceso
Ingeniería inversa a una aplicación para Android
Ingeniería inversa a un juego para Nintendo DS
WriteUp Forensic100
Descripción
We have dumped the RAM of a Machine on which was running a VNC server.
The goal is to get the password of that VNC server.
Resolución
Lo primero que hice fue descargar una herramienta que me permitiera por cada proceso separar la memoria que ocupaba en el dump de la RAM, tal herramienta se llama Memoryze.
Entre las características de Memoryze podemos encontrar que puede listar el espacio de direcciones virtuales y mostrar tanto las DLLs cargadas como las porciones de memoria del programa deseado.
Memoryze trae una serie de archivos batch que nos ayudan a obtener estos espacios de memoria, se usó el archivo ProcessDD.bat de la siguiente forma:
ProcessDD.bat -input C:\dump.raw -process winvnc4.exe
El programa creó una carpeta de auditoría que contenía:
El programa ejecutable
Las bibliotecas cargadas por el programa
La pila de ejecución del programa
Los resultados del análisis
Como mi especialidad no es el análisis forense lo que hice fue un ataque de fuerza bruta sobre la pila de ejecución del programa (Archivos .VAD) en busca de 8 bytes que representan la contraseña cifrada del servidor VNC.
La contraseña es cifrada mediante el algoritmo DES (Modo ECB) usando la llave fija "\x17\x52\x6B\x06\x23\x4E\x58\x07" a la que anteriormente se reversó cada uno de sus bits (En el código pueden ver la función bit_mirror usada para reversar los bits de una cadena)
El código usado para hacer fuerza bruta fue el siguiente
//Fixed key with reversed bits
$key = bit_mirror("\x17\x52\x6B\x06\x23\x4E\x58\x07");
//Directory of audit generated by Memoryze
$audit_dir = "./20110401234944";
$d = dir($audit_dir);
//Loop through files in audit directory
while (false !== ($entry = $d->read())) {
if ($entry != '.' && $entry != '..' && substr($entry, -3) == 'VAD') {
//Read virtual address descriptor
$file = file_get_contents("./20110401234944/$entry");
//Obtain eight bytes that could match VNC password hash
preg_match_all('/\x00([\x00-\xff]{8})/', $file, $match);
//Loop through hashes
foreach ($match[1] as $hash) {
$decrypted = mcrypt_decrypt(MCRYPT_DES, $key, $hash, MCRYPT_MODE_ECB);
//Save possible answer if decrypted text contains printable characters
if (printable($decrypted))
file_put_contents('possible_answers_vnc.txt', $decrypted . "\n", FILE_APPEND);
}
}
}
//Return true if all characters in string are printable
function printable($string) {
$len = strlen($string);
for ($i = 0; $i < $len; $i++) {
if (ord($string[$i]) < 32 || ord($string[$i]) > 127)
return false;
}
return true;
}
//Return string with reversed bits
function bit_mirror($str) {
$tmp = '';
$len = strlen($str);
for ($i = 0; $i < $len; $i++) {
$ord = ord($str[$i]);
$tmp .= chr((($ord * 0x0802 & 0x22110) | ($ord * 0x8020 & 0x88440)) * 0x10101 >> 16);
}
return $tmp;
}
Al realizar el ataque por fuerza bruta encontramos en el archivo "possible_answers_vnc.txt" las posibles contraseñas para el servidor VNC
Q\D!J>'
*@W+SZXT
f-XjyB9E
rgO.;o1k
K]oo=~W`
f-XjyB9E
&dSD uNT
secretpq
b#<1?~_#
\q*QqXh
La contraseña usada entonces fue "secretpq" que corresponde al hash "\xDA\x6E\x31\x84\x95\x77\xAD\x6B" y que además se encuentra en el archivo "1696__SystemMemory%5c0x008c0000-0x008cffff.VAD"
Bandera
secretpq
Archivado en: Criptografía, Programación, Retos informáticos, Seguridad |
sensacional!!!
muy buen código, que imaginación la tuya!!
Gracias por compartir.
SUper bueno y yo me mate tratando de sacarlo con el Volatility pero pailas escasamente pude ver las cadenas de registro, y gracias a este tipo de write ups aprendo dia a dia alguas ptras opciones.
Gracias.
Felicidades! cada vez llegan más lejos. Espero puedan sacar el writeup del Forensic300
[...] Pueden ver un resumen de las prequals en el sitio de HackerzVoice, durante toda la competencia estuvimos entre los primeros equipos. Daniel publicó la lista de retos que se solucionarón y el Write Up del reto forensics 100. [...]