
Von der Deobfuskierung von code.js bis zu Root, CVE-2023-0386
| port | service | details |
|---|---|---|
| 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 |
Ich habe 2million.htb zu meiner /etc/hots-Datei hinzugefügt
Ich habe eine Pfad-Erkennung über 2million.htb mit gobuster durchgeführt
Während der Enumeration habe ich den Endpunkt /invite entdeckt

Nach dem Navigieren zur Seite /invite

Als ich die Seite untersuchte, bemerkte ich, dass sie eine JavaScript-Datei namens inviteapi.min.js geladen hatte, die verschleierten Code enthielt:
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,{}))
Ich habe den Code mit de4js deobfuskiert, was das folgende lesbare JavaScript ergab:

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() : erzeugt einen neuen Einladungscode
verefyInviteCode(code) : prüft, ob ein Code gültig ist
Um mehr zu verstehen, habe ich die Verifizierungsanfrage abgefangen:

Die API verwendet JSON-Antworten
Ich ging zur Browser-Konsole und führte makeInviteCode() aus

Ich bemerkte, dass die Daten mit ROT13 verschlüsselt waren

Nach der Entschlüsselung fand ich den Endpunkt /api/v1/invite/generate; anschließend generierte ich den Einladungscode

Base64-Entschlüsselung

Schlüssel
Der Schlüssel 2F4BN-YI8OH-B0SCL-L8OE6 wurde eingegeben und erfolgreich akzeptiert

Registrierung

Startseite

Zugriffsseite
Nur wenige Seiten dieser Website funktionieren richtig; die Zugriffsseite ist der Ort, an dem es interessant wird

Enumeration der API-Endpunkte
Ich habe eine VPN-Datei hochgeladen, indem ich auf den Button connection pack geklickt habe, und die GET-Anfrage abgefangen.

Anschließend habe ich eine curl-Anfrage mit den Optionen verbose und silent ausgeführt, um verfügbare API-Endpunkte zu enumerieren.


Der Server antwortete mit einer JSON-Liste der API-Endpunkte.
Der Admin hatte 3 API-Endpunkte mit den Methoden GET, POST und PUT.
Als ich versuchte, mit dem Admin-Endpunkt /api/v1/admin/vpn/generate einen Admin-Schlüssel zu generieren, wurde der Schlüssel nicht generiert, weil ich nicht der Admin war; der erste Admin-Endpunkt /api/v1/admin/auth bestätigte dies.


Nachdem ich das korrekte Format der PUT-Anfrage mit Content-Type: application/json und den erforderlichen Parametern herausgefunden hatte, habe ich meinen Benutzer erfolgreich zum Administrator hochgestuft.









Ich habe ;whoami; in das Benutzernamen-Feld injiziert; mein Verdacht fiel auf die PHP-Funktionen exec() oder system(), die häufig in Admin-Funktionen vorkommen und oft keine ordnungsgemäße Sanitisierung aufweisen.
Zum Beispiel sah der verwundbare Code wahrscheinlich ungefähr so aus:
$username = $json->username;
exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");
Dieser Endpunkt POST /api/v1/admin/vpn/generate war verwundbar, und OS-Befehlsinjektion wurde erfolgreich durchgeführt.



Da die Anwendung Einschränkungen hatte, die Sonderzeichen verhinderten, habe ich den Reverse-Shell-Payload-Befehl in Base64 kodiert, um diese Einschränkung zu umgehen.

Ich habe den Payload in den username-Parameter injiziert und ihn zur Dekodierung und Ausführung an base64 -d | bash weitergeleitet:


Der Payload wurde erfolgreich ausgeführt und lieferte eine Reverse Shell als www-data-Benutzer.

Ich habe Lateral Movement vom www-data-Benutzer zum admin-Benutzer mit verschiedenen Techniken versucht.
Während ich das Verzeichnis /var/www/html untersuchte, entdeckte ich eine .env-Datei mit Datenbank-Anmeldedaten:

Das entdeckte Passwort wurde erfolgreich wiederverwendet, um sich über SSH und MySQL zu authentifizieren.
SSH

MySQL

Nachdem ich als admin-Benutzer initialen Zugriff erlangt hatte, führte ich eine System-Enumeration durch, um potenzielle Privilegieneskalations-Vektoren zu identifizieren.
Ich habe alle gängigsten Privilegieneskalations-Tricks ausprobiert – SUID-Binaries, Capabilities, Sudo-Rechte, Cron-Jobs – nichts funktionierte. Also habe ich Umgebungsvariablen auf PATH-Hijacking oder sensible Variablen überprüft und eine MAIL-Variable gefunden, die auf /var/mail/admin zeigt.

Ich habe den Inhalt der E-Mail überprüft und festgestellt, dass der Admin gewarnt worden war, den Kernel gegen eine OverlayFS/FUSE-Schwachstelle zu patchen.

Kernel-Version

OS-Version

Der Kernel wurde nie aktualisiert, was bestätigt, dass der Administrator die Sicherheitswarnung ignoriert oder vergessen hatte.
Die Kernel-Enumeration ergab Version 5.15.70-051570-generic, die für CVE-2023-0386, eine lokale OverlayFS/FUSE-Privilegieneskalation, anfällig ist.
Nachdem die Schwachstelle bestätigt war, besorgte ich mir einen öffentlichen POC-Exploit.
Ich klonte den POC und übertrug ihn auf die Zielmaschine.
Anschließend führte ich ihn aus und erlangte erfolgreich Root-Zugriff.


CVE-2023-0386 - CVE-2023-0386 - OS-Befehlsinjektion
Haftungsausschluss: Diese Maschine wurde in einer autorisierten Penetrationstest-Umgebung gerootet.
| Phase | Technik | Ziel | Ergebnis |
|---|
| 1. Aufklärung | Portscan | 22 (SSH), 80 (HTTP) | Diensterkennung |
| Pfad-Erkennung | /invite | Einladungsseite gefunden | |
| JS-Deobfuskation | inviteapi.min.js | API-Endpunkte offengelegt | |
| 2. Initialer Zugriff | Einladungscode-Generierung | POST /api/v1/invite/generate | Gültiger Einladungscode |
| Registrierung | POST /api/v1/user/register | Standardbenutzer erstellt | |
| 3. Web-Privilegieneskalation | API-Enumeration | GET /api/v1 | Admin-Endpunkte entdeckt |
| Vertikale Eskalation | PUT /api/v1/admin/settings/update | is_admin: 0 -> 1 | |
| 4. Systemzugriff | Befehlsinjektion | POST /api/v1/admin/vpn/generate | username=test;id; |
| Reverse Shell | Base64-kodierter Payload | www-data-Shell | |
| 5. Lateral Movement | Datei-Erkennung | /var/www/html/.env | admin:SuperDuperPass123 |
| SSH-Wiederverwendung | ssh [email protected] | Zugriff als admin-Benutzer | |
| 6. Root-Eskalation | Kernel-Enumeration | uname -r -> 5.15.70 | CVE-2023-0386 identifiziert |
| E-Mail-Warnung | /var/mail/admin | OverlayFS/FUSE bestätigt | |
| Exploit-Ausführung | ./fuse && ./exp | Root-Shell |