Guia de CTF
Um guia rápido para abordar máquinas de CTF: enumeração, exploração, foothold e privesc.
Anote tudo
IP, portas, serviços, versões, paths, usuários, senhas, nomes, erros e arquivos interessantes.
Valide o contexto
Antes de usar exploit, confira se versão, serviço, endpoint e pré-requisitos fazem sentido.
Volte quando travar
Travou? Releia a enumeração. Normalmente a pista já apareceu, mas passou batida.
Comece criando uma pasta para a máquina. Assim você não perde scans, exploits, arquivos e anotações.
mkdir -p ~/ctf/maquina cd ~/ctf/maquina touch notes.txt mkdir scans exploits files
notes.txt
Anotações, hipóteses e credenciais encontradas.
scans
Saídas do Nmap e enumeração.
exploits
PoCs baixadas ou adaptadas.
files
Arquivos coletados durante a prática.
nmap -sC -sV -oN scans/initial.txt IP
Se encontrar portas novas, rode uma varredura direcionada nelas.
nmap -sC -sV -p PORTAS -oN scans/targeted.txt IP
Troque IP pelo IP da máquina. Troque PORTAS pelas portas encontradas, separadas por vírgula.
SSH
Pode ser útil depois, quando alguma credencial aparecer.
HTTP
Abra no navegador, olhe HTML, headers, paths e rode fuzzing.
FTP
Veja se permite anonymous login ou expõe arquivos.
SMB
Procure shares, permissões e arquivos acessíveis.
Versão
Nome do serviço + versão pode levar a CVE ou PoC.
Hostname
Às vezes aparece em certificado, banner ou página web.
curl -i http://IP/ curl -s http://IP/ | head whatweb http://IP/
Título
Nome da aplicação, CMS ou tema.
Headers
Server, X-Powered-By, cookies e redirecionamentos.
HTML
Comentários, links, assets e caminhos internos.
Robots
Pode mostrar caminhos que não aparecem na página.
curl -s http://IP/robots.txt curl -s http://IP/sitemap.xml
ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt
gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt
Se a aplicação responder sempre com o mesmo tamanho, filtre por status ou tamanho.
ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt -fc 404 ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt -fs TAMANHO
Se encontrar um diretório, entre nele pelo browser e verifique informações que podem ser interessantes.
Nome
O que é a aplicação?
Versão
Existe número de versão visível?
Path
A aplicação está na raiz ou em subdiretório?
Login
Existe painel administrativo?
Parâmetros
Alguma URL usa filtros, IDs ou ações?
Arquivos
README, changelog, config, backup ou install.
searchsploit "NOME DA APLICAÇÃO" searchsploit "NOME DA APLICAÇÃO" "VERSÃO" "NOME DA APLICAÇÃO" "VERSÃO" exploit "NOME DA APLICAÇÃO" "VERSÃO" CVE
head -n 60 exploit.py grep -n "usage|url|target|payload|wordlist|password|hash" exploit.py python3 exploit.py -h
URL
O exploit espera URL base, endpoint ou path específico?
Dependências
requests, termcolor, bs4, pwntools ou outra lib?
Versão
Python 2 ou Python 3?
Impacto
Lê dado? Consegue shell? Precisa crackear senha?
Se o exploit retorna hash, token ou credencial, a exploração ainda pode não ter acabado.
ssh usuario@IP ftp IP smbclient -L //IP/ -U usuario
Reuso
Senha de web pode funcionar no SSH.
Usuários
Nome em página, e-mail, autor ou banco pode virar usuário local.
Hash
Se receber hash e salt, pense em cracking com wordlist.
Painel
Credencial pode servir em painel administrativo antes do SSH.
whoami id hostname pwd uname -a ls -la
Se for uma reverse shell limitada, tente melhorar a interatividade.
python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
stty rows 40 columns 120Se estiver via SSH, normalmente não precisa estabilizar shell.
sudo -l cat /etc/passwd ls -la /home ls -la /root 2>/dev/null find / -perm -4000 -type f 2>/dev/null getcap -r / 2>/dev/null cat /etc/crontab ls -la /etc/cron.d
sudo -l
Mostra comandos que podem rodar como outro usuário.
SUID
Binários que executam com permissão do dono.
Capabilities
Permissões especiais quebradas em partes.
Cron
Tarefas automáticas que podem rodar como root.
1. Rode sudo -l. 2. Veja se algum binário pode rodar como root. 3. Pesquise o nome do binário no GTFOBins. 4. Abra a seção que combina com seu caso. 5. Se o contexto for sudo, procure a seção sudo. 6. Se a técnica abrir shell, entenda que essa shell pode herdar o privilégio do comando executado.
Editores, pagers e interpretadores costumam ser interessantes porque possuem comandos internos. Se um editor aparece no sudo -l, pesquise esse editor no GTFOBins e leia a seção sudo.
Em um CTF, abrir uma shell significa conseguir executar comandos diretamente dentro da máquina alvo.
A parte importante para privesc é o contexto dessa shell. Se uma shell abre com permissões do usuário comum, você continua limitado. Se uma shell abre a partir de um programa executado como root, ela pode herdar esse contexto e virar uma shell privilegiada.
Shell comum
Executa comandos com as permissões do usuário atual.
Shell privilegiada
Executa comandos com permissões maiores, muitas vezes como root.
Impacto
Com root, é possível ler arquivos restritos, acessar diretórios protegidos e concluir a máquina.
Por isso GTFOBins dá tanta atenção para técnicas de Shell. O objetivo não é apenas abrir um terminal novo, mas abrir um terminal no contexto de privilégio errado.
A lógica é simples: se um programa roda com permissão maior e ele consegue chamar uma shell, a shell pode abrir no mesmo contexto de privilégio.
Por isso, quando aparecer um editor, pager ou interpretador no sudo -l, procure por formas de shell escape desse programa.
Editores
vi, vim, nano, ed.
Pagers
less, more, man.
Interpretadores
python, perl, ruby, awk, lua.
Ferramentas
find, tar, zip, nmap antigo.
# Dentro de alguns programas interativos, procure por padrões como: :!comando !/bin/sh !/bin/bash shell sh bash # Em alguns casos, o programa também aceita executar comandos ao iniciar: programa -c 'comando interno' programa --command 'comando interno'
Essa lista não é uma receita universal. Ela serve para reconhecer o tipo de coisa que você deve procurar quando um programa interativo aparece em sudo -l.
find / -iname "*flag*" 2>/dev/null ls -la /home ls -la /root 2>/dev/null
Se conseguir root, confirme com:
whoami id
Releia scans
Alguma porta ficou sem enumeração?
Refaça web
Algum diretório encontrado não foi explorado?
Pesquise versão
Nome + versão + CVE + exploit.
Teste credenciais
Usuário/senha podem servir em outro serviço.
Olhe arquivos
Configs e backups costumam ter pistas.
Enumere local
Depois do foothold, o jogo muda.
# Organização
mkdir -p ~/ctf/maquina/{scans,exploits,files}
cd ~/ctf/maquina
touch notes.txt
# Nmap
nmap -sC -sV -oN scans/initial.txt IP
nmap -p- --min-rate 5000 -oN scans/all-ports.txt IP
nmap -sC -sV -p PORTAS -oN scans/targeted.txt IP
# Web
curl -i http://IP/
whatweb http://IP/
curl -s http://IP/robots.txt
# Fuzzing
ffuf -u http://IP/FUZZ -w /usr/share/wordlists/dirb/common.txt
gobuster dir -u http://IP/ -w /usr/share/wordlists/dirb/common.txt
# Searchsploit
searchsploit "NOME"
searchsploit "NOME" "VERSÃO"
searchsploit -x ID
searchsploit -m ID
# PoC
head -n 60 exploit.py
python3 exploit.py -h
pip install -r requirements.txt
# Credenciais
ssh usuario@IP
ftp IP
smbclient -L //IP/ -U usuario
# Foothold
whoami
id
hostname
uname -a
ls -la
# Privesc
sudo -l
find / -perm -4000 -type f 2>/dev/null
getcap -r / 2>/dev/null
cat /etc/crontab
ls -la /home
find / -iname "*flag*" 2>/dev/nullShell escape
Se sudo -l mostrar editor, pager ou interpretador:
- Pesquise o binário no GTFOBins.
- Veja se ele tem Shell, sudo, SUID ou herda de outro binário.
- Procure padrões como :!comando, !/bin/sh, !/bin/bash ou opção -c.