Ос­новная при­чина успе­ха боль­шинс­тва взло­мов, будь то пен­тест или реаль­ное про­ник­новение зло­умыш­ленни­ков, — это допущен­ные адми­нис­тра­тора­ми ошиб­ки в нас­трой­ках и кон­фигура­ции. Сегод­ня мы погово­рим о спо­собах экс­плу­ата­ции небезо­пас­ных груп­повых политик в сетях Active Directory.

warning

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону.

 

Структура

Груп­повые полити­ки исполь­зуют­ся пов­семес­тно. Это удоб­ный инс­тру­мент, поз­воля­ющий сис­темным адми­нис­тра­торам управлять нас­трой­ками кли­ент­ских сис­тем в домене. Сама «архи­тек­тура» груп­повых политик — кли­ент‑сер­верная. Чаще все­го кон­трол­лер домена выс­тупа­ет в роли сер­вера, на котором соз­дают­ся, нас­тра­ивают­ся и изме­няют­ся полити­ки, а домен­ные компь­юте­ры, поль­зовате­ли и иные объ­екты в AD — кли­енты, которые эти самые полити­ки получа­ют и при­меня­ют.

Груп­повая полити­ка называ­ется Group Policy Object (GPO). Внут­ри каж­дой GPO есть две сущ­ности:

  • Group Policy Container — спе­циаль­ный объ­ект, который име­ет иден­тифика­тор GUID, обоз­нача­ющий груп­повую полити­ку. Находит­ся в CN=Policies,CN=System;
  • Group Policy Template — фай­лы .ADMX и .ADML, поз­воля­ющие с помощью GPO управлять объ­екта­ми в AD.

GPO при­меня­ется к Organizational Units (орга­низа­цион­ным еди­ницам). Мож­но счи­тать это некой пап­кой, в которой находят­ся поль­зовате­ли, компь­юте­ры и дру­гие объ­екты.

Из­началь­но в толь­ко что соз­данном домене будут две полити­ки:

  • Default Domain Policy — наз­нача­ется текуще­му домену;
  • Default Domain Controller’s Policy — наз­нача­ется OU, в сос­тав которо­го вхо­дит кон­трол­лер домена. По умол­чанию имя этой OU — Domain Controllers.

А теперь зай­дем в ADUC и уви­дим, что нарав­не с OU в домене сущес­тву­ют и кон­тей­неры.

Кон­тей­неры — это лишь допол­нитель­ные объ­екты, поз­воля­ющие орга­низо­вать струк­туру AD. К кон­тей­неру нель­зя при­вязать GPO. Что­бы при­менить GPO к кон­тей­неру, сна­чала сле­дует добавить его в соот­ветс­тву­ющую OU и уже к ней при­вязы­вать GPO.

GPO рас­простра­няет­ся по сети через общий сетевой ресурс SYSVOL, который хра­нит­ся на кон­трол­лере домена. Все поль­зовате­ли в домене обыч­но име­ют к нему дос­туп и пери­оди­чес­ки син­хро­низи­руют­ся для обновле­ния нас­тро­ек сво­их объ­ектов груп­повой полити­ки. Общий ресурс SYSVOL по умол­чанию ука­зыва­ет на каталог C:\Windows\SYSVOL\sysvol\ на кон­трол­лере домена.

Для син­хро­низа­ции нуж­но вре­мя. Иног­да на обновле­ние нас­тро­ек может уйти до двух часов. Если нам тре­бует­ся немед­ленная син­хро­низа­ция, то на компь­юте­ре надо ввес­ти коман­ду

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, на которые у пользователя domain\user есть права
Get-DomainGPO|Get-DomainObjectAcl -ResolveGUIDs | Foreach-Object {$_ | Add-Member -NotePropertyName Identity -NotePropertyValue (ConvertFrom-SID $_.SecurityIdentifier.value) -Force; $_}| Foreach-Object {if ($_.Identity -eq $("domain\user")) {$_}}
# Находим 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}" }

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    7 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии