Page cover

🟢Code

En esta ocasión vamos a hacer el writeup de la máquina Code de Hack the Box, una máquina Linux de dificultad easy.

Primer acceso

Añadimos la IP 10.10.11.62 a nuestro /etc/hosts y accedemos través del navegador.

No tiene el puerto 80 expuesto, por lo que haremos un escaneo de puertos.

Escaneo de puertos

Solo encontramos 2 puertos abiertos, el 22 y el 5000, que rápidamente nos llama la atención. Al acceder nos encontramos con una especie de editor/ejecutor de código desde el navegador:

Fuzzing

Haciendo fuzzing con dirsearch nos encontramos unos pocos directorios:

Tiene una página de login y registro, por lo que nos registraremos para ver el interior de la aplicación:

Lo único que activa esto es un apartado de My Codes, que sirve para guardar el código que escribamos. Al intentar un payload básico en python para ejecutar un comando de sistema como id:

Vemos que nos da el error:

Al intentar ejecutar una reverse shell nos da el mismo error.

Encontrar keywords restringidas

  • El endpoint POST /run_code es el responsable de ejecutar código Python.

  • El filtro de "restricted keywords" no está en el frontend (no hay ninguna validación JS), por lo que el filtrado ocurre en el backend, probablemente usando expresiones regulares o listas negras.

Vamos a usar el siguiente script en python para encontrar las keywords restringidas en el endpoint:

Al ejecutarlo nos muestra todas las keywords permitidas:

El filtrado está bloqueando no solo funciones/módulos peligrosos, sino también nombres relacionados con excepciones del sistema, lo cual sugiere que podrían estar evaluando la entrada con una expresión regular muy general o una lista negra más profunda de lo habitual.

Bypass Python Sandboxes

Buscando en Hacktricks encontramos un artículo interesante sobre Bypass Python Sandboxes que podemos utilizar:

Podemos usar el manejo de excepciones para interactuar con la memoria de la aplicación usando:

Y nos devuelve lo siguiente, confirmando que existen clases como User y objetos de SQLAlchemy (db) en la aplicación Flask. Esto indica que la aplicación carga modelos de la base de datos en memoria.

Esto significó que desde aquí podía consultar la memoria de la aplicación para extraer datos confidenciales, incluso sin necesidad de acceso directo ni importaciones.

Extraer Credenciales de Usuarios

Ejecutamos una consulta directa a la tabla User usando SQLAlchemy:

Eso nos devuelve:

Usando el siguiente payload extraemos las credenciales del primer usuario:

Y con el siguiente payload extraemos las credenciales del segundo usuario:

Tenemos 2 usuarios y 2 hashes, que probaremos a crackear con Crackstation:

Hash
Tipo
Resultado

759b74ce43947f5f4c91aeddc3e5bad3

md5

development

3de6f30c4a09c27fc71932bfc68474be

md5

nafeelswordsmaster

Bingo! Tenemos credenciales de 2 usuarios:

Acceso por SSH

Intentamos acceder con development, pero solo podemos acceder con el usuario martin:

Al acceder encontramos un directorio backups con un archivo interesante:

task.json

  • Configuración de un script de backup que archiva /home/app-production/app.

Escalada de privilegios

En el directorio /home/martin no está la flag, y no tenemos las credenciales de la otra home de app-production. Vamos a ver los permisos de ejecución que tenemos en la máquina:

Vemos que tenemos permisos de ejecución del script en bash backy.sh y que funciona pasándole como argumento el task.json que nos encontramos en el directorio /backups, vamos a echarle un vistazo al script:

El script lee un archivo JSON, lo filtra con jq para sanitizar un Directory Traversal ../ y luego lo envía a /usr/bin/backy.

Generar un json fake apuntando a /root

Este JSON es válido y pasará el filtro de jq, ya que:

  • /home/....//root empieza por /home/, así que pasa el filtro de is_allowed_path.

  • El traversal (....//) puede resolverse por el sistema de archivos a /root si el programa no aplica una resolución estricta del path.

Ahora ejecutamos backy.sh pasándole el json:

Extraemos el tar en /tmp:

Root flag

Persistencia root

Vamos a extraer la clave id_rsa de root para acceder sin contraseña y así hacernos con la user flag:

Guardamos el id_rsa en un archivo en nuestro Kali Linux y le damos permisos limitados con chmod 600:

User flag

Última actualización

¿Te fue útil?