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

MATCH (s: Share) RETURN s


Рис. 4.52. Результат добавления нового узла


Теперь добавим отображение новой метки

Share
в BloodHound. Весь процесс будет аналогичен отображению метки локального пользователя.

Отображение метки общего ресурса в BloodHound

Переходим в директорию

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

global.appStore = {

dagre: true,

LocalUser:{

font: "'Font Awesome 5 Free'",

content:'\uf007',

scale:1.5,

color:'#E69717',

},

Share:{

font: "'Font Awesome 5 Free'",

content:'\uf07b',

scale:1.25,

color:'#f8d775',

},

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

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

lowResPalette:{

colorScheme:{

Base:'#E6E600',

LocalUser:'#E69717',

Share:'#f8d775',

},

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

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

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

const labels = [

'Base',

'Container',

'OU',

'GPO',

'User',

'Computer',

'Group',

'Domain',

'LocalUser',

'Share',

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

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

export async function setSchema() {

const luceneIndexProvider = "lucene+native-3.0"

let labels = ["User", … "Base", "LocalUser", 
"Share",

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

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

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

switch (type) {

case 'LocalUser':

node.type_localuser = true;

break;

case 'Share':

node.type_share = true;

break;

}

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

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

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

switch (type) {

case 'LocalUser':

icon.className = 'fa fa-user';

break;

case 'Share':

icon.className = 'fa fa-folder';

break;

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

Кроме отображения самой метки нужно добавить визуализацию свойств узла. В той же директории открываем файл

TabContainer.jsx
и добавим импорт вкладки после импорта
LocalUserNodeData
:

import OuNodeData from './Tabs/OUNodeData';

import LocalUserNodeData from './Tabs/LocalUserNodeData';

import ShareNodeData from './Tabs/ShareNodeData';

До нажатия на сам узел его свойства будут скрыты, для этого в классе

TabContainer
находим строку
this.state
и добавляем строку:

class TabContainer extends Component {

constructor(props) {

super(props);

this.state = {

containerVisible: false,

localuserVisible: false,

shareVisible: false,

Дальше нужно добавить обработку при нажатии на узел. Для этого находим строку

nodeClickHandler(type)
и добавляем код:

nodeClickHandler(type) {

} else if (type === 'GPO') {

this._gpoNodeClicked();

} else if (type === 'LocalUser') {

this._localuserNodeClicked();

} else if (type === 'Share') {

this._shareNodeClicked();

Ниже находим изменение состояния видимости вкладки для каждой метки. Код начинается с

_labelNodeClicked
. Для общего ресурса код будет выглядеть следующим образом:

_localuserNodeClicked() {

this.clearVisible()

this.setState({

localuserVisible: true,

selected:2

});

}

_shareNodeClicked() {

this.clearVisible()

this.setState({

shareVisible: true,

selected:2

});

}

Ниже в функции отображения

render()
находим строку
NoNodeData
и добавляем следующий код:

render() {

visible={

!this.state.ouVisible &&

!this.state.localuserVisible &&

!this.state.shareVisible &&

И еще ниже добавим отображение вкладки со свойствами для

ShareNodeData:

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