
Dalla deoffuscazione di code.js alla root, CVE-2023-0386
| porta | servizio | dettagli |
|---|---|---|
| 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 |
Ho aggiunto 2million.htb al mio file /etc/hots
Ho eseguito una discovery dei percorsi su 2million.htb usando gobuster
Durante l'enumerazione, ho scoperto l'endpoint /invite

Dopo aver navigato nella pagina /invite

Ispezionando la pagina, ho notato che caricava un file JavaScript chiamato inviteapi.min.js contenente codice offuscato:
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,{}))
Ho deoffuscato il codice usando de4js, che ha prodotto il seguente JavaScript leggibile:

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(): genera un nuovo codice d'invito
verefyInviteCode(code): verifica se un codice è valido
e per capire meglio, ho intercettato la richiesta di verifica:

l'API usa risposte JSON
Sono andato nella console del browser e ho eseguito makeInviteCode()

Ho notato che i dati erano cifrati con ROT13

Dopo la decrittazione, ho trovato l'endpoint /api/v1/invite/generate; ho quindi generato il codice d'invito

Decodifica Base64

Chiave
La chiave 2F4BN-YI8OH-B0SCL-L8OE6 è stata inserita e accettata con successo

Registrazione

Home Page

Pagina Access
Non molte pagine di questo sito funzionano correttamente; la pagina access è dove le cose diventano interessanti

Enumerazione degli endpoint API
Ho caricato il file VPN cliccando sul pulsante connection pack e ho intercettato la GET request

Ho quindi eseguito una richiesta curl con le opzioni verbose e silent per enumerare gli API endpoints disponibili


Il server ha risposto con un elenco JSON di endpoint API
L'admin aveva 3 endpoint API con metodi GET, POST e PUT
Quando ho tentato di generare la chiave admin con l'endpoint admin /api/v1/admin/vpn/generate, la chiave non è stata generata perché non ero l'admin, e il primo endpoint admin /api/v1/admin/auth lo ha confermato


Dopo aver scoperto il corretto formato della PUT request con Content-Type: application/json e i required parameters, ho elevato con successo il mio utente ad amministratore