domingo, 23 de agosto de 2009

Campus party valencia 2009

El evento campus party se realizó este año en la ciudad de las artes y las ciencias, un lugar muy bonito, guardando las proporciones es un parque explora + maloka, pero mas grande :p



Esta vez estuve apoyando nuevamente al equipo de tecnología de futura networks, apoyando el montaje y soporte de la red durante la semana de campus. Allí pude conversar con algunos desarrolladores de OSSIM (ahora Alien Vault), pude asistir a algunas conferencias y talleres, también conocer algunos proyectos interesantes de los campuseros españoles, etc.




Le dije a klondike y xisco (sí el del final del video es él) que lo saludaría en mi post, ya que nos estuvo apoyando durante toda la campus en algunas labores administrativas, esta persona se encargó de montar el servidor DC (nota: no hace parte de futura, ni de campus party, solo es un campusero aficionado :). Muchas gracias.



En la campus española se vive lo mismo que en una colombiana, solo que aún no hemos importado algunas cosas (esperemos que no lo hagamos). Como por ejemplo:



Un saludo para todos los del equipo de tecnología de campus party y para el resto de personas que hacen que este evento pueda ser una realidad (son muchisimas), esperemos que nos podamos seguir viendo por temporadas ;)


De la campus quedó mucho material audiovisual interesante, les dejo el link a continuación:
(vale la pena!)
http://www.youtube.com/view_play_list?p=DBE02456F86696E5

Algunos videos :

El Cosmonauta.es



Alien Vault.com



Libertad de Telefonica.org


sábado, 22 de agosto de 2009

How to PASS wargame CP 2009: BINARIES

Por fin!, última entrada de las soluciones a los retos de seguridad de la CP 2009 Valencia.

// RETO 1 //

Como se puede ver en la imagen, se da un enlace a un archivo .class, el cual lo podemos entender como un archivo compilado de java, así que este programa se podrá ejecutar con la maquina virtual de java, pero no tendremos acceso a su código fuente, o sí?

Lo primero que intentamos es usar strings para darnos una idea del software:

nonroot@plasma:/tmp$ strings OhHai.class
Me,
, I KILL YOU!!!
console
()Ljava/io/Console;
So ... WTF are you? ->
java/io/Console
readLine
9(Ljava/lang/String;ÄLjava/lang/Object;)Ljava/lang/String;
equals
(Ljava/lang/Object;)Z
Hoooray!! Your pass is "
args
ÄLjava/lang/String;
hidden
whoami
clue
line
SourceFile
OhHai.java
éN-+
Esto me da varias pistas, pero nada tangible, ejecutemos el software:

Uhmm, al parecer el programa espera algo que aún no sabemos. En este punto pensamos que estamos en los ejercicios de binarios, cracking o ingeniería inversa, como les quieras llamar. Entonces en la mayoría de los casos tendremos que decompilar, desensamblar y debugguear todo lo que se aparezca.

El procedimiento entonces es usar un desensamblador de archivos .class para tratar de conseguir los .java (código fuente). Después de reblujar todo Internet, concluimos que el mejor es este programa multiplataforma.

Como pueden ver, al abrir el archivo .class, obtenemos el archivo en código fuente tan limpio como si lo acabaran de programar ;)

Que hacemos entonces?, tenemos dos opciones:

1. Le hacemos un seguimiento al programa e intentamos entender lo que hace para así deducir que debemos ingresar en los parámetros de ejecución.

2. Buscamos las líneas donde se compare lo que ingresamos y lo que el programa calcula e imprimimos el resultado, para esto hay que volver a compilar el .java modificado ;).

Las últimas líneas del código me muestran un condicional de algo, que hacemos entonces?, pues quitamos el condicional y ensamblamos nuevamente.


sin el condicional el programa queda así:

De esta forma el programa imprimirá SI o SI, la respuesta ;)
Aquí vemos el resultado:


Conclusiones:

1. Cualquier cosa que se pueda compilar, se puede decompilar, cualquier ensamblador, tiene su desensamblador, ten esto presente.

2. Si eres programador de java y estas pensando que entonces tus .class son vulnerables, la verdad es que TAMBIÉN son vulnerables, la recomendación es que cuando programes validaciones (de lo que sea) no las metas dentro de los mismos ficheros compilados, porque alguien sabrá como sacarlas de allí. Existen suficientes recursos en Internet donde te enseñan un poco de seguridad en la programación en CUALQUIER LENGUAJE.

3. Este es un reto básico de ingeniería inversa, como siempre, si tenemos la herramienta adecuada y conocemos la ruta, no hay nada que hacer.

//FIN RETO 1//

Esto se puso bueno ...

// RETO 2 //
Al ingresar al servidor SSH (un linux), encontrábamos un fichero binario.
Este fichero binario al ejecutarlo me pedía un nombre y luego me decía:

root@plasma:/tmp# date
Fri Jul 31 22:45:05 COT 2009
root@plasma:/tmp# ./reto2
Por favor, dime tu nombre: nando
Lo siento nando No te dare el token hasta el 10-08-2009
root@plasma:/tmp#

Esto nos dice varias cosas:

1. Es un programa que tiene que ver con el tiempo (funciones de tiempo), también la imagen de la presentación del reto apoya esto.

2. El password seria mostrado si pasaba esa fecha.

Que podemos hacer entonces?, lo que primero se nos ocurre es intentar cambiar la fecha del sistema, pero obtenemos un mensaje:

Técnica no valida!!

Y si le cambiamos el nombre al programa:

Técnica no valida!!

Y si lo copiamos por ssh a otra maquina e intentamos ejecutarlo?

Técnica no valida!!

Y si intentamos abrirlo con gdb, el debugguer de linux?

Técnica no valida!!

Y si intentamos debuguearlo con la técnica ptrace?

Técnica no valida!!

Y si intentamos causarle un overflow en la entrada del nombre?
Y si le pasamos el comando string?
Y si nos retiramos del juego? :P


Después de probar unas cuantas técnicas, nos damos cuenta que el binario esta muy protegido y que lo mejor es NO moverlo del sistema, entonces como hacer para explotarlo?

Hacemos memoria y recordamos una vieja, pero efectiva técnica donde podemos hacer un mapeo en memoria de ciertas funciones y luego obligamos al programa objetivo a que use estas funciones en reemplazo de las originales de librerias .h.

Esta técnica se conoce como la de LD_PRELOAD, puedes ver un ejemplo aqui. Los ejemplos mas comunes en Internet son ataques a la función time(), que para nuestra suerte es la que esta usando este programa (o al menos eso creemos).

Entonces hay dos formas de atacar el programa:

1. la dificil, es hacer todo el procedimiento que equivale a programar una función time() ficticia, luego crear una libreria dinamica .so, luego exportar la variable LD_PRELOAD y luego ejecutar el programa.

2. Usar una herramienta que haga eso por nosotros :)

Seleccionamos la opción 2 (por pereza) y descargamos esta libreria la cual promete hacer todo lo que necesitamos. El modo de uso se encuentra en el sitio web, entonces solo tenemos que hacer un "make" y listo, a usarla.

¿Bonito no?, lo que hicimos fue hacer un FAKE de la rutina del tiempo para hacerle creer que estabamos 15 días mas adelante, pueden ver tambien que la fecha real del sistema no se altera, solamente se suplanta en tiempo de ejecución del programa objetivo ;)

Un aplauzo para libfaketime! (PLAP, PLAP, PLAP!)

Conclusiones:

1. Este nivel es un clásico del hacking ;). gracias.

2. Interesante conocer todas las protecciones que usaron para los binarios, para evitar desensamblados, debugging y otro monton de cosas que a uno se le pudieran ocurrir.

3. Al estar tan limitados en los aspectos de reversing con el ejecutable objetivo, no quedaba otro remedio que buscar la técnica que ellos estaban esperando.

4. Un muy buen reto, pero si quieres entender el ataque de LD_PRELOAD es mejor que te crees las librerías a mano y ensayes no solo con la time(), si no con la chown(), chmod() y cualquier otra que se te atraviese, explota, explota, explota!!!!.

// FIN RETO 2 //

I need medic, Requesting backup, I'm going for the bug ...

// RETO 3 //

Cuando entramos al servidor ssh (linux) para este nivel, encontramos un escenario similar al anterior, un binario, estamos dentro de un chroot de ssh, el binario tiene mil protecciones y bueno ...

¿Que hacemos entonces?

Después de intentar algunas cosas, buscar posibles ataques por format string, vemos que no es por ahí el asunto. Entonces debe ser un ataque clasico de overflow o no?

Para poder llevar a cabo un ataque de *overflow clásico, el sistema no debe tener randomizado el stack (sysctl kernel.randomize_va_space=0) y se deben haber deshabilitado las protecciones en el momento de compilación de la aplicación (gcc -fno-stack-protector). Vamos a suponer así es.

Podemos ver en los permisos que el binario tiene el bit suid:
nonroot@plasma:/tmp$ ls -la echo
-rwsr-xr-x 1 root root 9472 2000-08-22 09:44 echo
Entonces buscaremos atacar el software con un stack overflow, intentemos el viejo truco del perl.

Podemos ver que el programa se revienta después de 504 caracteres, eso nos da una pista para poderlo explotar. Se supone que unos cuantos bytes mas adelante podemos sobreescribir el EIP y apuntarlo a donde queramos.

Pongamos un shellcode en memoria e intentemos pegarle:


Con ese programa put.c (si el de aleph), podemos ubicar un shellcode en memoria, a esto se le conoce como huevo.

Con este otro programa find.c, podemos encontrar la dirección de memoria donde se encuentra el huevo, aqui vemos que nos retorna 0xbffff866.

Intentemos pegarle al shellcode:


!! EFECTIVO !!


Lo que hacemos es meterle 504 bytes al buffer y los 4 restantes que sobreescriben EIP son los bytes de la dirección en memoria de nuestro huevo. Para el ataque hay que tener en cuenta que se deben poner los bytes en orden inverso para que nuestro procesador los entienda correctamente.

Despues de explotar este binario lo que podiamos hacer era leer un fichero que tenia como propietario otro usuario (sin permisos de lectura para el jugador del reto = campus02) y listo, con eso pasabamos el nivel.

Conclusiones:

1. Un ejercicio de stackoverflow sencillo.

2. Creo que son las mismas protecciones usadas en el binario anterior, buena por esa!.

3. Los BOFs nunca pasaran de moda, siguen allí, ¿sigues programandolos? (alguien seguirá explotandolos)

//FIN RETO 3 //
Queda uno ...

// RETO 4 //

jueves, 20 de agosto de 2009

How to PASS wargame CP 2009: CRYPTO

Aquí va la tercera entrega de soluciones del wargame realizado en campus party valencia:


// RETO 1 //


Al seguir el enlace llamado Bases, nos descargamos un PDF que tiene las bases del concurso. ¿Que hacemos entonces?

1. Podemos buscar en el código fuente del sitio, mirar posibles scripts, etc, pero no vemos nada.

2. El enunciado dice que "en las nuestras hay un par de sorpresas", eso dice algo como que en las reglas hay un par de cosas que nos interesan, pero si leemos las reglas del archivo pdf y las comparamos con las reglas del archivo de presentación del wargame, vemos que son las mismas.
Y no hay nada raro en ellas.

3. Abandonamos el juego !

4. Tengo una teoría sobre los wargames, cada vez que se monta uno, los creadores intentaran hacer niveles que se relacionen con ellos de alguna forma, con sus blogs, con sus herramientas, con sus investigaciones, de todas formas algo que se busca publicando un reto es que se conozca mas acerca de quien lo esta realizando y sobre las cosas que tiene para mostrar ;)

Así que siguiendo esto nos vamos a buscar las palabras pdf, mezcladas con security by default. Lo hacemos de esta forma:

El primer documento que aparece es una entrada de hace algún tiempo donde nos hablan de un modulo de perl muy interesante, será esto lo que hicieron?, A que si!.
La forma mas fácil de tenerlo es bajando el fuente, lo descomprimimos, le damos

root@plasma:/tmp/Fuse-PDF-0.09# perl Makefile.PL
y luego

root@plasma:/tmp/Fuse-PDF-0.09# make

y listo, ahora lo usamos con nuestro pdf.

Fácil no?, si conoces la herramienta y sabes como hacerlo, todo es tan fácil :p

Si quieres saber mas sobre el filesystem que se usa para montar temporalmente el PDF, entonces lee por aquí.


Conclusiones:

1. Referenciate siempre en lo que quieren los creadores del wargame, ya lo tienes claro?

2. Casi todo wargame se orienta a usar una herramienta o explotar una vulnerabilidad, debes tener presente toda la gama de posibles herramientas y de ataques para saber cual seleccionar en el momento adecuado, desafortunadamente no hay un truco para eso, creo que todos los que hayamos jugado en muchos wargames (desde hackerzone ...), coincidimos en que esto se le conoce como:
EXPERIENCIA

Y la única forma de obtener esa experiencia es jugando!, tal cual como en los videojuegos :p

-x* Odio a los que me matan jugando UT :( -x*

3. No conocía este paquete de perl, me parece muy interesante, leeré mas sobre este.

// FIN RETO 1 //

vamola, vamola ...

// RETO 2 //

Así comienza el ejercicio, sin muchas palabras, solo un MD5 muy evidente.

Del código fuente de la página vemos que el fondo es una simple imagen que se repite, además encontramos el MD5 en texto plano.

Intentamos romper el MD5?
Ignoreme!

Ok sigamos, concentremonos en la imagen.

Este recuadro y los cuadritos en las esquinas me hacen pensar que esta imagen es un código QR, si quieres crear códigos QR puedes entrar en este sitio. ¿Que hacemos entonces?, podemos buscar una lista de posibles lectores QR, pero la mas efectiva es bajarse este código opensource que se compila muy fácil.

Vemos que el decodificador QR nos entrega un texto que parece ser base64 , si lo descodificamos obtenemos otro texto que parece tener párrafos y que además usa puntuación, lo que me hace pensar que el texto sigue cifrado con algún tipo de corrimiento o sustitución.

Para analizar el texto podemos hacerlo a fuerza bruta o usar una excelente herramienta de criptografía que nos permite estudiar un poco sobre el tema, analizar textos y usar los algoritmos mas comunes de cifrado simétrico y asimétrico.

Con esta herramienta podemos intentar hacer un análisis de sustitución y nos dirá que el texto esta en ingles e intentará crear un mapa de sustitución que es bastante acertado, luego a mano podremos cambiar los caracteres restantes hasta obtener el texto completo.

Luego este texto lo podemos buscar en Internet y adivinen que encontraremos?, la referencia a un post de SBD donde hablan de un método de captcha muy popular en esos días.

La solución entonces era el titulo de dicho post, que buen reto !

Conclusiones:

1. La verdad es que descifrar texto no es una tarea muy simple, pero si contamos con las herramientas indicadas nos ahorraremos mucho tiempo.

2. Debes tener una novia al lado (o conectada) para que te inspire a la hora de resolver estos ejercicios, thx triz :P

3. Hay que leer mas sobre QR, al parecer por estos lados aún no es un tema común, revisen el listado que les dejé para que estudien también!

// FIN RETO 2 //

aquí vamos otra vez ...

// RETO 3 //

Al seguir el link ...


Este nivel aún no se como se pasa, tengo la teoría, lo que esta en el twitter son textos en base64, si los descodificamos tenemos mensajes cifrados en RC4, que se supone que hay que hacer entonces?, un ataque de fuerza bruta (otra vez :( ) contra el mensaje hasta que rompamos la clave con la que fue cifrado. En las pistas que nos dan los creadores del reto, dice que se rompe con una palabra que esta en su sitio web ...

Ni idea de como pasar este nivel, alguien se anima?

El link donde están los textos cifrados es este: http://twitter.com/Ninja_Assasin.

Conclusiones:

1. Odio la fuerza bruta !!!

2. Odio la fuerza bruta !!!

3. La criptografía fuerte es fuerza bruta, la odio !!!

Update (24 de agosto): vierito5, me cuenta que la palabra que le hace falta a mi diccionario es "wargames", no puedo creer que no se me ocurriera. En el dicionario sacado del sitio, tenia la palabra "wargame", todo por una s, lol.

Lo que habia hecho era programar un bruteforce para RC4, lo probe con la palabra y funcionó:


Con eso queda resuelto el reto, gracias vierito5 ;)

// FIN RETO 3 //

un suspiro y seguimos ...
// RETO 4 //


En este reto nos preguntan si tenemos el certificado del campurriano, y recordamos que en el primer reto encontramos un archivo llamado ficticio.p12, esa extensión al igual que esta, nos habla de un estándar PKCS el cual nos permite definir un container con información privada y protegido con una clave simétrica. La clave simétrica se usa para proteger el acceso a los certificados digitales del usuario.

Estos archivos los podemos pasar a diferentes aplicaciones como navegadores y dispositivos que requieran acceso a sistemas protegidos comúnmente por SSL.

En el escenario de este reto, tenemos un servidor web apache, configurado con certificados digitales autofirmados y el reto entonces consiste en encontrar la clave que me permite abrir el container .p12 para sacar los certificados digitales del usuario y poderlos agregar a un navegador para que el servidor web me permita acceder al contenido que protege.

En resumen, crackear el certificado .p12.

Para hacer esto debemos tener el archivo .p12 (ya lo tenemos), debemos tener un software de crackeo y además un diccionario que funcione (fuerza bruta otra vez).

En el web site de sbd recomiendan usar una herramienta llamada brute12, pero la verdad la probé en linux emulada con wine y en windows de todas las formas posibles y no funciona. Si quieres crearte tus propios archivos .p12 para hacer pruebas, puedes seguir la documentación que aparece en este link.

La forma de pasar este nivel ya explicada se basa en un diccionario mágico generado de la página de campus con el que se puede hacer lo siguiente:

1. Crear un mini script que invoque directamente a openssl y le pase como parámetro una posible clave de una lista y trate de abrir el archivo .p12, si la clave es correcta entonces el script parará y me pedira la clave con la que quiero exportar el certificado .pem.

root@plasma:~/ssl# cat script
for i in `cat dict.txt`
do
echo $i
openssl pkcs12 -in $1 -passin pass:$i -out nando.pem
done
root@plasma:~/ssl#
2. Ejecutarlo y esperar la respuesta:
root@plasma:~/ssl# sh script ficticio.p12
Esta
Mac verify error: invalid password?
es
Mac verify error: invalid password?
la
Mac verify error: invalid password?
versión
Mac verify error: invalid password?
html
Mac verify error: invalid password?
del
...
hubiesen
Mac verify error: invalid password?
finalizado
MAC verified OK
Enter PEM pass phrase:
En el punto donde se detiene el script leemos la clave correcta con la que se abre el container.
Esta forma funciona si no conseguimos un cracker de archivos .p12, pero Lorenzo Martinez muy amablemente creó una herramienta de crackeo llamada brute12unx, basada en brute12, que funciona muy bien. Esta herramienta es un sencillo script en perl que lee palabras de un diccionario y ataca la apertura del archivo en cuestión.

Un ejemplo? :
root@plasma:~/ssl# perl brute12unx.pl -p ficticio.p12 -d dict.txt
Certificate Cracker PKCS12 for UNIX 03/08/2009 (http://www.lorenzomartinez.es/projs/brute12unx)
By Lorenzo Martinez (lorenzo@lorenzomartinez.es)
Based on idea: brute12 (http://www.security-projects.com/?Brute12)
Password is: finalizado
Start time: 2009-08-21 16:25:09
End time: 2009-08-21 16:25:13
Abriendo este container ya podiamos cargar los certificados digitales en el navegador y el servidor web objetivo nos dejaria entrar, que encontrariamos?, segun dicen los amigos de sbd una imagen a la cual habia que pasarle un software de esteganografía para sacar otra imagen que tenia la clave, no tengo la imagen, pero si usan por ejemplo la herramienta openstego podran evidenciar lo fácil que es esconder imagenes, musica, etc, dentro de otras imagenes, musica, etc . Si hace una busqueda en los repositorios de los sistemas linux, podran encontrar otras tantas herramientas.
root@plasma:~# apt-cache search stegano
outguess - Universal Steganographic tool
python-stepic - Python Steganography in Images
samhain - Data integrity and host intrusion alert system
snowdrop - plain text watermarking and watermark recovery
steghide - A steganography hiding tool
root@plasma:~#
Conclusiones:

1. Este era un ejercicio interesante, sin embargo ya teniamos todo lo que necesitabamos excepto por supuesto el diccionario correcto. Todos estos ejercicios se volvieron de fuerza bruta, si tienes el archivo y tienes la herramienta, solo basta conseguir el diccionario adecuado y tener mucha paciencia. En fin, tendré que mejorar mi capacidad de deducción referente a que diccionarios usar :P

2. Cuando NO hay herramientas de crackeo automatizadas, siempre podras usar las herramientas que se usan en un sistema de forma convencional, sin embargo los tiempos de crackeo van a ser muy diferentes y en la mayoria de los casos sera un proceso mas lento. Lo ideal es programar las herramientas de crackeo en lenguajes muy rápidos (como C o ensamblador) y obviamente para eso vas a necesitar un set de librerias con los estandares y protocolos que quieras atacar, pero creo que todo esta casi hecho y si no, a programar!!!

Un ejemplo de los tiempos de mi script vs el brute12unx:

El script:
Mac verify error: invalid password?
finalizado
MAC verified OK
Enter PEM pass phrase:
real 0m10.651s
user 0m8.169s
sys 0m1.880s
brute12unx:
Password is: finalizado
Start time: 2009-08-21 16:38:13
End time: 2009-08-21 16:38:17

real 0m3.575s
user 0m3.544s
sys 0m0.028s
Esto lo calculé con el comando time de un sistema linux.

3. Puedes jugar con openssl y hacer muchas cosas mas que intentar crackear archivos .p12 :P


// FIN RETO 4 //


miércoles, 19 de agosto de 2009

How to PASS wargame CP 2009: WEB SECURITY

Hola a todos!, continuamos con las soluciones de los niveles relacionados con el tema de seguridad en web.

// RETO 1 //

Cuando le hacemos click en el link de login obtenemos:


Vemos un sistema de autenticación normal, usuario y clave, sin embargo mas abajo tenemos un link de recuperar contraseña. De la experiencia y visitando uno que otro sistema, me he dado cuenta que aveces los desarrolladores ponen mucho énfasis en proteger sus sistemas de autenticación, pero se descuidan con los sistemas secundarios, como los recuperadores de contraseñas, inscripción de usuarios y cosas así. La seguridad tendría que abarcar cada posible entrada de usuario.

Cual atacarías primero?, la entrada principal o el sistema de recuperación de contraseñas?.

Nos hacen una pregunta personal del usuario, así que debemos conocer un poco mas del usuario para poder tener esos datos. Que tal si lo buscamos en google?

En google no vemos nada, en otros buscadores tampoco, intentamos visualizar el sitio, pero no hay nada, intentamos pruebas básicas de sql injection y nada ...

Bueno, después de pensarlo con mas calma leemos nuevamente y nos dicen que este sujeto usa mucho las redes sociales, así que tendrá que ser un usuario activo de tuenti, facebook, twitter, identi.ca, etc, etc. Lo que hacemos entonces es buscar su nombre de usuario en cada una de estas redes y adivinen donde lo encontramos?

En los microposts podemos leer la respuesta a la pregunta secreta: R5CopaTurbo.

Y con esta clave obtenemos la contraseña del usuario que nos esta pidiendo el nivel

Y listo, pasamos el nivel!, fácil eh?, como siempre!, después de hacerlo se da uno cuenta que era hasta fácil, pero la verdad perdí mucho tiempo buscando al campurriano!!!!

Conclusiones:

1. Un nivel bueno para ser el primero de esta serie.

2. La moraleja es: ¿ Que tantas cosas dices en tus blogs, wikis y redes sociales?, ¿Que tanto "material" hay disponible sobre tí para perfilar un ataque a un recordatorio de contraseñas?.

3. ¿Se asustó?, go and chage it!

4. Un sitio de busqueda de nicks registrados en diferentes servicios muy interesante.


// FIN RETO 1 //

Vamos ...

// RETO 2 //

Vemos otro sistema de autenticación ...


Intentamos usuarios y claves al azar y no pasa nada, luego observamos el código fuente y descubrimos que hay un archivo llamado login.swf.

Debes concluir al igual que yo, que el sistema de validación lo hace un archivo de flash. :p

Que hacemos entonces?

Lo primero es descargar el archivo y lo segundo tratar de abrirlo (desemsamblarlo) para ver que tiene por dentro.

root@plasma:~/Desktop# apt-cache search flasm
flasm - assembler and disassembler for Flash (SWF) bytecode
root@plasma:~/Desktop# apt-get install flasm
Reading package lists... Done
Building dependency tree
Reading state information... Done
Desensamblamos y leemos la salida:

root@plasma:~/Desktop# flasm -d login.swf > salida
Leyendo el desensamblado que es una locura, encontramos en las primeras líneas referencias a MD5.
frame 0
constants 'str', '', 'j', 'hex_chr', 'charAt', 'nblk', 'length', 'blks', 'Array', 'i', 'charCodeAt', 'addme', 'rol', 'bitAND', 'bitOR', 'cmn', 'bitXOR', 'x', 'str2blks_MD5', 'a',$
function2 bitOR (r:4='a', r:3='b') ()
Esto me hace pensar que el archivo puede tener una validación donde la contraseña este almacenada en MD5. Entonces la buscamos en el archivo completo (strings -32 salida).

De esa forma encontramos algo que parece un MD5, y como lo crackeamos?, lo primero es intentar con los sitios de crackeo online: 9f29db7287469c5f9520a1f8ddf946f2

  • http://passcracking.com/
  • http://www.md5crack.com/

Y bueno, encontramos la clave perdida. Y cual es el usuario?, pues como en el enunciado nos dicen que campurriano es el administrador, entonces pruebo con el usuario campurriano y con el usuario admin y sus combinaciones. Ahí termina el nivel ;)

Conclusiones:
1. Deben existir mejores herramientas de desensamblado en .swf, pero flasm fue lo primero que vi.

2. Si deseas asegurar una aplicación programada en flash, entonces usa criptografía fuerte, de modo que no sea vulnerable a desensamblados.

3. Los crackeadores de passwords online son la primera opción a usar cuando requerimos algo rápido. Si pagas por una subscripción seguro que rompes lo que sea :p

// FIN RETO 2 //

go ahead!

// RETO 3 //

De nuevo ...

El código fuente de la página luce muy simple, que hacemos?

Después de desesperarnos un poco podemos plantear diferentes vectores de ataque:

1. hacer fuerza bruta tratando de encontrar archivos o directorios mal ubicado
2. hacer fuzzing para tratar de descubrir problemas en los scripts o en el sitio en general
3. pedir auxilio en el foro, en listas, leer sobre vulnerabilidades web, etc.
4. abandonar el reto :p

Lo que yo hice fue continuar probando posibles entradas maliciosas, hasta que con el símbolo ", saco un error.

El error dice algo acerca de XML y estamos hablando de seguridad en WEB, por lo que me oriento a pensar en un problema de XPATH Injection, la cual esta clasificada como una vulnerabilidad web hace mucho tiempo al igual que los SQL Injection y derivados.

Con esta ruta clara, buscamos información de como inyectarle algo para que nos deje validar.
Podemos intentar algo como:

usuario: xxx" or "1"="1
password: xxx" or "1"="1
Esto efectivamente nos deja pasar y entramos a "un sistema de blogs?" algo simple.

Sigo explorando por todos lados y encuentro algunos scripts de php (ensenia.php, postz.php), pero no logro encontrar cual es la respuesta, será que tengo que inyectar xpath para sacar mas información?, pero ya entre al sistema, para que quiero inyectar mas ...

En fin, después de buscar mucho por ese lado y de leer un poco sobre simplexml (producto del error) decido inventar nombres y rutas a donde se encuentren posibles archivos xml.

  • scripts/
  • archivos/
  • files/
  • includes/
  • xml/
  • bd/
  • inc/
De todas estas pruebas me llevo una sorpresa, el directorio xml responde con l siguiente:

El mensaje de advertencia deja mucho que pensar, es una autenticación básica de apache y me esta diciendo que por allí no es, será?. Obviamente intento unas cuantas claves pero no funcionan, en este punto uno puede pensar en un ataque de fuerza bruta contra un sistema de autenticación básica. Bueno, ve a por el!.



El mismo problema de siempre cuando hacemos ataques de fuerza bruta, el tiempo, el tiempo.
Aunque hay un problema mucho peor, no tener afinadas las herramientas. ¿Confias en que tus herramientas realmente hacen lo que dicen?, funcionan?, me he encontrado con herramientas que dan muchos falsos positivos y otras aún peor que bajo mucho stress no se comportan adecuadamente, tengan mucho cuidado con eso ...

Bueno ya empece a desesperarme, busquemos en otros niveles, alguna pista algo interesante ...

Mirando otros niveles me puedo dar cuenta que es necesario conectarse a un servidor ssh, allí me dan el usuario y la clave para conectarme.

usuario: campus01, clave: blah
usuario: campus02, clave: blahz

Uhmm esa clave porque?, sera de blah, blah, blah (cuando una persona habla mucho?), lo que hago entonces es buscar esa palabra en la lista de palabras que tengo llamada all, que en un post anterior dije de donde bajarla.

De la búsqueda encuentro palabras como:
root@plasma:/tmp# grep blah all
bablah
blah
blahlaut
blah
...
Lo que hago es empezar a probar usuarios y claves "custom", pruebo con nombres como: Campu_rriano, admin, administrador, sbd, campus, campus01, campus02, campusxx, mezclandolos con claves con estas claves: blah, blahz, blahs, blashy, etc.

Al tener un diccionario custom, puedo usar una herramienta de fuerza bruta probada y recontraprobada o si tengo mucho tiempo, lo hago a mano!.

Al final y con mucha suerte logro encontrar que la combinación:

usuario: blah
clave: blah

!FUNCIONA!

Pero bueno, al entrar no encuentro nada, es simplemente una página web vacía que no tiene código oculto ni nada, y entonces?.

De aquí podemos analizar varias cosas:

1. Quizás sea un despiste (honeypot :p) para que creamos que hay algo importante en este directorio, así que estaríamos perdiendo las horas de pruebas que hemos realizado hasta el momento.

2. Puede ser que se aseguraron de proteger el directorio porque hay archivos importantes que no estan listados, pero que existen, esto es muy probable.

Que hacemos entonces?, nuevamente empezamos a probar nombres y posibles rutas, que tal si probamos con archivos .inc, .php, .xml, .css ??

Basandonos en los nombres de los scripts que hemos visto, en la salida de los .css que hemos encontrado, después de intentar un buen rato encontramos que hay un archivo llamado posts.xml, ese archivo al ser .xml se visualiza como un archivo de texto plano en el navegador
y puedo observar su contenido:


En el comentario estaba la clave que me pasaría de nivel y listo, después de mucha fuerza bruta y de reintentar y reintentar pudimos encontrar la clave correcta.

Conclusiones:

1. Es importante que piensen que en un wargame debemos usar herramientas que realmente sepamos lo que hacen, que estén comprobadas y que las hayamos afinado para lo que vayamos a realizar. Para esto es clave primero hacer unos "pilotos de ataque", para comprobar su efectividad. de lo contrario nos harán perder el doble del tiempo, ademas de hacernos abandonar la ruta correcta.

2. Los ejercicios de fuerza bruta son desesperantes.

3. Yo creo que el nivel lo pase de una forma que no era, porque encontrar a fuerza bruta la autenticación blah, blah, me permitió pasar también una parte del próximo nivel y leyendo la explicación de la gente de sbd, no creo que el asunto fuera por este lado, pero vale no?

4. Si esta no era la ruta que ellos esperaban, entonces como se supone que podía leer un archivo .xml, inyectando con xpath?, si alguien tiene la solución por favor que la publique.
(update 1 - 20 agosto/2009) Listo ya la tengo, supuestamente usando este tool.

5. Estuvo muy interesante este nivel. thx sbd.

// FIN RETO 3 //

Y para finalizar ...
// RETO 4 //

Lo primero con lo que nos encontramos es con un sistema de validación, otra vez, pero como dije antes, adivinen cual es el usuario y la clave? (blah:blah)

Una vez adentro leemos otra historia mas acerca de Campu_rriano y seguimos el link que nos indican:

De este error podemos ver que el sistema esta esperando que ingresemos un parámetro id, en el script login.php. Al hacer algunas pruebas cambiando el valor del id, nos damos cuenta que el ejercicio posiblemente es de sql injection puesto que obtengo resultados diferentes a medida que cambio parámetros o uso la instrucción SELECT, UNION, etc.

El sistema por defecto muestra un nombre y un usuario, pero suponemos que en las tablas de "mysql?" debe haber un campo de password, pero que el script login.php no lo muestra porque solo saca las posiciones de usuario y nombre. Como le hacemos cambiar de parecer?

Pues lo obligamos a que nos muestre el otro campo haciendo un SELECT incorrecto que no retorne nada y haciendo un UNION que retorne lo que quiero:

id=400' UNION SELECT 1,2

Así en vez de mostrarnos el nombre y el usuario, nos mostraria el usuario y el password, realmente nada raro, solo un ataque de sql injection y volviendo a leer el enunciado entonces nos damos cuenta que es un ataque de sql injection a ciegas ;), posiblemente el bug se encuentre con una herramienta automatizada, pero no vale la pena usarla, ya que el mismo reto nos dice cual es la variable a inyectar. El password mostrado nos dejaba pasar el nivel.

Conclusiones:

1. Un reto fácil porque ya tenia el usuario de la autenticación básica.

2. SQL injection siempre estará de moda en los wargames, hasta que aparezca algo mas entretenido.

3. No me toco cambiar todas las peticiones GET por PUT o algo similar, puesto que me autentique correctamente en el formulario, esto fue una ventaja, ademas me ahorro la ruta de ir a configurar un proxy para que cambiara el método de petición.

4. Nos leemos en la proxyma entrada. Comentarios / Sugerencias, en el link de abajo :p

// FIN RETO 4 //

Entradas populares