Prueba web 1 (categora: web) URL: http://ctf.navajanegra.com/game.php?n=1
Comenzando que es gerundio; accedemos al enlace page de la imagen anterior, que nos lleva a http://ctf.navajanegra.com/WEB%201.php, y que tiene el siguiente aspecto:
Si tratamos de acercarnos al botn ste se desplaza, impidiendo pulsarlo; sin embargo, podemos utilizar javascript y la consola de firebug 1 para, aunque sea por cabezotas, conseguir pulsar el botn:
Lo que hace que aparezca la siguiente ventana emergente:
Una vez cerrada la ventana se nos redirige a la pgina principal de Navaja Negra; vamos, va muerta. Despus de varias vueltas al cdigo fuente de la pgina, el cual slo contiene una funcin en javascript, fun(), encargada de marearnos con el botn, se me ocurri utilizar el comando wget desde Linux para obtener el contenido y ver si este difera en algo, encontrando all, ahora s, la contrasea del nivel. El siguiente script en Python permite obtener el mismo resultado que lanzar el comando wget: #! /usr/bin/python # -*- coding: utf-8 -*- """ web1.py (v0.1)
Created: 2014-09-28
Copyright (c) 2010: Vte J. Garcia Mayen <neofito@gmail.com> Copyright (c) 2010: Neo System Forensics http://neosysforensics.es
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See http://www.gnu.org/copyleft/gpl.html for the full text of the license. """ import requests import bs4
print '-----------------------------------------------------' print '- #nn4ed CTF - Level: web1 (unclassified) -' print '-----------------------------------------------------' print '[*] Guetting WEB 1.php content...' req = requests.get(url, headers=headers) print '[*] Done!' print '[*] Analyzing the retrieved content...' soup = bs4.BeautifulSoup(req.text) print '[*] Done!' print '-----------------------------------------------------' for string in soup.strings: if "Password" in string: print string.replace('\n', '')
if __name__ == "__main__": main()
La salida de su ejecucin sera: C:\nn4ed>python web1.py ----------------------------------------------------- - #nn4ed CTF - Level: web1 (unclassified) - ----------------------------------------------------- [*] Guetting WEB 1.php content... [*] Done! [*] Analyzing the retrieved content... [*] Done! ----------------------------------------------------- Password: 6e3e92ebfcec506d0cc56f24a929ac11
7
Prueba web 2 (categora: web) URL: http://ctf.navajanegra.com/game.php?n=12
Continuamos para bingo; en este caso, y tal como nos indica el enunciado de la prueba, es necesario aprovechar una inyeccin SQL en el formulario al que accedemos mediante el enlace Server, y que apunta a http://ctf.navajanegra.com/web2.php Despus de varios intentos detecto la cadena que permite la inyeccin en el campo user del formulario, or 1=1, que obtiene como resultado una ventana emergente indicndonos que el usuario root es correcto, pero no as la contrasea proporcionada:
Si por el contrario probamos con una sentencia SQL cuyo resultado no es verdadero, or 1=2 por ejemplo, no obtenemos ninguna respuesta:
8
As que tiene toda la pinta de ser una inyeccin SQL a ciegas, es decir, no obtenemos directamente los valores buscados, en este caso la pass de root, directamente desde la pgina pero si podemos inferir estos valores haciendo las consultas adecuadas y atendiendo al resultado obtenido: un alert si el resultado de la consulta es verdadero; nada en el caso de que el resultado sea falso. Para automatizar el proceso de averiguar la pass del usario utilizo el siguiente script: #! /usr/bin/python # -*- coding: utf-8 -*- """ web2_02.py (v0.2)
Created: 2014-09-28
Copyright (c) 2010: Vte J. Garcia Mayen <neofito@gmail.com> Copyright (c) 2010: Neo System Forensics http://neosysforensics.es
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See http://www.gnu.org/copyleft/gpl.html for the full text of the license. """ import requests import sys
def make_query(query, okmsg): """ Function doc """
El script implementa una bsqueda binaria para obtener el resultado con el menor nmero posible de consultas sql. El script lo desarroll en su momento para solucionar una prueba del wargame Narnia, y slo he tenido que adaptarlo para esta ocasin. La explicacin y el script original estn en: Jugando s se aprende (advierto, nivel bsico) http://neosysforensics.blogspot.com.es/2013/01/jugando-si-se-aprende-advierto-nivel.html El resultado obtenido al ejecutarlo para solucionar la prueba: C:\nn4ed>python web2_v2.py --------------------------------------------------- - #nn4ed CTF - Level: web2 (Blind SQL Injection) - --------------------------------------------------- [*] Guessing password length... [*] Password length guessed! [*] Guessing password... [*] Password guessed! --------------------------------------------------- Password: 78a2109f8519940bb553
La prueba nos indica que tenemos que trabajar con la imagen, y para eso, primero necesitamos la imagen! No basta con hacer clic con el botn derecho del ratn y darle a Guardar imagen, ya que est incluida como fondo mediante el siguiente cdigo CSS:
El enlace para descargarla sera pues http://ctf.navajanegra.com/STG1.jpg Una vez descargada, si la abrimos con un editor hexadecimal podemos ver al final lo que parece una cadena en base64:
11
Utilizando el intrprete de Python podemos descodificarla para obtener finalmente el flag del nivel: C:\nn4ed>python Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import base64 >>> cadena = "TXkgc2VjcmV0IGNvZGU6IDFlZjFkODM0NzMzMWFmYjc1YjgyMjgxOWZkNGU2ZDNiIA==" >>> base64.b64decode(cadena) 'My secret code: 1ef1d8347331afb75b822819fd4e6d3b ' >>> Prueba phk 1 (categora: phreaking) URL: http://ctf.navajanegra.com/game.php?n=3
Vale, tenemos un audio donde una locucin indica al usuario que introduzca su nmero de tarjeta de crdito y a continuacin los tonos correspondientes a los nmeros de la misma. Se me ocurre que lo mejor es cortar la locucin y quedarme slo con la parte que me interesa as que, utilizando audacity 2 primero abro el fichero mp3 y divido la pista en los dos canales que componen el formato estreo:
para eliminar uno de ellos y quedarme con el audio en formato mono.
2 http://audacity.sourceforge.net/?lang=es
12
A continuacin selecciono el bloque que me interesa y lo corto:
y ya por ltimo creo un nuevo proyecto y lo pego all, para finalmente exportarlo y guardarlo como un fichero WAV. Vale, ya tenemos el audio con los nmero de la tarjeta de crdito, pero ahora hay que interpretarlo, y como no tenemos a mano el wasap de John Draper 3 pues tiramos de aplicacin online, que haberlas haylas. Concretamente yo he utilizado esta: http://dialabc.com/sound/detect/index.html
La pgina de la prueba nos permite descargar una captura, SipPHK2.pcapng, del trfico SIP producido durante el proceso de registro de un dispositivo en un servidor SIP.
Utilizando las herramientas de la suite sipcrack podemos extraer el hash md5 solicitado por el servidor al dispositivo para, posteriormente y mediante un ataque de diccionario, obtener la contrasea en texto claro. Lo primero, extraer los paquetes correspondientes al proceso de login utilizando sipdump: # sipdump -p SipPHK2.pcapng auth.txt
* Using pcap file 'SipPHK2.pcapng' for sniffing * Starting to sniff with packet filter 'tcp or udp'
* Dumped login from 77.72.169.129 -> 10.0.61.100 (User: 'nn4ed')
* Exiting, sniffed 1 logins
y ahora, utilizando el famoso diccionario rockyou.txt incluido con cualquier distribucin para pentesting que se precie lanzamos el ataque mediante la herramienta sipcrack: # sipcrack -w rockyou.txt auth.txt
Una vez descargado el fichero CrackMe1.zip si extraemos su contenido obtenemos un ejecutable de Windows, CrackMe1.exe, que una vez ejecutado, no sin un poco de miedo, muestra lo siguiente:
Difcil va a ser adivinar los valores correctos por inspiracin divina, as que mejor primero analizamos el ejecutable con PEiD a ver qu tenemos:
15
Parece que el ejecutable ha sido empaquetado utilizando UPX 4 para dificultar su anlisis, as que primero lo desempaquetamos:
y una vez correctamente desempaquetado volvemos a analizarlo a ver que tenemos ahora:
Esto ya es otra cosa! Tenemos un ejecutable en Visual Basic y se me ocurre probar primero lo ms simple, o lo que es lo mismo, ver las strings que contiene el ejecutable a ver si suena la flauta. Esto anterior traducido a OllyDbg 5 sera:
Entre todas las strings incluidas en el ejecutable me llaman la atencin las dos siguientes:
Como probar es gratis las utilizo como valores de autenticacin en el ejecutable, Albacete como usuario y ...N....N como contrasea, y mira t por donde que suena la flauta:
Para obtener el cdigo que permite pasar el nivel necesitamos el hash md5 correspondiente a la contrasea obtenida, as que nuevamente usando el intrprete de Python: C:\nn4ed>python Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import hashlib >>> m = hashlib.md5() >>> m.update("...N....N") >>> print m.hexdigest() 0047c0baeb5faccc8a71319c72fa6af2 >>> Prueba crp 2 (categora crypto) URL: http://ctf.navajanegra.com/game.php?n=10
Copio la cadena hexadecimal incluida entre comillas dobles como valor de la variable MSG directamente en un nuevo proyecto dentro de la herramienta CrypTool 6 para empezar a analizarla (@Kachakil 7 dixit). Me aseguro primero de haber definido correctamente las opciones de la aplicacin para los procesos de anlisis, dejando los valores tal como se muestra en la siguiente imagen:
Ahora s, men Anlisis, Herramientas para el anlisis, Histograma:
El resultado anterior nos muestra la frecuencia de aparicin para cada carcter, y por la forma de agruparse tiene toda la pinta de tratarse de una cadena ASCII cifrada utilizando algn tipo de cifrado simtrico. Otro matiz interesante es que el valor hexadecimal ms pequeo es el 40. En una cadena ASCII el valor ms pequeo y que resulta ms probable es el espacio en blanco, que se corresponde con el cdigo 40 en hexadecimal. Vamos a probar a descifrar el texto utilizando la tcnica de suma de bytes, as que men Cifrar/Descifrar, Simtrico (clsico), Suma de Bytes y vamos a utilizar como valor la diferencia entre el carcter hexadecimal ms pequeo en la cadena cifrada y su valor correspondiente ms probable, el espacio en blanco o lo que es lo mismo el cdigo hexadecimal 40:
18
Pulsando el botn descifrar obtenemos el texto en claro con la solucin de la prueba:
Secret code: a3fa85f73d5565db577095d283ef7651 Prueba extra (categora: varios) URL: http://ctf.navajanegra.com/game.php?n=13
19
Parece que hay varios caminos para solucionar la prueba, pero ya puedo darme con un canto en los dientes de haber encontrado al menos uno de ellos. Pulsando sobre la imagen del gato pirata nos lleva a http://ctf.navajanegra.com/extra.php donde comienza realmente la prueba, y podemos leer el siguiente texto:
Si algo sabemos es que somos 007, otra cosa es donde indicrselo a la pgina; unas cuantas vueltas, dos cervezas y varios cabezazos despus se me ocurre probar modificando la el header User-Agent de la peticin http, utilizando para ello la herramienta OWASP ZAP 8 :
Misin cumplida, o al menos obtenidas las instrucciones de la misin, ya que la pgina nos devuelve ahora el siguiente contenido:
As que una vez descargado el cdigo QR y utilizando http://blog.qr4.nl/Online-QR-Code_Decoder.aspx obtenemos el cdigo md5 correspondiente: f3807a187fce8cd0d901726ee33331bc. Tirando nuevamente de servicios online, ahora desde http://www.md5cracker.org/, obtenemos la cadena correspondiente al hash md5 obtenida en el paso anterior, y que es BUDA (sin las comillas).
El paso siguiente sera comunicar dicha palabra a la pgina de la prueba, as que varios cabezazos, que no cervezas, despus, se me ocurre mandar la siguiente peticin:
El mtodo POST est asociado normalmente al envo de datos a travs de un formulario, de ah la cabecera Content-Type: application/x-www-form-urlencoded y el valor, con formato variable=valor, ira en el cuerpo de la peticin. La cabecera Content-Length correspondera a la longitud de la cadena incluida en el cuerpo del POST. Sea como fuere vemos que todava no hemos terminado, ya que recibimos el siguiente contenido:
Unas cuantas vueltas despus decidimos que adivinos no somos, y aunque tampoco somos exploiters no nos quedan ms huevos que intentarlo por esa va, as que descargamos el fichero BoF1.ova desde el siguiente enlace http://ctf.navajanegra.com/extra.php?guru=buda, donde al visitarlo se nos dan algunas instrucciones ms, todo ello sin olvidar quin somos, o lo que es lo mismo, mandando en la cabecera de la peticin el User-Agent: 007 tal como hemos hecho hasta ahora:
Y las nuevas instrucciones justo con el enlace para la descarga desde Mega:
Descarga: https://mega.co.nz/#!wEFFUSyI!IygGuqaNn5KijDlC5WW3XM3yX_T6sdyvwjBfOd0nizE Una vez descargada la mquina virtual en formato ova 9 podemos importarla, por ejemplo desde VirtualBox 10 , para tener disponible la mquina virtual y poder seguir as con la resolucin de la prueba (o pegndonos ms cabezazos, segn se mire o segn quin mire).
Una vez finalizado el proceso de importacin arrancaremos la nueva mquina virtual y seguiremos con la fiesta, que si no lo es por el alcohol, si al menos por las horas en las que transcurra:
Como soy un chico bueno, y la falta de sueo ya haca mella, me centr en la consecucin de la prueba siguiendo los cauces indicados y dej la curiosidad para otros momentos ms idneos, as que utilizando las credenciales proporcionadas anteriormente, usuario navaja con contrasea negra accedemos al sistema y vemos primero que es lo que hay: navaja@slitaz:~$ ls -l total 12 -rwxr-xr-x 1 navaja navaja 7305 Sep 25 18:44 bof1 -rw-r--r-- 1 navaja navaja 113 Sep 25 18:14 readme.txt
navaja@slitaz:~$ cat readme.txt
10 https://www.virtualbox.org/
22
Encuentra la contrasea del archivo /home/navaja/bof1, desbordando la pila, para obtener la clave del nivel :)
Probamos a ejecutar la aplicacin para ver de qu va esto: navaja@slitaz:~$ ./bof1 Pista: 0x8048474 Hola Introduciste: Hola
Como se trata de explotar un buffer overflow la cadena introducida debe ser lo suficientemente larga como para sobrescribir la direccin de retorno, EIP, y dada la pista tiene toda la pinta que la direccin con la que sobrescribir EIP tiene que ser la indicada, es decir, 0x8048474, que como estamos en un sistema litle-endian 11 tiene que representarse al revs. Utilizar el siguiente comando de Python, que ya estoy harto de que todos los ejemplos se hagan utilizando un lenguaje orientado al ofuscamiento: python -c 'print "A" * NUM_A_DETERMINAR + "\x74\x84\x04\x08"' | ./bof1
Unas cuantas pruebas despus tenemos la solucin de la prueba, que al final no ha sido tan complicada como pareca a priori:
Slo nos queda obtener el hash md5 de la contrasea obtenida para utilizarlo como solucin de la prueba, as que de nuevo desde el intrprete de Python: C:\Users\jgarcia>python Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import hashlib >>> m = hashlib.md5() >>> m.update("GNU/Linux") >>> print m.hexdigest() 4a58db979d107ca6300f1be1406b3605 >>>
Y esto ha sido todo lo que he conseguido. No s si as han sido las cosas, pero s que as las he contado