
Эксплойт для CVE-2018-18925: удалённое выполнение кода в Gogs через обход каталога при обработке сессий, позволяющее обойти сессию и получить доступ администратора с последующим RCE через git-хуки.
Эксплуатация CVE-2018-18925 — удаленное выполнение кода в самостоятельно размещаемом Git-инструменте: Gogs.
Gogs основан на фреймворке Macaron. Система управления сессиями очень похожа на ту, что используется в PHP. Идентификатор сессии в cookie сопоставляется с файлом в файловой системе. Когда веб-сервер получает запрос с идентификатором сессии (в виде cookie), он ищет соответствующий файл в файловой системе.
Уязвимость представляет собой простой обход каталога (directory traversal) при получении файла, используемого для сессии, в файловой системе. Например, вы можете установить cookie i_like_gogits в значение ../../../../../../etc/passwd, чтобы получить ошибку от сервера.

Для эксплуатации обхода сессии нам потребуется способ загрузить специально созданный файл, затем мы будем использовать этот файл как наш идентификатор сессии; мы можем создать собственный файл идентификатора сессии с помощью https://github.com/RyouYoo/CVE-2018-18925/blob/main/main.go.
go run main.go
При создании локальной копии репозитория Gogs помещает файлы в /data/gogs/data/tmp/local-repo/[REPO_ID]/[FILENAME] (этот репозиторий создаётся только при использовании функции "Загрузить файл").

Где [FILENAME] — это имя загружаемого вами файла, а [REPO_ID] — идентификатор репозитория, который можно найти с помощью ссылки Fork:

Где 5 — это идентификатор репозитория.
По умолчанию сессии хранятся в /data/gogs/data/sessions/. Таким образом, вы можете использовать следующий относительный путь в качестве идентификатора сессии: ../tmp/local-repo/[REPO_ID]/[FILENAME]. Используя этот путь в вашей cookie i_like_gogits, вы будете авторизованы как administrator.

Для получения RCE вы можете использовать функциональность git-хуков в репозитории для запуска shell-скрипта.

В pre-receive внедрите ваш код:

Затем выполните push-запрос с помощью git или функции создания файла, чтобы хук выполнился.