
أداتك المصاحبة للطرفية والقائمة على القوالب لـ BloodHound

تطبيق طرفية Python3 يحتوي على استعلامات Neo4j من نوع Cypher لمجموعات بيانات BloodHound مع نص برمجي لأتمتة استيرادها إلى BloodHound CE.
الطرفية

تقرير HTML

تقرير HTML (تابع)

BloodHound هو أداة أساسية لكل مختبر اختراق. ومع ذلك، هناك بعض الآثار الجانبية السلبية بناءً على تصميمه. سأغطي أكبر نقاط الألم التي مررت بها وما تهدف هذه الأداة إلى معالجته:
JSON المصدرة، أحتاج إلى نتائج الرسم البياني بتنسيق سطرًا تلو الآخر .txt لأتمكن بالفعل من مهاجمة الأشياء من أدوات أخرىيمكن أن توفر هذه الأداة قيمة كبيرة لكل من الفرق الحمراء والزرقاء.
استعد السيطرة على بيانات BloodHound الخاصة بك مع CypherHound!
grep/cut/awkcustomqueries.json الخاص بـ BloodHound Legacy إلى 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 لإخراج الطرفية بناءً على متغيرات cypher، استخدم أسماء مستعارة لمتغيرات Neo4j لتجنب محاولة Jinja عرضها كمتغيرات متداخلة |
params.*)يستخدم البرنامج Jinja2 لعرض Cypher. حدد معاملات وقت التشغيل باستخدام الأمر set وارجع إليها في YAML كـ {{ params.<key> }}.
CLI
set <key> <value...> # مثال: set user [email protected]
unset <key> # اختياري
show # اختياري
مثال 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] }})
أنماط المعاملات الشائعة
| مفتاح المعامل | قيمة مثال | الاستخدام في 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 }} |
يوفر هذا المستودع نصًا برمجيًا query-importer.py لأتمتة استيراد الاستعلامات إلى واجهة BloodHound CE من ملف JSON. كما تم توفير bh_query_converter.py لتحويل ملف YAML مخصص لتطبيق الطرفية إلى تنسيق JSON المتوقع بواسطة query-importer.py و BloodHound CE. مثال على تنسيق 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"
}
]
}
قائمة الأوامر الكاملة موضحة أدناه: