Мы часто говорим о пентесте и проходим задания с различных площадок для хакеров. Сегодня мы рассмотрим интересный пример пентеста, в котором покажу, как неправильная настройка сервера STUN позволила мне проникнуть в локальную сеть, обойти защиту и проэксплуатировать Log4Shell, захватить виртуальную инфраструктуру при помощи SAML-аутентификации, продвинуться во внутренней сети и с помощью атаки Pass the Hash получить доменного администратора.
Все это реальный пример пентеста большой и известной ИТ‑компании. Передо мной была поставлена цель — оценить возможность взлома и проникновения во внутреннюю сеть и компрометация хостов.
Рекон
Начинаем по традиции со сканирования и поиск открытых сервисов. В данном случае с веб‑приложения IvaConnect — сервиса для создания видеоконференции.
Платформа позволяет подключиться к видеоконференции по цифровому идентификатору. Путем перебора идентификаторов мероприятия я получил доступ к экспериментальной комнате 3333. Далее веб-приложение получает учетные данные сервера STUN и подключается к нему.
- Логин — ivcs
- Пароль — ivcs
Протокол STUN дает возможность установить соединение между двумя узлами, находящимися за NAT, и создать соединение WebRTC. На данном этапе также возможно получить внутреннюю адресацию путем перехвата трафика STUN в сниффере Wireshark.
В данном случае, мне повезло, сервер не проверяет, что адрес, по которому следует подключиться, расположен в локальной сети. Таким образом хакер может получить доступ ко внутренним ресурсам, например применив инструмент Stunner.
Если вы обнаружили неправильно сконфигурированный сервер STUN, Stunner поможет построить SOCKS-прокси, который перенаправит весь трафик через протокол TURN во внутреннюю сеть.
Для этого можно выполним простую команду:
1 |
./stunner socks -s [IP]:[PORT] -u [USER] -p [PASSWORD] |
Так я смог получить доступ к внутренней сети:
1 |
10.1.1.0/24 |
Первый доступ
Во время анализа внутренней сети я обнаружил PostgreSQL-сервер, использующий такую же учетку, как и STUN-сервер. Внутри базы я нашел таблицу videoconference.lpad, в которой находилась запись для подключения к LDAP-серверу.
Воспользовавшись найденной информацией, я подключился к серверу LDAP, где нашелся, в открытом виде, еще один пароль в поле description.
Учетка из LDAP оказалась действительной, и я получил админ-доступ к серверу А. Кроме этого, по адресу vcenter.company.local нашелся сервер vCenter с уязвимостью Log4Shell. Она‑то и позволит мне выполнить код на сервере.
Для эксплуатации нужно, чтобы целевой сервер не имел доступа к интернету и подключался к внешнему LDAP. Поэтому для эксплуатации использую сервер А.
Закрепление в целевой системе
В файловой системе сервера vCenter лежит файл data.mdb, а в нем сертификаты для подписи запросов при утентификации SAML всех пользователей, включая админа.
Чтобы сгенерировать сессию через аутентификацию SAML я использовал инструмент vcenter_saml_login:
1 |
python3 vcenter_saml_login.py -p [PATH TO MDB] -t [HOST] |
Используя полученную сессию мне удалось попасть на vCenter и получить контроль над виртуальной инфраструктурой.
Попав в vCenter я нашел виртуальную машину express c пройденной аутентификацией и доступом в тырнет.
Теперь можно отказаться от STUN-туннеля и воспользоваться напрямую этой виртуальной машиной для доступа ко внутренним ресурсам.
Далее мы нашли уязвимый к Log4Shell сервер VMware Horizon на внешнем периметре. На этом сервере тоже не было доступа в интернет, и для эксплуатации было необходимо подключение к внешнему серверу LDAP. Выяснилось, что в сети используется СЗИ, которое обнаруживает попытку эксплуатации и обрывает соединение до LDAP-сервера. Со временем стало понятно, что СЗИ детектирует лишь значение java.lang.Runtime.getRuntime, поэтому мы обфусцировали полезную нагрузку, а для эксплуатации использовали сервер express.
На сервере VMware Horizon была возможность перехватывать пароли пользователей в открытом виде, прослушивая порт 8009 (Connection Server — AJP13):
1 |
tcpdump -X -s 0 'tcp port 8009 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) |
Продвижение по сети
С сервера horizon.company.ru мы произвели опрос доменного контроллера и получили информацию о пользователях, компьютерах, сессиях. Затем через procdump сделали дамп памяти процесса lsass, содержащего NTLM-хеши учетной записи инженера поддержки, назовем его USER1@internal.RU.
Дальше я изучил права учетной записи USER1@internal.RU и обнаружили, что пользователь состоит в группе. Предположим, она называется SUPPORT ENGINEERS@internal.RU. У нее есть право ReadLAPSPassword, позволяющее получить информацию о паролях локального администратора на компьютерах пользователей.
Повышение привилегий
Первом делом мы использовали технику Pass the Hash и запросили данные у контроллера домена. Техника, если ты не в курсе, заключается в том, что можно использовать NT-хеш вместо пароля, чтобы пройти аутентификацию.
На машине NSurname.internal.RU обнаружилась установленная сессия администратора домена ADMINISTRATOR@internal.RU.
Используя полученные права локального администратора, мы сделали дамп памяти процесса lsass на компьютере zz, в результате чего удалось получить пароль администратора домена в открытом виде с помощью утилит procdump и mimikatz.
Затем я аутентифицировался на доменном контроллере DC01 с правами доменного администратора, пользователь pentester был добавлен в группу Domain Admins для подтверждения целей тестирования.
Защита от взлома
Чтобы повысить защищенность и не допустить подобной атаки, мы рекомендуем следующие шаги.
- Необходимо настроить STUN-сервер таким образом, чтобы он отклонял запросы на подключение к зарезервированным диапазонам IP-адресов.
- Регулярно обновлять программное обеспечение.
- Внедрить парольную политику и не допускать хранения паролей в открытом виде.
- Внедрить защиту конечных устройств на серверы.
И конечно, проводить регулярный анализ защищенности и/или тестирование на проникновение.
Заключение
Резюмируя, можно сказать, что на внешней инфраструктуре отсутствовали уязвимости, а средства защиты блокировали все векторы атак. Но некорректно сконфигурированный сервер STUN все‑таки позволил попасть во внутреннюю сеть.
Во внутренней сети защитные средства тоже блокировали вредоносный трафик, но, обойдя СЗИ и проэксплуатировав Log4Shell, мы получили доступ к гипервизору и захватили виртуальную инфраструктуру, сделали дамп памяти, получили доменную учетную запись, повысили свои привилегии и стали администратором домена.
Можно сделать вывод, что уровень злоумышленника, необходимый для захвата ИТ‑инфраструктуры, должен быть достаточно высоким. Заказчик увидел пробелы в своем процессе патч‑менеджмента и промашки администраторов — они хранили пароли в открытом виде и использовали одинаковые пароли на разных сервисах.
Спасибо Александр!
ПОЛЕЗНЫЕ ССЫЛКИ:
- Использование фишинговой рассылки в пентесте
- Пример проникновения при физическом пентесте
- Пентест Active Directory на машине HTB Intelligence