Hack The Box. Прохождение JSON. Уязвимость в Json.Net и LPE через SeImpersonatePrivilege

в 10:03, , рубрики: C#, ctf, HTB, json.net, LPE, Metasploit Framework, msfvenom, pentest, ralf_rt, информационная безопасность
image

Продолжаю публикацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ. В данной статье эксплуатируем уязвимость в Json.Net и посмотрим, как повысить свои привилегии до SYSTEM, если мы имеем право SeImpersonatePrivilege.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

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

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Разведка

Данная машина имеет IP адрес 10.10.10.158, который я добавляю в /etc/hosts.

10.10.10.158    json.htb

Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.158 --rate=500

image

Далее нужно собрать больше информации об известных портах. Для того используем nmap с параметром -А.

nmap json.htb -p49156,49154,49152,47001,80,137,49153,139,49155,135,445,49158,5985,6666,21

image

Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.

nmap -A json.htb -p80,139,135,445,5985,6666,21

image

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

image

Можно было бы это обойти, но admin:admin позволяют нам зайти.

image

На самом сайте ничего интересного нет, и в попытках найти хоть что-то, цепляемся за куки.

image

Декодируем Base64.

echo "eyJJZCI6MSwiVXNlck5hbWUiOiJhZG1pbiIsIlBhc3N3b3JkIjoiMjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzMiLCJOYW1lIjoiVXNlciBBZG1pbiBIVEIiLCJSb2wiOiJBZG1pbmlzdHJhdG9yIn0=" | base64 -d ; echo

image

То есть значение Password — это MD5 от пароля admin.

image

Далее ничего интересного. Открыв Burp и перехватив запрос, можно обнаружить интересный HTTP-заголовок.

image

И на данном этапе я завис, пока мне не подсказали “поломать значение”. Очевидно, что в таких случаях нужно добиваться ошибок и смотреть реакцию API в трех состояниях: верно, неверно и ошибка. Но я почему-то это упустил.

Entry point

И далее было обнаружено, что если в странном заголовке HTTP будут передаваться поломанные данные (удалить часть символов), то сервер выдает ошибки. Ниже приведены данные, которые возвращает сервер при нормальном значении заголовка и при удалении от одного до четырех символов.

image

Интересную ошибку мы получаем в последнем случае. Так как происходит десереалиация объекта JSON, мы можем проэксплуатировать это с помощью ysoserial. Будем использовать гаджет ObjectDataProvider для Json.Net и выполним команду ping для проверки предположения уязвимости.

image

Теперь включим tcpdump с фильтром протокола ICMP, чтобы отлавливать ping.

image

При перехвате запроса меняем заголовок.

image

И получаем тот пинг, который заказывали.

image

USER

Теперь нужно проделать то же самое с нагрузкой метерпретер. Для начала сгенерируем нагрузку и откроем листенер.

image

image

Теперь откроем локальный SMB сервер с которого будет запускаться нагрузка.

image

Теперь снова сериализуем нужные данные, в качестве команды запускаем нашу нагрузку с нашего сервера.

image

Видим успешное подключение к серверу SMB и успешно загруженную сессию метерпретера.

image

image

И читаем файл пользователя.

ROOT

Первым делом смотрим информацию о пользователе, под которым мы работаем.

image

У пользователя включена привилегия SeImpersonatePrivilege (право «Олицетворять клиента после проверки подлинности»). Как говорит Microsoft:

Присвоение пользователю права «Олицетворять клиента после проверки подлинности» разрешает программам, запущенным от имени данного пользователя, олицетворять клиента. Использование данного параметра предотвращает олицетворение неавторизованными серверами клиентов, подключающихся к этим серверам с помощью процедур RPC или именованных каналов.

Дело в том, что мы можем поднять свои права до SYSTEM. Полное исследование можно глянуть тут. Данной уязвимости подвержены следующие привилегии:

  • SeImpersonatePrivilege
  • SeAssignPrimaryPrivilege
  • SeTcbPrivilege
  • SeBackupPrivilege
  • SeRestorePrivilege
  • SeCreateTokenPrivilege
  • SeLoadDriverPrivilege
  • SeTakeOwnershipPrivilege
  • SeDebugPrivilege

Давайте сгенерируем еще одну нагрузку и запустим для нее листенер.

image

image

Для эксплуатации будем использовать Juicy Potato. Но в качестве параметра нужно указать CLSID учетной записи для целевой системы, его возьмем также с репозитория. Но сначала глянем, что за система.

image

И теперь смотрим CLSID.

image

Загрузим файлы на целевой хост.

image

Теперь запускаем Juicy Potato и указываем ему с помощью чего будет создан процесс (CreateProcessWithTokenW или CreateProcessAsUser, параметр -t), файл процесса (-p), порт для прослушивания (-l), и CLSID (-c).

image

Процесс успешно создан, и мы видим созданную сессию метерпретер.

image

И получаем учетную запись SYSTEM.

Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.

Автор: Ральф Фаилов

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js