🟢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_codees 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:
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/....//rootempieza por/home/, así que pasa el filtro deis_allowed_path.El traversal (
....//) puede resolverse por el sistema de archivos a/rootsi 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?