
Использует билеты Kerberos для обхода UAC Windows и получения привилегий SYSTEM путем внедрения поддельного MachineID в служебные билеты, применяя трюк tgtdeleg и доступ к SCM.
Этот POC вдохновлен Джеймсом Форшо (@tiraniddo), представленным на BlackHat USA 2022 в докладе «Taking Kerberos To The Next Level». Он продемонстрировал демо-версию злоупотребления билетами Kerberos для обхода UAC. Добавив запись KERB-AD-RESTRICTION-ENTRY в сервисный билет, но подставив поддельный MachineID, можно легко обойти UAC и получить привилегии SYSTEM, обратившись к SCM для создания системной службы. Джеймс Форшо объяснил обоснование этого в блоге под названием «Bypassing UAC in the most Complex Way Possible!», что вызвало у меня большой интерес. Хотя он не предоставил полный код эксплойта, я построил POC на основе Rubeus. Как набор инструментов C# для низкоуровневого взаимодействия с Kerberos и злоупотребления билетами, Rubeus предоставляет удобный интерфейс, позволяющий легко инициировать запросы Kerberos и манипулировать билетами Kerberos.
Вы можете ознакомиться со статьями о KRBUACBypass в моем блоге «Revisiting a UAC Bypass By Abusing Kerberos Tickets», включая теоретическую основу и реализацию. Как сказано в статье, она вдохновлена докладом @tiraniddo «Taking Kerberos To The Next Level» (без его выступления я бы этого не сделал), и я просто реализовал ее в виде инструмента перед окончанием колледжа.
Мы не можем вручную сгенерировать TGT, так как у нас нет и нет доступа к учетным данным текущего пользователя. Однако Бенжамен Дельпи (@gentilkiwi) в своем Kekeo добавил трюк (tgtdeleg), который позволяет злоупотреблять неограниченным делегированием для получения локального TGT с ключом сессии.
Tgtdeleg использует Kerberos GSS-API для получения доступных TGT для текущего пользователя без получения повышенных привилегий на хосте. Этот метод использует функцию AcquireCredentialsHandle для получения дескриптора учетных данных Kerberos для текущего пользователя и вызывает функцию InitializeSecurityContext для HOST/DC.domain.com с флагом ISC_REQ_DELEGATE и целевым SPN для подготовки псевдо-делегированного контекста для отправки на контроллер домена. Это приводит к тому, что KRB_AP-REQ в выводе GSS-API включает KRB_CRED в контрольную сумму аутентификатора. Затем ключ сессии сервисного билета извлекается из локального кэша Kerberos и используется для расшифровки KRB_CRED в аутентификаторе для получения рабочего TGT. Набор инструментов Rubeus также включает эту технику. Подробнее см. «Rubeus – Now With More Kekeo».
С этим TGT мы можем сгенерировать собственный сервисный билет, и возможный процесс операции выглядит следующим образом:
KERB-AD-RESTRICTION-ENTRY, но подставьте поддельный MachineID.После получения сервисного билета можно использовать аутентификацию Kerberos для доступа к именованным каналам SCM (Service Control Manager) или TCP через SPN HOST/HOSTNAME или RPC/HOSTNAME. Обратите внимание, что Win32 API SCM всегда использует аутентификацию Negotiate. Джеймс Форшо создал простой POC: SCMUACBypass.cpp, который через два API HOOK (AcquireCredentialsHandle и InitializeSecurityContextW) изменяет имя пакета аутентификации, вызываемого SCM (pszPackage), на Kerberos, чтобы SCM использовал Kerberos при локальной аутентификации.
Для получения дополнительной информации прочитайте:
Теперь давайте посмотрим на результат работы, как показано на рисунке ниже. Сначала запросите билет для службы HOST текущего сервера через функцию asktgs, затем создайте системную службу через krbscm для получения привилегий SYSTEM.
KRBUACBypass.exe asktgs
KRBUACBypass.exe krbscm
