
De desofuscar code.js a 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