Writeup CTF CIDSI 2021

Hola! En este writeup detallo cómo he solucionado los problemas del CTF del CIDSI 2021, organizado por AGETIC.


Navidad en el código

La dirección que nos adjuntan es la de una web.

Revisamos la fuente de los archivos. Es algo que ya hago de forma mecánica, incluso una vez que resolví un CTF en la cafetería de la universidad aprendí un atajo para eso en Firefox: Ctrl+U.

No hay mucho en la página, asi que revisamos los otros archivos.

Hay un código. Como solo hay letras mayúsculas, bien podría ser base32 (sí lo era).

flag{El codigo mas dificil de corregir es aquel del que piensas que es imposible que algo esta mal.}


Desarrollador senior

Cuando veo códigos, lo primero que hago es abrir CyberChef e ir probando con lo usual: base64, rot13, etc.

XD


Bla bla bla 1

Te dan un zip, y este tiene contraseña.

Ya que son números, creamos un diccionario con crunch 7 8 0123456789 -o numeritos.txt y crackeamos el zip con fcrackzip -v -u -D -p ~/Descargas/numeritos.txt ~/Descargas/ctf.zip

Pensé que eso era todo, pero termino con este archivo:

Mmm…

Si revisamos si hay cadenas en el archivo (sea con strings de linux o con el Forensically), en los comentarios mencionan «Templarios».

Ah, ¿los templarios tienen un codigo?

https://www.dcode.fr/templars-cipher

Ya tenemos la flag! VAMOSSIGUEADELANTE


Ataque a R2D2 Corp

En ese zip tenemos dos archivos: un raw y un dat. Con file vemos que el archivo dat es de texto, y el raw es un archivo 7zip… con contraseña.

Parece que es texto oculto con figlet. Me instalo gnome-terminal (yo uso KDE) y con esto y un cat, puedo ir reacomodando los caracteres a mano.

Esos puntitos sirven de guía, al parecer…

No entiendo lo que quieren decir :/ y los «puntos guía» estan rectos. Aunque, como curiosidad, los puntos siempre aparecen al final pero en esta ocasión aparecen al medio…


Acá ando bastante confundido, asi que me voy a preparar té. Más tarde se me ocurre que podría intentar «reconstruir» el texto con figlet.

Oooh, viendo el man, como suponia, ¡hay fuentes para este comando! Pero no sé donde están. Lo normal seria abrir el paquete de figlet y listar las fuentes, pero mi cerebro vago se fue a buscar a internet.

Oh vaya, el pato tiene esa función integrada. Probaremos haciendo fuerza bruta: probando letra por letra hasta obtener algo muy similar.

Ya tenemos la cadena: se la paso al ark y ya puedo abrir el 7z.

Dentro está un archivo que contiene la flag:

8c9b126596b213283df332002af9478c76fb0d8f-GALF-1202ISDIC

(Pensé en darle la vuelta, pero esa no era. Ahí perdí un intento)


Pandas

El zip tiene contraseña.

Listo, ya tenemos la contraseña 🙂

Ambos archivos tienen la misma imagen, pero por el MD5 se ve que son distintos. Comparamos su tamaño, podría ser que uno tenga algo que el otro no. ¿Metadatos?

Podemos analizar las imágenes una por una, pero es más fácil revisar las diferencias entre los dos archivos con diff.

🙂


Crackeando las evidencias

Nos dan un zip. El pdf está protegido con contraseña, pero una imagen lo acompaña.

Primero hago una búsqueda reversa, no ayuda en mucho.

https://www.redbubble.com/es/i/poster/Ahriman-de-Deceptikitty/78670571.E40HW

https://warhammer40k.fandom.com/wiki/Ahriman

Bueno, toca ver metadatos.

¡Ya tengo la contraseña del PDF!


Cacheando al mundo

Bien, memcached. Aprendí algunas cosas de memcached en mi anterior trabajo, pero si no conoces el servicio, puedes buscar en internet algún snippet de stackoverflow.

https://stackoverflow.com/questions/13940404/whats-the-simplest-way-to-get-a-dump-of-all-memcached-keys-into-a-file#13941700

Bien. Tenemos un hash y un salt. En las herramientas del CTF mencionaron hashcat, asi que podemos revisarlo.

Hashcat hizo que amdgpu crasheara y mi Manjaro quedara en mal estado 🙁 pero tengo la contraseña gracias a mis capturas en video 🙂

Una revisión adicional:

Inicialmente la flag no funcionó, pero luego de consultar por mail a la organización pues resulta que sí era. ¡Genial!


Developer enojado

Me habla algo de una app. No veo una app, solo eso. Los links no llevan a ningún lugar.

Juguemos con lo que hay.

Lo que veo es que directamente el sistema me muestra la… salida de comandos de ping. Será que esa web está ejecutando comandos directamente? uuuuuhh

Viendo el man de mi comando ping, está la opción -V para ver la versión.

¡Buenísimo! Efectivamente el sitio está ejecutando comandos directamente.

Ya que podemos meter comandos, intento ejecutar algo más. Por desgracia, pongo ; y ninguna otra cosa funciona (no me sale nada). Bueno, no se me ocurre nada, me voy a almorzar.


Tuve una nueva idea más tarde.

Acá pedí un ping a goo;gle.com pero el comando funcionó XDDDDDDDDD

Una vez hace muchos años armé un sistema para que la gente pueda ver si estaba en el padrón electoral y pues el sistema solo era un grep a un txt gigante. La cosa es que tenía miedo de un hackeo y pues lo que hice era quitar los ; y entre otras cosas, con un str_replace, y parece que ahora en este reto hicieron lo mismo. Buenas épocas con PHP 😀

Bien, ahora veo que están filtrando ; de forma intencional. Pruebo con | y con el ´, pero & funciona mejor.

Con & echo veo si hay algo al final (no hay nada) y entonces pruebo con un comando más informativo.

& id se ejecutó, y además ya sabemos bajo qué usuario está corriendo el script 🙂

Con pwd veo donde estamos (/var/www/html) y con ls saco esto

Bien, veo que ahí hay algunos archivos. Los descargaré.

Alguien ya estuvo jugando.

Mientras flutter.apk.zip va descargando, voy viendo la fuente de las páginas.

XDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD lo sabía!

Bien, ya tenemos flutter.apk.zip y resulta que es un zip con contraseña. Reviso los php pero no tienen nada, y al rato me di cuenta que hay un wav ahí. El archivo viene con música (Shazam me dice que es Lilium, de Kumiko Noma). La canción me va acompañando en la competencia.

Cuando le pongo replay y lo veo, me doy cuenta de algo. ¿Por qué un wav? Un mp3 u otro formato recortaría… las frecuencias altas.

Abro como velocista el audacity y:

Me distraje con la música. ¡Muy buena, por cierto!

Pruebo la pw y si, «HAKUNAMATATAS» es el password del zip.


Bien, ya tengo el apk. Mencionaron algo de la fuente en el problema, asi que toca decompilarlo.

Recuerdo cuando hacía mods a apps de android (una vez hice que mi Xperia Sola grabe audio con un mejor bitrate): si queremos ver fuente Java, toca ir a revisar smali.

No encuentro nada, pero la id de la app se ve rara.

La experiencia que tengo con android es más con apps nativas, y con cosas como Kotlin o Flutter, pues mucho no sé.

¡Pero otros sí saben! Voy al pato y me pongo a buscar.

https://blog.odinshell.ninja/2020/05/25/Reverse-Engineering-Flutter-apps-NullBreaker-CTF

Oh, vaya. Me imaginaba que con Flutter esto es distinto, pero no sabía que con las compilaciones debug se puede recuperar código original sin compilar.

En la fuente que vi dice debug. Así que busco ese archivo, lo encuentro xd, y pues lo reviso.

¡Bingo!


Un amor entre desechos químicos

Los mensajes de la (o del) crush son un clásico en los CTFs. Nos dejan un PDF esta vez.

Veo las cadenas del pdf con strings para ver si hay algo (nada). Luego quiero extraer las imágenes por si hay algún metadato (intento con pdfimages pero parece que convierte las imágenes y no quiero eso) y termino sacándolas a lo neandertal, a punta de cincel con binwalk y dd.

Algunas herramientas que no pude probar pero que quizás sirvan en otra ocasión:

https://github.com/qpdf/qpdf
https://github.com/jesparza/peepdf

Vi algunos patrones en los números de la imagen, pero no correlaciono eso con algo conocido (ASCII). No hay nada, y me voy a otro ejercicio.


Al día siguiente retomo el problema. Miro que le han prestado especial atención al número 119 (quizás es una clave de steghide) y busco número atómico 119. Esto solo por el meme de los Simpsons.

https://es.wikipedia.org/wiki/Ununennio

Ununennio, nada interesante. Pero…

¿Se acuerdan de la correspondencia con ASCII? ¡Quizás podamos usar esta tabla para convertir esos números a texto!

22921196344633411992104711956631010553653810

Este es el número transcrito tal cual. Si el 199 significa algo (Uue), entonces

2292 119 63446334 119 921047 119 56631010553653810

De ahí podemos intentar adivinar letras partiendo el número.

22 92 119 63 44 63 34 119 92 10 47 119 56631010553653810
Ti U  Uue Eu Ru Eu Se Uue U  Ne Ag 

Tomando solo la iniciales ya tenemos algo de texto. Reviso de nuevo el pdf y pone que la 119 está vacía, asi que viendo el texto tiene mucho sentido que se asocie un espacio ahí en vez de una letra. Igualmente no sé si tomar números en grupos de dos o tres, pero eso va tomando sentido solito (por ejemplo, 101 05 no tiene sentido, debería ser 10 10 5 o 10 105).

La última parte me cuesta completarla, ya que 56 63 10 10 55 36 53 81 tiene tanto sentido como 56 63 10 105 53 65 38 10. Pero, viendo los patrones de números repetidos (53 se repite, o sea debe ser una letra), voy probando hasta que termino.

22 92 119 63 44 63 34 119 92 10 47 119 56 63 10 105 53 6 53 8 10
Ti U      Eu Ru Eu Se     U  Ne Ag     Ba Eu Ne Db  I  C I  O Ne

«TU ERES UNA BENDICION»

Esa es la flag 🙂


¿Estos temas te interesan? Puedes ver mi writeup de un CTF anterior, o también unirte a la comunidad Núcleo GNU/Linux, en donde tendremos actividades relacionadas a GNU/Linux y a los CTFs 🙂