
From deobfuscating code.js to root, CVE-2023-0386
| puerto | servicio | detalles |
|---|---|---|
| 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 |
Añadí 2million.htb a mi archivo /etc/hots
Realicé un descubrimiento de rutas en 2million.htb usando gobuster
Durante la enumeración, descubrí el endpoint /invite

Después de navegar a la página /invite

Mientras inspeccionaba la página, noté que cargaba un archivo Javascript llamado inviteapi.min.js que contenía código ofuscado:
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,{}))
Desofusqué el código usando de4js, lo que produjo el siguiente JavaScript legible:

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 nuevo código de invitación
verefyInviteCode(code) : comprueba si un código es válido
y para entenderlo mejor, intercepté la solicitud de verificación:

la API usa respuestas JSON
Fui a la consola del navegador y ejecuté makeInviteCode()

Noté que los datos estaban cifrados con el cifrado ROT13

Después del descifrado, encontré el endpoint /api/v1/invite/generate, y entonces generé el código de invitación

Descifrado Base64

Clave
La clave 2F4BN-YI8OH-B0SCL-L8OE6 se insertó y fue aceptada correctamente

Registro

Página de inicio

Página de acceso
No muchas páginas de este sitio funcionan correctamente; la página de acceso es donde las cosas se ponen interesantes

Enumeración de endpoints de la API
Subí el archivo VPN haciendo clic en el botón connection pack e intercepté la GET request

Luego ejecuté una solicitud curl con las opciones verbose y silent para enumerar los API endpoints disponibles


El servidor respondió con una lista JSON de endpoints de API
El administrador tenía 3 endpoints de API con métodos GET, POST y PUT
Cuando intenté generar la clave de admin con el endpoint de admin /api/v1/admin/vpn/generate, la clave no se generó porque yo no era el admin, y el primer endpoint de admin /api/v1/admin/auth lo confirmó


Después de descubrir el formato correcto de la PUT request con Content-Type: application/json y los required parameters, escalé exitosamente mi usuario a administrador









Inyecté ;whoami; en el campo de nombre de usuario; mi sospecha recayó en las funciones php exec() o system(), que son comunes en funciones exclusivas de administrador y a menudo carecen de una sanitización adecuada
Por ejemplo, el código vulnerable probablemente se veía así:
$username = $json->username;
exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");
Este endpoint POST /api/v1/admin/vpn/generate era vulnerable, y la inyección de comandos del sistema operativo se realizó con éxito



Dado que la aplicación tenía restricciones que impedían caracteres especiales, codifiqué en base64 el comando del payload de reverse shell para evadir esta restricción

Inyecté el payload en el username parameter, canalizándolo a base64 -d | bash para su decodificación y ejecución:


El payload se ejecutó correctamente, devolviendo una reverse shell como el www-data user

Intenté un movimiento lateral del usuario www-data al usuario admin usando varias técnicas
Mientras inspeccionaba el directorio /var/www/html, descubrí un archivo .env que contenía credenciales de la base de datos:

La contraseña descubierta se reutilizó con éxito para autenticarse vía SSH y MySQL
SSH

MySQL

Después de obtener el acceso inicial como usuario admin, realicé una enumeración del sistema para identificar posibles vectores de escalada de privilegios
Probé todos los trucos más comunes de escalada de privilegios, como binarios SUID, capabilities, derechos sudo, cron jobs; nada funcionó. Así que revisé las variables de entorno en busca de secuestro de PATH o variables sensibles, y encontré una MAIL variable que apuntaba a /var/mail/admin

Fui a revisar el contenido del correo y noté que le habían advertido al admin que parcheara el kernel contra una OverlayFS/FUSE vulnerability

versión del kernel

versión del SO

El kernel nunca se actualizó, lo que confirmó que el administrador había ignorado u olvidado la advertencia de seguridad
La enumeración del kernel reveló la versión 5.15.70-051570-generic, que es vulnerable a CVE-2023-0386, una escalada local de privilegios OverlayFS/FUSE
Con la vulnerabilidad confirmada, procedí a obtener un exploit POC público
Cloné el POC y lo transferí a la máquina objetivo
Luego lo ejecuté y obtuve acceso root con éxito


CVE-2023-0386 - CVE-2023-0386 - Inyección de comandos del SO
Descargo de responsabilidad: Esta máquina fue vulnerada en un entorno de pruebas de penetración autorizado.
| Fase | Técnica | Objetivo | Resultado |
|---|
| 1. Reconocimiento | Escaneo de puertos | 22 (SSH), 80 (HTTP) | Descubrimiento de servicios |
| Descubrimiento de rutas | /invite | Página de invitación encontrada | |
| Desofuscación JS | inviteapi.min.js | Endpoints de API expuestos | |
| 2. Acceso inicial | Generación de invitación | POST /api/v1/invite/generate | Código de invitación válido |
| Registro | POST /api/v1/user/register | Usuario estándar creado | |
| 3. Escalada web | Enumeración de API | GET /api/v1 | Endpoints de admin descubiertos |
| Escalada vertical | PUT /api/v1/admin/settings/update | is_admin: 0 -> 1 | |
| 4. Acceso al sistema | Inyección de comandos | POST /api/v1/admin/vpn/generate | username=test;id; |
| Reverse Shell | Payload codificado en Base64 | Shell www-data | |
| 5. Movimiento lateral | Descubrimiento de archivos | /var/www/html/.env | admin:SuperDuperPass123 |
| Reutilización de SSH | ssh [email protected] | Acceso al usuario admin | |
| 6. Escalada a root | Enumeración del kernel | uname -r -> 5.15.70 | CVE-2023-0386 identificado |
| Advertencia por correo | /var/mail/admin | OverlayFS/FUSE confirmado | |
| Ejecución del exploit | ./fuse && ./exp | Shell root |