Este artículo es parte de los escritos para la resolución de las máquinas del evento de la #Hackatón Telefónica 2019 realizado el 24 de Julio.
Pude ser parte del equipo organizador y agregar esta máquina a los desafíos de ese día.
La idea de esta máquina era ser lo más rebuscado posible para esconder “ingeniosamente” las banderas. Eran una serie de desafíos de #esteganografía, #fuerzabruta e ingenio que en retrospectiva, necesitaban de mucho más tiempo que sencillamente las 12 horas del evento.
Lamento de antemano el exceso, pero es parte del aprendizaje y para el otro año será “mejor”.
Veamos de qué se trata esta máquina.
Enumeración Inicial
Inicialmente al hacer un reconocimiento tenemos que los puertos abiertos son solamente el 22 y el 80, pero lo extraño es que hay muchos puertos filtrados, eso lo veremos más adelante.

Como no podemos hacer nada con el servicio SSH todavía, tenemos que comenzar por el servicio Web.
Web Server
Inicialmente tenemos una página web con simplemente 3 datos:
- Un título de página que dice: “Bienvenido, golpea antes de entrar”
- Un encabezado de página que dice: “La isla del tesoro”
- Una imagen con una isla de nombre aa356147323d04e976f87d2d0b92c59c.jpg

Al hacer un reconocimiento con dirsearch no encontramos nada más en el sitio, por lo que no nos queda más que intentar analizar la imagen.

Imagen aa356147323d04e976f87d2d0b92c59c.jpg
Analizando la imagen con el comando strings, vemos que tiene varios indicios de ser un archivo compuesto por 3 datos distintos, una imagen, un dato llamado archivo521.zip y otra imagen.

De hecho, si también aplicamos el comando binwalk, tenemos un resultado parecido que apoya la teoría de que son 3 datos juntos, y nos da más luces del archivo .zip que hay entremedio.

Al intentar extraerlo con el comando “binwalk -e” ocurre un problema, solamente saca dos archivos .zip, uno llamado 10672A.zip (con tamaño 984448 bvtes) y otro llamado archivo521.zip con tamaño 0 bytes, un archivo 121533 de 0 bytes y un archivo 121533.zlib (con tamaño 874359).

Hay algo mal acá, intentamos revisar nuevamente lo encontrado con otra herramienta: foremost. Con esta herramienta tenemos más datos:

En efecto, al extraer los datos con foremost tenemos los 3 archivos que se nos había indicado con las herramientas anteriores: un archivo .jpg, un archivo .zip y un archivo .png.
El primer archivo .jpg es la imagen inicial que se ve en el webserver, el segundo es un archivo .zip que tiene otro archivo comprimido adentro llamado archivo521.zip (lo mismo que había intentado sacar binwalk), y luego está otra imagen totalmente distinta.


Partamos el análisis por el archivo .zip
Archivo 00002099.zip (parte 1)
Revisando el archivo .zip tenemos que es un archivo con clave, que necesitamos revisar si es que se puede romper con algún diccionario conocido, intentamos con el rockyou.txt que viene incluído en Kali, pero no es posible.

No nos queda más que intentar con fuerza bruta, intentamos primero con un password con máximo 4 caracteres y logramos encontrar la clave: “732e”

Al revisar el archivo extraido tenemos una revelación, el archivo se llama “archivo520.zip”, lo cual nos vaticina un loop bastante largo, hay que descifrar más de 500 archivos uno dentro del otro.
Para eso tenemos que hacer un pequeño script en bash, el cual sencillamente revisará los archivos encontrados y luego intentará hacer fuerza bruta para sacarlos (puede ser lento).

Esa versión usa fcrackzip probando con unzip (programa externo) lo cual lo hace muy lento en una máquina virtual “cualquiera”, por lo que también existe una mejor versión del script usando John The Ripper.

Mientras el script se queda sacando todos los archivos podemos avanzar con la otra imagen.
Imagen 00002309.png

Si comenzamos revisando la imagen 00002309.png, tenemos a primera vista que es una imagen con 2 globos de texto que dicen:
- “Partimos desde las 4 hasta casi las 6 am.”
- “Y hay que seguir desde las 6 hasta casi las 11. Esto no para!”
Estas frases son bastante extrañas, pero hablan de algunos números (4, 6, 6 y 11), que tendremos en cuenta para más adelante.
Necesitamos nuevamente revisar la imagen por algún indicio de Esteganografía, pero al hacer las revisiones por el comando strings o binwalk no aparece nada.
Entonces tenemos que revisar la imagen con StegSolve (https://github.com/zardus/ctf-tools/blob/master/stegsolve/install) una herramienta en Java para la revisión de Esteganografía de imágenes. Al revisarla encontramos unas cosas interesantes:


Ahora, que encontramos esos números escondidos podemos hacer un poco más de sentido de todo el contexto de la página:
- “Bienvenido, golpea para entrar” quiere decir que requiere golpear la puerta, o en este caso hablamos de la técnica de “port knocking”
- Los mensajes de los globos de texto dan el orden
(siguiendo las manecillas del reloj):
- 4am = 8991
- casi 6am = 71
- 6 am = 1051
- casi 11 am = 54123
Ahora viene el momento de entrar, con la herramienta netcat podemos hacer un comando en una línea para hacer este golpeo de puertos, y podemos ver que hay un cambio al hacer los 4:
nc [IP] 8991; nc [IP] 71; nc [IP] 1051; nc [IP] 54123

Ahora la conexión al puerto 54123 se queda “esperando” por lo que ahora podemos revisar nuevamente este puerto, y vemos que es un servidor web y que además expone un archivo “text.txt”

Y este archivo es el que finalmente tiene la clave para el usuario por SSH

Ingresando al equipo
Al ingresar con las credenciales podemos ver que existen 2 archivos:
- inicial.txt: es el archivo con la primera bandera
- tesoro.zip: es un archivo .zip con clave que tiene un archivo que dice bandera.txt adentro

Al intentar descifrar el archivo tesoro.zip, tenemos que está con clave. Al intentar crackearlo por diccionario vemos que no es exitoso. Por lo que lo dejamos para después.
Al hacer la enumeración de procesos vemos que existe un proceso corriendo con nombre /root/pyknock.py, y si lo buscas en internet existe la herramienta online para el “port knocking” (https://github.com/mike01/pyknock).

Pero no podemos acceder a la configuración porque está en la carpeta de root, pero si vemos el siguiente proceso, vemos que existe una carpeta con otro script en python corriendo en /usr/bin/sysmonitor/. Si nos metemos en la carpeta vemos que es la misma estructura del pyknock.

Si vemos la configuración de config.py de ese archivo vemos que existen las configuraciones para otro port knocking:

Con esto vemos además que abrir el servicio internamente hace correr “redis” dentro del equipo. Entonces comenzamos a ejecutar el port knocking de acuerdo a lo que pide.
ping -c 1 -s 72 127.0.0.1; ping -c 1 -s 92 127.0.0.1; nc localhost 65533
Con esto podemos ver nuevamente la lista de procesos y encontrar que está corriendo “redis”

Ahora como sabemos que está funcionando redis, podemos intentar conectarnos al servicio directamente, pero vemos que se necesita autenticación.

Pero si vamos a la configuración del servicio, tenemos directamente la clave que se necesita.

Escalando privilegios
Para escalar privilegios, uno puede abusar de la configuración de Redis y así poder escribir en directorios que inicialmente uno no debería, por ejemplo, la carpeta de llaves ssh de root.
Para eso primero debemos generar una llave ssh con el usuario actual y luego preparamos unos saltos de linea para poder leer mejor la llave pública cuando sea agregada por redis.

Ahora nos aprovechamos del servicio de redis para poder escribir en un directorio no convencional, por ejemplo /root/.ssh/ utilizando el siguiente set de comandos:
cat public.txt | redis-cli -h 127.0.0.1 -p 46379 -a 0fa365795f8be3dd94d7b77304084c9d6aff27728d8ab9a84a38f349997d15dc -x set pub redis-cli -h 127.0.0.1 -p 46379 -a 0fa365795f8be3dd94d7b77304084c9d6aff27728d8ab9a84a38f349997d15dc config set dir "/root/.ssh/" redis-cli -h 127.0.0.1 -p 46379 -a 0fa365795f8be3dd94d7b77304084c9d6aff27728d8ab9a84a38f349997d15dc config set dbfilename "authorized_keys" redis-cli -h 127.0.0.1 -p 46379 -a 0fa365795f8be3dd94d7b77304084c9d6aff27728d8ab9a84a38f349997d15dc save

Aunque aparece un Warning en la ejecución del comando, podemos ver que este comando retorna un OK. Ahora basta con hacer ssh para escalar a root.

Con esto podemos ver el directorio del usuario root y la segunda bandera

La tercera bandera
Esta bandera es la más rebuscada de la máquina (siendo que hasta ahora ya es bastante).
Para revisar la bandera necesitamos 2 cosas: el archivo tesoro.zip y el archivo 00002099.zip anterior.
Archivo 00002099.zip parte 2
Al terminar de descomprimir tenemos que al final está solamente un archivo llamado texto.txt el cual tiene el siguiente texto: ”Por acá no es”

Este paso es el más frustrante, pero si es que nos ponemos a revisar el proceso de descompresión de todos los archivos vemos que justamente guardamos las claves en el archivo “claves.txt”.
Analizando las claves vemos que todas son de 4 letras y éstas son justamente en el rango de letras ASCII en hexadecimal.

Si intentamos extraer el texto hexadecimal tenemos un texto inentendible pero casi legible:

Pero esto tiene que ver con el orden en que sacamos las claves (en orden decreciente), pero si lo hacemos al revés con el comando tac (cat al revés) tenemos el siguiente texto:

Este es otro texto, mucho más legible, pero un poco desalentador. Aunque al revisar las primeras letras del texto tenemos algo extraño:

Dice: “LACLAVECOMPLETA”
Ahora usamos esta clave en el archivo .zip y sale el último flag

Ojalá que les haya gustado la máquina, y nos vemos en el siguiente año.
Ricardo Monreal Llop
Presidente FINSIN