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

"MATCH (m {objectid:'$ObjectSID'})

MATCH (n {objectid:'$ID'}) MERGE

(m)-[r: WriteUserAccountControl]->(n) SET r.isacl=TRUE;"

}

}

}

}

}

После запуска скрипта получим три строки Cypher-запроса, которые необходимо загрузить в базу. Так как запросов немного, то для загрузки данных воспользуемся браузером neo4j.


Рис. 4.46. Результат сбора информации


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

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

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

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

const fullEdgeList = [

'SeRemoteInteractiveLogonRight',

'SeInteractiveLogonRight',

'WriteScriptPath',

'WriteUserAccountControl',

'WriteGPLink'

];

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

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

global.appStore = {

dagre: true,

edgeScheme:{

SeRemoteInteractiveLogonRight:'tapered',

SeInteractiveLogonRight:'tapered'
,

WriteScriptPath:'tapered',

UserAccountControl:'tapered',

WriteGPLink:'tapered',

},

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

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

lowResPalette:{

edgeScheme:{

SeRemoteInteractiveLogonRight:'line',

SeInteractiveLogonRight:'line'
,

WriteScriptPath:'line',

WriteUserAccountControl:'line',

WriteGPLink:'line'

},

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

if (typeof conf.get('edgeincluded')
и там тоже добавляем наши связи:

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

conf.set('edgeincluded', {

SeRemoteInteractiveLogonRight: true,

SeInteractiveLogonRight: true
,

WriteScriptPath: true,

WriteUserAccountControl: true,

WriteGPLink: true,

});

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

npm run build: win32

Запускаем обновленную версию BloodHound и проверяем пути от

user
до
office
.


Рис. 4.47. Короткий путь от user до office


Изменение формы Добавление связей

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

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

src\components\Modals
и открываем на редактирование файл
AddEdgeModal.jsx.
Находим строчку
Edge Type
и ниже всех в списке имен связей добавляем наши новые связи:

Edge Type

value={edgeValue}

DumpSMSAPassword

Control

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

npm run build: win32

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


Рис. 4.48. Добавление связей в форму


Добавление в фильтр запросов

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

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

EdgeFilter.jsx,
расположенный в
\src\components
\SearchContainer\EdgeFilter
, находим строку
title='ACL Edges'
и добавляем в конце блока наши связи:

title='ACL Edges'

edges={[

'WriteAccountRestrictions',

'WriteScriptPath',

'WriteUserAccountControl',

'WriteGPLink',

]}

sectionName='ACL'

Ниже, после строки

name='SyncLAPSPassword' />
, также добавим наши связи:

title='Containers'

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

npm run build: win32

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


Рис. 4.49. Добавленные фильтры


Создание подсказки

Как уже говорилось в разделе об интерфейсе BloodHound, связи имеют подсказку по эксплуатации. И сейчас мы создадим подсказку для

WriteScriptPath
.

Откроем файл

HelpModal
, расположенный в
src\components\Modals
, и в конце импорта внешних файлов добавим:

import AZLogicAppContributor from './HelpTexts/AZLogicAppContributor/AZLogicAppContributor';

import AZNodeResourceGroup from './HelpTexts/AZNodeResourceGroup/AZNodeResourceGroup';

import WriteScriptPath from './HelpTexts/WriteScriptPath/WriteScriptPath';

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

const components
и добавим в нее следующий код:

const components = {

GenericAll: GenericAll,

AZNodeResourceGroup: AZNodeResourceGroup,

WriteScriptPath: WriteScriptPath,

};

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

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

src\components\Modals\HelpText
и сделаем копию директории
AdminTo