Descripción del Reto:
Una empresa crea su propio sistema de cifrado de comunicaciones y lo utiliza para que un cliente/empleado les envíe diariamente un mensaje.
Una de esas comunicaciones es interceptada por un 'intruso' y además copia el código fuente del software utilizado para dichas comunicaciones entrando en un servidor de la empresa.
Para resolver el reto se pide que obtengamos la password (shared secret) utilizada por ambas partes (cliente/servidor) para iniciar la autenticación, así como la clave usada para cifrar los mensajes.
Para ello nos dan un archivo PCAP con las tramas capturadas y, el código fuente del software de comunicación.
He de decir, que este reto me ha parecido muy sencillo debido principalmente, a la cantidad de información (pistas) proporcionadas, no obstante ha sido igualmente entretenido (gracias por prepararlo).
Primera Parte
Lo primero que hice fue echar un vistazo al PCAP con un tiburón. Rápidamente localizamos los protocolos que intervienen en las comunicaciones entre cliente y servidor y vemos como se envían una serie de 'comandos' tipo HELO, RESP, AUTH OK, etc
Echando un vistazo a los programas vemos que en uno de los paquetes se envía un número que es aleatorio, y un HASH que se crea a partir del número aleatorio y la password (shared secret).
Datos extraídos de uno de los paquetes: 52:45:53:50:20:cb:4e:fa:38:89:20:33:a4:34:3b:fe:c9:47:70:16:09
52=R, 45=E, 53=S, 50=P, 20=ESPACIO el resto cb:4e...16:09 es el hash de tipo MD5(valor_aleatorio:password)
Lo que hice fue aprovechar el propio código fuente proporcionado y utilizar su función HMAC(...) para ir generando hash "bruteforceando" la password, eso sí salían más de 78.000 millones de combinaciones posibles (36 caracteres alfanuméricos 'abcdefghijklmnopqrstuvwxyz0123456789' en grupos de 7 = 36^7 = 78.364.164.096), por lo tanto se podría recurrir a algún servicio en la nube para obtener el MD5.
Aquí el resultado de la ejecución del programa generador de pass:
Yo empezé generando passwords comenzando por 'aaaaaaa' con lo cual era cuestión de tiempo sacar la password original utilizada en la comunicación interceptada. La cual resultó ser: bm28lg1
Segunda Parte
Una vez que obtenemos la password, averiguar la clave de cifrado de mensajes fue más sencillo todavía. En mi caso, lo que hice fue utilizar los dos programas proporcionados AuthClient y AuthServer pero modificando el AuthServer para que en lugar de generar el número aleatorio, enviase siempre el número que saqué de la captura PCAP (448). De esta forma generaría el mismo hash:
MD5("448bm28lg1") = "cb4efa38892033a4343bfec947701609"
Puse a funcionar el servidor modificado utilizando como password 'bm28lg1'
A continuación, utilizando la misma password ejecute el cliente AuthClient:
Y ¡voilá! ya tenemos todos los datos que se pedían en el reto
Password: bmp28lg1
Session Key: 07e0f7a7cbc2d8b3dba6b7d3b69c3236
Realmente estuvo entretenido y si a alguien le sirve de algo pues me alegro.
Comentarios
Publicar un comentario