lunes, 17 de agosto de 2009

How to PASS wargame CP 2009: NETWORKING

Estas son mis soluciones (pueden haber mas y mucho mas efectivas) a los retos relacionados con el tema de redes del wargame de CP2009 VAL:

// RETO 1 //


Este primer nivel nos indica por donde empezar, claramente aparece linkeado un archivo .pcap el cual al buscar en algun sitio como este, nos podemos enterar que son archivos que contienen paquetes capturados por sniffers o por algo similar. Pues el siguiente paso es entonces encontrar un programa que pueda entender el archivo, para esto yo uso el programa wireshark, el cual funciona en casi cualquier sistema operativo y es software libre.

Al cargarlo en este programa y revisando las líneas de paquetes capturados podemos identificar tráfico HTTP, para esto usamos la opción del wireshark de reconstruir la sesión HTTP y de este modo entender que fue lo que sucedió en el momento que se capturaron los paquetes:


De la salida anterior podemos concluir que se trata de una petición GET a un archivo llamado Prueba1.rar y tambien podemos ver que hay un archivo llamado tegustamicucu.txt dentro de ese archivo .rar.

Podriamos pensar que la extención del archivo podria estar adulterada, sin embargo el encabezado del archivo parece ser un archivo .rar legitimo.

Que hacemos entonces?,

1. Debemos recuperar el archivo.

2. Debemos abrir el archivo .rar con un programa que lo permita.


Para recuperar el archivo podemos usar una herramienta llamada foremost, esta herramienta nos permite recuperar archivos de capturas .pcap (tambien sirve para mas cosas), así que hace justo lo que necesitamos. Para instalarla en un linux es muy simple, busca el paquete e instalala.

Para usarla:
root@plasma:/tmp# foremost -v -i prueba1.pcap
Foremost version 1.5.5 by Jesse Kornblum, Kris Kendall, and Nick Mikus
Audit File

Foremost started at Mon Aug 17 22:39:24 2009
Invocation: foremost -v -i prueba1.pcap
Output directory: /tmp/output
Configuration file: /etc/foremost.conf
Processing: prueba1.pcap
|------------------------------------------------------------------
File: prueba1.pcap
Start: Mon Aug 17 22:39:24 2009
Length: 1 KB (1387 bytes)

Num Name (bs=512) Size File Offset Comment

0: 00000001.rar 132 B 927 Password Protected:
*|
Finish: Mon Aug 17 22:39:24 2009

1 FILES EXTRACTED

rar:= 1
------------------------------------------------------------------

Foremost finished at Mon Aug 17 22:39:24 2009
root@plasma:/tmp#
En rojo resalto lo que nos interesa. El archivo recuperado queda en un directorio llamado output que se crea automaticamente en el directorio donde estamos ubicados.

root@plasma:/tmp/output/rar# pwd
/tmp/output/rar
root@plasma:/tmp/output/rar# ls
00000001.rar
root@plasma:/tmp/output/rar#
Ahora intentamos abrir el archivo:
root@plasma:/tmp/output/rar# unrar x 00000001.rar

UNRAR 3.80 freeware Copyright (c) 1993-2008 Alexander Roshal

Extracting from 00000001.rar

Enter password (will not be echoed) for tegustamicucu.txt:

Extracting tegustamicucu.txt 51%
Encrypted file: CRC failed in tegustamicucu.txt (password incorrect ?)
Total errors: 1
root@plasma:/tmp/output/rar#
Como ya sabiamos, el archivo tiene contraseña, entonces el ejercicio se vuelve un caso de fuerza bruta. Si pensamos que este era el primer nivel, entonces suponemos que la clave no puede ser muy compleja, de todos modos le corremos primero un diccionario, probamos algunas posibles palabras y si no, fuerza bruta hasta que reviente.

Podemos usar la herramienta rarcrack la cual requiere la libreria "libxml2-dev" para poderla compilar:
root@plasma:/tmp/rarcrack-0.2# make
gcc -pthread rarcrack.c `xml2-config --libs --cflags` -O2 -o rarcrack
rarcrack.c: In function ‘crack_thread’:
rarcrack.c:206: warning: comparison between pointer and integer
rarcrack.c:205: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result
rarcrack.c: In function ‘init’:
rarcrack.c:283: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘char (*)[300]’
rarcrack.c:317: warning: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result
root@plasma:/tmp/rarcrack-0.2# ls
CHANGELOG LICENSE Makefile rarcrack rarcrack.c rarcrack.h README README.html RELEASE_NOTES test.7z test.rar test.zip
root@plasma:/tmp/rarcrack-0.2#
root@plasma:/tmp/rarcrack-0.2# ./rarcrack 00000001.rar
RarCrack! 0.2 by David Zoltan Kedves (kedazo@gmail.com)

INFO: detected file type: rar
INFO: cracking 00000001.rar, status file: 00000001.rar.xml
...
Despues de un tiempo te vas a dar cuenta de que la fuerza bruta puede llegar a ser algo verdaderamente desesperante, entonces mejor volvemos al ataque de diccionario.

Puedes descargarte unas listas de contraseñas en este sitio. O puedes buscar palabras claves como wordlist, english passwords, spanish passwords o cualquier combinación que se te ocura en los torrents, hay archivos de varias gigas que te garantizan un rompimiento seguro.

Este ejercicio realmente lo rompi con un software en windows, que al parecer sigue siendo el mas rápido para los ataques de diccionario y fuerza bruta. El software en cuestión lo encuentran aquí. Pero como siempre, no esperen que sea gratis y mucho menos libre, pero garantizo que es efectivo.

Pero como tambien queria romperlo en unix, lo que hice fue usar el comando unrar pasandole como parámetro la posible clave de un diccionario hasta que alguna coincidiera:
#root@plasma:/tmp/rarcrack-0.2# cat script.sh
for i in `cat lista`
do
echo $i
unrar t $1 -o+ -p$i
done
root@plasma:/tmp/rarcrack-0.2#
Ese script lo que hace es invocar el comando unrar con cada palabra que encuentre en el archivo lista. Obviamente lista es nuestro diccionario de ataque.
root@plasma:/tmp/rarcrack-0.2# sh script.sh 00000001.rar >> prueba1.crack &
Encrypted file: CRC failed in tegustamicucu.txt (password incorrect ?)
Encrypted file: CRC failed in tegustamicucu.txt (password incorrect ?)

...
Todo el resultado del comando lo pondremos en prueba1.crack, allí buscaremos la palabra "All" la cual nos indicara que el archivo abrio completamente.
root@plasma:/tmp/rarcrack-0.2# grep All prueba1.crack
All OK
Busco el resultado en el archivo prueba1.crack y obtengo lo siguiente:
123456
UNRAR 3.80 freeware Copyright (c) 1993-2008 Alexander Roshal
Testing archive 00000001.rar
Testing tegustamicucu.txt ^H^H^H^H 51%^H^H^H^H^H OK
All OK
Esto nos dice que la clave que usó para abrir correctamente el archivo es: 123456.
Teniendo esta clave podemos abrir el archivo y leer el contenido que tiene:
root@plasma:/tmp/rarcrack-0.2# unrar x 00000001.rar
UNRAR 3.80 freeware Copyright (c) 1993-2008 Alexander Roshal
Extracting from 00000001.rar
Enter password (will not be echoed) for tegustamicucu.txt: (123456)
Extracting tegustamicucu.txt OK
All OK

root@plasma:/tmp/rarcrack-0.2# cat tegustamicucu.txt
PASS:paellitaDElaXXXXX
root@plasma:/tmp/rarcrack-0.2#


Conclusiones:

1. Un nivel normal para empezar :)
2. No encuentro aún un buen cracker de archivos .rar para sistemas unix, si alguien lo conoce, por favor use los comentarios para postear la referencia.

// FIN RETO 1 //

continuamos ...

// RETO 2 //

En este nivel podemos ver que tenemos las indicaciones para seguir, sin embargo mi problema fue que pense que la estación del metro de la que hablaban era en valencia, puesto que el nivel 1 hablaba que Deivid habia llegado a valencia. Esa interpretación me quito muuuuchooo tiempo, pero si solo tomas como pista la que te dice en el nivel no es tan complicado.

Realizamos lo mismo que en el reto 1, extraemos la información del archivo .pcap:

root@plasma:/tmp# foremost -t gif,jpeg -v -i prueba2.pcap
Foremost version 1.5.5 by Jesse Kornblum, Kris Kendall, and Nick Mikus
Audit File
Foremost started at Tue Aug 18 09:43:29 2009
Invocation: foremost -t gif,jpeg -v -i prueba2.pcap
Output directory: /tmp/output
Configuration file: /etc/foremost.conf
Processing: prueba2.pcap
|------------------------------------------------------------------
File: prueba2.pcap
Start: Tue Aug 18 09:43:29 2009
Length: 52 KB (53332 bytes)
Num Name (bs=512) Size File Offset Comment
*|
Finish: Tue Aug 18 09:43:29 2009
0 FILES EXTRACTED
-----------------------------------------------------------------
Foremost finished at Tue Aug 18 09:43:29 2009
root@plasma:/tmp#

Nos damos cuenta que no se extrae nada, así que tenemos que cambiar la estrategia.
Abrimos el archivo con wireshark y lo analizamos.

Concluimos de las imagenes que tenemos una transferencia FTP en la captura y que la transferencia FTP fue de un archivo que tiene algo que ver con JFIF. Nuevamente buscamos en fileinfo y nos enteramos que esta relacionado con las imagenes JPEG. Lo que hacemos entonces es salvar esa "conversación" en tipo raw y renombramos el archivo con la extención .jpeg.

Esto es lo que obtenemos, una imagen parcial de algo. Según las pistas que nos dan, esto debe corresponder a un lugar donde haya una estación de metro (cual metro, cual ciudad?, cual pais?).

El próximo paso entonces es pensar en que si la imagen no esta completa es porque fué alterada una vez descargada por FTP, así que debieron haber agregado o removido información, puede ser que hayan usado técnicas esteganograficas o usado la información propia de la imagen.

Usemos el comando exif para pedir información del archivo:
root@plasma:/tmp# exif capturada.jpg
Corrupt data (ExifLoader):
The data supplied does not seem to contain EXIF data.
root@plasma:/tmp#
Uhmm, al parecer hay algo que no esta bien, si es una imagen, pero no nos deja sacar la información de la misma. Bueno, que tal si usamos una herramienta antigua pero igual de efectiva que el foremost ?

root@plasma:/tmp# tcpxtract -f prueba2.pcap
Found file of type "jpg" in session [127.0.0.1:42959 -> 127.0.0.1:41618], exporting to 00000000.jpg
Found file of type "tif" in session [127.0.0.1:42959 -> 127.0.0.1:41618], exporting to 00000001.tif
root@plasma:/tmp#
tcpxtract es capaz de encontrar la imagen y la renombra como 00000000.jpg, intentemos leerla con el comando exif:

root@plasma:/tmp# exif 00000000.jpg
EXIF tags in '00000000.jpg' ('Intel' byte order):
--------------------+----------------------------------------------------------
Tag |Value
--------------------+----------------------------------------------------------
North or South Latit|N
Latitude |51.00, 30.00, 56.47
East or West Longitu|W
Longitude |0.00, 8.00, 29.55
--------------------+----------------------------------------------------------
root@plasma:/tmp#
Uhmm, esto ya es mas razonable, parecen unas coordenadas de posicionamiento (latitud y longitud). Como son 3 valores supongo que son los grados, minutos y segundos, así que me voy para google maps y despues de leer el formato de entrada para la busqueda inserto esto:

+37° 46' 15.63", -122° 24' 42.30"


Al hacer click en los alrededores del punto marcado como "A" podemos encontrar la famosa estación del metro que buscabamos.

Conclusiones:

1. Si estamos seguro del formato del archivo a analizar debemos usar diferentes herramientas para extraer información, si hubiera abandonado la ruta de la información exif, seguro me hubiera perdido del todo.

2. Las pistas ayudan, pero aveces confunden mas de lo debido, trata de pensar la opción mas simple, la estación del metro se encontraba en londres, nada que ver con valencia o españa, así que esa pista terminaba siendo un dolor de cabeza.

3. La información de EXIF, mostraba mas cosas:

EXIF tags in '00000000.jpg' ('Intel' byte order)

Esto me hizo perder tiempo pensando en que los datos entregados estaban organizados de forma diferente, segun el tipo de arquitectura del procesador :S, nuevamente: no te compliques mas de la cuenta.

4. Se que existe software que puede extraer mas información de un archivo de imagen. Ve a por el!.


// FIN RETO 2 //

y sigue ...

// RETO 3 //


Este reto me parecio "una putada" como dicen los españoles. La verdad no encuentro una forma lógica para resolver el ejercicio. Como bien lo dice la introducción se trata de otra captura, pero esta vez hay que encontrar cual es la sintaxis que se esta usando en nmap :S.

Si pensamos en que nmap tiene un monton de opciones, que ademas muchas de la opciones tienen varias formas de ser escritas ( -sC: equivalent to --script=default) y que el ingreso de la sintaxis validaba mayusculas, minusculas y el orden, este ejercicio parecia imposible de resolver.

Para mi no tiene mucho fundamento a menos que el ejercicio entregue mas datos y sea un ejercicio donde se trate de encontrar el tipo de escaneo realizado, que es algo muy diferente, en un antiguo reto de honeynet lo vemos. Pero jugar con opciones de puerto, de MACs, adivinar el orden de ingreso de los parametros, se me hace un tanto aburrido y complicado a la vez.

Así que este ejercicio a menos de que ya hubieses pasado otros ejercicios similares o conozcas a los desarrolladores del wargame, no podrias resolverlo.

La explicación mágica, con el screenshot mágico de la solución la puedes ver en el sitio oficial del reto.

Conclusiones:

1. Si alguien encuentra una forma coherente de hacer las deducciones que aparecen en la solución de SBD, que por favor lo postee, porque no tengo idea de por donde iniciar. Sabia que era un NULL scan (flags a 0), sabia el rango de puertos escaneado, pero no sabia en que orden poner los parametros. bruteforce tambien?

2. Sobra decir que este nivel no me gusto.

3. Descubrí que tethereal ahora es tshark :)

// FIN RETO 3 //

ya casi ...

// RETO 4 //

La introducción nos dice que es algo con RADIUS y tenemos un nuevo archivo .pcap.

Para practicar este tema decidí montar el ejercicio completo, esto es, crear un servidor radius básico, luego simular una autenticación y capturar esos datos, y luego buscar una herramienta que pudiera hacer fuerza bruta contra el archivo.

Servidor Freeradius:

El servidor se instala común y corriente y se deja como está (configuración by default), lo único que necesitamos es agregar un usuario con el que vamos a realizar las pruebas, para eso en el archivo /etc/freeradius/users agregamos al final la siguiente línea:

nando Cleartext-Password := "nandux"

Tuve algunos problemas con la validación del usuario porque la información que aparece en Internet dice que la variable que se debe usar es: User-Password. Pero para la autenticación EAP/MD5 no funciona. así que siganme el consejo y usen esta configuración.

Cliente radius:

Para hacer las pruebas y no configurar un NAS, es mejor usar un cliente radius que permita simular todo tipo de paquetes, para accesos sencillos tenemos las utilidades radtest y radclient que vienen en los linux, pero que pasa si necesitamos probar una autenticación EAP/MD5 ?.

Existe un supuesto cliente llamado radeapclient, pero creanme que intente hacerlo funcionar y no pude, ademas es muy problematico con las duplas de variables que requiere el paquete a transmitir, entonces opte por una herramienta que funciona muy bien. Tiene una interfaz amigable y tiene plantillas para las pruebas mas comunes.

nuestro paquete de prueba entonces queda así:


Debemos agregar la variable EAP-MD5-Password, que contiene la clave del usuario, pero que en ningun momento se transmitirá en texto plano en la comunicación, esa es la que queremos adivinar. Recuerden que el objetivo es encontrar la clave de un usuario, no la shared key que comparten cliente y servidor radius.

La captura:

Una vez enviada la prueba de autenticación, en el servidor debemos obtener algo así:
rad_recv: Access-Request packet from host 192.168.0.9 port 1097, id=1, length=117
NAS-IP-Address = 192.168.16.128
Message-Authenticator = 0xf962daa95d030872d9b237e69525d917
NAS-Port = 0
User-Name = "nando"
User-Password = "nandux"
State = 0x8306893983cf8d261c891df8ac1795ce
EAP-Message = 0x02c9001604107af9c25101475e14f550313e19211519
+- entering group authorize {...}
[files] users: Matched entry DEFAULT at line 71
[files] users: Matched entry nando at line 209
++[files] returns ok [eap] EAP packet type response id 201 length 22 [eap] No EAP Start, assuming it's an on-going EAP conversation ++[eap] returns updated Found Auth-Type = EAP Found Auth-Type = EAP
Warning: Found 2 auth-types on request for user 'nando'
+- entering group authenticate {...}
[eap] Request found, released from the list
[eap] EAP/md5 [eap] processing type md5 [eap] Freeing handler ++[eap] returns ok +- entering group post-auth {...} ++[exec] returns noop Sending Access-Accept of id 1 to 192.168.0.9 port 1097
EAP-Message = 0x03c90004
Message-Authenticator = 0x00000000000000000000000000000000
User-Name = "nando"
Finished request 1.
Going to the next request
Waking up in 4.9 seconds.
Cleaning up request 0 ID 0 with timestamp +9
Cleaning up request 1 ID 1 with timestamp +9
Ready to process requests.
Recuerden que esta información esta en el lado del servidor, lo que hacemos es poner el servidor radius en modo debugging para ver los errores que pueda tener, eso lo hacemos con la opción X.

root@plasma:~# freeradius -X
FreeRADIUS Version 2.1.0, for host i486-pc-linux-gnu, built on Mar 5 2009 at 18:50:47
Copyright (C) 1999-2008 The FreeRADIUS server project and contributors.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
You may redistribute copies of FreeRADIUS under the terms of the
GNU General Public License v2.
Starting - reading configuration files ...
including configuration file /etc/freeradius/radiusd.conf
including configuration file /etc/freeradius/proxy.conf
including configuration file /etc/freeradius/clients.conf
...
Como la respuesta fue correcta, entonces debemos tener en nuestro sniffer una captura de la sesión de autenticación radius que acaba de ocurrir:


En la comunciación vamos a encontrar 4 paquetes, en este orden:

1. CLIENTE --> Petición de acceso --> SERVIDOR
2. SERVIDOR --> Le envia un MD5 que se llama reto --> CLIENTE
3. CLIENTE --> Le responde con un MD5 que tiene respuesta al reto --> SERVIDOR
4. SERVIDOR --> Lo acepta o lo deniega --> CLIENTE


¿Donde esta el problema y la queja de todo el mundo con EAP/MD5?, pues que si logro interceptar estos 4 paquetes, puedo saber cual fue el reto y la respuesta al reto, de esta forma podria realizar un ataque de fuerza bruta offline tratando de encontrar una clave de usuario que me diera como respuesta el MD5 enviado al servidor. Como se puede ver, es cuestión de tiempo.

Tambien en la captura vemos que el usuario que se autenticó se llama "nando", esto tambien lo necesitamos para usarlo en un programa de fuerza bruta.

Hasta este momento, hemos conseguido todo lo que necesitamos para atacar la contraseña del usuario nando, lo que sigue es encontrar una herramienta que nos permita hacer un ataque de fuerza bruta. Los amigos de SBD dicen que no hay herramientas, sin embargo yo encontre esta, que funciona bastante bien, el autor la tiene pensada para ataques EAP/MD5 en entornos wireless, pero si pensamos que es lo mismo en entornos wireds entonces nos funciona!!!. ;)

La herramienta puede abrir paquetes .pcap automaticamente y extraer los MD5 para hacer la fuerza bruta, pero voy a mostrar como se sacan a mano.

Este es un ejemplo de la documentación:

$ ./eapmd5pass -w dict -U jwright -C d7:ec:2f:ff:2a:da:43:7f:9d:cd:4e:3b:0d:f4:4d:50 -R 1f:fc:6c:26:59:bc:5b:b9:41:44:fd:01:eb:75:6e:37 -E 2
eapmd5pass - Dictionary attack against EAP-MD5
User password is "beaVIs".
3917111 passwords in 7.05 seconds: 555990.03 passwords/second.

Aqui lo que vemos es que se le pasa un diccionario con la opción w, un MD5 reto (Challenge) con la opción C, una respuesta al reto con la opción R y un ID de la conexión con la opción E.

Miremos de donde sacamos estos datos de los 4 paquetes radius:

Aqui seleccionamos el paquete challenge y leemos el valor de MD5-Challenge que aparece al finalizar el screenshot.


Luego seleccionamos el paquete request que lleva la respuesta y leemos el valor del MD5-Challenge.


De los dos screenshots vemos que el ID es 201, este fue un numero arbitrario que usé para crear el paquete radius. Casi siempre es 1 o 2 cuando las comunicaciones se hacen de forma natural.

Datos recolectados:
root@plasma:~/eapmd5pass# cat misdatos
challenge:d4463c371a222f445326b61b4696a641
response: 460d8f39a13e2df26514d391e400eee2
user: nando
id: 201
root@plasma:~/eapmd5pass#
Ahora usamos la herramienta:

Pueden ver que si se usa un ID diferente la herramienta no puede encontrar la clave, mucho cuidado cuando hagas tus pruebas ;)

En el último screenshot pueden ver tambien que la clave la encuentra, obviamente en el diccionario usado hemos puesto la clave, esto es un ataque de diccionario y la clave debe estar allí para que el ataque sea efectivo.

¿Que tal si lo intentamos contra el reto del wargame ;) ?

Conclusiones:

1. Lo importante en un reto es entender que es lo que los diseñadores del reto quieren que hagamos, aveces no se deja muchas posibilidades a la hora de enfrentar el problema, como por ejemplo cuando todo llega al punto de fuerza bruta, ahí no se puede hacer mas, solo se puede hacer fuerza bruta, a menos que hagamos ingenieria social o ataquemos los servidores del juego.

2. En la vida real las cosas son muy diferentes, hay miles de posibilidades, con miles de herramientas posibles.

3. Despues de leer y releer me ha quedado claro el punto en cuestión: ¿Porque EAP/MD5 es inseguro?, porque solo Microsoft lo monta por defecto en algunos de sus servicios y porque casi nadie lo usa en la vida real :p

4. El reto estuvo interesante, sin embargo no pude encontrar la clave, porque no encontre el diccionario correcto, si alguien rompe la clave de John.McGuirk, por favor que me la diga para poder dormir en paz ;)
(update: 21 de agosto, la encontré de pura casualidad: http://packetlife.net/captures/, al parecer los de sbd se lo bajaron de aquí ;)

4.5 Ahora pienso que si hubiera buscado en Internet: radius "John.McGuirk", hubiera encontrado la respuesta en texto plano en el primer y segundo link, me hubiera evitado la configuración de todo el asunto, pero bueno, todo es por aprender y practicar un poco ;)

5. Esto es todo por ahora en los niveles de red, seguiré sacando tiempo para publicar los otros niveles, espero les haya gustado.

// FIN RETO 4 //

2 comentarios:

vierito5 dijo...

en la net04 la clave salía por fuerza bruta enseguida porque era un número de 4 cifras: 9995, el problema es que no suele estar en un diccionario jeje

saludos!

Anónimo dijo...

Una opcion para craquear password zip.
fcrackzip = Crakeador de archivos zip

Entradas populares