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. Они представляют собой набор настроек и конфигураций, которые будут применяться к определенной группе пользователей и компьютеров в домене. Эти настройки используются для контроля и управления различными функциями операционной системы и приложений, работающих в домене. Также групповые политики применяются для обеспечения соблюдения определенных конфигураций, политик безопасности, установки программного обеспечения и т. д.