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
Ferramentas/GitHubGitHub/jithinodattu/cve-2007-4559-lab
Análise EstáticaAnálise de VulnerabilidadesAnálise de CódigoExploração de Aplicações WebCTFSegurança da Cadeia de SuprimentosAprendizado e EducaçãoExploração de BináriosLabs e Prática
GitHubjithinodattu/cve-2007-4559-lab

CVE-2007-4559-lab

Laboratório Docker autocontido demonstrando a travessia de diretório CVE-2007-4559 (TarSlip) via o módulo tarfile do Python. Inclui APIs vulneráveis e corrigidas, geração de payload e um script de demonstração interativo para educação em segurança.

Ver Repositório
7há 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-2007-4559 — TarSlip: A travessia de diretórios de 15 anos

Apenas para uso educacional. Este laboratório explora intencionalmente vulnerabilidades do sistema de arquivos dentro de contêineres Docker isolados. Não execute em nenhum sistema com dados sensíveis ou em ambientes de produção.

Um laboratório Docker autocontido que demonstra CVE-2007-4559 — a infame vulnerabilidade "TarSlip" no módulo tarfile do Python — através de uma cadeia de ataque concreta, de ponta a ponta:

  1. Um atacante envia um tarball malicioso para uma API de upload de arquivos.
  2. extractall() escreve cegamente uma entrada tar nomeada ../../../etc/passwd fora do diretório de extração, sobrescrevendo o arquivo real do sistema.
  3. A senha plantada concede ao atacante acesso a um endpoint /admin protegido.
  4. O mesmo ataque é então executado contra uma API corrigida — e bloqueado com uma linha de código.

A vulnerabilidade

tarfile.extractall() do Python reproduz fielmente todas as entradas de um arquivo tar, incluindo entradas cujos nomes contêm sequências de travessia de diretório . Ele .

../
nunca foi projetado para ser uma fronteira de segurança
root@kitploit:~
nome da entrada tar : ../../../etc/passwd
diretório de extração : /shared/uploads/a1b2c3d4/

caminho resolvido  : /shared/uploads/a1b2c3d4/../../../etc/passwd
               = /etc/passwd   ← arquivo do sistema sobrescrito
Linha do tempo
2007Bug reportado à equipe de segurança do Python
2007 – 2022Marcado como "não é um problema de segurança" — tarfile está "funcionando conforme o esperado"
2022Pesquisadores da Trellix escaneiam GitHub e encontram mais de 350.000 repositórios chamando extractall() em entrada não confiável
2022Divulgação pública. CVE-2007-4559 ressurge. Correria em toda a indústria.
2023PEP 706 envia filter='data' no Python 3.12 — a correção é um único argumento

O que a demonstração mostra

A demonstração é executada em três movimentos, cada um exigindo uma tecla para avançar.

Movimento 1 — Linha de Base

  • GET /admin → 401. O endpoint admin existe e está protegido. O atacante não sabe a senha.
  • Upload de innocent.tar.gz → os arquivos caem dentro do diretório sandbox. Tudo parece normal.

Movimento 2 — O Exploit

root@kitploit:~
Atacante cria tarslip_passwd.tar.gz
  └─ entrada: "../../../etc/passwd"
       conteúdo: admin:hacked:1001:...   ← senha plantada
            │
            ▼
  POST /upload  (upload de arquivo multipart)
            │
            ▼
  extractall("/shared/uploads/{uuid}/")
  resolve "../../../etc/passwd" → /etc/passwd   ← CVE-2007-4559
            │
            ▼
  GET /admin   Authorization: Basic admin:hacked
            │
            ▼
  HTTP 200 — "Welcome, admin! You have full admin access."
  flag: CVE-2007-4559{tarslip_passwd_overwrite_to_admin_rce}

Um único HTTP POST. Nenhum shell. Nenhum payload RCE. Apenas um arquivo tar.

Movimento 3 — A Correção

O mesmo tarball é enviado para a API corrigida, que passa filter='data' para extractall(). O Python lança tarfile.OutsideDestinationError — a travessia é bloqueada, /etc/passwd permanece intocado e /admin permanece bloqueado.

root@kitploit:~
# Vulnerável — padrão antes do Python 3.14
tar.extractall(extraction_dir)

# Corrigido — PEP 706 (Python 3.12+)
tar.extractall(extraction_dir, filter='data')

Um argumento. Quinze anos para ser enviado.


Arquitetura

Quatro serviços em uma rede bridge Docker isolada (tarslip-net). Nada alcança a internet.

root@kitploit:~
┌─────────────────────────────────────────────────────────┐
│                    tarslip-net (bridge)                  │
│                                                          │
│  ┌─────────────────┐      ┌──────────────────────────┐  │
│  │  vulnerable-api │      │       file-server        │  │
│  │  python:3.11.3  │      │       nginx:alpine       │  │
│  │  porta 8000      │      │       porta 8080 (host)   │  │
│  │                 │      │                          │  │
│  │  POST /upload   │      │  Serve /shared via       │  │
│  │  GET  /admin    │      │  HTTP — navegue pelas    │  │
│  │  GET  /health   │      │  extrações visualmente   │  │
│  └────────┬────────┘      └────────────┬─────────────┘  │
│           │  volume shared-storage     │                 │
│           └────────────────────────────┘                 │
│                                                          │
│  ┌─────────────────┐                                     │
│  │    attacker     │                                     │
│  │  python:3.12    │  (sem porta no host — apenas interno)│
│  │                 │                                     │
│  │  craft_malicious.py  — gera tarballs                  │
│  │  demo.py             — conduz a demonstração          │
│  └─────────────────┘                                     │
└─────────────────────────────────────────────────────────┘
ServiçoImagemFunçãoPorta do host
vulnerable-apipython:3.11.3-slimAPI Flask de upload + /admin protegido por autenticação /etc/passwd8000
fixed-apipython:3.12-slimMesmo código + USE_SAFE_EXTRACTION=true8000
file-servernginx:alpineListagem de diretório dos arquivos extraídos8080
attackerpython:3.12-slimGerador de payload + condutor da demonstração—

As APIs vulnerável e corrigida usam código-fonte idêntico. A única diferença é a variável de ambiente USE_SAFE_EXTRACTION=true no contêiner corrigido, que ativa o único argumento filter='data'.


Estrutura do repositório

root@kitploit:~
CVE-2007-4559-lab/
├── run_demo.sh                      ← comece aqui
├── docker-compose.vulnerable.yml
├── docker-compose.fixed.yml
├── vulnerable-api/
│   ├── app.py                       # API Flask: /upload + /admin + /health
│   ├── Dockerfile                   # insere admin:s3cr3t_Adm1nPass no /etc/passwd
│   └── requirements.txt
├── file-server/
│   ├── Dockerfile
│   └── nginx.conf
└── attacker/
    ├── craft_malicious.py           # gera innocent.tar.gz + tarslip_passwd.tar.gz
    ├── demo.py                      # driver CLI com quatro modos (craft/baseline/exploit/verify)
    ├── Dockerfile
    └── requirements.txt

Pré-requisitos

  • Docker 20.10+ com o plugin Compose (docker compose version)
  • macOS / Linux — o script shell usa bash
  • Portas 8000 e 8080 livres no seu host

Executando a demonstração

root@kitploit:~
git clone https://github.com/seu-usuario/CVE-2007-4559-lab.git
cd CVE-2007-4559-lab
bash run_demo.sh

O script é totalmente interativo. Ele imprime uma narrativa antes de cada etapa e aguarda Enter para avançar. Nenhum conhecimento prévio de Docker é necessário para acompanhar.

O que cada ponto de pausa cobre

PausaNarrativa exibidaAção ao pressionar Enter
1Linha do tempo CVE, o que são os três movimentosConstrói pilha vulnerável
2Funções dos contêineres, senha admin inseridaGera payloads
3O que há dentro de cada tarballMovimento 1 — linha de base
4Por que /admin é 401, como é a extração normalMovimento 2 — exploit
5A matemática exata da travessia, o que é sobrescritoTroca para pilha corrigida
6O que filter='data' faz e por que funcionaMovimento 3 — verificação
7Principais conclusões + padrão ZipSlip mais amploDesmontagem

Executando movimentos individualmente

Se quiser avançar manualmente:

root@kitploit:~
# Pilha vulnerável
docker compose -f docker-compose.vulnerable.yml up --build -d
docker compose -f docker-compose.vulnerable.yml exec attacker python craft_malicious.py
docker compose -f docker-compose.vulnerable.yml exec attacker python demo.py baseline
docker compose -f docker-compose.vulnerable.yml exec attacker python demo.py exploit

# Pilha corrigida
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 craft_malicious.py
docker compose -f docker-compose.fixed.yml exec attacker python demo.py verify

# Desmontagem
docker compose -f docker-compose.fixed.yml down

Inspeção visual

Enquanto a pilha vulnerável estiver em execução, abra http://localhost:8080/uploads/ para navegar pelos diretórios de sessão extraídos no seu navegador.


Como o endpoint /admin funciona

A API insere uma senha de admin secreta no /etc/passwd no momento da construção da imagem:

root@kitploit:~
admin:s3cr3t_Adm1nPass:1001:1001:Administrator:/home/admin:/bin/bash

GET /admin lê este arquivo e verifica o segundo campo (senha) contra as credenciais de Autenticação Básica HTTP. O atacante não conhece s3cr3t_Adm1nPass — mas depois que o TarSlip sobrescreve o arquivo com sua própria versão contendo admin:hacked, ele passa a conhecer.

Este é um modelo simplificado de alvos do mundo real: chaves SSH authorized_keys, arquivos de configuração de aplicativos, cron jobs e qualquer arquivo de credenciais que o processo web possa escrever.


Como os payloads são criados

craft_malicious.py usa o próprio módulo tarfile do Python — o mesmo que tem o bug:

root@kitploit:~
def _add_entry(tar, name, content):
    info = tarfile.TarInfo(name=name)   # name é o caminho de travessia
    info.size = len(content)
    tar.addfile(info, io.BytesIO(content))

# O nome da entrada resolve para /etc/passwd quando extraído em /shared/uploads/{uuid}/
_add_entry(tar, "../../../etc/passwd", malicious_passwd_content)

Nenhuma ferramenta especial. Nenhuma exploração binária. A biblioteca padrão é tanto a arma quanto a vítima.


A correção explicada

O Python 3.12 introduziu filter= no PEP 706. O filtro 'data':

  • Rejeita entradas que resolvem fora do diretório de destino
  • Remove bits setuid/setgid
  • Ignora arquivos de dispositivo e links físicos para caminhos inseguros
  • Levanta tarfile.OutsideDestinationError em tentativas de travessia
root@kitploit:~
# Antes (vulnerável — ainda o padrão até o Python 3.14)
with tarfile.open(path) as tar:
    tar.extractall(dest)

# Depois (seguro)
with tarfile.open(path) as tar:
    tar.extractall(dest, filter='data')

Para Python 3.11 e anteriores, valide manualmente:

root@kitploit:~
import os

def safe_extract(tar, dest):
    dest = os.path.realpath(dest)
    for member in tar.getmembers():
        member_path = os.path.realpath(os.path.join(dest, member.name))
        if not member_path.startswith(dest + os.sep):
            raise ValueError(f"Caminho inseguro: {member.name}")
    tar.extractall(dest)

Análise estática: a regra B202 do bandit sinaliza chamadas inseguras de extractall() no CI.


Impacto mais amplo — ZipSlip

TarSlip é o nome do Python para uma classe de vulnerabilidade que existe em todas as linguagens com APIs de extração de arquivos:

LinguagemAPI vulnerávelCVE / Aviso
Pythontarfile.extractall()CVE-2007-4559
JavaZipInputStreamZipSlip (2018)
Goarchive/zipZipSlip (2018)
.NETZipArchiveZipSlip (2018)
Node.jstar, adm-zip, outrosZipSlip (2018)

Mesma causa raiz em todos os lugares: confiar em caminhos de arquivos não confiáveis. Mesma correção em todos os lugares: canonicalizar e validar antes de escrever.


Variações de público

Públicos desenvolvedores

Foco na diferença de código antes/depois e na regra B202 do bandit. O objetivo é "como evitamos isso em nossa base de código?" — mostre o guia de migração do PEP 706 e como adicionar a verificação ao CI.

Públicos de segurança

Foco na metodologia de divulgação da Trellix — como eles pesquisaram o GitHub em escala, estimaram o impacto em mais de 350.000 repositórios e navegaram na divulgação responsável para uma vulnerabilidade tão difundida.

Públicos de CTF

Estenda craft_malicious.py para plantar um arquivo authorized_keys do SSH ou uma entrada maliciosa no cron em vez de /etc/passwd. Mesma técnica, alvos diferentes — mostra que qualquer caminho gravável é uma superfície de ataque.


Referências

  • NVD — CVE-2007-4559
  • PEP 706 — Filtro para tarfile.extractall
  • Trellix — "15 anos depois: sobre os perigos do Zip/Tar Slip"
  • Rastreador de issues do Python — bpo-21109 (o relatório original de 2007)
  • Bandit B202
  • Aviso ZipSlip da Snyk

Licença

MIT — use livremente para educação, pesquisa de segurança e demonstrações em conferências. Não use as técnicas de geração de payload contra sistemas que não sejam seus.

Baixar ferramenta