viernes, junio 22, 2012

Una solución al reto de Cripto de SensePost

En verdad el reto de criptografía de Sensepost no es muy difícil. Después de leer la entrada pensé que quizás era alguna debilidad en un algoritmo casero de criptografía, pero no. Basicamente la cosa va así:
1) Cliente dice HOLA a servidor
2) Servidor contesta con un num aleatorio entre 1 y 1000
3) Cliente genera un paquete con "RESP " + hash(numero_aleatorio, clave)
4) Servidor calcula el mismo hash por si mismo y lo compara con el recibido.
- Si son iguales genera una session key así: hash( hash_anterior, clave, kc );
- El algoritmo de hash no es más que un md5($salt . $clave);

Figura 1: Hash en captura pcap
Figura 2: Número aleatorio de inicialización en la captura

- Puesto que tenemos el número aleatorio que envía el servidor en el archivo pcap (448) y el hash con el que compara (cb4efa38892033a4343bfec947701609), lanzamos un crackeador que tenga ese formato, por ejemplo, hashcat.

$ ./hashcat-cli64.bin -m 2 -a 3 ~/hashfile -e ~/saltfile --pw-min=7 --pw-max=7 -1=?l?d ?1?1?1?1?1?1?1 
Initializing hashcat v0.39 by atom with 8 threads and 32mb segment-size...
NOTE: press enter for status-screen
Added external salts from file /home/D/saltfile: 1 salts
Added hashes from file /home/D/hashfile: 1 (1 salts)
Activating quick-digest mode for single-hash
Input.Mode: Mask (?1?1?1?1?1?1?1)
Index.....: 0/1 (segment), 94931877133 (words), 0 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: - plains, 36.59M words
Progress..: 46851708/94931877133 (0.05%)
Running...: 00:00:00:01
Estimated.: 00:00:43:13
Input.Mode: Mask (?1?1?1?1?1?1?1)
Index.....: 0/1 (segment), 94931877133 (words), 0 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: - plains, 36.78M words
Progress..: 898263584/94931877133 (0.95%)
Running...: 00:00:00:25
Estimated.: 00:00:42:36
Input.Mode: Mask (?1?1?1?1?1?1?1)
Index.....: 0/1 (segment), 94931877133 (words), 0 (bytes)
Recovered.: 0/1 hashes, 0/1 salts
Speed/sec.: - plains, 36.79M words
Progress..: 5867093480/94931877133 (6.18%)
Running...: 00:00:02:40
Estimated.: 00:00:40:21
cb4efa38892033a4343bfec947701609:448:bm28lg1
All hashes have been recovered

Y ya tenemos la clave secreta. Para generar la clave de sesión, basta con que pongamos el valor numérico en el código de servidor a 448 (el valor original) en vez de dejar que se genere uno aleatorio, e iniciarlo con la clave descifrada, el mismo programa te genera la session key.

Figura 3: Configurando el valor "random" del código por el valor 448 que se utilizó

Figura 4: Ejecución de Cliente y Servidor para obtener la clave de sesión

Ahora ya tenemos la clave que se usó y la Session Key de la comunicación con la que descifrar el mensaje oculto en el archivo pcap.
Clave: bm28lg1
Session: 07e0f7a7cbc2d8b3dba6b7d3b69c3236
Diego Marañón

Actualización: Ya está publicada la solución oficial

2 comentarios:

  1. Que buena explicacion, ahora a ponerla en practica..
    Gracias por compartir

    ResponderEliminar
  2. sigue compartiendo, gracias

    adrian

    ResponderEliminar