
From deobfuscating code.js to 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









Injetei ;whoami; no campo username; minha suspeita recaiu sobre as funções PHP exec() ou system(), que são comuns em recursos exclusivos de admin e frequentemente não possuem sanitização adequada
Por exemplo, o código vulnerável provavelmente se parecia com isto:
$username = $json->username;
exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");
Este endpoint POST /api/v1/admin/vpn/generate estava vulnerável, e a Injeção de Comando no SO foi executada com sucesso



Como a aplicação tinha restrições que impediam caracteres especiais, codifiquei em base64 o comando do payload do reverse shell para contornar essa restrição

Injetei o payload no username parameter, canalizando-o para base64 -d | bash para decodificação e execução:


O payload foi executado com sucesso, retornando um reverse shell como o www-data user

Tentei movimentação lateral do usuário www-data para o usuário admin usando diversas técnicas
Ao inspecionar o diretório /var/www/html, descobri um arquivo .env contendo credenciais de banco de dados:

A senha descoberta foi reutilizada com sucesso para autenticar via SSH e MySQL
SSH

MySQL

Após obter o acesso inicial como o usuário admin, realizei enumeração do sistema para identificar possíveis vetores de escalação de privilégio
Tentei todos os truques mais comuns de escalação de privilégio, como binários SUID, capabilities, direitos sudo, cron jobs; nada funcionou. Então verifiquei as variáveis de ambiente em busca de sequestro de PATH ou variáveis sensíveis, e encontrei uma MAIL variable apontando para /var/mail/admin

Fui verificar o conteúdo do e-mail e notei que o admin havia sido alertado para corrigir o kernel contra uma OverlayFS/FUSE vulnerability

versão do kernel

versão do SO

O kernel nunca foi atualizado, confirmando que o administrador ignorou ou esqueceu o aviso de segurança
A enumeração do kernel revelou a versão 5.15.70-051570-generic, que é vulnerável a CVE-2023-0386 escalação local de privilégio OverlayFS/FUSE
Com a vulnerabilidade confirmada, prossegui para obter um exploit POC público
Clonei o POC e o transferi para a máquina alvo
Em seguida, executei-o e obtive acesso root com sucesso


CVE-2023-0386 - CVE-2023-0386 - Injeção de Comando no SO
Aviso Legal: Esta máquina foi comprometida em um ambiente de teste de penetração autorizado
| Fase | Técnica | Alvo | Resultado |
|---|
| 1. Reconhecimento | Varredura de portas | 22 (SSH), 80 (HTTP) | Descoberta de serviços |
| Descoberta de caminhos | /invite | Página de convite encontrada | |
| Desofuscação de JS | inviteapi.min.js | Endpoints da API expostos | |
| 2. Acesso Inicial | Geração de convite | POST /api/v1/invite/generate | Código de convite válido |
| Registro | POST /api/v1/user/register | Usuário padrão criado | |
| 3. Privesc Web | Enumeração de API | GET /api/v1 | Endpoints de admin descobertos |
| Escalação vertical | PUT /api/v1/admin/settings/update | is_admin: 0 -> 1 | |
| 4. Acesso ao Sistema | Injeção de comando | POST /api/v1/admin/vpn/generate | username=test;id; |
| Reverse Shell | Payload codificado em base64 | Shell www-data | |
| 5. Movimentação Lateral | Descoberta de arquivos | /var/www/html/.env | admin:SuperDuperPass123 |
| Reutilização de SSH | ssh [email protected] | Acesso ao usuário admin | |
| 6. Escalação Root | Enumeração do kernel | uname -r -> 5.15.70 | CVE-2023-0386 identificado |
| Aviso de e-mail | /var/mail/admin | OverlayFS/FUSE confirmado | |
| Execução do exploit | ./fuse && ./exp | Shell root |