lunes, 6 de junio de 2011

SANS Forensic Contest #8 (Solución)

Me encantan los retos de seguridad de todo tipo, de Hacking, de Forensics, de lo que sea, y concretamente siempre me parecen muy "reales" e interesantes los retos que pone la gente del SANS en su web ForensicContest.Com.

Hace poco pusieron su Puzzle #8, en el que nos proporcionaban una captura de red de una Wifi sobre la que ha ocurrido cosas extrañas. Concretamente, el único usuario legítimo de la red, con MAC 00:11:22:33:44:55, notifica que de repente no puede entrar a su propia red.

En el reto, te piden que contestes una serie de preguntas, pero como no tengo demasiado interés en participar en el reto yo me quedo con las preguntas que me parecen más interesantes:
  1. SSID y BSSID de la Wifi
  2. Clave de Citrado de la Red Wifi
  3. Clave de Gestión del Punto de Acceso
  4. Nueva Clave del Punto de Acceso
  5. Otras acciones
Bueno, pues como dijo Jack el Destripador, "vayamos por partes":

SSID Y BSSID DE LA WIFI

Podríamos irnos a fichero PCAP y extraer de ahí esta información, pero vamos ha hacerlo de una forma mucho más sencilla con Airodump, al que le podemos pasar como parámetro que lea de una captura de red en lugar de directamente de la red:

$ airodump-ng -r evidence08.pcap


Como podeis ver, de lanzar este comando ya podemos sacar gran parte de la información, entre ella que el SSID de la red es "Ment0rNet" y que el BSSID es "00:23:69:61:00:D0" (la MAC del punto de acceso).

Algo muy interesante que tiene esta manera de ver la captura de red es que vamos viendo "en tiempo real" como se van generando los paquetes y como fuere ocurriendo todo. Entre otras cosas podemos ver como los #Data crecen de forma rapidísima, lo cual, siendo un cifrado WEP nos hace ver que casi con toda seguridad se trataban de un ataque estadístico con inyección de paquetes ARP, pero eso lo vemos ahora enseguida.

ROTURA DEL CIFRADO

Como estábamos comentando, vemos que la cantidad de paquetes crecen de forma rapidísima. Esto es típico de los ataques que hacen replay de paquetes ARP para aumentar el tráfico de red y así obtener los IVs necesarios para romper la clave WEP de forma más rápida. Para comprobarlo vamos a ver como fueron los paquetes ARP de la captura de red que tenemos, a ver si se confirma nuestra teoría.

Abrimos el fichero de captura con Wireshark y nos vamos a la opción Statistics->Conversations->WLAN y ordenamos por la columna "packets" para que se nos quede la comunicación de más tráfico arriba. Filtramos por el tráfico intercambiado entre estas dos MACs y vemos muchísimos paquetes idénticos con destino a la dirección FF:FF:FF:FF:FF:FF que tienen toda la pinta de ser replays de paquetes ARP, porque además su contenido cifrado es idéntico en todos ellos:


Bueno, pues si este tío ha generado los suficientes IVs como para romper la clave WEP y acceder a la red... nosotros tenemos la captura con los mismos datos que él ha empleado para romper la clave, así que deberíamos ser capaces de romperla nosotros también, algo que va a ser necesario para poder ver lo que ha pasado una vez que el intruso ha entrado en la red.

En realidad, en una situación real, probablemente sería más correcto pedirle a nuestro cliente que nos proporcionara la clave, pero romperla siempre es más divertido :)

$ aircrack-ng evidence08.pcap


La clave WEP es "D0:E5:9E:B9:04", así que teniendo la clave de la Wifi ahora lo que tenemos que hace es descifrar todo el tráfico para poder analizar la captura de red.

Podríamos hacerlo con las opciones de Wireshark, pero casi que prefiero tener un PCAP descifrado como si fuera tráfico ethernet, para así poder analizarlo con el programa que quiera, así que mejor vamos a seguir utilizando herramientas de la suite Aircrack:

$ airdecap-ng -e Ment0rNet -w "D0:E5:9E:B9:04" evidence08.pcap
Total number of packets read 133068
Total number of WEP data packets 56692
Total number of WPA data packets 0
Number of plaintext data packets 0
Number of decrypted WEP packets 56692
Number of corrupted WEP packets 0
Number of decrypted WPA packets 0

Esto nos ha generado un fichero "evidence08-dec.pcap" que contiene el tráfico que estaba cifrado con esa clave WEP, pero descifrado, como si lo hubiéramos capturado desde una interface ethernet.

CLAVE DE GESTIÓN DEL AP

Ahora que ya tenemos el tráfico descifrado, vamos a abrirlo con Wireshark. Como sabemos que algo raro ha pasado con el AP, es bastante probable que el intruso haya accedido a él, así que filtramos por la IP del Gateway (192.168.1.1) y vemos tráfico HTTP entre este y una IP desconocida, con una MAC diferente a la del usuario legítimo.

Observando cualquiera de las peticiones que hace y haciendo un "Follow Stream" podemos ver la clave que se ha utilizado para acceder al punto de acceso:


Como se puede ver se trata de Autenticación Basic, que por definición simplemente se trata del usuario y la contraseña separados por dos puntos y codificado todo en Base64, así que solo tenemos que decodificar esa Base64 para saber que contraseña tenía el AP:

$ echo YWRtaW46YWRtaW4= | openssl base64 -d
admin:admin

Como no... parece que la contraseña de gestión del AP era la contraseña por defecto, o al menos tiene toda la pinta, así que el intruso lo ha tenido bastante más fácil para acceder. Veamos que hizo el intruso con el AP...

NUEVA CLAVE DEL AP

Para ver todas las peticiones HTTP podemos usar el filtro de Wireshark "http.request", y veremos a la derecha todas las peticiones. Pasamos de todo lo que sea gif y similar, y buscamos peticiones GET con parámetros o peticiones POST, y al final llegamos a una petición POST.


Parámetros POST:
SecurityMode=3&CipherType=1&PassPhrase=hahp0wnedJ00&GkuInterval=3600&layout=en

Bueno, parece que la clave la tenemos, pero además de la clave vemos que ha cambiado más opciones, como "SecurityMode" y "CipherType", que podemos sospechar que son pero que mejor si nos aseguramos, así que vamos a mirar el referer de esta petición a ver si vemos el formulario que ha estado tocando el atacante:


Vale, pues vamos a mirar la petición a WSecurity.htm y vamos a salvarla en un fichero, a ver que pinta tiene. Yo personalmente para estas cosas suelo utilizar Xplico, una herramienta que me gusta bastante para hacer análisis forense de red, pero en esta ocasión no me ha sacado las cosas como yo quería (reportaré el bug), así que vamos a sacarlo un poco a mano, así que vamos a buscar en el cuerpo del HTML como se llaman los campos del formulario que el intruso ha cambiado:

SecurityMode=3 -> WPA2 Personal
CipherType=1 -> AES
PassPhrase=hahp0wnedJ00 -> WPA SKey

Parece ser que lo que ha hecho nuestro intruso es cambiar el cifrado del punto de acceso a un cifrado WPA2, y por supuesto a partir del momento del cambio de clave no vamos a ver nada en el fichero de captura que hemos sacado descifrando el cifrado WEP.

OTRAS ACCIONES

Sin embargo... tenemos la clave WPA, así que podemos descifrar el tráfico igual que hemos hecho antes. Vamos a ello!

$ airdecap-ng -e Ment0rNet -p "hahp0wnedJ00" evidence08.pcap
Total number of packets read 133068
Total number of WEP data packets 56692
Total number of WPA data packets 0
Number of plaintext data packets 0
Number of decrypted WEP packets 0
Number of corrupted WEP packets 0
Number of decrypted WPA packets 0

Joder... que aguafiestas estos del SANS... no nos han metido el tráfico WPA en la captura, con la curiosidad que tenía en saber que más había hecho el intruso... en fin...

Como digo siempre, si tenéis comentarios que hacer o formas en la que lo hubierais hecho de forma más sencilla... decídmelo!

16 comentarios :

neofito dijo...

Creo que no deberias haberlo publicado, aun no se ha cerrado el plazo para el envio de soluciones.

Saludos

Jose Selvi dijo...

Ops! Bueno, lo hice cuando salió y puse fecha de publicación automática para cuando acabara el plazo, pero parece que han ampliado el plazo y no me he enterado :P

Bueno, ahora ya está publicado... que le vamos a hacer. La próxima vez no le pondré que se publique automáticamente y así lo revisaré antes.

Anónimo dijo...

El plazo terminaba el 31/05/2011.
Otra cosa es que haya algun tipo de acuerdo de no publicar nada antes de la fecha de publicacion oficial, pero no lo he visto

David A. dijo...

Muy buen articulo!

neofito dijo...

@Anonimo:

---
However, please do not publish the answers before the deadline, or you (and your team) will be automatically disqualified.
---
The new deadline is: June 30, 2011.
Same rules as before.
--

Evidentemente, y aunque la recomendacion no le afecta ya que parece que no va a participar estiy seguro que Jose Selvi, tal como ha explicado, no hubiera publicado el articulo si hubiera sido consciente de la extension del plazo.

Saludos

Jose Selvi dijo...

Exacto @neofito, en un principio resolví el reto y, viendo las fechas que comentaban, lo programé en Blogger para que se publicara ayer, fecha en la que ya se había cerrado el plazo para presentar soluciones.

El problema ha sido que han ampliado el plazo y no me he enterado, así que se ha publicado aún estando el plazo abierto :S

hecky dijo...

Veamosle por el lado bueno, esto servira de guia para los que quieran iniciar y hacer el reto y no sepan por donde =)

Ademas que es un reto sin resolucion??

@Jose solo hay una cosa que no entendi...en este comando

$echo YWRtaW46YWRtaW4= | openssl base64 -d

Como para que el "openssl" ?? Por cierto excelente articulo =) me encanta leerle

Saludos ;)

Jose Selvi dijo...

@hecky: Muchas gracias :)

El comando que usa openssl es para descifrar el Base64 de la autenticación Basic. La autenticación Basic de HTTP coge una cadena formada por usuario:contraseña y la encodea en Base64.

Como aún no he aprendido a encodear y desencodear Base64 de cabeza, pues utilizo OpenSSL xDDD Aunque podrías usar cualquiera de las webs que hay por ahí que lo hacen.

mgesteiro dijo...

una gran entrada Jose. Un 10 por ese estilo único que hace parecer fácil lo difícil.

Jose Selvi dijo...

Gracias @mgesteiro :)

Desde la Rooted que no nos vemos, a ver si coincidimos en algún tinglado pronto.

Saludos!

hecky dijo...

@Jose Selvi

Ya veo Jose Selvi a lo que yo iba es que no es necesario pasar el comando openssl, sino nada mas hacer el echo y pasarle la decodificacion

$echo "YWRtaW46YWRtaW4=" | base64 -d

Por eso se me hizo raro ver openssl


Por cierto si por alguna EXTRAÑA razon quisiera aprender a codificar en Base64 a mano :P puede leer la ezine 4 de DragonJar donde yo hice un articulo donde enseño eso xDD

http://bit.ly/mrTqiU


Saludos Jose ;)

Jose Selvi dijo...

@hecky: Es que en mi Mac no tengo ningún comando "Base64" xD. Lo puse utilizando OpenSSL porque me pareció lo más estandar, pero puede hacerse de muchas otras maneras, claro :)

hecky dijo...

:O hahaha ya todo me queda mas claro :P Por eso se me hacia raro, no sabia en MAC no estaba ese comando, entonces por eso me saco de onda :P

Gracias por la info, asi no vuelvo a hacer el "oso" preguntando "chorradas" xD

Saludos ;)

hecky dijo...

:O hahaha ya todo me queda mas claro :P Por eso se me hacia raro, no sabia en MAC no estaba ese comando, entonces por eso me saco de onda :P

Gracias por la info, asi no vuelvo a hacer el "oso" preguntando "chorradas" xD

Saludos ;)

Anónimo dijo...

If you use Xplico you have to disable ARP protocol. In this pcap there are many ARP request and all go to SQLite DB (=> slowdown).

Jose Selvi dijo...

@Anonimo: Xplico told me that parsing was finished, but connections didn't appear. I doesn't seems a slowdown problem.

Anyway, I will try to throw away ARP Requests by tcpdump, or to disable ARP Protocol.

Thanks for your advise :)