Внутренности и ограничения BloodHound – Часть 1: Перечисление прав пользователей через SAMR и GPOLocalGroup
Переведено для LIMB.cc
АВТОР СТАТЬИ: Sven Defatsch
Ссылка на оригинал: https://blog.compass-security.com/2022/05/bloodhound-inner-workings-part-1/
Год выпуска оригинальной статьи: 2022
Ссылка на оригинал: https://blog.compass-security.com/2022/05/bloodhound-inner-workings-part-1/
Год выпуска оригинальной статьи: 2022
Не удалось прогрузить медиа
BloodHound — must-have тулза для поиска attack paths в Active Directory (AD).
Но вот как именно он собирает инфу — без залезания в код SharpHound (ингестор для BloodHound) не всегда очевидно.
Microsoft со временем закрутила гайки апдейтами, и теперь энумация объектов и связей в AD стала гораздо муторнее, чем ещё пару лет назад.
В этой серии статей мы уходим в дебри SharpHound, разбираем, как он реально делает enum и где у этого подхода есть свои лимиты.
Содержание
В этой статье мы разберём энаму прав пользователей через SAMR и GPOLocalGroup.Дальше в серии будут:
- Session Enumeration через NetWkstaUserEnum & NetSessionEnum (релиз 12 мая)
- Session Enumeration через Remote Registry + итоговое резюме (релиз 25 мая)
User Rights Enumeration
Одна из самых полезных штук во время пентеста — это инфа типа:«Какой доменный юзер имеет какие права на какой машине?»
SharpHound будет пытаться собрать эти данные через локальные группы, а BloodHound визуализирует это с помощью вот таких рёбер (edges):
- AdminTo — кто в локальных администраторах
- CanRDP — кто в Remote Desktop Users
- CanPSRemote — кто в Distributed COM Users
- ExecuteDCOM — кто в Remote Management Users
Не удалось прогрузить медиа
В этой статье рассматриваются два метода получения этих данных:
- SAMR
- GPOLocalGroup
SAMR
Когда включаются методы коллекцииLocalAdmin, RDP, DCOM или PSRemote, SharpHound вытаскивает инфу о членстве в локальных группах (юзеры и их права) на целевых системах, дергая Windows SAM-базу по сети.Как это работает?
Схема такая: коннект к именованному пайпу\PIPE\samr, который торчит через IPC$ (inter-process communication) SMB-шару.Дальше в ход идёт SAMR (Security Account Manager Remote Protocol) — это RPC поверх SMB, порт 445.
Wireshark trace
Если глянуть Wireshark-трейс успешного вызова SAMR от SharpHound, можно чётко увидеть все шаги процесса:Не удалось прогрузить медиа
- Устанавливаем SMB-коннект к удалённой машине (с Kerberos-аутентификацией).
- Коннектимся к
IPC$-шаре. - Открываем именованный пайп
samr(это почти как открыть файл с таким именем). - Биндимся к
SAMR-интерфейсу по UUID12345778-1234-abcd-ef00-0123456789acчерез RPC поверх SMB. - Взаимодействуем через SAM (Security Account Manager) Remote Protocol.
- Получаем SIDs юзеров и групп в локальной группе через функцию
GetMembersInAlias. - Закрываем соединение и логафимся.
Авторизация в процессе
Права проверяются трижды:- При открытии
IPC$-шары - При открытии
samr-пайпа - При выполнении RPC-вызова через пайп
На новых Windows эта последняя проверка фейлится у юзеров с низкими правами, как мы увидим ниже.
Вы можете попробовать это самостоятельно, используя следующий фильтр Wireshark:
((smb2) || (samr) || (dcerpc) || (smb)) && !(smb2.ioctl.function == 0x001401fc)Фильтрация результатов
Windows идёт со стандартными аккаунтами, которые нам не интересны. SharpHound отбрасывает:- Локальные юзеры
- Локальные сервисные аккаунты (S-1-5-80)
- IIS AppPool identities (S-1-5-82)
- Window Manager аккаунты (DWM) (S-1-5-90)
- Font Driver Host аккаунты (S-1-5-96)
Какие права нужны?
Раньше любой аутентифицированный юзер мог дергать SAM любого компа в домене — это давало полный доступ к локальным группам на машине. С Windows 10 1607+ и Windows Server 2016+ ситуация поменялась: теперь SAMR доступен только членам локальной встроенной группы Administrators.Наличие старых ОС в сети не гарантирует, что можно энамить локальные группы, потому что Microsoft выпустила обновления до Windows 7 / Server 2008 R2, чтобы контролировать это через GPO:
Computer Configuration | Windows Settings | Security Settings | Local Policies | Security Options | Network access: Restrict clients allowed to make remote calls to SAMЭта же GPO может разрешить SAMR для не-админов.
До этого была популярная PowerShell-штука от Itai Grady — “SAMRi10”, которая делала почти то же самое.
Исключения
Некоторые системы не подпадают под это ограничение:- Domain Controllers (DC)
- Read-Only Domain Controllers (RODC)
Но для нас, пентестеров, это почти бесполезно: локальная SAM база на DC обычно не используется.
Почему? Она есть (можно проверить через mimikatz lsadump::sam), но применяется только при загрузке в Directory Services Repair Mode (DSRM) или Recovery Console.
Иначе SAMR возвращает доменных юзеров из ntds.dit, а не локальных. Это то, что мы видим, когда делаем:
net user /domainДальше читаем
Техническая инфа по SAMR: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-samr/4df07fab-1bbc-452f-8e92-7853a3c7e380SharpHound реализует SAMR в CommonLib здесь: https://github.com/BloodHoundAD/SharpHoundCommon/blob/master/src/CommonLib/Processors/SAMRPCServer.cs, код использует нативные Windows-функции, P/Invoke сигнатуры которых объявлены здесь: https://github.com/BloodHoundAD/SharpHoundCommon/blob/master/src/CommonLib/NativeMethods.cs
Сами RPC-вызовы SAMR для всех четырёх типов рёбер делаются через функцию
GetLocalGroupMembers: https://github.com/BloodHoundAD/SharpHound/blob/dev/src/Runtime/ObjectProcessors.cs.GPOLocalGroup
Учитывая ограничения SAMR, посмотрим второй способ, которым SharpHound собирает права пользователей — метод GPOLocalGroup.Как это работает?
Group Policy Objects (GPO) можно использовать для управления локальными группами на компах. Это можно делать двумя способами, и оба собираются SharpHound:Local Users and Groups GroupPolicy Preferences (GPP), которые находятся по путиComputer Configuration\Preferences\Control Panel Settings\(хотя это можно управлять и черезUser Configuration, SharpHound смотрит толькоComputer Configuration)
Не удалось прогрузить медиа
Restricted Groupsнаходится вComputer Configuration\Policies\Windows Settings\Security Settings\
Не удалось прогрузить медиа
Детали реализации
Вот как идёт процесс:- Листаем все OU, где привязан GPO (
gpLinkв LDAP). - Пропускаем пустые
gpLinkили отключённые GPO. - Обрабатываем
gPCFileSysPathкаждого GPO — здесь лежат файлы с правилами на SYSVOL. - Ищем
Groups.xml(для локальных пользователей и групп) иGptTmpl.inf(дляRestricted Groups). - Фильтруем по интересующим SID:
- Administrators — S-1-5-32-544
- Remote Desktop Users — S-1-5-32-555
- Remote Management Users — S-1-5-32-580
- Distributed COM Users — S-1-5-32-562
- Определяем, какие доменные пользователи входят в эти группы и на какие компьютеры применяются соответствующие GPO.
Ограничения
Прежде всего, этот метод сбора данных не подтягивает локальные членства групп (поэтому тут преимущество у SAMR-метода). Полнота собранной информации сильно варьируется от домена к домену: в некоторых средах GPO активно управляет локальными группами, а в других ими почти не пользуются.Wireshark trace
Трассировка Wireshark успешного вызова SharpHound позволяет нам выделить следующие этапы:Не удалось прогрузить медиа
- Получаем все объекты домена через LDAP (не все запросы показаны выше).
- Устанавливаем SMB-соединение с контроллером домена (аутентификация через Kerberos).
- Подключаемся к шару SYSVOL и ищем XML-файлы.
- Закрываем соединение и выходим.
- При запросе данных через LDAP.
- При попытке открыть шар SYSVOL и XML-файлы.
((smb2) || (ldap) || (dcerpc) || (smb)) && !(smb2.ioctl.function == 0x001401fc)Какие привилегии нужны?
По умолчанию GPO читаемы для всех Authenticated Users, что делает этот метод сбора подходящим для пентестеров и атакующих. ОднакоSecurity Filtering GPO можно настроить, чтобы ограничить доступ на чтение:Не удалось прогрузить медиа
Если GPO доступен только для компьютерных объектов, к которым он применён, доступ к политикам на SYSVOL будет запрещён, и SharpHound ничего не увидит.
Дополнительные материалы
SharpHound реализует “GPOLocalGroup” в CommonLib: https://github.com/BloodHoundAD/SharpHoundCommon/blob/master/src/CommonLib/Processors/GPOLocalGroupProcessor.csПереведено для LIMB.cc
👍30
❤️6
🔥4
👏9
🤔3
💯3
LIMB