
De desofuscando code.js até 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 |
Adicionei 2million.htb ao meu arquivo /etc/hots
Realizei uma descoberta de caminhos em 2million.htb usando gobuster
Durante a enumeração, descobri o endpoint /invite

Após navegar para a página /invite

Ao inspecionar a página, notei que ela carregava um arquivo JavaScript chamado inviteapi.min.js contendo 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,{}))
Desofusquei o código usando de4js, que produziu o seguinte JavaScript legível:

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() : gera um novo código de convite
verefyInviteCode(code) : verifica se um código é válido
e, para entender mais, interceptei a solicitação de verificação:

a API usa respostas JSON
Fui ao console do navegador e executei makeInviteCode()

Percebi que os dados estavam criptografados com a cifra ROT13

Após a descriptografia, encontrei o endpoint /api/v1/invite/generate; então gerei o código de convite

Descriptografia Base64

Chave
A chave 2F4BN-YI8OH-B0SCL-L8OE6 foi inserida e aceita com sucesso

Registro

Página Inicial

Página de Acesso
Poucas páginas deste site funcionam corretamente; a página de acesso é onde as coisas ficam interessantes

Enumeração de Endpoints da API
Fiz upload do arquivo VPN clicando no botão connection pack e interceptei a requisição GET

Em seguida, executei uma requisição curl com as opções verbose e silent para enumerar API endpoints disponíveis


O servidor respondeu com uma lista JSON de API endpoints
O admin tinha 3 endpoints de API com métodos GET, POST e PUT
Quando tentei gerar a chave de admin com o endpoint /api/v1/admin/vpn/generate, a chave não foi gerada porque eu não era o admin, e o primeiro endpoint /api/v1/admin/auth confirmou isso


Depois de descobrir o formato correto da requisição PUT com Content-Type: application/json e os parâmetros necessários, elevei meu usuário a administrador com sucesso