11 diciembre, 2015 Alberto

CTF No cON Name 2015

CTF NoConName

El pasado Jueves participé en el CTF de la No cON Name de Barcelona, el congreso de seguridad más antiguo en España y que celebra su duodécimo aniversario.  La competición de CTF (Capture de flag) se celebra en modalidad Jeopardy, resolviendo retos en múltiples categorías (seguridad web, móvil, programación, esteganografía, criptografía, etc).  Y congregó a ocho equipos de cuatro participantes cada uno excepto un francés que iba por libre y nos ganó a todos.

Uno de los retos trataba de desactivar una bomba programada y ofuscada en Javascript.

Al entrar en el reto nos encontramos una página HTML con un dibujo de una bomba que contiene el texto «Bomb script».

Frontend reto de la bomba

Frontend del reto de la bomba

Echando un vistazo al código fuente encontramos el script con la bomba.

Código fuente reto de la bomba

Código fuente reto de la bomba

El código fuente se encuentra ofuscado pero a simple vista podemos ver los dos métodos que nos interesan «disable» y «exploit» que corresponden a las funciones __ZN4Bomb7disableEm__ZN4Bomb7exploitEv respectivamente.

Código fuente Javascript ofuscado

Código fuente Javascript ofuscado

Al ejecutar  la herramienta firebug para utilizar la consola y  jugar con los métodos del script nos encontramos con una pista para activar la bomba.

Consola de firebug con las pistas

Consola de firebug con la pista

Iniciamos la bomba instanciando un nuevo objeto ‘bomb’ de la clase ‘Bomb’.  Al realizar esta acción aparece una cuenta regresiva de 60 segundos.

Activando la bomba desde Firebug

Activando la bomba desde Firebug

Como hemos visto antes en el código el método disabled recibe un parámetro a0 que es el código de desactivación.  Invocando el método sin conocer el código de desactivación detonamos la bomba antes de que acabe la cuenta atrás.  En el ejemplo anterior probamos con el valor «30» obteniendo como resultado la cadena «BOOOoooooOOOOOM!»

Intento de desactivacion de la bomba

Intento de desactivacion de la bomba

Es el momento de volver al código para estudiar cómo se desactiva.  Para ello vamos a la función __ZN4Bomb7disableEm.  En la función encontramos dos sentencias IF y en cada una de ellas se forma una cadena concatenando caracteres ASCII.

Podíamos haber echado perfectamente mano del debugger de Firebug pero mis malos hábitos de programador en entornos mainframe, dónde no nos dejaban usar debuggers por que consumían muchos recursos, me llevó inconscientemente a poner algunos ‘puts’, en este caso console.log, para ver el contenido de las variables y de paso eliminar las sentencias IF para conocer todo el contenido de la función.

Así que modifiqué el código de la primera sentencia IF del siguiente modo.  Algunos console.log los puse posteriormente para conocer mejor el funcionamiento del script.

Modificación del código en el primer if para desactivar la bomba

Modificación del código en el primer if para desactivar la bomba

Y en la segunda sentencia IF.

Segundo if en la función de desactivar la bomba

Segundo if en la función de desactivar la bomba

Ejecutamos el código modificado y vemos que la segunda sentencia IF muestra la cadena «Bomb Disabled!!»

Ejecución de la bomba con el código modificado

Ejecución de la bomba con el código modificado

Volvemos al código para ver qué condición se debe de cumplir en la sentencia IF para que se muestre la cadena.

if (((Lcode>> 0) === (870919929>> 0))) {

Observamos que la variable Lcode es el parámetro que le estamos pasando a la función de desactivar bomba y que la primera sentencia IF no tiene que ver con ésta.  Así que introduciendo el número 870919929 hace que se cumpla la sentencia IF y pasamos el reto.

Bomba desactivada

Bomba desactivada

Aquí mostramos cómo se podría haber realizado utilizando el debugger de Firebug.

Debugger de Firebug

Debugger de Firebug

Finalmente no era tan sencillo y la bandera 870919929 no era válida para pasar el reto.  Esto me llevó a pensar por momentos que había que introducir un segundo código.  Una vez desactivada la bomba al tiempo volvía a aparecer la cadena «Bomb Exploited!!» y el script validaba a través de una variable las veces que se había entrado en la función disabled.  Al final por una pista en el dashboard del CTF que indicaba la palabra «HxELL» nos hizo llegar a la conclusión de que había que introducir la bandera en notación hexadecimal (0x870919929).  Este era uno de los retos más sencillos por el que daban 220 puntos.

Otros retos

Era la primera vez que participaba y no paré cuenta en tomar capturas de pantalla ni nada por el estilo, así que lo que puedo contar:

Otro de los retos que puntuamos con 100 puntos era una página web con una inyección SQL de libro.  En la tabla users se encontraba la bandera.

El reto que más cerca estuvimos de puntuar fue el de «Calçotada en Sabadell» con más de 300 puntos y que fue para tirarnos por la ventana.  Otra página web con un portal de login, encontramos un inyección SQL a ciegas, de tipo boleano.  Nos fuimos por los cerros de Ubeda al lanzar SQLMap.  Había una única tabla user con un único usuario.  Estuvimos media hora tratando de crackear el hash de la contraseña hasta que nos dimos cuenta de que simplemente podíamos hacer un bypass del login con la inyección.  Una vez dentro había un montón de archivos para descargar, viendo el código fuente encontramos un directorio oculto.  En el código fuente del directorio oculto encontrábamos una pista para descargar una imagen.  De la imagen extraímos mediante esteganografía un texto cifrado.  El texto estaba cifrado en César (ROT 13).  Y aquí cometimos el error.  Lo desciframos directamente desde la página web de Cryptool y la bandera nos la daba como -.NoConNamek15CTF.-.  No sabemos muy bien por qué convertía algunos caracteres a mayúsculas cuando la bandera real era -.noconnamek15CTF.- y que había que hashear con SHA-1.  Por este motivo nos daba un hash distinto y no conseguimos puntuar, una verdadera lástima.

Por otro lado el reto de «ForensicDump» pensamos que lo teníamos totalmente resuelto y en verdad estábamos perdidísimos.

El reto te descargaba un binario llamado ForensicDump.E01.  Con el comando fls veíamos que contenía un archivo llamado Document.docx

root@KaliVB:~# fls ForensicDump.E01
r/r 4-128-4: $AttrDef
r/r 8-128-2: $BadClus
r/r 8-128-1: $BadClus:$Bad
r/r 6-128-4: $Bitmap
r/r 7-128-1: $Boot
d/d 11-144-4: $Extend
r/r 2-128-1: $LogFile
r/r 0-128-6: $MFT
r/r 1-128-1: $MFTMirr
r/r 9-128-8: $Secure:$SDS
r/r 9-144-11: $Secure:$SDH
r/r 9-144-5: $Secure:$SII
r/r 10-128-1: $UpCase
r/r 10-128-4: $UpCase:$Info
r/r 3-128-3: $Volume
r/- * 0: Document.docx
-/r * 35-128-1: Document.docx
d/d 256: $OrphanFiles

Con icat extraemos el documento indicando el innode.

icat ForensicDump.E01 35-128-1 > document.docx

Y dentro del documento hay un imagen de la página web de NoConName.

Contenido del documento

Contenido del documento

Atendiendo a los metadatos, en mi caso utilicé metashield analyzer

Title: NcN CTF
Application: Microsoft Office
Description: Q1RGX0ZPUkVOU0lDX05jTkA=
Times Edited: 1

Hay un base64 en la descripción que si lo desciframos nos da la cadena «CTF_FORENSIC_NcN@».

En este punto perdimos el camino y empezamos a utilizar técnicas de esteganografía para tratar de sacar algún contenido oculto de la imagen utilizando CTF_FORENSIC_NcN@ como clave. Realmente la imagen contiene un archivo RAR con la bandera. Todavía no le he echado ningún vistazo. Este reto tan sólo valía 100 puntos y no lo supimos sacar.

Otro reto trataba de encontrar y entrar en un servidor PAW de Android que contenía las credenciales por defecto admin:1234. Había que extraer de su contenido unas imágenes y la bandera se encontraba en los metadatos si no recuerdo mal.

También vimos de pasada el reto de CivilWar en el que descargabas un audio con señales que había que descifrar mediante SIGINT. Lo abrimos con Audicity y poco más.

En otro reto nos quedemos atrapados en una técnica anti-debugging mientras hacíamos ingeniera inversa.

Y el último reto que echamos un vistazo fue uno en el que te daban una dirección IP con el puerto 6667. En mi caso conecté un cliente de IRC y lo miré de reojo mientras atendía otros retos.

Más o menos esto es lo que nos dio durante casi diez horas en las que disfrutamos mucho.  Para la próxima vez espero que vaya mejor y llevarlo mejor preparado, por lo menos con un equipo con más herramientas instaladas.

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies