Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Основная причина успеха большинства взломов, будь то пентест или реальное проникновение злоумышленников, — это допущенные администраторами ошибки в настройках и конфигурации. Сегодня мы поговорим о способах эксплуатации небезопасных групповых политик в сетях Active Directory.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Групповые политики используются повсеместно. Это удобный инструмент, позволяющий системным администраторам управлять настройками клиентских систем в домене. Сама «архитектура» групповых политик — клиент‑серверная. Чаще всего контроллер домена выступает в роли сервера, на котором создаются, настраиваются и изменяются политики, а доменные компьютеры, пользователи и иные объекты в AD — клиенты, которые эти самые политики получают и применяют.
Групповая политика называется Group Policy Object (GPO). Внутри каждой GPO есть две сущности:
CN=Policies,CN=System
;
.ADMX
и .ADML
, позволяющие с помощью GPO управлять объектами в AD.
GPO применяется к Organizational Units (организационным единицам). Можно считать это некой папкой, в которой находятся пользователи, компьютеры и другие объекты.
Изначально в только что созданном домене будут две политики:
Domain Controllers
.
А теперь зайдем в ADUC и увидим, что наравне с OU в домене существуют и контейнеры.
Контейнеры — это лишь дополнительные объекты, позволяющие организовать структуру AD. К контейнеру нельзя привязать GPO. Чтобы применить GPO к контейнеру, сначала следует добавить его в соответствующую OU и уже к ней привязывать GPO.
GPO распространяется по сети через общий сетевой ресурс SYSVOL
, который хранится на контроллере домена. Все пользователи в домене обычно имеют к нему доступ и периодически синхронизируются для обновления настроек своих объектов групповой политики. Общий ресурс SYSVOL
по умолчанию указывает на каталог C:WindowsSYSVOLsysvol
на контроллере домена.
Для синхронизации нужно время. Иногда на обновление настроек может уйти до двух часов. Если нам требуется немедленная синхронизация, то на компьютере надо ввести команду
gpupdate /force
С GPO могут быть связаны какие‑либо права. Например, пользователь Admin11111
имеет право GenericAll
на политику UsersInfo
. Неправильная настройка таких прав приводит к появлению векторов эксплуатации, которые мы рассмотрим в сегодняшней статье.
Обнаружить доступные GPO можно следующим образом:
ls \<домен>SYSVOL<домен>Policies
В результате мы получим GUID всех доступных политик.
Если у нас есть доступ к Active Directory Module, то сможем получить информацию вот так:
Get-ADObject -LDAPFilter "(ObjectClass=GroupPolicyContainer)" -Properties Name, DisplayName,gPCFileSysPath | select Name, DisplayName,GPCFileSysPath | Format-List
Наконец, PowerView имеет такую же функциональность:
Get-NetGpo
Теперь желательно из GUID получить имя политики. Конечно, AD Module и PowerView умеют делать это самостоятельно, но в случае, если у нас есть только GUID, имя можно получить следующим образом:
# RSAT Get-Gpo -GUID '{205F0E03-17C3-4E9B-925E-330FAD565CA1}'# PowerView v3 Get-DomainGPO -Identity '{205F0E03-17C3-4E9B-925E-330FAD565CA1}' | select DisplayName
Мы также можем изучить политики, привязанные к определенному устройству:
# PowerView v2 Get-NetGPO -ComputerName name.domain.com
# PowerView v3 Get-DomainGPO -ComputerIdentity name.domain.com -Properties Name, DisplayName
Наконец, самое интересное. Пора изучать все ACL на найденные GPO, пытаясь найти мисконфиг. Сделать это можно с помощью разных средств. Чаще всего используются или BloodHound, или PowerView:
# PowerView v2 # Получение ACL на все политики Get-NetGPO | % {Get-ObjectAcl -ResolveGUIDs -Name $_.Name} # Найти GPO, на которые пользователь student имеет права Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ?{$_.IdentityReference -match "student"}
Пользователь vaska
имеет подозрительно высокие права на GPO с GUID {31B2F340-016D-11D2-945F-00C04FB984F9}
. PowerView третьей версии (он же PowerView DEV) не отстает от своего младшего собрата, но отличается тем, что не умеет автоматически преобразовывать SID в понятное для человека имя пользователя, поэтому в конец каждого командлета добавляется огромная строка:
# PowerView v3 # Находим ACL на все политики Get-DomainGPO|Get-DomainObjectAcl -ResolveGUIDs | Foreach-Object {$_ | Add-Member -NotePropertyName Identity -NotePropertyValue (ConvertFrom-SID $_.SecurityIdentifier.value) -Force; $_} # Находим GPO, на которые у пользователя domainuser есть права Get-DomainGPO|Get-DomainObjectAcl -ResolveGUIDs | Foreach-Object {$_ | Add-Member -NotePropertyName Identity -NotePropertyValue (ConvertFrom-SID $_.SecurityIdentifier.value) -Force; $_}| Foreach-Object {if ($_.Identity -eq $("domainuser")) {$_}} # Находим GPO, на которую пользователи с RID > 1000 имеют какие-нибудь права: Get-DomainObjectAcl -LDAPFilter '(objectCategory=groupPolicyContainer)' | ? { ($_.SecurityIdentifier -match '^S-1-5-.*-[1-9]d{3,}$') -and ($_.ActiveDirectoryRights -match 'WriteProperty|GenericAll|GenericWrite|WriteDacl|WriteOwner')} # Обнаружение пользователей (кроме ожидаемых, таких как Enterprise Admins, Domain Admins), которые могут изменять GPO Get-DomainGPO | Get-DomainObjectAcl -ResolveGUIDs | where { $_.ActiveDirectoryRights -match "GenericWrite|AllExtendedRights|WriteDacl|WriteProperty|WriteMember|GenericAll|WriteOwner" -and $_.SecurityIdentifier -match "S-1-5-21-3301805923-005976665-244893303-[d]{4,10}" }
Источник: xakep.ru