Code
Executive summary — Code is an Easy Linux box whose entry point is an online Python code editor (Flask on Gunicorn) that runs your input after filtering it through a keyword blocklist. We escape the sandbox by pulling the already-loaded modules from
globals()and usinggetattr()to reachos.popenwithout ever writing the forbidden words literally (RCE). The application's SQLite database holds unsalted MD5 hashes; we crackmartin's and log in over SSH. Root comes from asudoNOPASSWD entry onbacky.sh, a backup wrapper whose anti-traversal filter (../) does a single pass and is bypassed with....//to archive the whole of/root. Path: web sandbox → RCE → SQLite → SSH → backy.sh → root.
| Platform | Hack The Box |
| Operating system | Linux |
| Difficulty | Easy |
| Status | Retired |
| Target IP | 10.10.11.62 |
Attack map
[5000/HTTP] "Python Code Editor" (Flask + Gunicorn)
│ runs Python with a keyword BLOCKLIST (import, os, eval…)
│ sandbox escape: globals()['o'+'s'] + getattr() → os.popen
▼
[RCE] shell as app-production
│ SQLite instance/database.db → MD5 hashes (development, martin)
│ crack martin → nafeelswordsmaster
▼
[SSH] martin (user.txt)
│ sudo -l → NOPASSWD /usr/bin/backy.sh
│ «../» filter bypassed with «....//» → archive /root
▼
[ROOT]
1. Recon
As usual, we start with a full sweep of all 65535 TCP ports, then a targeted script and version scan on whatever comes back open:
nmap -p- --min-rate 10000 10.10.11.62
nmap -p22,5000 -sCV 10.10.11.62
22/tcp open ssh OpenSSH 8.2p1 Ubuntu
5000/tcp open http Gunicorn 20.0.4
--min-rate 10000 forces nmap to send packets at a high minimum rate so sweeping the entire port range doesn't take forever; -sCV is shorthand for -sC -sV (default NSE scripts + version detection) run only against the ports we already know are open.
Only two ports: SSH (no credentials yet, so not the entry vector) and an HTTP service on 5000 served by Gunicorn, the production WSGI server typical of Python/Flask apps (the Flask dev server normally isn't fronted by Gunicorn on port 5000). The whole foothold necessarily goes through 5000.
Resumen ejecutivo — Code es un Linux Easy cuyo punto de entrada es un editor de código Python online (Flask sobre Gunicorn) que ejecuta lo que escribes tras filtrarlo con una lista negra de palabras. Se escapa del sandbox accediendo a los módulos ya cargados con
globals()ygetattr()para llegar aos.popensin escribir jamás las palabras prohibidas de forma literal (RCE). En la base de datos SQLite de la aplicación hay hashes MD5 sin sal; se crackea el demartiny se entra por SSH. El root llega por unsudoNOPASSWD abacky.sh, un envoltorio de backups cuyo filtro anti-traversal (../) hace una única pasada y se esquiva con....//para archivar/rootcompleto. Recorrido web sandbox → RCE → SQLite → SSH → backy.sh → root.
| Plataforma | Hack The Box |
| Sistema operativo | Linux |
| Dificultad | Easy |
| Estado | Retired |
| IP objetivo | 10.10.11.62 |
Mapa del ataque
[5000/HTTP] "Python Code Editor" (Flask + Gunicorn)
│ ejecuta código Python con una BLOCKLIST de palabras (import, os, eval…)
│ escape del sandbox: globals()['o'+'s'] + getattr() → os.popen
▼
[RCE] shell como app-production
│ SQLite instance/database.db → hashes MD5 (development, martin)
│ crack de martin → nafeelswordsmaster
▼
[SSH] martin (user.txt)
│ sudo -l → NOPASSWD /usr/bin/backy.sh
│ filtro «../» esquivable con «....//» → archivar /root
▼
[ROOT]
1. Reconocimiento
Como siempre, empezamos con un barrido completo de los 65535 puertos TCP y, después, un escaneo dirigido de scripts y versiones sobre los que aparecen abiertos:
nmap -p- --min-rate 10000 10.10.11.62
nmap -p22,5000 -sCV 10.10.11.62
22/tcp open ssh OpenSSH 8.2p1 Ubuntu
5000/tcp open http Gunicorn 20.0.4
--min-rate 10000 obliga a nmap a enviar paquetes a un ritmo mínimo alto para que el barrido de todo el rango de puertos no se eternice; -sCV es el atajo de -sC -sV (scripts NSE por defecto + detección de versión) aplicado solo a los puertos que ya sabemos que están abiertos.
Solo dos puertos: SSH (sin credenciales aún, así que no es el vector de entrada) y un servicio HTTP en el 5000 servido por Gunicorn, el WSGI de producción típico de aplicaciones Python/Flask (el
flask runde desarrollo no suele ir en el puerto 5000 detrás de Gunicorn). Todo el ataque de entrada pasará, necesariamente, por el 5000.
This content is Root Access only. Everything else on the site — the free tier, the whole public library — stays open.
See Root Access plansNo account? Create one free then upgrade from your console.
Este contenido es solo para Root Access. Todo lo demás del sitio — el nivel gratuito, toda la biblioteca pública — sigue abierto.
Ver planes de Root Access¿Sin cuenta? Crea una gratis y luego mejora desde tu consola.