Идём по киберследу: Анализ защищенности Active Directory c помощью утилиты BloodHound — страница 44 из 46

'line',

CanEnroll:'line',

CanAutoEnroll:'line',

WriteProperty:'line',

RequestCertificates:'line',

ManageCA:'line',

ManageCertificates:'line',

Read:'line',

},

Находим строчку

if (typeof conf.get('edgeincluded') === 'undefined')
и там тоже добавляем строчку:

if (typeof conf.get('edgeincluded') === 'undefined') {

conf.set('edgeincluded', {

FullControl: true,

CanEnroll: true,

CanAutoEnroll: true,

WriteProperty: true,

RequestCertificates: true,

ManageCA: true,

ManageCertificates: true,

Read: true,

});

Сохраняем измененный файл и собираем приложение:

npm run build: win32

Запустим обновленную версию BloodHound и выполним несколько запросов путей. Этого будет достаточно для проверки корректного добавления связей.


Рис. 4.77. Проверка прямой связи


Или более сложный запрос:


Рис. 4.78. Проверка непрямой связи


Создание запросов

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


Глобальное подтверждение на запрос сертификата

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

requestdisposition
. Если он содержит
PendingFirst
, то все дальнейшие шаги будут зависеть от того, есть ли права на подтверждение запроса.

MATCH(c: CA) WHERE ANY (x IN c.requestdisposition WHERE x CONTAINS 'PendingFirst') RETURN c


Проверка ESC1

Для эксплуатации

ESC1
должны выполняться следующие условия:

● 

authclient = TRUE

● 

enrolleesuppliessubject = TRUE

● 

pendallrequests = FALSE

● 

enabled = TRUE

В дополнение сразу запросим, в каком центре сертификации включен шаблон. В результате Cypher-запрос будет следующим:

MATCH p=((m)-[r: CanEnroll|MemberOf*1..]->(t: Template {authclient: TRUE, enrolleesuppliessubject: TRUE, pendallrequests: FALSE})-[r1:HostedOn]->(c: CA)) RETURN p


Рис. 4.79. Результат проверки ESC1


Проверка ESC2

Для эксплуатации

ESC2
должны выполняться следующие условия:

● 

anypurpose = TRUE

● 

pendallrequests = FALSE

● 

enabled = TRUE

В дополнение сразу запросим, в каком центре сертификации включен шаблон. Cypher-запрос будет следующим:

MATCH p=((m)-[r: CanEnroll|MemberOf*1..]->(t: Template {anypurpose: TRUE, pendallrequests: FALSE})-[r1:HostedOn]->(c: CA)) RETURN p


Рис. 4.80. Результат проверки ESC2


Проверка ESC3

Для эксплуатации

ESC3
требуется два шаблона и должны выполняться несколько условий кроме прав на запрос сертификата.

У одного из шаблонов сертификатов:

● 

requestagent = TRUE

Для другого:

● 

enrollmentagent = TRUE

● 

authclient = TRUE

Запрос Cypher будет следующим:

MATCH p=(m)-[r: CanEnroll|MemberOf*1..]->(t: Template)-[: HostedOn]->(c: CA) WHERE t.requestagent = TRUE OR (t.enrollmentagent = TRUE AND t.authclient=TRUE) RETURN p


Рис. 4.81. Результат проверки ESC3


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

MATCH (t1:Template {requestagent: TRUE, enabled: TRUE}) MATCH (t2:Template {enrollmentagent: TRUE, authclient: TRUE, enabled: TRUE}) MERGE (t1)-[r: CanEnroll]->(t2)

Совет

Этот запрос можно добавить в скрипт для сбора информации.

Повторим предыдущий запрос, в результате получим последовательность запросов сертификатов (рис. 4.82).


Рис. 4.82. Обновленный результат проверки ESC3


Проверка ESC4

Для эксплуатации

ESC4
проверяем, кто какие права имеет на объекты шаблонов сертификатов (рис. 4.83). Могут быть следующие варианты:

● GenericAll

● GenericWrite

● WriteProperty

● WriteDacl

● WriteOwner

В дополнение уберем из запроса SID следующих групп и пользователей, это позволит получить более чистый вывод:

● Domain Admin

● Enterprise Admins

● Account Operators

● Administrators

● Administrator

● krbtgt

В результате Cypher-запрос получится следующим:

MATCH p=allshortestpaths((m)-[r: MemberOf|GenericAll|WriteDacl|WriteProperty|WriteOwner|Owns*1..]->(n: Template))

WHERE m<>n and NONE (x IN nodes(p) WHERE x.objectid =~ '(?i)S-1–5-.*-512|S-1–5-.*-519 |.*-544 |.*-500 |.*-502 |.*-548') WITH n AS Templates, p as p1

MATCH p2=(Templates)-[r1:HostedOn]->(c: CA)

RETURN p1, p2

Здесь формируется два запроса, первый строит все доступные короткие пути с правами на изменение шаблонов сертификатов с добавлением исключений, а второй из выборки устанавливает, в каком центре сертификации присутствуют шаблоны.


Рис. 4.83. Проверка ESC4


Проверка ESC5

Для эксплуатации

ESC5
требуется найти всех пользователей и группы, которые имеют привилегии локального администратора в центре сертификации. Для этого в запросе Cypher будет использоваться связь AdminTo.

Внимание

Необходимо помнить, что не только пользователи могут иметь права локального администратора на хосте, но и компьютеры.

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

dnshostname
центра сертификации. Вторым шагом будет непосредственный поиск всех объектов, которые имеют права локального администратора.

Таким образом, запрос будет следующим:

MATCH(m: CA) WITH collect(m.dnshostname) as ca

MATCH p=(n)-[r: MemberOf|AdminTo*1..]->(c: Computer) WHERE c.name IN ca RETURN p

Внимание

Необходимо помнить, что BloodHound не всегда дает верную информацию о правах локального администратора (AdminTo) на хостах, поэтому в некоторых случаях необходимо проверять права локального администратора вручную.

Проверка ESC6

Для эксплуатации требуется установленный флаг

EDITF_ATTRIBUTESUBJECTALTNAME2,
в нашем случае это свойство
attributesubjectaltname2,
и оно должно быть включено. Поэтому запрос будет очень простой:

MATCH (c: CA) WHERE c.attributesubjectaltname2 = 'Enabled' RETURN c

Хотя имя сервера, на котором расположен центр сертификации, указано в свойстве

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