
From deobfuscating code.js to root, CVE-2023-0386
.env contenant les identifiants de la base de données est découvert et, grâce à la réutilisation de mots de passe, les attaquants peuvent se connecter en tant qu'utilisateur admin sur la machine. Le noyau du système s'avère obsolète et CVE-2023-0386 peut être utilisée pour obtenir un shell root| port | service | détails |
|---|---|---|
| 22/tcp | ssh | syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0) |
| 80/tcp | http | syn-ack ttl 63 nginx 2million.htb |
J'ai ajouté 2million.htb à mon fichier /etc/hots
J'ai effectué une découverte de chemins sur 2million.htb en utilisant gobuster
Au cours de l'énumération, j'ai découvert l'endpoint /invite

Après avoir navigué sur la page /invite

En inspectant la page, j'ai remarqué qu'elle chargeait un fichier JavaScript nommé inviteapi.min.js contenant du code obfusqué :
eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1 i(4){h 8={"4":4};$.9({a:"7",5:"6",g:8,b:\'/d/e/n\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}1 j(){$.9({a:"7",5:"6",b:\'/d/e/k/l/m\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}',24,24,'response|function|log|console|code|dataType|json|POST|formData|ajax|type|url|success|api/v1|invite|error|data|var|verifyInviteCode|makeInviteCode|how|to|generate|verify'.split('|'),0,{}))
J'ai désobfusqué le code à l'aide de de4js, ce qui a produit le JavaScript lisible suivant :

function verifyInviteCode(code) {
var formData = {
"code": code
};
$.ajax({
type: "POST",
dataType: "json",
data: formData,
url: '/api/v1/invite/verify',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}
function makeInviteCode() {
$.ajax({
type: "POST",
dataType: "json",
url: '/api/v1/invite/how/to/generate',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}
makeInviteCode() : génère un nouveau code d'invitation
verefyInviteCode(code) : vérifie si un code est valide
et pour mieux comprendre, j'ai intercepté la requête de vérification :

l'API utilise des réponses JSON
Je suis allé dans la console du navigateur et j'ai exécuté makeInviteCode()

J'ai remarqué que les données étaient chiffrées avec le chiffrement ROT13

Après déchiffrement, j'ai trouvé l'endpoint /api/v1/invite/generate, puis j'ai généré le code d'invitation

Décodage Base64

Clé
La clé 2F4BN-YI8OH-B0SCL-L8OE6 a été insérée et acceptée avec succès

Inscription

Page d'accueil

Page d'accès
Peu de pages de ce site fonctionnent correctement ; c'est la page d'accès qui devient intéressante

Énumération des endpoints API
J'ai téléchargé le fichier VPN en cliquant sur le bouton connection pack, et j'ai intercepté la GET request

J'ai ensuite exécuté une requête curl avec les options verbose et silent pour énumérer les API endpoints disponibles


Le serveur a répondu avec une liste JSON d'API endpoints
L'admin disposait de 3 endpoints API avec les méthodes GET, POST et PUT
Lorsque j'ai tenté de générer une clé admin avec l'endpoint admin /api/v1/admin/vpn/generate, la clé n'a pas été générée car je n'étais pas l'admin, et le premier endpoint admin /api/v1/admin/auth l'a confirmé


Après avoir découvert le bon format de PUT request avec Content-Type: application/json et les required parameters, j'ai réussi à élever mon utilisateur au rang d'administrateur









J'ai injecté ;whoami; dans le champ username ; mes soupçons se sont portés sur les fonctions PHP exec() ou system(), courantes dans les fonctionnalités réservées aux administrateurs et souvent dépourvues d'un assainissement approprié
Par exemple, le code vulnérable ressemblait probablement à ceci :
$username = $json->username;
exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");
Cet endpoint POST /api/v1/admin/vpn/generate était vulnérable, et l'injection de commandes OS a été réalisée avec succès



Comme l'application avait des restrictions empêchant les caractères spéciaux, j'ai encodé en base64 la commande du payload du reverse shell pour contourner cette restriction.

J'ai injecté le payload dans le username parameter, en le redirigeant vers base64 -d | bash pour le décodage et l'exécution :


Le payload s'est exécuté avec succès, renvoyant un reverse shell en tant que www-data user

J'ai tenté un mouvement latéral de l'utilisateur www-data vers l'utilisateur admin en utilisant diverses techniques
En inspectant le répertoire /var/www/html, j'ai découvert un fichier .env contenant les identifiants de la base de données :

Le mot de passe découvert a été réutilisé avec succès pour s'authentifier via SSH et MySQL
SSH

MySQL

Après avoir obtenu un accès initial en tant qu'utilisateur admin, j'ai effectué une énumération du système pour identifier les vecteurs potentiels d'élévation de privilèges
J'ai essayé toutes les techniques d'élévation de privilèges les plus courantes comme les binaires SUID, les capabilities, les droits sudo, les tâches cron, rien n'a fonctionné. J'ai donc vérifié les variables d'environnement pour un détournement de PATH ou une variable sensible, et j'ai trouvé une variable MAIL pointant vers /var/mail/admin

Je suis allé vérifier le contenu du courrier et j'ai remarqué que l'administrateur avait été averti de corriger le noyau contre une OverlayFS/FUSE vulnerability

version du noyau

version de l'OS

Le noyau n'a jamais été mis à jour, ce qui confirme que l'administrateur avait ignoré ou oublié l'avertissement de sécurité
L'énumération du noyau a révélé la version 5.15.70-051570-generic, qui est vulnérable à CVE-2023-0386 élévation de privilèges locale OverlayFS/FUSE
La vulnérabilité étant confirmée, j'ai procédé à l'obtention d'un exploit POC public
J'ai cloné le POC, je l'ai transféré sur la machine cible
Je l'ai ensuite exécuté et obtenu avec succès un accès root


CVE-2023-0386 - CVE-2023-0386 - Injection de commandes OS
Avertissement : Cette machine a été rootée dans un environnement de tests d'intrusion autorisé
| Phase | Technique | Cible | Résultat |
|---|
| 1. Recon | Scan de ports | 22 (SSH), 80 (HTTP) | Découverte de services |
| Découverte de chemins | /invite | Page d'invitation trouvée | |
| Désobfuscation JS | inviteapi.min.js | Endpoints API exposés | |
| 2. Accès initial | Génération d'invitation | POST /api/v1/invite/generate | Code d'invitation valide |
| Inscription | POST /api/v1/user/register | Utilisateur standard créé | |
| 3. Web Privesc | Énumération API | GET /api/v1 | Endpoints admin découverts |
| Élévation verticale | PUT /api/v1/admin/settings/update | is_admin: 0 -> 1 | |
| 4. Accès système | Injection de commandes | POST /api/v1/admin/vpn/generate | username=test;id; |
| Reverse Shell | Payload encodé en base64 | shell www-data | |
| 5. Mouvement latéral | Découverte de fichiers | /var/www/html/.env | admin:SuperDuperPass123 |
| Réutilisation SSH | ssh [email protected] | accès utilisateur admin | |
| 6. Élévation racine | Énumération du noyau | uname -r -> 5.15.70 | CVE-2023-0386 identifiée |
| Avertissement par e-mail | /var/mail/admin | OverlayFS/FUSE confirmé | |
| Exécution de l'exploit | ./fuse && ./exp | Shell root |