El nivel 7 fue el que menos tiempo nos costó resolver 🙂 Veníamos preparados..
Unas horas para que lo penséis… (y el password que aparece en pantalla no es el correcto 😉
El nivel 7 fue el que menos tiempo nos costó resolver 🙂 Veníamos preparados..
Unas horas para que lo penséis… (y el password que aparece en pantalla no es el correcto 😉
Reverse Engineering. Cracking. Un poco de conocimientoso sobre ambos temas serán imprescindibles para
pasar este nivel (os he dejado muchos días para que fuerais sacándolo por vuestra cuenta, ¿qué tal os ha ido?) Vamos a por ello. Tras descargarnos el fichero .zip que indica la página, lo descomprimimos e intentamos ejecutar (txipi nos dijo que no había virus ni código maligno en los ejecutables, por eso nos atrevemos a ejecutar un binario a pelo…). La salida es bastante pobre, por decir algo:
sh-3.2$ ./program
sh-3.2$
Así que toca depurar con GDB.
$ gdb ./program
warning: no loadable sections found in added symbol-file /tmp/program
(no debugging symbols found)
Vaya, si no hay tabla de símbolos, la depuración puede ser un infierno. Así que comprobemos primero que el ejecutable
no haya sido comprimido con UPX o similares (UPX es el compresor más conocido de ficheros ELF en Linux):
$ upx -l ./program
Ultimate Packer for eXecutables
Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007
UPX 3.00 Markus Oberhumer, Laszlo Molnar & John Reiser Apr 27th 2007
.
File size Ratio Format Name
-------------------- ------ ----------- -----------
532432 -> 52404 9.84% linux/elf386 ./program
¡Tachán! Efectivamente el ejecutable está comprimido con UPX. Descompresión al canto:
$ sh-3.2$ upx -d ./program
Ultimate Packer for eXecutables
Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007
UPX 3.00 Markus Oberhumer, Laszlo Molnar & John Reiser Apr 27th 2007
.
File size Ratio Format Name
-------------------- ------ ----------- -----------
532432 <- 52404 9.84% linux/elf386 program
Unpacked 1 file.
Y ahora volvemos a pasarlo por GDB, a ver qué nos dice:
sh-3.2$ gdb ./program
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb)
Mejor 🙂 Bien, vamos a poner un punto de ruptura en main():
(gdb) break main
Breakpoint 1 at 0x8048455
(gdb)
Ejecutemos hasta el punto de ruptura y pidamos un desensamblado de la zona:
(gdb) run
Starting program: /tmp/program
Breakpoint 1, 0x08048455 in main ()
(gdb) disassemble
Dump of assembler code for function main:
0x08048444
0x08048448
0x0804844b
0x0804844e
0x0804844f
0x08048451
0x08048452
0x08048453
0x08048454
0x08048455
0x08048458
0x0804845f
0x08048462
0x08048465
0x0804846a
0x08048471
0x08048473
0x08048477
0x0804847e
0x08048480
0x08048483
0x08048486
Bien, se ve la zona de paso de variables a la pila (guardar el contexto) y primera llamada call (por el nombre de la función, times, parece que hace algún tipo de comprobación) y en función del resultado, en main+45 saltamos a main+51. Ahí nueva comparación… saltamos (hacia atrás) a main+47. Parece un bucle, ciclando hasta que se cumpla cierta condición. Posteriormente, se hace una nueva llamada a «times», haciendo alguna nueva comprobación:
0x08048486
0x0804848b
0x0804848e
0x08048491
0x08048493
0x08048495
0x08048497
0x0804849a
0x0804849e
0x080484a4
0x080484ab
En main+90 hay alguna condición que tras comprobarla hace que el programa termine (salta a main+322). Vamos a cortocircuitar este último salto . a ver qué pasa 😉 :
Program exited normally.
(gdb) j *0x080484a4
Continuing at 0x80484a4.
username? jota
error: wrong serial number!
(gdb)
Vaya, algo hemos avanzado, porque al menos nos pide username… Pero poniéndole cualquier cosa (jota, p.ej.), vemos que no le gusta.
Mmmmmhhh… volvamos a la carga:
(gdb) run
Starting program: /tmp/program
.
Breakpoint 1, 0x08048455 in main()
(gdb) disassemble
...
0x080484ab
0x080484b0
0x080484b3
0x080484b6
0x080484bb
0x080484c0
0x080484c3
0x080484c6
0x080484cd
0x080484d1
0x080484d7
...
Entre el printf («username») y el gets (recogida del parámetro por teclado) no hay nada que destacar.
Lo siguiente termina en un jne a main+310. Volvamos a cortocircuitar (no queremos saltar en main+141… queremos ir
a la siguiente instrucción) :
(gdb) j *0x080484d7
Continuing at 0x80484d7.
correct! password = d3nb0r4
Program exited normally.
(gdb)
¡Qué bonito password! 🙂
CanSecWest 2008 es una conferencia sobre seguridad digital en la práctica, celebrada en Canadá, que reúne a los mejores grupos y empresas de seguridad informática del mundo. Entre otros interesantes eventos, el que mayor atención recaba es el concurso Pwn2Own. El objetivo es usar un 0day exploit sobre cualquiera de las 3 máquinas en juego:
Los sistemas vienen instalados con lo justo: lo que «trae el CD» del sistema, instalación por defecto. Son 3 días en los que los mejores equipos de hackers del mundo (en el buen y mal sentido de la palabra 😉 intentan darle candela a esos sistemas. El que primero consiga leer el contenido de un fichero que la organización indica, gana el concurso. Premios: ¡fama! y el portátil que hayan conseguido hackear. Para el primero además, hay un plus de 10.000 dólares y para el segundo $5.000. ¿No está mal, eh? Eso sí, a cambio de ese dinero, la Zero Day Initiative (patrocinadores del evento) les compra los derechos de los exploits 😉 (avisando al fabricante del bug…)
El primer día sólo permiten ataques de red. Los 3 sistemas resistieron como campeones. El segundo día, para facilitar las cosas, permitieron que los atacantes facilitaran a la organización direcciones web que los organizadores visitarían usando el navegador instalado en el portátil. Aquí es donde cayó el primer sistema: MacOSX, debido a una vulnerabilidad (por ahora mantenida bajo secreto por la organización) en el navegador Safari. $10.000 y un precioso Mac Air para Charlie Miller de Independent Security Evaluators (foto de la izquierda). El segundo día no cayó ningún otro sistema. El tercer día quedaban sólo por tanto, Ubuntu Linux y Windows Vista. Los organizadores procedieron a facilitar un poco el concurso, instalando aplicaciones «populares» en ambos sistemas. Una de esas aplicaciones fue el plugin de Flash. Y ahí es donde Shane Macaulay de Security Objectives, junto a sus compañeros Alexander Sotirov y Derek Callaway, se llevaron el Fujitsu y 5.000 petrodólares.
Thorsten Berens, desarrollador OpenOffice para Novel, presentó en la pasada OOo Con 07 de Barcelona un prototipo de visor/editor de los parámetros de configuración internos de OpenOffice. Realizado en Python, parsea los ficheros XML de configuración de OOo y nos muestra los valores de cada parámetro convenientemente en una hoja de cálculo Calc. Hay varias columnas, indicando nombre de la variable, tipo de datos, explicación detallada de su función y valor. El objetivo de OoConfig es similar al about:confid de Firefox: permitir cambiar y ‘tunear’ valores de OOo ocultos. Hoy ya está disponible para su descarga una versión beta de dicha aplicación. Nunca está de más conocer estos detalles…
Koji es el sistema desarrollado por Fedora para permitir la construcción y trazabilidad automática de RPMs. En concreto, permite tomar código fuente del CVS original y convertirlo en un paquete RPM para Fedora. Koji dispone de distintos interfaces de acceso, siendo el más sencillo de usar el interfaz web (que podemos ver aquí). El sistema automático de construcción de paquetes permite disponer del RPM de una aplicación a los pocos días de su publicación … de hecho, yo lo he conocido buscando un paquete RPM de Inkscape 0.46 para Fedora8, cuya fecha oficial de publicación ha sido… ¡hoy!