Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Продвижение
- Локальное повышение привилегий
Сегодня мы с тобой взломаем веб‑интерпретатор кода на Python и выполним на сервере свой код в обход фильтров. Затем получим доступ к базе данных и извлечем учетные данные другого пользователя. При повышении привилегий используем уязвимость недостаточной фильтрации в скрипте, создающем резервные копии.
Наша конечная цель — получение прав суперпользователя на машине с учебной площадки Hack The Box. Уровень задания — легкий.
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.62 code.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(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__.