Solución al HackIt’2010: level 3

Tras rompernos la cabeza con el acertijo de Einstein y no obtener nada en claro, nos decantamos por analizar todo lo que el servidor nos enviaba (cookies, cabeceras, gráficos…) Y héte aquí que analizando el código fuente de la página, vimos que en la hoja de estilos CSS que se cargaba (en concreto en la URL: http://hackit2010.marcansoft.com/default.css ) aparecía una bonita imagen de fondo: img/background.png . La que acompaña a este artículo… y así llegamos al nivel 4, que no es complicado (uy! he dicho la palabra mágica ;-P

HackIt 2010 : solucionario

cc-by-sa  mightyohm http://www.flickr.com/photos/mightyohm/2680805529/ Tenía pendiente desde hace unos cuantos meses escribir sobre el HackIt’2010. También sobre el Hackit-Makeit de la Gipuzkoa Encounter 2011, pero esa acaba de terminar y la dejaré para más adelante.

Ya sabéis cómo funciona la cosa (¿cómo que no? Veo que no seguís DiarioLinux desde hace tiempo). Los hackits de otros años los tenéis tanto en la página de txipi como en las de DiarioLinux (hackit1 (2007), hackit2 (2008), hackit3 (2009)). El Hackit de 2010 por ahora sólo está disponible en la web de marcan. Espero poder hacer un mirror en cuanto consiga convencer a Hey_Neken para que me pase el .tar.gz (lo he intentado un par de veces sin éxito ;-P )

Los ganadores del año pasado (2010) fueron el equipo de topolb, z@scrack, marcan, ziberpunk, jaxvi, lothwen et all (Epic Einsteins !?). 2º puesto para DiarioLinux (yeah!) y tercero para NavarParty (tatai, Ontza, Arcan and cía).

No me extenderé más, probad con el nivel 1 (realmente muuuuy sencillo de pasar, pero para algo es el nivel 1, ¿no? 🙂 En breve la solución (que marcaré con aviso de SPOILER para que no pille a nadie por sorpresa)

Ejecutar scp en background sin ssh-keys

Problema: tengo que lanzar una orden scp para copiar el contenido de un directorio en un servidorA a la misma ruta en el servidorB. Para ello, me conecto desde el PC de casa al servidorA por ssh y lanzo la orden. El problema radica en que no quiero dejar la terminal abierta en el ordenador de casa. Lo que quiero es darle la orden al servidorA y desconectar. Esto se puede hacer precediendo la orden con un nohup por delante y dejándolo en segundo plano… ¡pero scp pide password! Y si está en segundo plano no lo puedo teclear o_O

Solución: usar claves ssh (ssh-keys), de tal forma que se copia la clave ssh pública en el servidorB y a partir de ahi éste no le pedirá password al usuario conectándose desde servidorA. Ésto se puede hacer y no es demasiado complicado (en resumidas cuentas, se crea una pareja de clave pública-clave privada, se sube la clave pública al servidor B y se da la orden de aceptar al cliente que tenga la clave privada correspondiente, sin necesidad de password), pero me gustaría hacerlo de forma más sencilla, sin claves ssh ni necesidad de más configuraciones. Ésto último también se puede hacer, con screen, esa gran aplicación que poco o nada veo usar a la gente.

Recordemos el problema: quiero conectarme a servidorA y lanzar desde ahí una orden scp para copiar una serie de archivos de servidorA a servidorB. La copia de archivos durará mucho tiempo y no quiero tener la conexión abierta durante todo ese rato. El problema es: si corto la conexión, el scp se para. Para que no se pare, podría usar «nohup scp … &», pero scp pide password, y al lanzarlo en segundo plano (con &), no puedo teclearlo.
Así que vamos al grano, usaremos screen, así:

$ screen 
$ lanzo la orden scp

Salgo de screen, pero dejando la sesión abierta. ¿Cómo? Pulsando ctrl+a y luego d .
Ahora puedo cerrar la conexión ssh con serverA cuando quiera.

La próxima vez que conecte por ssh contra serverA puedo retomar la sesión que inicié con screen y ver cómo ha ido evolucionando. Para retomar la sesión, tecleamos:

$ screen -r

Parece más complejo de lo que es. Símplemente toma nota de este post para cuando lo necesites 😉

Hackit!: nivel 3

Warning! Este post muestra paso a paso cómo superar la prueba 4 (nivel 3) del HackIt! de la Gipuzkoa Encounter 2009. Si no quieres verlo, deja de leer… ¿Todavía estás aquí? Entonces ¿quieres leer la solución? Vale, tú mismo. Allá vamos:

0) Descargar el ejecutable para Windows a crackear. Si estás en Linux, aprovecha para pasarle el comando strings y ver si encuentras algo interesante – no hay gran cosa-. Ya puestos ábrelo en vi (sí! abrimos el binario en vi) . Aquí sí que vemos algunas cadenas interesantes. Entre ellas UPX!

1) UPX es un empaquetador de ejecutables (tanto para Win como para Linux). Descargamos UPX. Desempaquetamos el ejecutable (se puede hacer en Linux con Wine si se desea)

/tmp/upx303w$ wine upx.exe -d ../crackit.exe
Ultimate Packer for eXecutables
Copyright (C) 1996 – 2008
UPX 3.03w Markus Oberhumer, Laszlo Molnar & John Reiser Apr 27th 2008
File size Ratio Format Name
——————– —— ———– ———–
28672 <- 8704 30.36% win32/pe crackit.exe
Unpacked 1 file.

2) La idea ahora es abrir el ejecutable con algún debugger para Win. Por ejemplo, OllyDBG. Lo he probado con Wine y no ha ido muy fino así que abrámoslo en el sistema del maligno 😉

Abrimos el fichero desempaquetado crackit.exe en OllyDBG.

Ponemos un punto de ruptura en la primera línea ejecutable del .exe (en la 00401811). Para ello, basta con hacer doble click sobre la línea en cuestión (el número de línea se pondrá rojo, igual que en la imagen). Ahora, dado que la primera línea es un «call 004023E4» lo inspeccionamos con «step into», es decir, pulsamos F7 para ver el código al que ese call está llamando. Ahora, empezamos a navegar por el código usando F8 (o sea, step over, es decir, ejecución línea por línea, sin meternos en los call)

Seguimos así hasta la línea 00401665 «call 00401005». Realmente la idea es que pulsamos F8 hasta ver cuándo se abre una ventana MS-DOS que nos está pidiendo login y password. En ese momento apuntamos la línea que provocó esa llamada y nos damos cuenta de que es la 00401665. Ahora reiniciamos la sesión de debug y pulsamos F7/F8  hasta pararnos en 00401665. Pulsamos F7 (step into) para ver «las tripas» de ese método.

Ahí hay un «jmp 00401010». Pulsamos F7. Y seguimos con F8, línea a línea. En la 00401050 vemos que se prepara el string que nos indicará por pantalla «En esta prueba es importante saber quién eres…». F8 y veremos que se hace una llamada a printf. Seguimos con F8. En la línea 004010A2 vemos que se hace una llamada a fgets (se solicita por teclado un string al usuario). Tecleamos «euskal» y pulsamos intro para seguir depurando. F8 hasta que nos pida el password. Tecleamos cualquier cosa (12345678, por ejemplo).

Ahora se supone que en algún momento deberá de compararse lo que hemos tecleado nosotros (12345678) con la clave correcta que se supone que deberíamos de teclear. Así que vamos pulsando F8 hasta que veamos el «strcmp» pasar por delante nuestro y justo antes, el string con el que comparar  🙂

(pulsa sobre la imagen para ver la contraseña en la línea 004011B3). Suerte con el nivel 4 😉

Nivel 3: crack the planet

Tras los comentarios del nivel 2, especialmente los del usuario anónimo, con el que he tenido una buena discusión (que me ha dado qué pensar, y ¡en la que me ha convencido! 🙂 coincido en que es mejor que vaya publicando pistas sobre cómo resolver poco a poco, y dar bastante más tiempo para cada prueba. El concurso ya terminó hace tiempo, pero aquellos de vosotros que estáis intentándolo, parece que ciertamente , tener las soluciones os desmotiva. No problem, las siguientes pruebas tendrán la solución explicada – es una opción- , pero con bastante más tiempo entre una y otra. Otra opción es crear un post donde la solución vaya con contraseña (en WordPress se pueden crear página protegidas) Así, sólo el que haya pasado la prueba podrá ver la solución y discutir pasos alternativos con el resto de usuarios. Pero esto tiene el problema de que dejaría fuera a quien más lo necesita… Se admiten sugerencias en los comentarios sobre cómo abordar esto. Incluso se admiten discusiones (pero a ser posible con usuarios no anónimos, para que no me de la sensación de ¡estar discutiendo con alguien sin rostro!)

Al lío: primera pista para el nivel 3. Para poder ejecutar el .exe y ver al menos qué es lo que hace, conviene leerse este post.