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

node.accessible = data.properties.accessible;

Спускаемся ниже до условия

if (node.highvalue)
и добавляем свой код для отображения внешнего вида нашей метки о недоступности:

if (node.highvalue) {

});

}

if (node.accessible === false) {

node.glyphs.push({

// Указание
расположения отметки

position:'bottom-left',

font:'"Font Awesome 5 Free"',

content:'\uf05e',

fillColor:'#990000',

fontScale:2.0,

fontStyle:'900',

});

}

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

npm run build: win32

В результате если у объекта будет атрибут

accessible
со значением
false
, то в нижнем левом углу появится значок, показывающий, что доступа нет. Выполним запрос Cypher в Raw Query, показывающий все компьютеры:

MATCH (c: Computer) RETURN c


Рис. 4.34. Отображение метки на узлах


Внимание

Если у узла нет такого атрибута, то отображаться ничего не будет.

Исключение из пути

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

accessible
установлено в
false
. Аналогично с черным списком, рассматривавшимся ранее.

Для начала восстановим связи для компьютеров из раздела добавления собственных запросов:

MATCH (c1:Computer {name: "DC.DOMAIN.LOCAL"})

MATCH (c2:Computer {name: "COMP.DOMAIN.LOCAL"})

MATCH (g: Group {name: "DOMAIN COMPUTERS@DOMAIN.LOCAL"})

MERGE (c1)-[: AdminTo]-(c2)

MERGE (g)-[: AdminTo]-(c2)

В BloodHound перейдем во вкладку Analysis и выберем Find All Computers where Computers are Local Admin. В результате получим следующий граф:


Рис. 4.35. Обычный запрос без исключений


Теперь добавим исключение и исключим из запроса недоступные хосты, тогда наш запрос будет выглядеть следующим образом (рис. 4.36):

MATCH (c: Computer) WHERE c.accessible = FALSE WITH collect(c) AS wo

MATCH p=(n: Computer)-[r: MemberOf|AdminTo*1..]->(m: Computer)

WHERE NONE (x IN nodes(p) WHERE x in wo)

RETURN p


Рис. 4.36. Запрос с исключениями


Внимание

Стоит учитывать связь через недоступный узел. Так, например, GenericAll не будет влиять на захват объекта, если следующий шаг связан с настройками ACL.

Добавление отметки в контекстном меню

В ходе работ ситуация может поменяться и какие-то объекты станут доступными, а какие-то, наоборот, нет. Можно обойтись запросом в Cypher для изменения свойства

accessible
. Изменить свойство можно с помощью Cypher-запроса в зависимости от ситуации:

// Хост недоступен

MATCH (c: Computer) SET u.accessible = FALSE

// Хост доступен

MATCH (c::Computer) SET u.accessible = TRUE

Но мы пойдем другим путем и добавим в контекстное меню узла функцию изменения доступности хоста.

Для начала открываем файл

NodeTooltip.jsx
, который находится в директории
src\components\Tooltips
, находим условие
If condition={node.highvalue === true
}, связанное с добавлением отметки
HighValue
, и после всего блока добавляем код:

onClick={() => {

emitter.emit('setAccessible', id, false);

}}

>

 Set {type} as NotAccessible

onClick={() => {

emitter.emit('setAccessible', id, true);

}}

>

 Set {type} as Accessible

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

Теперь переходим в директорию на уровень выше, открываем файл

Graph.jsx
и начинаем его изменять. Находим строчку
emitter.on('setHighVal', this.setHighVal.bind(this));
и после нее добавляем:

emitter.on('setHighVal', this.setHighVal.bind(this));

emitter.on('setAccessible', this.setAccessible.bind(this));

Дальше находим блок

setHighVal(id, status) {
и после него добавляем наш код управления свойством:

setHighVal(id, status) {

closeTooltip();

});

}

setAccessible(id, status) {

closeTooltip();

let instance = this.state.sigmaInstance;

let node = instance.graph.nodes(id);

node.accessible = status;

if (status === false) {

node.glyphs.push({

position:'bottom-left',

font:'"Font Awesome 5 Free"',

content:'\uf05e',

fillColor:'#990000',

fontScale:2.0,

fontStyle:'900',

});

} else {

let newglyphs = [];

$.each(node.glyphs, (_, glyph) => {

if (glyph.position!== 'bottom-left') {

newglyphs.push(glyph);

}

});

node.glyphs = newglyphs;

}

instance.renderers[0].glyphs();

instance.refresh();

let q = driver.session();

q.run(

'MATCH (n:${node.type} {objectid:$objectid}) SET n.accessible=$status',

{

objectid: node.objectid,

status: status,

}

). then((x) => {

q.close();

});

}

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

npm run build: win32

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


Рис. 4.37. Новая кнопка в контекстном меню


Внимание

Если вы устанавливаете отметку о доступности на узел, у которого нет свойства

accessible
, то сначала свойство будет установлено в значение
true
.

Разбор inf-файлов в групповых политиках

Групповые политики – это важная часть Active Directory. Они представляют собой набор настроек и конфигураций, которые будут применяться к определенной группе пользователей и компьютеров в домене. Эти настройки используются для контроля и управления различными функциями операционной системы и приложений, работающих в домене. Также групповые политики применяются для обеспечения соблюдения определенных конфигураций, политик безопасности, установки программного обеспечения и т. д.