SpecterOps / BloodHound

Six Degrees of Domain Admin
https://bloodhoundenterprise.io/
Apache License 2.0
1.02k stars 99 forks source link

First Degree Outbound/Inbound Controls #117

Open funnybananas opened 11 months ago

funnybananas commented 11 months ago

Feature Description:

As implemented in earlier versions of Bloodhound, provide the option to display first degree level of outbound or inbound controls, rather than the current "all or nothing" approach. This grants a snapshot to the outbound/inbound controls without the need to draw all nodes.

Current Behavior:

Inbound Controls: Lists all inbound controls, including nested nodes, which can complicate the output and make it difficult to ascertain a valid path.

Outbound Controls: Does not graph anything. Only displays the names of nodes in a small drop down window. Not useful for large datasets containing multiple hundreds/thousands of nodes (as is usually the case).

Desired Behavior:

List only the first level of controls. Will most likely display the nodes with immediate controls or the group objects the source node has controls against. Act as a "preview" to determine if this path is worth exploring more, no need to display all nodes at this point. If path seems viable, groups can then be expanded to reveal nested nodes. More intuitive to idenify paths from Graph rather than from small, compact list.

Use Case:

With current implementation, when selecting a node and selecting "Outbound Controls", it only provides the ability to view all of them in a drop down list, it does not graph it. For example, in a dataset with over 100k nodes, selecting an admin User and selecting "Outbound Controls" displays multiple tens of thousands of node names in a list. This includes first level and transivitive outbound controls. Being able to display only the first level of controls would greatly ease enumeration and path identification.

martinsohn commented 10 months ago

I'm sure you know but for good measure... As a workaround; You can run this Cypher query after replacing the n.name with your desired node.

MATCH p=(n)-[r]->(m)
WHERE n.name = "DOMAIN USERS@ROOT.LOCAL"
AND n<>m
AND NOT TYPE(r) IN ["MemberOf", "Contains"]
RETURN p

Adjust the excluded edges at AND NOT TYPE to your liking.