
Prueba de concepto en Python para CVE-2025-8110, que demuestra escritura arbitraria de archivos a RCE en Gogs mediante symlink y API, con uso educativo en laboratorio.
Este repositorio contiene un script de prueba de concepto (PoC) en Python para demostrar y analizar la vulnerabilidad registrada como CVE-2025-8110 en el servicio de Git auto-alojado Gogs (versiones 0.13.3 y anteriores).
[!WARNING] ESTE SOFTWARE SE PROPORCIONA ÚNICAMENTE CON FINES EDUCATIVOS Y DE INVESTIGACIÓN DE SEGURIDAD. > El uso de este material contra objetivos sin el consentimiento previo y por escrito de sus propietarios es completamente ilegal. El autor de este repositorio no se hace responsable de ningún daño, perjuicio o mal uso derivado del uso de este código. Utilízalo siempre bajo tu propio riesgo y dentro de entornos controlados o simulaciones autorizadas (como laboratorios de CTF).
El CVE-2025-8110 es una vulnerabilidad crítica de Escritura de Archivos Arbitrarios provocada por una validación insuficiente al manejar enlaces simbólicos (symlinks) a través de la API PutContents de Gogs.
Un atacante autenticado puede:
.git/config del servidor).root, la escritura de archivos se puede escalar a Ejecución Remota de Código (RCE) inyectando el comando deseado dentro de la propiedad sshCommand del archivo de configuración de Git.exploit.py)El script automatiza todo el proceso de explotación utilizando credenciales válidas y un Token de API previamente generado de forma manual en la interfaz web de Gogs:
┌──────────────────────────────────────────────┐
│ Máquina del Atacante (Kali) │
└──────────────────────┬───────────────────────┘
│
(1) Crea Repositorio │ (3) Sube Symlink (.git/config)
Malicioso vía API │ vía git push
▼
┌──────────────────────────────────────────────┐
│ Túnel SSH Local (puerto 8080) │
└──────────────────────┬───────────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ Servidor Víctima Gogs │
│ (Puerto 3001) │
└──────────────────────┬───────────────────────┘
│
│ (4) API PUT "contents"
│ Sigue Symlink y escribe
│ "sshCommand" en .git/config
▼
┌──────────────────────────────────────────────┐
│ Ejecución del Payload como ROOT │
└──────────────────────────────────────────────┘
create_malicious_repo: Realiza una petición POST a la API de Gogs (/api/v1/user/repos) autenticándose con el token de acceso proporcionado para crear un nuevo repositorio con un nombre aleatorio generado de manera dinámica.upload_malicious_symlink:
/tmp/..git/config (el archivo de configuración de Git del servidor).git push).exploit: Define la carga útil (payload) utilizando un truco de inyección en la propiedad sshCommand de Git. Al actualizar el contenido a través de la API, Gogs es forzado a sobreescribir su propio .git/config en el servidor. Cuando se activa la última parte del proceso de Git, el sistema de Gogs ejecuta el comando de terminal (una shell reversa en Bash) devolviendo la conexión a tu escucha en Netcat.Asegúrate de configurar los datos de identidad globales en Git antes de correr el script para evitar errores al realizar el commit automático:
git config --global user.email "[email protected]"
git config --global user.name "estudiante"
### Uso: python3 exploit.py -u (http://127.0.0.1:8080) -lh <TU_IP_VPN> -lp 4446