Contenido principal

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
:arrow: Inyección + serialize
:arrow: Inyección a través de imágenes
:arrow: Inyección a través de cookies

Forensics
:arrow: Análisis del dump de memoria encontrando la clave del servidor VNC
:arrow: Obtención de clave de usuario encontrada en ntds.dit (Active Directory)
:arrow: Análisis del dump de memoria encontrando el proceso sospechoso

Crypto
:arrow: Texto cifrado con Vigenere

RCE
:arrow: Ingeniería inversa al archivo para encontrar la clave de acceso
:arrow: Ingeniería inversa a una aplicación para Android
:arrow: 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:
:arrow: El programa ejecutable
:arrow: Las bibliotecas cargadas por el programa
:arrow: La pila de ejecución del programa
:arrow: 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

<?php
//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 |

4 comentarios

  1. zarek Abril 4, 2011 @ 12:14 am

    sensacional!!!
    muy buen código, que imaginación la tuya!!
    Gracias por compartir.

  2. Kagure Abril 4, 2011 @ 11:19 am

    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.

  3. Juan Escobar Abril 4, 2011 @ 12:16 pm

    Felicidades! cada vez llegan más lejos. Espero puedan sacar el writeup del Forensic300 :)

  4. stuff » Nuit Du Hack 2011 Prequals Abril 10, 2011 @ 11:32 pm

    [...] 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. [...]

Deja un comentario