Vamos allá: estábamos trabajando en el nivel 4 del concurso . Sabemos que hay un formulario integrado en un componente Flash (swf). Nuestra suposición: el código que valida al usuario está en el propio swf (no se hacen llamadas a otro servidor), por tanto, aplicaremos ingeniería inversa sobre el binario .swf, descifraremos el algoritmo usado y pasaremos al siguiente nivel. Facil, ¿no? Pues no… ahora veremos por qué.
Si trabajamos en Windows, podemos encontrar varios descompiladores de ficheros Flash swf. Si trabajamos en Linux, sólo he encontrado uno, Flare 0.6, que al usarlo, dejaba como resultado código ininteligible. Al parecer el .swf del nivel 4 tiene alguna protección que hace que la ingeniería inversa no sea trivial.
Buscando en el sabio, encontramos que Sothink SWF Decompiler es una de las herramientas de ingeniería inversa sobre Flash que más se usan. Lo instalamos en Windows y … ¡ah! no, mejor lo instalamos en Linux. ¿Cómo? con WINE, y no, WINE no es un emulador.
Una vez instalado, veremos que al lanzar Sothink SWF nos sale una alerta indicando que falta el componente flash.ocx. Buscando en el sabio encontramos que es necesario instalar el FlashPlayer para Windows (otra vez desde WINE).
Ya tenemos todas las herramientas instaladas. Abrimos el fichero login.swf. Y aquí nos damos cuenta de que el código ActionScript descompilado también deja mucho que desear. ¿Se acabó? No, nos queda una última bala, Sothink permite exportar todos los recursos que hayan podido descompilarse a partir del .swf . Lo hacemos.
La versión de evaluación de Sothink nos avisa: ojo, esta versión sólo exporta los dos primeros frames. Esperemos tener suerte 😉
Le indicamos a Sothink que deje en /tmp/login/ los resultados de la descompilación (parcial). Veremos que hay bastantes directorios. Ahora toca pensar… a ser posible con un poco de café al lado 😉 . Resumiendo la mini-reunión que tuvimos el día de la competición: ¿qué palabra podríamos buscar en todo lo exportado que tenga que ver con el procedimiento de validación del user y password? Lo primero que se nos viene a la cabeza: «pass» o bien «user» . Vamos a probar suerte…
$ cd /tmp/login
$ grep -irn user *
Coincidencia en el fichero binario Frame/frame1.swf
Vamos a ver qué hemos pescado. Filtremos las cadenas «legibles», busquemos user y pidamos un contexto de +-5 líneas:
$ cd Frame
$ strings frame1.swf | grep -C5 user
E/d@
EnterButton
Button
C~D^F
./level5-bUrm4nfl4x.html
username
password
UserName
Password
Button
KJ
¿La suerte también cuenta? 😉
pues yo todavia no me he enterado de la soluiion
Lo que está en rojo es la solución:
./level5-bUrm4nfl4x.html
es decir, si tecleas en el navegador:
http://hackit2.diariolinux.com/level5-bUrm4nfl4x.html
pasarás de nivel…