
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.