Продолжаю публикацию решений отправленных на дорешивание машин с площадки 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
Далее нужно собрать больше информации об известных портах. Для того используем nmap с параметром -А.
nmap json.htb -p49156,49154,49152,47001,80,137,49153,139,49155,135,445,49158,5985,6666,21
Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.
nmap -A json.htb -p80,139,135,445,5985,6666,21
Зайдем посмотреть, что на вебе. В итоге загружается страница, и потом только нас перебрасывает на страницу авторизации.
Можно было бы это обойти, но admin:admin позволяют нам зайти.
На самом сайте ничего интересного нет, и в попытках найти хоть что-то, цепляемся за куки.
Декодируем Base64.
echo "eyJJZCI6MSwiVXNlck5hbWUiOiJhZG1pbiIsIlBhc3N3b3JkIjoiMjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzMiLCJOYW1lIjoiVXNlciBBZG1pbiBIVEIiLCJSb2wiOiJBZG1pbmlzdHJhdG9yIn0=" | base64 -d ; echo
То есть значение Password — это MD5 от пароля admin.
Далее ничего интересного. Открыв Burp и перехватив запрос, можно обнаружить интересный HTTP-заголовок.
И на данном этапе я завис, пока мне не подсказали “поломать значение”. Очевидно, что в таких случаях нужно добиваться ошибок и смотреть реакцию API в трех состояниях: верно, неверно и ошибка. Но я почему-то это упустил.
Entry point
И далее было обнаружено, что если в странном заголовке HTTP будут передаваться поломанные данные (удалить часть символов), то сервер выдает ошибки. Ниже приведены данные, которые возвращает сервер при нормальном значении заголовка и при удалении от одного до четырех символов.
Интересную ошибку мы получаем в последнем случае. Так как происходит десереалиация объекта JSON, мы можем проэксплуатировать это с помощью ysoserial. Будем использовать гаджет ObjectDataProvider для Json.Net и выполним команду ping для проверки предположения уязвимости.
Теперь включим tcpdump с фильтром протокола ICMP, чтобы отлавливать ping.
При перехвате запроса меняем заголовок.
И получаем тот пинг, который заказывали.
USER
Теперь нужно проделать то же самое с нагрузкой метерпретер. Для начала сгенерируем нагрузку и откроем листенер.
Теперь откроем локальный SMB сервер с которого будет запускаться нагрузка.
Теперь снова сериализуем нужные данные, в качестве команды запускаем нашу нагрузку с нашего сервера.
Видим успешное подключение к серверу SMB и успешно загруженную сессию метерпретера.
И читаем файл пользователя.
ROOT
Первым делом смотрим информацию о пользователе, под которым мы работаем.
У пользователя включена привилегия SeImpersonatePrivilege (право «Олицетворять клиента после проверки подлинности»). Как говорит Microsoft:
Присвоение пользователю права «Олицетворять клиента после проверки подлинности» разрешает программам, запущенным от имени данного пользователя, олицетворять клиента. Использование данного параметра предотвращает олицетворение неавторизованными серверами клиентов, подключающихся к этим серверам с помощью процедур RPC или именованных каналов.
Дело в том, что мы можем поднять свои права до SYSTEM. Полное исследование можно глянуть тут. Данной уязвимости подвержены следующие привилегии:
- SeImpersonatePrivilege
- SeAssignPrimaryPrivilege
- SeTcbPrivilege
- SeBackupPrivilege
- SeRestorePrivilege
- SeCreateTokenPrivilege
- SeLoadDriverPrivilege
- SeTakeOwnershipPrivilege
- SeDebugPrivilege
Давайте сгенерируем еще одну нагрузку и запустим для нее листенер.
Для эксплуатации будем использовать Juicy Potato. Но в качестве параметра нужно указать CLSID учетной записи для целевой системы, его возьмем также с репозитория. Но сначала глянем, что за система.
И теперь смотрим CLSID.
Загрузим файлы на целевой хост.
Теперь запускаем Juicy Potato и указываем ему с помощью чего будет создан процесс (CreateProcessWithTokenW или CreateProcessAsUser, параметр -t), файл процесса (-p), порт для прослушивания (-l), и CLSID (-c).
Процесс успешно создан, и мы видим созданную сессию метерпретер.
И получаем учетную запись SYSTEM.
Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Автор: Ральф Фаилов