Escrito de #HackatonTelefonica – Treasure Island

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.

Enumeración inicial

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
Imagen inicial del sitio web

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.

Ejecución del comando strings

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.

Ejecución del comando binwalk

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).

Extracción incorrecta con binwalk -e

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

Extracción de los datos con foremost

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.

Revisión del archivo 00002099.zip
Imagen 00002309.png

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.

Revisión del .zip con rockyou

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”

Extracción de la clave inicial

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).

Loop en bash con fcrackzip para extraer el contenido de los .zip

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.

Loop en bash con John the Ripper para extraer el contenido de los .zip

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

Imagen 00002309.png

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:

Encontrando el 8991 en la esquina inferior derecha
Encontrando el 54123 en la esquina superior izquierda

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

Ejecución de netcat para el port-knocking

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”

Servidor web que se abre luego del port-knocking

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

Usuario y clave para 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
Listado del directorio del usuario pirate

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).

Proceso extraño en la lista de procesos

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.

Listado de directorio /usr/bin/sysmonitor/

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

Configuración del nuevo 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”

Ejecución del port-knocking

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

Error de autenticación de REDIS

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

Buscando el password de REDIS

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.

Creación de nueva llave

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 
Ejecución de los comandos de elevación de REDIS

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.

SSH para root

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

Listado del directorio de /root

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”

Terminando la decripción de los archivos .zip

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.

Listado del archivo de claves.txt

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

Traducción del listado de claves inicial (cat)

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:

Traducción del listado de claves al revés (tac)

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

Primeras letras del texto

Dice: “LACLAVECOMPLETA”

Ahora usamos esta clave en el archivo .zip y sale el último flag

Bandera final

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

Ricardo Monreal Llop
Presidente
FINSIN

Deje un comentario

Crea una web o blog en WordPress.com

Subir ↑