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

', {

objectid: id,

})

.then((r) => {

let props = r.records[0].get('node'). properties;

setNodeProps(props);

setLabel(props.name || props.azname || objectid);

session.close();

});

} else {

setObjectId(null);

setVisible(false);

}

};

const displayMap = {

objectid:'Object ID',

};

return objectId === null? (

):(

className={clsx(

!visible &&'displaynone',

context.darkMode? styles.dark: styles.light

)}

>

{label || objectId}

property='Enabled Templates'

target={objectId}

baseQuery={

'MATCH p=(m: Template)-[r: HostedOn]->(n: CA {objectid:$objectid})'

}

end={label}

/>


displayMap={displayMap}

properties={nodeProps}

label={label}

/>


displayMap={displayMap}

properties={nodeProps}

label={label}

/>


property='Explicit Object Controllers'

target={objectId}

baseQuery={

'MATCH p=(n)-[r]->(u1:CA {objectid:$objectid}) WHERE r.isacl=true'

}

end={label}

distinct

/>

property='Unrolled Object Controllers'

target={objectId}

baseQuery={

'MATCH p=(n)-[r: MemberOf*1..]->(g: Group)-[r1:GenericAll|GenericWrite|WriteDacl|WriteOwner|Owns|ManageCA|ManageCertificates]->(u: CA {objectid:$objectid}) WITH LENGTH(p) as pathLength, p, n WHERE NONE (x in NODES(p)[1..(pathLength-1)] WHERE x.objectid = u.objectid) AND NOT n.objectid = u.objectid'

}

end={label}

distinct

/>

property='Transitive Object Controllers'

target={objectId}

baseQuery={

'MATCH (n) WHERE NOT n.objectid=$objectid MATCH p = shortestPath((n)-[r1:MemberOf|GenericAll|GenericWrite|WriteDacl|WriteOwner|Owns|ManageCA|ManageCertificates*1..]->(u1:CA {objectid:$objectid}))'

}

end={label}

distinct

/>

);

};

CANodeData
.propTypes = {};

export default withAlert()(
CANodeData
);

Сохраняем измененный файл и соберем решение.

npm run build: win32

После запуска BloodHound в строке поиска наберем

DOMAIN-DC–CA
и посмотрим, как выглядит наш центр сертификации (рис. 4.75).

В разделе

OWERVIEW
можно заметить, что у нас есть 16 опубликованных шаблонов сертификатов. Если нажать на эти цифры, мы получим все опубликованные шаблоны сертификатов для данного центра сертификации (рис. 4.76):

Добавление новых связей

При сборе информации и формировании Cypher-запросов мы создали новые связи, которых до этого не было:

● CanEnroll;

● CanAutoEnroll (потенциальная);


Рис. 4.75. Центр сертификации


Рис. 4.76. Опубликованные шаблоны сертификатов


● WriteProperty (потенциальная);

● RequestCertificates;

● ManageCA;

● ManageCertificates;

● Read.

Связь

HostedOn
мы добавили в общих ресурсах.

При запросах без указания определенных связей BloodHound нарисует граф, но, как мы уже знаем, при поиске путей между двумя объектами ничего не произойдет. Поэтому добавим все новые связи в BloodHound.

Открываем файл

AppContainer.jsx
, который находится в
src
, находим массив
fullEdgeList
и добавляем связи:

const fullEdgeList = [

'FullControl',

'
CanEnroll',

'CanAutoEnroll',

'WriteProperty',

'RequestCertificates',

'ManageCA',

'ManageCertificates',

];

Сохраняем файл и теперь открываем файл

index.js
в том же каталоге, находим строчку
global.appStore
и двигаемся до
edgeScheme.
Там добавляем:

global.appStore = {

dagre: true,

edgeScheme:{

FullControl:'tapered',

CanEnroll:'tapered',

CanAutoEnroll:'tapered',

WriteProperty:'tapered',

RequestCertificates:'tapered',

ManageCA:'tapered',

ManageCertificates:'tapered',

Read:'tapered',

},

Доходим до

lowResPalette
и добавляем:

lowResPalette:{

edgeScheme:{

FullControl: