
Ihr vorlagenbasiertes BloodHound-Terminal-Begleitwerkzeug

Eine Python3-Terminalanwendung, die Neo4j-Cypher für BloodHound-Datensätze enthält, mit einem Skript zum automatischen Importieren in BloodHound CE.
Terminal

HTML-Bericht

HTML-Bericht (Fortsetzung)

BloodHound ist ein Standardwerkzeug für jeden Penetrationstester. Allerdings gibt es einige negative Nebeneffekte aufgrund seines Designs. Ich werde die größten Problemstellen behandeln, die ich erlebt habe und was dieses Tool zu adressieren versucht:
JSON-Graphen parsen, benötige ich Graph-Ergebnisse in einem zeilenweisen .txt-Format, um tatsächlich Angriffe aus anderen Tools durchzuführenDieses Tool kann sowohl für Red- als auch Blue-Teams einen erheblichen Mehrwert bieten.
Übernimm die Kontrolle über deine BloodHound-Daten mit CypherHound!
grep/cut/awk-freundlichen Format bereitgestelltcustomqueries.json-Importskript für BloodHound CE enthaltenStelle sicher, dass python3 installiert ist, und führe aus:
python3 -m pip install -r requirements.txt
Starte das Programm mit: python3 cypherhound.py -c config.json -y queries.yaml
Das Programm liest eine Konfigurationsdatei im json-Format. Ein Beispiel dieser Datei ist unten dargestellt:
{
"user": "neo4j",
"pwd": "password",
"database": "neo4j"
}
wobei:
user dein Neo4j-Benutzername istpwd dein Neo4j-Passwort istdatabase deine Neo4j-Datenbank istDas Programm liest Abfragen aus einer YAML-Datei im folgenden Format. ad-queries.yaml wurde als Beispiel mit Abfragen zu Active Directory bereitgestellt. msg_template ist für Kürzeste-Pfade-Abfragen nicht erforderlich, aber sie müssen die Variable zurückgeben, die den Pfad enthält
queries:
- group: general
desc: List all AddKeyCredentialLink privileges for owned principals
cypher: |-
MATCH (n {owned: true})-[r:AddKeyCredentialLink]->(m)
RETURN n.name AS n_name, m.name AS m_name, labels(m) AS labels_m, labels(n) AS labels_n
ORDER BY n.name
msg_template: |-
{{ n_name }} ({{ labels_n[0] }}/{{ labels_n[1] }}) has AddKeyCredentialLink over {{ m_name }} ({{
labels_m[0] }}/{{ labels_m[1] }})
Eine Aufschlüsselung der Schlüssel/Wert-Paare ist unten zu sehen:
| Key | Beschreibung |
|---|---|
group | Die Gruppe, zu der diese Abfrage gehört, Gruppen sind benutzerdefiniert, z.B. "general" |
desc | Die Beschreibung der Abfrage |
cypher | Die Abfrage selbst im Neo4j-Format |
msg_template | Jinja2-Vorlage für die Terminalausgabe basierend auf Cypher-Variablen, Aliase für Neo4j-Variablen verwenden, um zu vermeiden, dass Jinja versucht, sie als verschachtelte Variablen zu rendern |
params.*)Das Programm verwendet Jinja2, um Cypher zu rendern. Definiere Laufzeitparameter mit dem Befehl set und referenziere sie in YAML als {{ params.<key> }}.
CLI
set <key> <value...> # e.g., set user [email protected]
unset <key> # optional
show # optional
YAML-Beispiel
- group: user
desc: List all privileges for this user
cypher: |-
MATCH (n:User)-[r]->(m)
WHERE n.name =~ '((?i){{ params.user }})'
RETURN n.name AS n_name, TYPE(r) AS rel_type, labels(m) AS labels_m, m.name AS m_name
ORDER BY TYPE(r)
msg_template: |-
User {{ n_name }} has {{ rel_type }} over {{ m_name }} ({{ labels_m[0] }}/{{ labels_m[1] }})
Häufige Parametermuster
| Param-Schlüssel | Beispielwert | Verwendung in Cypher |
|---|---|---|
params.user | [email protected] | = {{ params.user }} |
params.user_regex | (?i)john\.doe(@example\.com)? | =~ '{{ params.user_regex }}' |
params.group | Domain [email protected] | = {{ params.group }} |
params.prefix | ACME- | STARTS WITH {{ params.prefix }} |
Dieses Repository stellt ein Skript query-importer.py bereit, um Abfragen automatisch aus einer JSON-Datei in die BloodHound CE UI zu importieren. bh_query_converter.py wurde ebenfalls bereitgestellt, um eine für die Terminalanwendung vorgesehene YAML-Datei in das von query-importer.py & BloodHound CE erwartete JSON-Format zu konvertieren. Ein Beispiel des erforderlichen JSON-Formats ist unten zu sehen: