Recientemente me he encontrado con un punto de acceso con configuración WPA2 Enterprise y autenticación EAP-MD5. Seguramente uno de los últimos que quedan, ya que está configuración es insegura, incluso más que WEP. Pero para mi sorpresa, la contraseña era bastante robusta.
Antes de entrar al tajo, permitidme que haga una pequeña introducción.
Tanto WPA como WPA2 soportan dos métodos de autenticación distintos:
1.- Contraseña compartida o PSK de sus siglas Pre Shared Key, tan simple como que ambas partes, punto de acceso y todos los clientes, conocen la contraseña. Siempre la misma.
2.- "Enterprise" ó 802.1x, donde mediante un segundo servicio de autenticación denominado radius se valida cada uno de los distintos usuarios y sus contraseñas usando alguna de las extensiones disponibles en EAP (Extensible Authentication Protocol). Una de estas extensiones es MD5.
En el caso de EAP-MD5, la comprobación de estas credenciales se hace mediante un desafío y su respuesta de la siguiente forma:
- Hasta que se ha realizado la validación el punto de acceso tan solo transmite desde el radius hasta el cliente sin intervenir en el proceso.
- El primer paso es la identificación del cliente que trata de conectar con el nombre de usuario "Identity" hasta el radius.
- El radius contesta con un paquete que contiene el identificador de la petición, por ejemplo la "1", y un desafío que es hash md5 obtenido al azar, por ejemplo: 6119212b50e2c9eba01fd618288f316c
- El cliente obtiene ambos valores y junto a la contraseña, por ejemplo "test", genera un nuevo hash de la siguiente forma: md5(requestid + contraseña + desafío), lo que se traduce como: md5(\x01test\x61\x19\x21\x2b\x50\xe2\xc9\xeb\xa0\x1f\xd6\x18\x28\x8f\x31\6c) y lo manda nuevamente al radius. En el ejemplo anterior: a4f3d177f37cff946daa45b8327e80c8
- El radius hará el mismo md5 con la contraseña que él conoce para ese usuario y si obtiene el mismo hash que le mandó el cliente como respuesta (a4f3d177f37cff946daa45b8327e80c8), es que la contraseña es válida.
Esquema de 802.1x (imagen de http://www.juansa.net/) |
Todo este tráfico se manda en texto claro, por lo que una captura de como conecta un cliente permite generar fácilmente un ataque de diccionario sobre la contraseña, generando tantos md5 como sean necesarios hasta que se obtenga el mismo que el cliente mandó en el último paso.
Con este concepto hay un par de scripts: eapmd5crack y eapmd5pass que hacen la labor. Pero por desgracia estas utilidades no están optimizadas para probar un elevado número de contraseñas en poco tiempo.
Para intentar optimizar el proceso he modificado eapmd5crack. Ahora en vez de tratar de obtener la contraseña directamente, creara la configuración necesaria para ejecutar posteriormente hashcat (en caso de CPU) o oclhashcat si disponemos de GPU mostrando el comando a ejecutar.
El script está disponible en el repositorio de SbD.
epamd5hcgen.py |
Respondiendo a un comentario añado esta información explicando los parámetros de hashcat:
- -m 10: que identifican que es un MD5 del tipo hash:salt
- --quiet: para que no muestre la salida completa y solo el resultado.
- --hex-salt: para indicarle que el salt (challange enviado por el radius) es binario y no un string en hexadecimal
- --outfile-format 7: para que muestre la salida con el resultado también en hexadecimal
- ToPwn: es el fichero que contiene el hash:salt
- /usr/share/wordlists/rockyou.txt: el diccionario
- -r eap.rule: se utiliza para añadir el ID del paquete al inicio de cada palabra probada.Necesario como se vio en la explicación de como se compone el MD5.
- awk...sed, simplemente es para eliminar de la contraseña el ID del paquete.
5 comments :
Muy buen trabajo! menuda currada :)
Gracias!
Ya lo he añadido.
El Radius tiene la contraseña del usuario en texto plano?
Correcto.
¿Intentaste http://hashtoolkit.com para revertir los hashes MD5? Funciona increíblemente rápido.
Publicar un comentario