Altered (2022)

Содержание:
После сканирования портов, мы обнаружим только два. На 80-ом порте будет форма авторизации и резета пароля с пинкодом. Просто перебирать четырехзначный пинкод не получится, так как после нескольких неправильных попыток, система блокирует запросы от пользователя. Laravel настроен так, что он использует Nginx, как прокси, следовательно, можно перезаписать HTTP-заголовки и брутить пинкод с нескольких айпи через X-Forwarded-For. После того, как мы получим доступ к учетке админа, можно будет проэксплуатировать SQLi, при этом тоже обойдя фильтры с помощью подмены типа переменной(Type Juggling). С помощью этой же SQLi получим непривилегированную оболочку и проэксплутируем вулну dirty pipe для уязвимого ядра линукса, чтобы рутироваться.
Сканируем порты с помощью nmap:

Угадываем имя пользователя:
Через данную форму можно угадывать имена пользователей, например, я ввел - "admin":

Также можно восстановить пароль, но нужно знать пинкод, следовательно, можно его пробрутить:

Обходим Rate Limit и брутим пинкод:
Так как, если начать прямо брутить пинкод через wfuzz, то сервер начинает блокировать запросы (где-то после 60-ого запроса), т.е. тут стоит Rate Limit. На сайте используется Laravel, это можно определить по хранящимся кукам. А Laravel настроен так, что он использует Nginx, как прокси, следовательно, можно перезаписать HTTP-заголовки и брутить пинкод с нескольких айпи через X-Forwarded-For. Поэтому делаем два словаря, один для заголовка X-Forwarded-For:
А другой для пинкода:
Так как мы будем использовать цикл с этими двумя словарями, следовательно, нужно, чтобы в wordlist1.txt было больше слов, чем в wordlist2.txt:
Wfuzz используем со специальным флагом -m zip, чтобы указать два словаря на два параметра фаззинга.

Пинкод - 5118, введя его и изменив пароль админа, мы можем войти в панель:

При клике на ссылку view у нас образуется GET-запрос с двумя параметрами id и secret:

Обходим фильтры и эксплуатируем SQLi:
При изменении параметра id вылетает ошибка, сообщающая о предотвращении пользовательского ввода. Так, как определенный параметр id должен соответствовать определенному параметру secret(который является md5 хэшем, 32 символа), то мы не можем попытаться эксплуатировать SQLi, следовательно, можно попробовать преобразовать тело запроса в json и попробовать эксплуатировать вулну, которая заключается в преобразовании типов(Type Juggling). Я ее подробно разобрал в райтапе по Ransom, а также нашел подробную статью по этому типу вулны https://owasp.org/www-pdf-archive/PHPMagicTricks-TypeJuggling.pdf:


Далее я просто раскрутил UNION SQLi(о ней я тоже сделал статью):
Подбираем количество столбцов в БД, которая сейчас используется с помощью null:

Смотрим какие есть базы данных:

Вытаскиваем таблицы из базы данных uhc:
Вытаскиваем столбцы из таблицы users базы данных uhc:
Достаем значения, которые нам ничего не дают 😂 :
Создаем Reverse Shell через SQLi:
Мы можем читать файлы, следовательно, можем найти корневую папку сервера:

Теперь попробуем создать свой файл html, записать в него что-то и проверить, имеем ли мы права создавать и редактировать файлы:


Все работает, переходим к созданию реверс шелла:

Но веб шелл нас не устраивает, поэтому перехватываем запрос и меняем его метод, а потом в параметр cmd вставляем наш пэйлоад в URL-энкоде:


Рутируемся через Dirty Pipe(CVE-2022-0847):
Мы можем погуглить версию ядра линукс 5.16.0 и найти CVE-2022-0847 (Dirty Pipe):
Если вкратце, то вулна Dirty Pipe позволяет перезаписывать любые файлы, но только после первого символа в них. Получается, нам нужно искать SUID-файлы, которые мы перезапишем и рутируемся:
Скачиваем второй эксплоит к себе на машину, компилируем и поднимаем пайтоновский веб-сервер:

Last updated
Was this helpful?