Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2023-24329-lab — Laboratório Docker autossuficiente que demonstra o CVE-2023-24329, uma diferença de parser do Python urllib que contorna filtros de esquema e host de URL, com ambientes vulneráveis e corrigidos para aprendizado prático em segurança. | Kitploit
Ferramentas/GitHubGitHub/jithinodattu/cve-2023-24329-lab
Análise de VulnerabilidadesExploraçãoSegurança WebCTFTestes de PenetraçãoAprendizado e EducaçãoLabs e Prática
GitHubjithinodattu/cve-2023-24329-lab

CVE-2023-24329-lab

Laboratório Docker autossuficiente que demonstra o CVE-2023-24329, uma diferença de parser do Python urllib que contorna filtros de esquema e host de URL, com ambientes vulneráveis e corrigidos para aprendizado prático em segurança.

Ver Repositório
4há 4 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2023-24329 — Laboratório de Diferencial de Parser

Apenas para uso educacional. Este laboratório existe para demonstrar uma vulnerabilidade real em um ambiente seguro e isolado. Nunca execute isso contra sistemas que você não possui. Nunca reutilize o código de filtro intencionalmente quebrado em qualquer sistema de produção.

Um laboratório Docker autocontido demonstrando a CVE-2023-24329 — um diferencial de parser no urllib.parse.urlparse() do Python que permite contornar filtros de esquema de URL e host no Python < 3.11.4.

O laboratório mostra uma API que bloqueia explicitamente URLs file:// e nomes de host internos sendo enganada para ler /etc/passwd de seu próprio contêiner e acessar um serviço interno privado — e então prova que o mesmo exploit falha no Python corrigido.


A Vulnerabilidade

O urlparse() do Python e os buscadores HTTP/arquivo subjacentes discordam sobre como lidar com URLs com espaços iniciais. Nas versões afetadas:

root@kitploit:~
from urllib.parse import urlparse

urlparse(" file:///etc/passwd").scheme   # → ""   (vazio — filtro passa)
urlparse(" file:///etc/passwd").hostname # → None (vazio — filtro passa)

Mas urllib.request.urlopen(" file:///etc/passwd") remove o espaço e busca file:///etc/passwd de qualquer forma.

Essa lacuna entre o que o parser vê e o que o buscador faz — essa é a vulnerabilidade.

Python 3.11.4 corrigiu isso removendo espaços iniciais e caracteres de controle antes do parsing, fechando a lacuna.


Demonstração — Três Cenários

CenárioO que você vêO que ensina
1 — Linha de basefile:///etc/passwd → 403 esquema bloqueadoO filtro parece razoável
2 — ExploitMesma URL com prefixo de espaço → 200 + conteúdo de /etc/passwd e segredo internoUm único espaço derruba o filtro inteiro
3 — CorreçãoMesmo payload contra Python 3.11.4 → 403 bloqueadourlparse corrigido remove espaços primeiro; filtro o captura corretamente

Arquitetura

Quatro serviços em uma rede Docker bridge isolada (cve-lab-net):

ServiçoVersão PythonFunçãoPorta do host
vulnerable-api3.11.3API alvo com filtro de URL ingênuo8000
fixed-api3.11.4Mesmo código, interpretador corrigido8000
internal-service3.12Endpoint de metadados interno falsonenhuma
attacker3.12Driver de exploraçãonenhuma

internal-service não tem mapeamento de porta do host — é acessível apenas de dentro da rede Docker, simulando um limite de confiança real.


Pré-requisitos

  • Docker Desktop (ou Docker Engine + plugin Compose)
  • ~500 MB de espaço em disco para as imagens

Início Rápido

root@kitploit:~
git clone <repo-url>
cd CVE-2023-24329-lab

Cenário 1 — Linha de base: filtro deve funcionar

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml up --build -d
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py baseline

Cenário 1 — filtro de linha de base funciona

Cenário 2 — Exploit: contornar o filtro

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py exploit

Cenário 2 — bypass bem-sucedido, /etc/passwd e segredo interno expostos

Cenário 3 — Correção: mesmo payload, Python corrigido

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml down
docker compose -f docker-compose.fixed.yml up --build -d
docker compose -f docker-compose.fixed.yml exec attacker python exploit.py verify

Cenário 3 — correção funciona no Python 3.11.4

Encerrar

root@kitploit:~
docker compose -f docker-compose.fixed.yml down

Estrutura de Diretórios

root@kitploit:~
CVE-2023-24329-lab/
├── docker-compose.vulnerable.yml   # Python 3.11.3 (afetado)
├── docker-compose.fixed.yml        # Python 3.11.4 (corrigido)
├── vulnerable-api/
│   ├── app.py                      # API Flask com o filtro ingênuo
│   ├── requirements.txt
│   └── Dockerfile
├── internal-service/
│   ├── app.py                      # Endpoint de metadados interno falso
│   ├── requirements.txt
│   └── Dockerfile
└── attacker/
    ├── exploit.py                  # Driver de demonstração (baseline / exploit / verify)
    ├── requirements.txt
    └── Dockerfile

Os serviços API vulnerável e corrigido compartilham o mesmo código-fonte — apenas a versão do Python na imagem base difere. Esta é a propriedade de controle científico chave do laboratório.


Como o Bypass Funciona

O filtro da API vulnerável (simplificado):

root@kitploit:~
parsed = urllib.parse.urlparse(url)

if parsed.scheme.lower() in {"file", "gopher", "ftp", "data"}:
    return 403  # bloqueado

if parsed.hostname in {"localhost", "127.0.0.1", "internal-service"}:
    return 403  # bloqueado

urllib.request.urlopen(url)  # busca a string original e não modificada

O payload de bypass é um único espaço inicial:

root@kitploit:~
 file:///etc/passwd
^
espaço (0x20)

No Python ≤ 3.11.3, urlparse vê esquema vazio e sem hostname → filtro passa. urlopen remove o espaço → busca file:///etc/passwd.

No Python ≥ 3.11.4, urlparse remove o espaço primeiro → vê corretamente scheme=file → filtro bloqueia com 403.


A Correção (O que o Python Corrigido Faz)

CPython issue #102153 — a correção remove caracteres de controle C0 e espaços do início da URL antes de fazer o parsing. Após a correção, tanto o parser quanto o buscador concordam sobre o que é a URL, então o filtro não pode ser contornado dessa forma.

O padrão defensivo correto independentemente da versão do Python:

root@kitploit:~
# Parse → reconstruir a partir das partes → passar a URL reconstruída downstream.
# Tanto o filtro quanto o buscador operam então na mesma string.
parsed = urllib.parse.urlparse(url)
safe_url = parsed.geturl()  # reconstruído a partir dos componentes
urllib.request.urlopen(safe_url)

Principais Pontos de Ensino

  1. Diferenciais de parser são uma classe de vulnerabilidade, não um bug isolado. A mesma ideia impulsiona contrabando de requisições HTTP, ataques de confusão SAML e os bypasses de ${jndi:...} do log4j.
  2. Listas de bloqueio falham quando o parser mente para você. Enumerar entradas ruins é um jogo perdido.
  3. Valide a URL reconstruída, não a string de entrada bruta.
  4. Uma versão menor, uma pequena correção, consequência enorme. A correção do CPython é um punhado de linhas.

Referências

  • NVD: CVE-2023-24329
  • Issue do CPython: github.com/python/cpython/issues/102153
  • Divulgação original: Yebo Cao — pesquise "CVE-2023-24329 Yebo Cao"
  • Classe mais ampla: PortSwigger — técnicas de bypass de filtro SSRF
  • Classe mais ampla: James Kettle — Ataques de Dessincronização HTTP

Proteções

  • Nunca exponha as portas do internal-service ao host.
  • Nunca execute este laboratório em uma máquina conectada a uma rede de produção.
  • O código do filtro em vulnerable-api/app.py está deliberadamente quebrado para fins de ensino — não o copie para nenhum sistema real.

Licença

MIT — livre para usar, compartilhar e adaptar para fins educacionais com atribuição.

Baixar ferramenta