LIMB
Вход Регистрация

тема

[ПЕРЕВОД] [ЧАСТЬ 1]Внутренности и ограничения BloodHound. Перечисление прав пользователей через SAMR и GPOLocalGroup

DESTR0Y · · 0 ответов · 474 просмотров

Внутренности и ограничения BloodHound – Часть 1: Перечисление прав пользователей через SAMR и GPOLocalGroup​

Переведено для LIMB.cc​

АВТОР СТАТЬИ: Sven Defatsch
Ссылка на оригинал: 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, можно чётко увидеть все шаги процесса:

Не удалось прогрузить медиа

  1. Устанавливаем SMB-коннект к удалённой машине (с Kerberos-аутентификацией).
  2. Коннектимся к IPC$-шаре.
  3. Открываем именованный пайп samr(это почти как открыть файл с таким именем).
  4. Биндимся к SAMR-интерфейсу по UUID 12345778-1234-abcd-ef00-0123456789ac через RPC поверх SMB.
  5. Взаимодействуем через SAM (Security Account Manager) Remote Protocol.
  6. Получаем SIDs юзеров и групп в локальной группе через функцию GetMembersInAlias.
  7. Закрываем соединение и логафимся.

Авторизация в процессе​

Права проверяются трижды:
  • При открытии 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)
На этих системах любые аутентифицированные юзеры всё ещё имеют доступ к SAMR ради совместимости.

Но для нас, пентестеров, это почти бесполезно: локальная 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-7853a3c7e380

SharpHound реализует 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 Group Policy Preferences (GPP), которые находятся по пути Computer Configuration\Preferences\Control Panel Settings\ (хотя это можно управлять и через User Configuration, SharpHound смотрит только Computer Configuration)
Не удалось прогрузить медиа

  • Restricted Groups находится в Computer Configuration\Policies\Windows Settings\Security Settings\
Не удалось прогрузить медиа


Детали реализации​

Вот как идёт процесс:
  1. Листаем все OU, где привязан GPO (gpLink в LDAP).
  2. Пропускаем пустые gpLink или отключённые GPO.
  3. Обрабатываем gPCFileSysPath каждого GPO — здесь лежат файлы с правилами на SYSVOL.
  4. Ищем Groups.xml (для локальных пользователей и групп) и GptTmpl.inf (для Restricted Groups).
  5. Фильтруем по интересующим 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
  6. Определяем, какие доменные пользователи входят в эти группы и на какие компьютеры применяются соответствующие GPO.
Тут ещё происходит много всего, что мы не будем подробно объяснять. Короче говоря: могут возникать конфликты, так как оба метода могут использоваться одновременно с разными или пересекающимися членствами. Юзеров можно удалять, добавлять или обновлять. Кроме того, настройки Restricted Groups имеют приоритет над GPP и могут их переопределять. SharpHound следит за всем этим и возвращает итоговую конфигурацию.

Ограничения​

Прежде всего, этот метод сбора данных не подтягивает локальные членства групп (поэтому тут преимущество у SAMR-метода). Полнота собранной информации сильно варьируется от домена к домену: в некоторых средах GPO активно управляет локальными группами, а в других ими почти не пользуются.

Wireshark trace​

Трассировка Wireshark успешного вызова SharpHound позволяет нам выделить следующие этапы:

Не удалось прогрузить медиа

  • Получаем все объекты домена через LDAP (не все запросы показаны выше).
  • Устанавливаем SMB-соединение с контроллером домена (аутентификация через Kerberos).
  • Подключаемся к шару SYSVOL и ищем XML-файлы.
  • Закрываем соединение и выходим.
Авторизация происходит в двух местах в этом процессе:
  1. При запросе данных через LDAP.
  2. При попытке открыть шар SYSVOL и XML-файлы.
Можно проверить самому, используя такой фильтр Wireshark:

((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

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.