Jane: pruebas seguridad Campus Party 2008
En este post voy a recopilar las soluciones de las pruebas del concurso de la Campus Party, las correspondientes a la categoría de seguridad. Pongo todo de mi memoria y de los logs del chat de equipo, así que no tengo los enunciados ni binarios ni nada... espero que quede más o menos claro todo 🙂 El orden tampoco es 100% seguro que sea ese, pero es más o menos como nosotros lo hicimos.
Prueba 1: token01
En esta prueba había que obtener un token para acceder a la próxima prueba, mediante una aplicación que te ofrecía un desafío y había que responder con la respuesta correcta. O bien hacer un poco de ingeniería inversa, claro. En este caso era fácil, solo con strings podías sacar el token, pues salía esto:
cuchara@vm02 /home/pruebas/cuchara $ strings token01
/lib/ld-linux.so.2
libcrypt.so.1
__gmon_start__
_Jv_RegisterClasses
crypt
libc.so.6
_IO_stdin_used
exit
strncmp
puts
printf
strlen
__errno_location
read
open
scanf
__libc_start_main
GLIBC_2.0
PTRh0
0[^]
[^_]
Enhorabuena, has pasado la autenticacion. El token es: dyP6IQCjo05S51x
Prueba 2: Aplicación web
En este caso, nos daban la URL de un servicio de webmail, y nos pedían obtener un archivo en el directorio padre. Mirando el código fuente HTML se veía un comentario indicando que se trataba de Endymion MailMan, y buscando en bugtraq encontramos esto.
Como pone, usando la variable ALTERNATE_TEMPLATE podemos conseguir un file disclosure, y allá que fuimos. Agregando esto a la URL: ?ALTERNATE_TEMPLATES=../u1Bjnk0R18maywv%0 0 conseguimos leer el archivo u1Bjnk0R18maywv situado en el directorio padre al servicio de webmail.
Prueba 3: token02
Otra de tokens, con un binario de por medio. En este caso, strings no daba ningún resultado así que no me calenté mucho la cabeza. Como gdb estaba disponible, cogí y puse un breakpoint justo tras la comprobación de la respuesta. Al ver que eax estaba a cero y se usaba para comprobar si el desafío era correcto (era el resultado de una comprobación) lo puse a 1 y arreglado:
(gdb) set $eax=1
(gdb) next
Single stepping until exit from function main,
which has no line number information.
Enhorabuena, has pasado la autenticacion. El token es: a15EJwU8wjkX
Sencillito 🙂 Aunque quizás lo suyo habría sido copiar el binario y parchearlo... pero no había ganas, gdb es más eficiente para estos casos jeje
Prueba 4: Escalada de privilegios
Esta prueba no era difícil pero se nos (me) atragantó. Y me cabreé bastante conmigo mismo por no verlo, todo hay que decirlo :roll:. Nos daban un ejecutable con bit setgid activo, para leer un archivo mediante el uso de una contraseña.
Tras probar los típicos parámetros larguísimos de N-mil A's y ver que no petaba, pasé al desensamblado y a leer el código. El programa usaba strncpy para copiar el password a una variable local (llamémosla buf), llamaba a check_pass(buf). Seguidamente sumaba el valor devuelto por check_pass a una variable local que había inicializado a 0 al principio del programa, y si el valor era 0xeb llamaba a read_file(argv[2]).
El problema aquí fue que estuve eones intentando entender check_pass, tratando de hacer gdb saltar a la función read_file como hice en token02, pero claro, daba error de archivos pues al estar usando gdb no se ejecutaba con los privilegios del setgid.
Al final, tras las 3 horas lo dejamos y lo recogí al día siguiente por la mañana. En 5 minutos me di cuenta de que el strncpy() copiaba 100 bytes y sobreescribía la variable local (solo un byte) que se sumaba al resultado de check_pass, que era 1 cuando el password era incorrecto.
Así pues, la cosa quedaba algo así:
plato@vm02 /home/pruebas/plato $ ./leer_archivos `pe rl -e 'print "\xea"x1000'` secreto
Enhorabuena, has conseguido leer el archivo secreto.
El codigo de validacion para pasar la prueba es: cfn3HqqbJlSeHsP
Que lo disfrutes
Sencillo verdad? Pues no lo veía, hay que... jejeje Nada como una noche descansando y una buena ducha para olvidarse de todo lo que ya has probado y ver estas cosas.
Prueba 5: Password Cracking
Seguidamente nos pusimos con una prueba de password cracking. Nos daban un / etc / passwd y había que crackearlo en 4 horas.
Esta fue la prueba que menos me gustó. Había que aplicar un ataque por diccionario, pero si no tenías el diccionario en concreto lo tenías mal porque el password no tenía ningún sentido... usamos más de 4 horas y perdimos el bonus, pero bueno... que se le va a hacer, no nos iban a gustar todas las pruebas.
El hecho de que no me gustara es más bien porque influía mucho más la suerte de tener el diccionario concreto que las habilidades del participante.
Prueba 6: Wifi
Esta era fácil. No me pareció demasiado justo que valiera 1600 puntos pero bueno, así son las cosas. Se trataba de una captura de 2 paquetes de una wifi de las de telefónica/imagenio. Sí, de estas de WLAN_XX en las que la WEP solo depende de la MAC, la marca del router y alguna cosa más... y al final solo tienes unas 16^4 posibilidades (si no me falla la memoria).
Total, que usas wlandecrypter o algo similar tras generarte el diccionario y arreglado.
Prueba 7: token03
Otra de los tokens, esta vez un poquito más difícil. Había que obtener la respuesta para un desafío concreto. Lo que hicimos fue cargar el binario en gdb, y analizarlo un poco. Se veía que se leía de /dev/urandom, había un printf que probablemente mostraba el desafío, y un scanf que leía el mismo.
Tras ello había un crypt() y un strncmp(). Esto nos indica que probablemente la respuesta al desafío fuera crypt(desafio,salt), donde nos falta por averiguar el salt. Con gdb o con IDA Pro era fácil encontrar el salt, que era la cadena cp.
Así pues, este sencillo programa nos daría la solución:
#include <stdio.h>
#include <unistd.h>
int main(int ac, char **av){
char *str;
str=crypt(av[1],"cp");
printf("%s\n",str);
}
Tras ejecutarlo como:
$ ./a.out HugGOJ28
cpbSFUhk1FzG
No era demasiado difícil no? 🙂
Prueba 8: Ingeniería inversa
Esta era la última prueba (si no me dejo ninguna). Esta no la pasamos, porque era muy complicada y porque no teníamos nada de tiempo. Se nos daba un dump de memoria (a partir de la dirección 0x080000) de un integrado, del cual se nos daba la foto. Aparecía marcado GC2-D2C en el mismo, lo que nos indica que algo tiene que ver con la wii.
Ahora sé que es un micro Panasonic MN102 y parece estar soportado por IDA Pro, al menos la versión 5.3 debería soportarlo. Se nos pedía un password que controlaba el acceso al resto del firmware y la función de la instrucción 0x60.
No llegamos a analizar nada, puesto que quedaban 2 horas y dieron 8 para el bonus, así que nos dio tiempo a nada. A parte de que no sabíamos qué micro llevaba ese chip y no podíamos desensamblar nada claro...
En fin, esta me la dejo por si tengo un rato y ganas de frikear... si lo hago ya contaré algo por aquí 🙂
Se acabó
Pues eso, hasta aquí mis soluciones rápidas a las pruebas del concurso de seguridad de esta Campus Party 2008. Desde aquí agradecer a Pedro, Rapul y Jaime por el curro que se pegaron con el concurso, y por entretenernos un tiempo.
Y también dar las gracias a Javi y a Amin por ese equipo que formamos, que funcionó a la perfección 🙂 Y también quiero cagarme en el mod_security de este servidor... que no me dejaba postear algunas palabras, de ahí los espacios que he metido en algunos.
August 7th, 2008 - 13:57
El diccionario usado para el passwd fue el Argon, yo no lo conocía por el nombre pero me coste bastante horas encontrar uno que me sirviera.
Para la de wifi, usé wlandecrypter y wepattack.
August 7th, 2008 - 16:52
Puff no se como os dio por probar el diccionario Argon… si ya me he costando encontrar el diccionario… como para probarlo.
http://theargon.com/achilles/wordlists/
pufff no hay diccionarios para probar ni nada…
vaya suerte
August 7th, 2008 - 17:02
Efectivamente. De ahí que sea la prueba que menos me gustó… junto a la de Wifi tal vez por ser [i]demasiado fácil[/i] para los puntos que daba.
De todas formas estuvimos un buen rato probando diccionarios distintos… de hecho no hicimos la prueba en el límite de las 4 horas que daban (para obtener bonus), sino bastante más tarde.
De todas formas a mí las pruebas en general me gustaron, estuvo entretenido 🙂
August 7th, 2008 - 17:11
Lo del tiempo no se muy bien como iba… porque por ejemplo cuando me entere de que habían retos de seguridad, me puse con uno de kriptografía de 1 hora y lo empezé por la noche y me fui a dormir y al dia siguiente lo resolví y me dieron la máxima puntuación. Y no solo me ha pasado a mí, a un amigo con otra prueba lo mismo.
¿Cómo va esto del tiempo? Lo único que se me ocurre es que el tiempo solo empieze a contar cuando fallas por primera vez… o que como yo y mi amigo nos apuntamos un poco tarde y el primero ya tenia lo menos 5000 puntos, el tiempo no nos afectara a nostros.
August 7th, 2008 - 17:18
Pues quizás a las primeras pruebas no se aplicara, pero luego (al menos así nos pasó a nosotros) cuando excedías el tiempo máximo o le dabas a ‘cancelar prueba’, la prueba pasaba a valer menos de lo que valía (creo que en la mayoría la mitad).
Al menos esa era la teoría… y a nosotros se nos aplicó en unas cuantas pruebas.
El tiempo empezaba a contar desde que dabas al link que te llevaba a la página de descarga del archivo de la prueba, con el mensaje o las instrucciones o lo que llevara esa prueba.