
आपका टेम्पलेट-आधारित 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] }})
नीचे कुंजी/मान जोड़े का एक तालिका विवरण देखा जा सकता है:
| कुंजी | विवरण |
|---|
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] }})
सामान्य पैराम पैटर्न
यह रिपॉजिटरी एक 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"
}
]
}
पूर्ण कमांड मेनू नीचे दिखाया गया है:
Documented commands (use 'help -v' for verbose/'help <topic>' for details):
======================================================================================================
alias Manage aliases
clear Clear the terminal.
cls Clear the terminal.
edit Run a text editor and optionally open a file with it
export Run a query and save its results
help List available commands or provide detailed help for a specific command
history View, run, edit, save, or clear previously entered commands
list List queries by group.
macro Manage macros
report Run multiple queries and generate a HTML report
run Execute a query
run_pyscript Run a Python script file inside the console
run_script Run commands in script file that is encoded as either ASCII or UTF-8 text
search Full-text search through stored queries.
set Set a dynamic search parameter (set <TARGET> <VALUE...>)
shell Execute a command as if at the OS prompt
shortcuts List available shortcuts
show Show dynamic search parameters
unset Unset a dynamic search parameter (unset <TARGET>)
Undocumented commands:
======================
exit q quit stop

query-importer.py स्क्रिप्ट JSON फ़ाइल से BloodHound CE UI में क्वेरी आयात करने को स्वचालित करेगी। bh_query_converter.py भी प्रदान किया गया है जो टर्मिनल एप्लिकेशन के लिए बनाई गई YAML फ़ाइल को BloodHound CE और query-importer.py द्वारा अपेक्षित JSON प्रारूप में परिवर्तित करता है।
यह स्क्रिप्ट टर्मिनल एप्लिकेशन के लिए बनाई गई YAML को query-importer.py स्क्रिप्ट के माध्यम से BloodHound CE में आसान आयात के लिए JSON फ़ाइल में परिवर्तित करेगी। ad-queries.json एक उदाहरण के रूप में प्रदान किया गया है कि आउटपुट फ़ाइल कैसी दिखती है और यह query-importer.py और BloodHound CE में क्वेरी आयात करने के लिए तैयार है।
यह स्क्रिप्ट BloodHound Legacy से एक customqueries.json फ़ाइल पढ़ेगी और आपके API क्रेडेंशियल का उपयोग करके उन सभी को BloodHound Community Edition के नए संस्करण में आयात करेगी। यह प्रदान किया गया है ताकि आपके द्वारा BloodHound Legacy के लिए बनाई गई क्वेरी का उपयोग Community Edition के साथ किया जा सके।
यह स्क्रिप्ट भविष्य के आयात के लिए रीसेट करने के लिए BloodHound से सभी सहेजी गई क्वेरी को हटा देगी। यह BloodHound CE के लिए है।
यह स्क्रिप्ट एक .txt फ़ाइल से नोड नामों की सूची पढ़ेगी और उन्हें डेटाबेस में स्वामित्व या उच्च-मूल्य के रूप में चिह्नित करेगी।
उपयोग
स्क्रिप्ट का उपयोग करने के लिए, आपके पास दो फ़ाइलें तैयार होनी चाहिए:
BloodHound प्रारूप में नोड नामों वाली एक लाइन-दर-लाइन .txt फ़ाइल
[email protected][email protected]COMPUTER.DOMAIN.LOCALjson प्रारूप में कॉन्फ़िगरेशन फ़ाइल जिसमें आपका Neo4j उपयोगकर्ता नाम, पासवर्ड और डेटाबेस हो (उदाहरण ऊपर दिखाया गया है)स्क्रिप्ट में निम्नलिखित विकल्प हैं:
-h, --help show this help message and exit
-c CONFIG, --config CONFIG
Config file
-l LIST, --list LIST List of node names
-o, --owned Set target nodes as owned
-v, --high-value Set target nodes as high-value
आपको कम से कम -o या -v निर्दिष्ट करना होगा
यह स्क्रिप्ट BloodHound CE API का उपयोग करके SpecterOps BloodHoundQueryLibrary की सहेजी गई क्वेरी को BloodHound Community Edition में आयात करता है।
Queries.json / Queries.zipQueries.json / Queries.zip का URLplatforms द्वारा क्वेरी फ़िल्टर करता है (केस-असंवेदनशील)/api/v2/saved-queries)Retry-After का उपयोग करके API दर सीमित करने (HTTP 429) के लिए पुनः प्रयास तर्क शामिल हैSpecterOps
Queries.jsonऔरQueries.zipको रिलीज़ आर्टिफैक्ट के रूप में प्रकाशित करता है (रिपो में संग्रहीत नहीं)। नवीनतम रिलीज़ डाउनलोड URL हैं:
https://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.jsonhttps://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.zip
उपयोग (स्थानीय फ़ाइल)
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--queries-file "/path/to/Queries.json" \
--base-url "http://127.0.0.1:8080"
उपयोग (सीधा URL)
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--queries-url "https://github.com/SpecterOps/BloodHoundQueryLibrary/releases/latest/download/Queries.json" \
--base-url "http://127.0.0.1:8080"
उपयोग (स्वचालित: नवीनतम रिलीज़)
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--bhql-latest \
--base-url "http://127.0.0.1:8080"
प्लेटफ़ॉर्म-फ़िल्टर्ड आयात (उदाहरण)
# केवल उन क्वेरी को आयात करें जो Active Directory का समर्थन करती हैं
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--bhql-latest \
--platforms "Active Directory" \
--base-url "http://127.0.0.1:8080"
# कई प्लेटफ़ॉर्म के लिए क्वेरी आयात करें (कोई भी मिलान)
python3 scripts/bhql/query-importer.py \
--token-id "<TOKEN_ID>" \
--token-key "<TOKEN_KEY>" \
--bhql-latest \
--platforms "Active Directory" "Azure" \
--base-url "http://127.0.0.1:8080"
सुझाव: आप BloodHound CE में एक टोकन बना सकते हैं और इसका Token ID/Key यहाँ उपयोग कर सकते हैं। यदि आप आयात करने से पहले "नई शुरुआत" करना चाहते हैं, तो शामिल पर्ज स्क्रिप्ट का उपयोग करें (
scripts/bloodhound-ce/purge-queries.pyदेखें)।
एक मौजूदा BloodHound क्वेरी YAML को इस प्रकार पुन: स्वरूपित करें कि:
यदि आप मूल DPAT रिपॉजिटरी में cypherhound कार्यक्षमता को विलय नहीं देखते हैं, तो कृपया मेरे DPAT फोर्क तक पहुँचें जिसमें यह होगा।
यह स्क्रिप्ट टर्मिनल एप्लिकेशन से कच्चे निर्यात को पार्स करेगी, विशेष रूप से सभी उपयोगकर्ता समूह सदस्यता सूचीबद्ध करने के लिए सिफ़र, इस उपकरण के आउटपुट को कैसे पार्स किया जा सकता है इसका एक उदाहरण के रूप में। आप इस निर्यात को स्क्रिप्ट, एक NTDS.dit फ़ाइल और एक आउटपुट निर्देशिका में पैरामीटर के रूप में पास करेंगे। यह तब आउटपुट निर्देशिका में प्रत्येक समूह नाम के लिए DOMAIN\USER प्रारूप में प्रविष्टियों के साथ .txt फ़ाइलें उत्पन्न करेगा, जो DPAT के साथ संगत है। फिर आप इस निर्देशिका को DPAT को -g कमांडलाइन तर्क के साथ पास करेंगे, जिससे ऑपरेटर डोमेन में प्रत्येक समूह के लिए समूह-विशिष्ट सांख्यिकी उत्पन्न कर सकता है।
स्क्रिप्ट का उपयोग करने के लिए, आपके पास दो फ़ाइलें तैयार होनी चाहिए:
NTDS.dit फ़ाइल जिसमें निम्नलिखित प्रारूप में पंक्तियाँ हों: domain\user:RID:LMhash:NTLMhash:::उपयोग
usage: parse-memberships.py [-m MEMBERSHIPS_FILE] [-d DOMAIN] [-n NTDS_FILE] [-o OUTPUT_DIR] [--netbios NETBIOS] [--encoding ENCODING]
[--debug] [--no-index] [-h]
Map users to groups from memberships file and match against NTDS dump.
options:
-m, --memberships-file MEMBERSHIPS_FILE
Path to memberships file (BloodHound-style lines) (default: None)
-d, --domain DOMAIN FQDN domain (e.g., EXAMPLE.COM) used in the membership regex (default: None)
-n, --ntds-file NTDS_FILE
Path to NTDS dump (DOMAIN\user:hash or pwdump-style) (default: None)
-o, --output-dir OUTPUT_DIR
Directory to write per-group output files (default: None)
--netbios NETBIOS NETBIOS/short domain to prefix when NTDS lines lack a domain (pwdump) (default: None)
--encoding ENCODING Encoding for input files (default: cp1252)
--debug Enable verbose debug output (default: False)
--no-index Name group files after the group instead of numbered files (unsafe chars replaced) (default: False)
-h, --help Show this help message and exit
यह स्क्रिप्ट सभी kerberoastable उपयोगकर्ताओं को सूचीबद्ध करने के लिए कच्चे निर्यात को पार्स करेगी, उपयोगकर्ताओं को NTDS.dit में प्रविष्टियों से मिलाएगी, और डंप से सभी kerberoastable उपयोगकर्ता हैश प्रविष्टियों वाली एक आउटपुट फ़ाइल उत्पन्न करेगी। फिर आप इस आउटपुट फ़ाइल को DPAT को -kz ध्वज के साथ पास करते हैं ताकि क्रैक किए गए kerberoastable खाता आँकड़े प्रदान किए जा सकें।
उपयोग
usage: parse-kerberoastable.py [-k KERB_FILE] [-n NTDS_FILE] [-d DOMAIN] [-o OUTPUT] [--encoding ENCODING] [--debug] [-h]
Match kerberoastable usernames against an NTDS.dit dump file
options:
-k, --kerb-file KERB_FILE
Path to Kerberoast output file (default: None)
-n, --ntds-file NTDS_FILE
Path to NTDS dump file (default: None)
-d, --domain DOMAIN Domain (e.g., EXAMPLE.COM) for regex matching (default: None)
-o, --output OUTPUT Path to write matches (default: None)
--encoding ENCODING File encoding to use when reading input files (default: cp1252)
--debug Enable verbose debug output (default: False)
-h, --help Show this help message and exit
Neo4j डेटाबेस और URI का उपयोग करने के लिए कॉन्फ़िगर किया गया हैBloodHound 4.3.1 और उससे ऊपर के संस्करणों के लिए बनाया गया है, कुछ किनारे पिछले संस्करणों के लिए काम नहीं करेंगेजुलाई 15, 2023 को मैंने परियोजना में कुछ बदलाव करने का निर्णय लिया। इस तिथि के बाद, यह परियोजना हमेशा प्रायोजकों के लिए निजी संस्करण से एक संस्करण पीछे रखी जाएगी। नवीनतम सिफ़र, सुविधाओं और बग फिक्स तक पहुँच के लिए मुझे प्रायोजित करना सुनिश्चित करें। इस स्तर पर मुझे प्रायोजित करके, आपको अतिरिक्त निजी रिपॉजिटरी तक भी पहुँच मिलेगी जो मैंने सार्वजनिक रूप से जारी नहीं की है!
Azure किनारों के लिए सिफ़र जोड़ेंकृपया किसी भी समस्या के साथ विस्तृत विवरण दें जिसे आप खोलने का निर्णय लेते हैं और यदि संभव हो तो आउटपुट प्रदान करें (यदि लागू हो)।
group | यह समूह जिससे यह क्वेरी संबंधित है, समूह उपयोगकर्ता-परिभाषित हैं जैसे "general" |
desc | क्वेरी का विवरण |
cypher | Neo4j प्रारूप में क्वेरी स्वयं |
msg_template | सिफ़र चर पर आधारित टर्मिनल आउटपुट के लिए Jinja2 टेम्पलेट, Neo4j चर के लिए उपनाम का उपयोग करें ताकि Jinja उन्हें नेस्टेड चर के रूप में रेंडर न करे |
| पैराम कुंजी | उदाहरण मान | सिफ़र में उपयोग |
|---|
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 }} |