
Laboratório baseado em Docker que reproduz o SSRF CVE-2023-27163 no Request-Baskets, com verificação de exploração, script de detecção e remediação de isolamento de rede.
Projeto: Laboratório de Pesquisa e Reprodução de Vulnerabilidades — CVE-2023-27163
Autor: Amulya Kaushik
Função: Candidato a Estágio em P&D de Cibersegurança e Desenvolvimento de Conteúdo de Laboratório
Server-Side Request Forgery no Request-Baskets ≤ 1.2.1
Um laboratório de pesquisa local autocontido para reproduzir, detectar e remediar o CVE-2023-27163 com arquitetura de defesa em profundidade.
| Campo | Valor |
|---|
| ID do CVE | CVE-2023-27163 |
| CWE | CWE-918 — Server-Side Request Forgery (SSRF) |
| Produto Afetado | Request-Baskets |
| Versões Afetadas | ≤ 1.2.1 |
| Versão Corrigida | 1.2.2 (Código upstream) / Isolamento de Rede com Defesa em Profundidade |
| Pontuação CVSS v3.1 | 6.5 (Média) |
| Vetor CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Complexidade do Ataque | Baixa — uma única chamada de API não autenticada |
Nota sobre Limitações do Upstream e Remediação:
Embora o CVE-2023-27163 trate da validação de URL de encaminhamento arbitrária, builds públicos de contêiner dodarklynx/request-basketsnão aplicam filtragem de loopback ou sub-rede privada por padrão. Seguindo as melhores práticas reais de DevSecOps, nosso laboratório demonstra a remediação por meio de Isolamento de Rede de Contêineres com Defesa em Profundidade. Ao isolar backends internos sensíveis em uma rede Docker somente interna (secure-internal-netcominternal: true), o caminho de retransmissão é cortado, mitigando a explorabilidade da vulnerabilidade SSRF mesmo ao executar encaminhadores de webhook não confiáveis.
Este laboratório fornece duas topologias distintas de Docker Compose:
docker-compose.yml): Request-Baskets e um serviço interno de eco de segredos compartilham a rede bridge lab-net. O Request-Baskets é mapeado para a porta do host 55556 (mapeada da porta do contêiner 55555).docker-compose.patched.yml): O Request-Baskets é conectado exclusivamente à public-net, enquanto o serviço interno de eco é conectado à secure-internal-net (internal: true).docker-compose.yml)┌─────────────────────────────────────────────────────────┐
│ Docker: lab-net │
│ │
│ ┌─────────────────────┐ ┌────────────────────────┐ │
│ │ request-baskets │───▶│ internal-service │ │
│ │ (v1.2.1) │ │ (http-echo:5678) │ │
│ │ Port 55556 ◀──HOST │ │ NOT exposed to host │ │
│ └─────────────────────┘ └────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
▲
│ HTTP (port 55556)
│
┌────┴─────┐
│ Attacker │
└──────────┘
docker-compose.patched.yml)┌─────────────────────────┐ ┌─────────────────────────┐
│ public-net │ │ secure-internal-net │
│ │ │ (internal: true) │
│ ┌───────────────────┐ │ │ ┌───────────────────┐ │
│ │ request-baskets │ │ ✕ │ │ internal-service │ │
│ │ Port 55556◀─HOST │ │ ──/──▶ │ │ (http-echo:5678) │ │
│ └───────────────────┘ │ │ └───────────────────┘ │
└─────────────────────────┘ └─────────────────────────┘
| Requisito | Versão Mínima | Notas |
|---|---|---|
| Docker Engine | 20.10+ | Runtime de virtualização de contêineres |
| Docker Compose | v2.0+ | Orquestração multi-contêiner |
| Python | 3.8+ | Ferramentas de verificação e detecção via CLI |
Configurar ambiente virtual Python e dependências:
python3 -m venv .venv
source .venv/bin/activate
pip install requests fpdf2
Inicie o ambiente vulnerável (Request-Baskets v1.2.1 acessível em http://localhost:55556):
docker compose up -d
Verifique se ambos os contêineres estão em execução:
docker compose ps
Saída esperada:
NAME IMAGE COMMAND SERVICE STATUS PORTS
isolated-internal-service hashicorp/http-echo:latest "/http-echo -text=CO…" internal-service Up 5678/tcp
vulnerable-request-baskets darklynx/request-baskets:v1.2.1 "/bin/sh -c /bin/ent…" request-baskets Up 0.0.0.0:55556->55555/tcp
Confirme que o serviço interno não é diretamente acessível a partir do host:
curl http://localhost:5678 2>&1 || echo "Connection refused — internal service isolated as expected"
Execute o script automatizado de verificação de SSRF:
python3 scripts/verify_vulnerability.py
O que acontece:
/api/baskets/ssrf-verification-basket definindo forward_url: "http://internal-service:5678" e proxy_response: true.CONFIDENTIAL_DATA{INTERNAL_SSRF_DEMONSTRATION_SUCCESS} e exibe RESULT: VULNERABLE.Execute a sonda de auditoria não destrutiva:
python3 scripts/detect.py
O que acontece:
http://127.0.0.1:80) é aceito.AUDIT RESULT: VULNERABLE após aceitação (HTTP 201) e limpa o basket de sondagem.Alterne para a topologia remediada segmentada:
docker compose down
docker compose -f docker-compose.patched.yml up -d
python3 scripts/verify_vulnerability.py
Saída esperada:
==============================================================
[✓] REMEDIATION VERIFIED: TARGET SECURED
The Request-Baskets instance failed to reach the internal
isolated service (HTTP 502 / Host Unreachable).
Network segmentation successfully prevented SSRF data exfiltration.
==============================================================
Derrube o ambiente quando terminar:
docker compose -f docker-compose.patched.yml down
O portfólio completo de evidências visuais para o Entregável 3 é mantido no diretório evidence/:
| Artefato | Propósito | Link do Arquivo | Descrição |
|---|---|---|---|
| Captura de Tela 1 | Ambiente em Execução | 01_lab_running.png | Mostra vulnerable-request-baskets (porta 55556) e isolated-internal-service em execução simultânea na lab-net. |
| Captura de Tela 2 | Exploração de SSRF | 02_reproduction_ssrf.png | Exibe a flag exfiltrada CONFIDENTIAL_DATA{...} e o status VULNERABLE. |
| Captura de Tela 3 | Ferramenta de Detecção Defensiva | 03_detection_tool_run.png | Exibe a verificação de assinatura em duas fases e a auditoria de loopback sinalizando VULNERABLE. |
| Captura de Tela 4 | Verificação de Remediação | 04_remediation_verified.png | Comprova a falha de retransmissão (HTTP 502 / Host Unreachable) sob defesa de rede segmentada. |
| Captura de Tela 5 | Configuração da Interface Web | 05_web_ui_ssrf.png | (Bônus) Captura do navegador das configurações da interface do Request-Baskets configuradas com Proxy Response. |
Passo a passo detalhados, comandos e transcrições do console para cada captura de tela estão documentados em evidence/README.md.
Para capturar todas as capturas de tela do terminal sequencialmente sem complicações de configuração manual, execute:
./scripts/capture_evidence_flow.sh
Compile o relatório técnico acadêmico em PDF:
python3 docs/generate_blog_pdf.py
Saída gerada: docs/CVE-2023-27163-Technical-Blog.pdf
cve-2023-27163-lab/
├── .gitignore # Git artifact exclusions (.venv, cache, OS files)
├── docker-compose.yml # Vulnerable environment (shared lab-net, port 55556)
├── docker-compose.patched.yml # Remediated environment (disjoint network isolation)
├── README.md # Complete documentation, attribution & guide
├── scripts/
│ ├── capture_evidence_flow.sh # Interactive runner for capturing screenshots
│ ├── verify_vulnerability.py # SSRF exploitation & remediation verification CLI
│ └── detect.py # Defensive audit and detection tool
├── evidence/
│ └── README.md # Formal screenshot evidence walkthrough
└── docs/
├── technical_blog.md # Academic technical write-up (800–1,200 words)
├── generate_blog_pdf.py # Markdown → PDF converter
└── CVE-2023-27163-Technical-Blog.pdf # Compiled academic report PDF
Esta pesquisa e desenvolvimento de laboratório baseia-se em padrões abertos de segurança, avisos de fornecedores e bancos de dados de vulnerabilidades:
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N).Este laboratório destina-se apenas a fins educacionais e de pesquisa de segurança autorizada. Não use estas ferramentas contra sistemas que você não possui ou para os quais não tem permissão explícita de teste.