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

. Комментарии в коде просто описывают шаги, их не стоит добавлять в код:

import React, {useEffect, useState} from 'react';

import clsx from 'clsx';

import CollapsibleSection from './Components/CollapsibleSection';

import NodeCypherLinkComplex from './Components/NodeCypherLinkComplex';

import NodeCypherLink from './Components/NodeCypherLink';

import NodeCypherNoNumberLink from './Components/NodeCypherNoNumberLink';

import MappedNodeProps from './Components/MappedNodeProps';

import ExtraNodeProps from './Components/ExtraNodeProps';

import NodePlayCypherLink from './Components/NodePlayCypherLink';

import {withAlert} from 'react-alert';

import {Table} from 'react-bootstrap';

import styles from './NodeData.module.css';

import {useContext} from 'react';

import {AppContext} from '../../../AppContext';

// Меняем название метки на LocalUserNodeData

const 
LocalUserNodeData
 = () => {

const [visible, setVisible] = useState(false);

const [objectId, setObjectId] = useState(null);

const [label, setLabel] = useState(null);

//const [domain, setDomain] = useState(null);

const [nodeProps, setNodeProps] = useState({});

const context = useContext(AppContext);

useEffect(() => {

emitter.on('nodeClicked', nodeClickEvent);

return () => {

emitter.removeListener('nodeClicked', nodeClickEvent);

};

}, []);

const nodeClickEvent = (type, id, blocksinheritance, domain) => {

// Меняем название метки LocalUser

if (type === 
'LocalUser'
) {

setVisible(true);

setObjectId(id);

let session = driver.session();

session

// Меняем метку на LocalUser

.run('MATCH (n:
LocalUser
 {objectid:$objectid}) RETURN n AS node', {

objectid: id,

})

.then((r) => {

let props = r.records[0].get('node'). properties;

setNodeProps(props);

setLabel(props.name || objectid);

session.close();

});

} else {

setObjectId(null);

setVisible(false);

}

};

// Здесь определяется, какие свойства узла попадут в раздел

// NODE PROPERTIES. Остальные будут отображаться в EXTRA PROPERTIES

const displayMap = {

name:'Name',

password:'Password',

objectid:'Object ID',

hash:'Hash',

};

return objectId === null? (

):(

className={clsx(

!visible &&'displaynone',

context.darkMode? styles.dark: styles.light

)}

>

{label || objectId}

// Удаляем раздел OVERVIEW, тут он нам не потребуется

// Раздел NODE PROPERTIES

displayMap={displayMap}

properties={nodeProps}

label={label}

/>


// Раздел EXTRA PROPERTIES

displayMap={displayMap}

properties={nodeProps}

label={label}

/>

// Удаляем раздел GROUP MEMBERSHIP


// В разделе LOCAL ADMIN RIGHTS оставляем только прямую связь AdminTo, групп уже не будет

property='First Degree Local Admin'

target={objectId}

baseQuery={

'MATCH p=(m: LocalUser {objectid:$objectid})-[r: AdminTo]->(n: Computer)'

}

start={label}

distinct

/>

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

// и INBOUND CONTROL RIGHTS

);

};

// Заменяем на LocalUserNodeData

LocalUserNodeData
.propTypes = {};

// Заменяем на LocalUserNodeData

export default withAlert()(
LocalUserNodeData
);

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

В дополнение добавим новую метку в файл

AddNodeModal.jsx
, расположенный в директории
src\components\Modals
. Это позволит добавлять новые узлы
LocalUser
с помощью интерфейса BloodHound.

Открываем файл на редактирование, находим строку

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

Node Type

Также нам нужно изменить процедуру проверки имени, так как форма проверяет тип компьютер на наличие более трех точек, а все остальные объекты – на наличие

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

if (type!=