
आपका टेम्पलेट-आधारित BloodHound टर्मिनल साथी उपकरण

एक Python3 टर्मिनल एप्लिकेशन जिसमें BloodHound डेटा सेट के लिए Neo4j सिफ़र हैं और BloodHound CE में उन्हें आयात करने के लिए एक स्क्रिप्ट है।
टर्मिनल

HTML रिपोर्ट

HTML रिपोर्ट (जारी)

BloodHound हर पेनिट्रेशन टेस्टर के लिए एक मुख्य उपकरण है। हालांकि, इसके डिज़ाइन के आधार पर कुछ नकारात्मक प्रभाव हैं। मैं उन सबसे बड़े समस्याओं को कवर करूंगा जो मैंने अनुभव की हैं और यह उपकरण किन मुद्दों को हल करने का लक्ष्य रखता है:
JSON ग्राफ़ को पार्स नहीं करते, मुझे ग्राफ़ परिणामों की लाइन-दर-लाइन .txt फ़ाइल चाहिए अन्य उपकरणों से वास्तव में हमला करने के लिएयह उपकरण रेड और ब्लू दोनों टीमों के लिए महत्वपूर्ण मूल्य प्रदान कर सकता है।
CypherHound के साथ अपने BloodHound डेटा का नियंत्रण वापस लें!
grep/cut/awk-अनुकूल प्रारूप में उदाहरण प्रदान किए गएcustomqueries.json आयातक स्क्रिप्ट BloodHound CE में शामिल हैसुनिश्चित करें कि python3 स्थापित है और चलाएं:
python3 -m pip install -r requirements.txt
प्रोग्राम को इस प्रकार शुरू करें: python3 cypherhound.py -c config.json -y queries.yaml
प्रोग्राम json प्रारूप में एक कॉन्फ़िगरेशन फ़ाइल पढ़ेगा। इस फ़ाइल का एक उदाहरण नीचे दिखाया गया है:
{
"user": "neo4j",
"pwd": "password",
"database": "neo4j"
}
जहाँ:
user आपका Neo4j उपयोगकर्ता नाम हैpwd आपका Neo4j पासवर्ड हैdatabase आपका Neo4j डेटाबेस हैप्रोग्राम नीचे दिए गए प्रारूप में YAML फ़ाइल से क्वेरी पढ़ता है। ad-queries.yaml एक उदाहरण के रूप में प्रदान किया गया है जिसमें Active Directory से संबंधित क्वेरी हैं। msg_template सबसे छोटे पथ क्वेरी के लिए आवश्यक नहीं है लेकिन उन्हें पथ वाले चर को वापस करना होगा
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] }})
नीचे कुंजी/मान जोड़े का एक तालिका विवरण देखा जा सकता है:
| कुंजी | विवरण |
|---|---|
group | यह समूह जिससे यह क्वेरी संबंधित है, समूह उपयोगकर्ता-परिभाषित हैं जैसे "general" |
desc | क्वेरी का विवरण |
cypher | Neo4j प्रारूप में क्वेरी स्वयं |
msg_template | सिफ़र चर पर आधारित टर्मिनल आउटपुट के लिए Jinja2 टेम्पलेट, Neo4j चर के लिए उपनाम का उपयोग करें ताकि Jinja उन्हें नेस्टेड चर के रूप में रेंडर न करे |
params.*)प्रोग्राम सिफ़र को रेंडर करने के लिए Jinja2 का उपयोग करता है। set कमांड के साथ रनटाइम पैरामीटर परिभाषित करें और YAML में {{ params.<key> }} के रूप में संदर्भित करें।
सीएलआई
set <key> <value...> # e.g., set user [email protected]
unset <key> # optional
show # optional
YAML उदाहरण
- 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] }})
सामान्य पैराम पैटर्न
| पैराम कुंजी | उदाहरण मान | सिफ़र में उपयोग |
|---|---|---|
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 }} |
यह रिपॉजिटरी एक query-importer.py स्क्रिप्ट प्रदान करता है जो JSON फ़ाइल से BloodHound CE UI में क्वेरी आयात करने को स्वचालित करता है। bh_query_converter.py भी प्रदान किया गया है जो टर्मिनल एप्लिकेशन के लिए बनाई गई YAML फ़ाइल को BloodHound CE और query-importer.py द्वारा अपेक्षित JSON प्रारूप में परिवर्तित करता है। आवश्यक JSON प्रारूप का एक उदाहरण नीचे देखा जा सकता है:
{
"queries": [
{
"name": "List all AddKeyCredentialLink privileges for owned principals",
"description": "List all AddKeyCredentialLink privileges for owned principals - General",
"query": "MATCH p=(n {owned: true})-[r:AddKeyCredentialLink]->(m)\nRETURN p\nORDER BY n.name"
},
{
"name": "List all AddKeyCredentialLink privileges for Users, Domain Users, Authenticated Users, and Everyone groups",
"description": "List all AddKeyCredentialLink privileges for Users, Domain Users, Authenticated Users, and Everyone groups - General",
"query": "MATCH p=(n:Group)-[r:AddKeyCredentialLink]->(m)\nWHERE (n.objectid =~ \"(?i)S-1-5-21-.*-513\" OR n.objectid =~ \"(?i).*-S-1-5-11\" OR n.objectid =~ \"(?i).*-S-1-1-0\" OR n.objectid =~ \"(?i).*-S-1-5-32-545\")\nRETURN p\nORDER BY n.name"
}
]
}
पूर्ण कमांड मेनू नीचे दिखाया गया है: