TwoMillion HackTheBox (WriteUp)

Création de l'espace de travail :

Nous établirons notre espace de travail en créant trois dossiers pour stocker les contenus importants, les exploits et les résultats de la reconnaissance à l'aide de Nmap.

Vérification de la Connectivité VPN

Vérification de la connexion VPN pour assurer une communication stable avec la machine cible.

Recherche des ports ouverts avec Nmap :

Exploration des ports ouverts et exportation dans le fichier "allPorts" dans le répertoire Nmap:

Scan de la version des ports avec Nmap:

Utilisation de Nmap pour scanner la version des ports et extraction des informations dans le fichier "targeted" :

Port 80 - HTTP

Découverte de ressources avec Gobuster

Découverte du fichier inviteapi.min.js

Ce fichier JavaScript est fortement obfusqué à l’aide de la technique classique eval(function(p,a,c,k,e,d){...}). Après déobfuscation, deux fonctions intéressantes apparaissent :

  • verifyInviteCode(code) : envoie un code d'invitation à /api/v1/invite/verify

  • makeInviteCode() : fait une requête à /api/v1/invite/how/to/generate

Exploitation de l’API – Génération d’un code d’invitation

Appel initial :

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"},"hint":"Data is encrypted ... We should probbably check the encryption type in order to decrypt it..."}#

Déchiffrement ROT13 → nouvelle URL :

In order to generate the invite code, make a POST request to /api/v1/invite/generate

Requête :

Réponse (base64) :

  • V1VPSUYtTEs2OFgtSFVHVFctRE9YMVM=

Décodage :

WUOIF-LK68X-HUGTW-DOX1S

Nous utilisons ce code pour créer un compte sur le site.

Exploitation de l'API HACKTHEBOX

Observation de l’API

En visitant /api, on observe les routes disponibles

Tentative de génération de config VPN (échec initial)

Réponse : non autorisé.

Modification de notre rôle via l’API

Nous testons la modification des paramètres utilisateur avec la route :

{"status":"danger","message":"Missing parameter: email"}

{"status":"danger","message":"Missing parameter: is_admin"}

Réponse :

{"id":15,"username":"Jordan","is_admin":1}

Vérification de notre statut admin

RCE via Injection de Commande

Tentative d’injection de commande dans le champ username :

Reverse Shell

  1. Serveur de fichiers

  1. Netcat en écoute

  1. Envoi de la commande

Nous obtenons un shell inversé

Escalade de privilèges

Découverte de fichiers sensibles

En fouillant les fichiers accessibles depuis notre shell, nous découvrons un fichier .env caché contenant des identifiants pour la base de données :

Nous repérons également la présence d’un second utilisateur nommé admin.

Réutilisation de mot de passe

En testant les identifiants découverts, nous constatons que l’utilisateur système admin utilise le même mot de passe que celui de la base de données.

Flag user.txt :)

Cette mauvaise pratique nous permet d’obtenir une connexion SSH :

Courriel système

À la connexion, un message nous informe de la présence d’un nouveau mail. En le lisant, on obtient une information cruciale :

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.

Ce message nous met sur la piste d’une vulnérabilité connue dans OverlayFS : CVE-2023-0386 – une faille d’escalade de privilèges locale dans le noyau Linux.

Exploitation de CVE-2023-0386 – OverlayFS Privilege Escalation

OverlayFS permet de superposer des systèmes de fichiers. Dans certaines versions du noyau Linux, une mauvaise gestion des capacités permet à un utilisateur non privilégié d’exécuter du code avec les droits root.

Étapes d’exploitation

  1. Cloner l’exploit depuis notre machine locale :

  1. Transférer les fichiers compilés vers la machine cible (scp, python -m http.server, etc.).

  1. Sur la machine cible, exécuter dans deux terminaux :

  • Terminal A :

  • Terminal B :

Si tout se passe bien, nous obtenons un shell root

Flag root.txt :)

Mis à jour

Ce contenu vous a-t-il été utile ?