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

  • Tutorial
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. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 3

    +1

    Поправьте, если не прав.


    Уязвимость существует если специально при десериализации задано
    Settings.TypeNameHandling <> TypeNameHandling.None
    и нет проверки типов?
    Если так, то это стоило и бы уточнить, потому что по умолчанию значение None.
    (Из-за заголовка я сделал другой вывод)

      +1

      Мне кажется основная идея в том что сериализация работает не так просто как мы думаем (или «не думаем» на автопилоте — доверяясь авторам библиотек). Особенно, если десериализатор поддерживает полиморфизм и может поднимать «произвольные» типы которые, в свою очередь, могут делать что-то эдакое при десереализации, вплоть до выполнения какого-то кода; такие типы есть среди стандартных и могут реализовать «безобидные» интерфейс типа IDictionary.


      Уязвимый код может выглядеть на первый взгляд невинно: https://docs.microsoft.com/en-us/visualstudio/code-quality/ca2300?view=vs-2019


      Вот тут больше ссылок для чтения:
      https://github.com/pwntester/ysoserial.net/blob/master/README.md#additional-reading

        0

        Ах да. Эта статья про конкретный учебный взлом, а не про десериализацию в целом. Это, впрочем, не до конца очевидно из заголовка. Автор мб подправит, хотя я б оставил как есть — мне был не очень интересен конкретный взлом а вот статьи про десериализацию (достаются по ссылкам) зацепили.

    Only users with full accounts can post comments. Log in, please.