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);
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrHvbkgkzpge8IjTFEYYcm4pZ9xk8ZFiJadd4-NvSG_nDv5CZVEmD_xVracfHx0Fmdsk-iGo38n2bAWejBgvXmLRKgLBsbn1ZSui6SJY-Q0jlVib11kJ3m8sUziURrGhLfKi6KSg/s280/hash.JPG) |
Figura 1: Hash en captura pcap |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZLoojNyPHZ3K7WsodyzpPGZeeZCk9tsr7ozwf25j3noCnFqyTQuSPoauN4hTbvpY6uGyik7DQu7k7AYU09uOKII9z-2g93m4DdN1FWnVDFXuXuYsZ0_Y2sQ3LXpsxqC6gmvS64Q/s280/puerto448.JPG) |
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX1HMnKObQ5zFHd65fqi6hB3sIzX2K5v1TA_I_INwpJs0-irBBr01SLsXy-0XqeyHJ7OeoOT6hcKEYIPdy4TIJMIyRf8PK30qH6tUK4JwIH7qlnGsdkTp5AZg1WGG3Lz5UlDk0CQ/s280/cambioRandomPor448.JPG) |
Figura 3: Configurando el valor "random" del código por el valor 448 que se utilizó |
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYYe8CMrz845PPhwMaGViKTdfluy4jnX2viTBGrGq1aD7roGbkXHg_cRRQXYpiTeo3NNwKeJ1qymr3_l6qM-6xkEom2yrAxJ39qoIVFqTjUa47A9GbkzSMKa4Trhp1UsT7NnogoQ/s280/sessionKey.JPG) |
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
Que buena explicacion, ahora a ponerla en practica..
ResponderEliminarGracias por compartir
sigue compartiendo, gracias
ResponderEliminaradrian