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

'Object ID',

enabled:'Enabled',

};

return objectId === null? (

):(

className={clsx(

!visible &&'displaynone',

context.darkMode? styles.dark: styles.light

)}

>

{label || objectId}

displayMap={displayMap}

properties={nodeProps}

label={label}

/>


displayMap={displayMap}

properties={nodeProps}

label={label}

/>


// Удаляем разделы EXECUTION RIGHTS, OUTBOUND OBJECT // CONTROL

property='Explicit Object Controllers'

target={objectId}

baseQuery={

'MATCH p=(n)-[r]->(u1:Template {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|WriteProperty|WriteDacl|WriteOwner|Owns]->(u: Template {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|WriteProperty|WriteDacl|WriteOwner|Owns*1..]->(u1:Template {objectid:$objectid}))'

}

end={label}

distinct

/>

);

};

// Заменяем на TemplateNodeData

TemplateNodeData.propTypes = {};

// Заменяем на TemplateNodeData

export default withAlert()(TemplateNodeData);

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

npm run build: win32

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

ESC1
и посмотрим, что мы получим на выходе. Свойства и метка должны отображаться корректно.


Рис. 4.74. Результат добавления новой метки


Отображение метки центра сертификации в BloodHound

Теперь приступим ко второй части и добавим метку самого центра сертификации. Открываем файл

index.js
на редактирование. Добавим информацию о том, как новая метка будет отображаться на графе. Находим строку
global.AppStore
и вставляем следующий код после блока
Template
:

global.appStore = {

dagre: true,

Template:{

font: "'Font Awesome 5 Free'",

content:'\uf2c2',

scale:1.25,

color:'#cc0066',

},

CA:{

font: "'Font Awesome 5 Free'",

content:'\uf66f',

scale:1.25,

color:'#FF3333',

},

Дальше ищем строку

lowResPalette
и добавляем название метки и цвет. Этот параметр отвечает за отображение узлов в низком разрешении.

lowResPalette:{

colorScheme:{

Share:'#f8d775',

Template:'#cc0066',

CA:'#FF3333',

},

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

Теперь переходим в директорию

src\js
и открываем на редактирование файл
utils.js.
В самом начале, в разделе
const labels = [
, добавляем новую метку после
Domain
.

const labels = [

'Domain',

'LocalUser',

'Share',

'Template',

'CA'
,

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

export async function setSchema()
и в массив
label
добавляем название новой метки.

export async function setSchema() {

const luceneIndexProvider = "lucene+native-3.0"

let labels = ["User", "Group", …, "Domain", "Container", "Base", "LocalUser", "Share", "Template", 
"CA"
,

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

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

components
и открываем файл
Graph.jsx.
Находим строку
switch (type)
и добавляем в нее код:

switch (type) {

case 'Template':

node.type_template = true;

break;

case 'CA':

node.type_ca = true;

break;

}

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

Для отображения метки в строке поиска нужно открыть файл

SearchRow.jsx,
который находится в директории
src\components\SearchContainer
. Находим строку
switch (type)
и после блока
Container
добавляем код:

switch (type) {

case