
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









Ho iniettato ;whoami; nel campo username; il mio sospetto è caduto sulle funzioni PHP exec() o system(), comuni nelle funzionalità solo-admin e spesso prive di una corretta sanitizzazione
Ad esempio, il codice vulnerabile probabilmente era simile a questo:
$username = $json->username;
exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");
Questo endpoint POST /api/v1/admin/vpn/generate era vulnerabile e OS Command Injection è stata eseguita con successo



Poiché l'applicazione aveva restrizioni che impedivano i caratteri speciali, ho codificato in base64 il comando del payload della reverse shell per bypassare questa restrizione

Ho iniettato il payload nel username parameter, passandolo tramite pipe a base64 -d | bash per la decodifica e l'esecuzione:


Il payload è stato eseguito con successo, restituendo una reverse shell come www-data user

Ho tentato un movimento laterale dall'utente www-data all'utente admin usando varie tecniche
Ispezionando la directory /var/www/html ho scoperto un file .env contenente le credenziali del database:

La password scoperta è stata riutilizzata con successo per autenticarsi via SSH e MySQL
SSH

MySQL

Dopo aver ottenuto l'accesso iniziale come utente admin, ho eseguito l'enumerazione del sistema per identificare potenziali vettori di privilege escalation
Ho provato tutti i più comuni trucchi di privilege escalation come i binari SUID, le capabilities, i diritti sudo, i cron job; niente ha funzionato. Quindi ho controllato le variabili d'ambiente per PATH hijacking o variabili sensibili e ho trovato una MAIL variable che punta a /var/mail/admin

Sono andato a controllare il contenuto della mail e ho notato che l'admin era stato avvisato di applicare la patch al kernel contro la OverlayFS/FUSE vulnerability

versione del kernel

versione del sistema operativo

Il kernel non è mai stato aggiornato, confermando che l'amministratore aveva ignorato o dimenticato l'avviso di sicurezza
L'enumerazione del kernel ha rivelato la versione 5.15.70-051570-generic, vulnerabile a CVE-2023-0386 OverlayFS/FUSE local privilege escalation
Con la vulnerabilità confermata, ho proceduto a ottenere un exploit POC pubblico
Ho clonato il POC e l'ho trasferito sulla macchina target
Poi l'ho eseguito e ho ottenuto con successo l'accesso root


CVE-2023-0386 - CVE-2023-0386 - OS Command Injection
Disclaimer: Questa macchina è stata portata a root in un ambiente di penetration testing autorizzato
| Fase | Tecnica | Obiettivo | Risultato |
|---|
| 1. Ricognizione | Scansione delle porte | 22 (SSH), 80 (HTTP) | Scoperta dei servizi |
| Scoperta dei percorsi | /invite | Pagina di invito trovata | |
| Deoffuscazione JS | inviteapi.min.js | Endpoint API esposti | |
| 2. Accesso iniziale | Generazione del codice d'invito | POST /api/v1/invite/generate | Codice d'invito valido |
| Registrazione | POST /api/v1/user/register | Utente standard creato | |
| 3. Web Privesc | Enumerazione API | GET /api/v1 | Endpoint admin scoperti |
| Escalation verticale | PUT /api/v1/admin/settings/update | is_admin: 0 -> 1 | |
| 4. Accesso al sistema | Command Injection | POST /api/v1/admin/vpn/generate | username=test;id; |
| Reverse Shell | Payload codificato in Base64 | Shell www-data | |
| 5. Movimento laterale | Scoperta di file | /var/www/html/.env | admin:SuperDuperPass123 |
| Riutilizzo SSH | ssh [email protected] | Accesso utente admin | |
| 6. Escalation a root | Enumerazione del kernel | uname -r -> 5.15.70 | CVE-2023-0386 identificato |
| Avviso via email | /var/mail/admin | OverlayFS/FUSE confermato | |
| Esecuzione dell'exploit | ./fuse && ./exp | Shell root |