
أداة جمع بيانات Active Directory تعتمد على واجهة نصية (TUI)، تقوم بجمع كائنات LDAP، وتنفيذ عمليات جمع عن بُعد عبر RPC/SMB/HTTP، وتوليد مخرجات متوافقة مع BloodHound CE لتحليل مسارات الهجوم.
واجهة مستخدم طرفية (TUI) لجمع معلومات Active Directory.
الأهداف الرئيسية لهذا المشروع هي:
يقوم Flashingestor بتنفيذ 3 خطوات أساسية منفصلة: استيراد LDAP والجمع عن بُعد والتحويل، على عكس المجمعات الأخرى التي تقوم بتشغيل الطرق المحددة في خطوة واحدة:
الاستيراد (Ctrl+l) - يجمع بيانات سمات الكائنات الأولية من LDAP ويخزنها تحت output/ldap في ملفات msgpack وسيطة. يمكن تخصيص الاستعلامات في config.yaml.
الجمع عن بُعد (Ctrl+r) - يقرأ هذه الملفات الوسيطة في الذاكرة، ويحسب قائمة أجهزة الكمبيوتر المراد جمعها، ويقوم بسلسلة من طلبات RPC/SMB/HTTP للحصول على المعلومات البعيدة ذات الصلة لكائنات Computer وEnterpriseCA، والتي تُخزن تحت output/remote.
التحويل (Ctrl+s) - يقرأ الملفات الوسيطة في الذاكرة، ويدمج المعلومات من خطوات الاستيراد والجمع عن بُعد، ويُنتج تفريغًا متوافقًا مع Bloodhound تحت output/bloodhound - هذه الخطوة غير متصلة بالإنترنت بالكامل.
لمزيد من التفاصيل والرؤى الفنية، راجع 📖 Wiki.
$ git clone https://github.com/Macmod/flashingestor
$ cd flashingestor
# للبناء فقط:
$ go build ./cmd/flashingestor
# لتثبيت الملف التنفيذي إلى $GOBIN أو $GOPATH/bin:
$ go install ./cmd/flashingestor
[!ملاحظة] يمكنك أيضًا استخدام الملفات الثنائية المعدة مسبقًا من Releases المتاحة.
أولاً، قم بالمصادقة باستخدام إحدى الطرق التالية:
# مجهول
# [يتطلب dSHeuristics بقيمة 0000002 في كائن DirectoryServices
# وقد تكون الرؤية محدودة بسبب عدم وجود أذونات Read ACEs]
$ ./flashingestor -u '@<DOMAIN>' -p '' [...]
# مستخدم + كلمة مرور
$ ./flashingestor -u <USER>@<DOMAIN> -p <PASSWORD> [-k] [...]
# مستخدم + NTHash
$ ./flashingestor -u <USER>@<DOMAIN> -H <NTHASH> [-k] [...]
# مستخدم + PFX
$ ./flashingestor -u <USER>@<DOMAIN> --pfx <PFXPATH> [--pfx-password <PFXPASS>] [-k] [...]
# مستخدم + PEM
$ ./flashingestor -u <USER>@<DOMAIN> --cert <PEMPATH> --key <KEYPATH> [-k] [...]
# مستخدم + AESKey
$ ./flashingestor -u <USER>@<DOMAIN> --aes-key <AESKEY> -k [...]
# مستخدم + تذكرة
$ ./flashingestor -u <USER>@<DOMAIN> --ccache /path/to/ticket.ccache -k [...]
أو
$ KRB5CCNAME=/path/to/ticket.ccache ./flashingestor -u <USER>@<DOMAIN> -k [...]
ثم قم بتشغيل الخطوات حسب الرغبة. لجمع LDAP فقط (DCOnly باستثناء GPOLocalGroup وCertServices)، فقط نفذ Ctrl+l، وتحقق من نجاح الاستيراد، ثم نفذ Ctrl+s لإنشاء التفريغ النهائي.
يوصى بتحديد --dc و--dns لتشغيل flashingestor. إذا لم تحدد --dc، سيحاول flashingestor العثور عليه عبر استعلامات SRV / A، مما قد يؤخر خطوة الاستيراد الأولية.
يجب عليك بعد ذلك تحديد --dns إذا كان خادم DNS القياسي الخاص بك لا يعرف المجال - عند استخدام DNS المتكامل مع Active Directory، فقط وجه --dns إلى DC المستضيف له. بالإضافة إلى ذلك، بغض النظر عن --dc، إذا كنت تريد تشغيل خطوة الجمع عن بُعد وكان خادم DNS الخاص بك لا يعرف أجهزة الكمبيوتر في المجال، فيجب عليك تحديد --dns للاستعلامات.
[!تلميح] في بيئات ذات DCs متعددة، يمكنك أيضًا استخدام أداة
dcprobeلقياس زمن الوصول إلى جميع DCs والعثور على هدف جيد للاستيراد:$ go build ./cmd/dcprobe $ ./dcprobe --dns 192.168.88.6 -d creta.local -r 10
إذا لم يكن ملف التكوين موجودًا في الدليل الحالي باسم config.yaml أو في المسار المقدم عبر --config، سيتم افتراض الخيارات الافتراضية (نفس تلك الموجودة في config.yaml المقدم) - وهي مضمنة في config/fallback.go. لمزيد من المعلومات، اقرأ Configuration File.
ضع في اعتبارك استخدام --log لتحديد ملف إخراج للسجلات (في حالة احتياجك لمراجعتها بعد إغلاق TUI) و-vv لرؤية رسائل سجل التصحيح، حيث قد تساعد هذه في استكشاف المشكلات المحتملة. للحصول على مرجع كامل لوسائط سطر الأوامر، اقرأ Command-Line Arguments.
[!ملاحظة] الاستعلامات الافتراضية في
config.yamlالمقدم مصممة مع وضع المعلومات المطلوبة لتحويل Bloodhound في الاعتبار. يمكنك اختيار تخصيص الاستعلامات أو السمات فيconfig.yaml، ولكن من الأفضل محاولة تجنب إزالة السمات الضرورية، وتجنب تغيير معنى مرشحات البحث.
إذا تم تعيين recurse_trusts على true، فسيقوم باستيراد أي مجالات موثوقة يتم العثور عليها بشكل متكرر باستخدام بيانات الاعتماد الأولية المقدمة للاستيراد.
إذا تم تعيين search_forest على true، فسيقوم باستيراد المجالات التي تشكل جزءًا من نفس الغابة مثل المجال الأولي من قسم Configuration - لن يتم إصدار استعلامات إضافية، لأن هذا جزء بالفعل من خطة الاستيراد الافتراضية. يمكن تعيين كلا الخيارين في نفس الوقت، وسيقوم flashingestor باستيراد أي مجال يتم العثور عليه مرة واحدة فقط (إما عبر ثقة، أو عبر الغابة الحالية).
إذا تم تمكين recurse_trusts وتم تعيين recurse_feasible_only أيضًا على true، فسيحاول فقط استيراد مجال موثوق إذا كانت الثقة:
هذا يعني أن الثقات الصادرة فقط لن يتم اجتيازها، وبصرف النظر عن المستوى الأول من الثقات، تتوقف مسارات الاستيراد عند الثقات غير المتعدية - إذا كانت B تثق في A بشكل غير متعدٍ، فلا يزال بإمكان A المصادقة في B؛ ولكن إذا كانت C أيضًا تثق في B بشكل غير متعدٍ، فلا يمكن لـ A المصادقة على C.
[!هام]
recurse_trusts/search_forestستصادق فقط على LDAP في المجالات المكتشفة باستخدام بيانات الاعتماد المحددة من المجال المصدر عندما تكون بيانات الاعتماد المقدمة إماكلمة مرور عاديةأوتجزئة NT؛ استخدام TGT لإصدار تذكرة إحالة لهذا الغرض ممكن نظريًا ولكن لم يتم تنفيذه بعد في مكتبةadauth.
يمكن أيضًا استخدام سلاسل الوسائط الوسيطة من Macmod/ldapx مباشرة مع flashingestor لتشويش استعلامات LDAP في خطوة الاستيراد باستخدام الخيارات -f (--ldapx-filter)، و-a (--ldapx-attrs)، و-b (--ldapx-basedn). مع -vv، سيتم أيضًا عرض الاستعلامات الأولية قبل وبعد التشويش في السجل.
إذا كنت تنوي تشغيل خطوة الجمع عن بُعد، تحقق من methods الممكّنة - تتوافق هذه تقريبًا مع الطرق التي تقدمها SharpHound ويمكن استخدامها لتبديل مجموعات محددة عبر RPC أو HTTP.
يمكن استخدام وسائط --remote-* لتحديد مجموعة منفصلة من بيانات الاعتماد للجمع عن بُعد. إذا لم يتم تحديدها، سيحاول flashingestor استخدام نفس بيانات الاعتماد للمستخدم المقدم في وسائط الاستيراد القياسية (--user، --password، إلخ).
يمكن أيضًا استخدام مسؤول محلي للجمع عن بُعد عن طريق تحديد --remote-user Administrator@. على سبيل المثال، لكن فعالية هذا النهج ستعتمد على ما إذا كان الحساب هو المسؤول المدمج أم لا، وعلى قيم مفاتيح التسجيل FilterAdministratorToken / LocalAccountTokenFilterPolicy. لمزيد من التفاصيل حول هذا السلوك، راجع Pass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicy
يمكن أن تساعد الخيارات compress_output وcleanup_after_compression في الحفاظ على صغر استخدام القرص. بعد تحميل التفريغ النهائي في Bloodhound، يمكنك حذف الملفات تحت output/ldap وoutput/remote يدويًا بأمان إذا لم تكن بحاجة إليها، ولكن يمكن الاحتفاظ بهذه الملفات للبحث عن معلومات مهمة دون الحاجة إلى إعادة تشغيل المجموعة الكاملة.
[!تلميح] الغرض الأساسي من ملفات
msgpackتحت مجلداتoutput/ldapوoutput/remoteهو العمل كتنسيق وسيط لفصل المسؤوليات للعملية بأكملها، ولكن يمكن أيضًا استخدام هذه الملفات كمصدر معلومات عن طريق تحويلها إلى JSON - بهذه الطريقة لا تضطر إلى البحث عن سمات الكائنات الأولية أو نتائج الجمع عن بُعد:$ go build ./cmd/ingest2json $ ./ingest2json output/ldap/YOURDOMAIN/SelectedFile.msgpack -o output.jsonطريقة جيدة لفحص هذه الملفات هي استخدام JQ/FX، أو لغة البرمجة المفضلة لديك 🙂
نرحب بالمساهمات من خلال فتح مشكلة أو تقديم طلب سحب.
شكر كبير لـ SpecterOps على BloodHound، وSharpHound / SharpHoundCommon و لـ dirkjanm على BloodHound.py، والتي كانت المراجع الرئيسية لهذه الأداة.
شكر لـ rtpt-erikgeiser و RedTeamPentesting على adauth و لـ p0dalirius على winacl، كلاهما مكتبات مفيدة حقًا.
شكر لـ oiweiwei على go-msrpc، حيث جعلت مكتبته من الممكن تنفيذ طرق الجمع عن بُعد المستندة إلى RPC.
Protected Users أو عندما يتم حظر مصادقة NTLM عبر إعدادات الأمان) أو باستخدام الشهادات (التي تستخدم PKINIT تحت الغطاء)، لن يحاول الجمع عن بُعد المصادقة على أجهزة كمبيوتر من مجالات تختلف عن المجال الذي ينتمي إليه المستخدم. ينطبق هذا أيضًا على طريقة GPOLocalGroup، والتي في تلك الحالات لن تحاول قراءة ملفات GPO من DCs للمجالات الأخرى، حتى إذا كانت هناك مجالات متعددة في البيانات المستوردة.SmbInfo لنوع Computer لا يزال تنفيذًا أساسيًا (فحوصات التسجيل فقط).HttpEnrollmentEndpoints يعمل فقط مع اسم مستخدم/كلمة مرور مقدمة.AllowedToDelegateTo / ServicePrincipalNames لا يزال تنفيذًا أساسيًا.يتم دعم جميع الخصائص تقريبًا المنفذة في SharpHound، ولكن هناك العديد من الاختلافات المعمارية بين هذه الأداة وSharpHound، لذلك لا تتوقع تطابق المخرجات تمامًا مع التنفيذ الرسمي (باستثناء الأخطاء المحتملة). قد تنشأ اختلافات رئيسية خاصة للتنفيذات الأكثر تعقيدًا، مثل المجموعات عن بُعد عبر RPC والمجموعات المتعلقة بإساءة استخدام CA/الشهادات.
لا تزال مهلات الوقت ثابتة في الغالب - يستخدم تنفيذ SharpHound مهلة تكيفية (ذكية جدًا!)، لكن لم يكن لدي وقت لدراسة ذلك بعد. إذا لزم الأمر، قم بتخصيص مهلات الوقت باستخدام خيارات --timeout و--computer-timeout و--method-timeout (config/config.go يحدد مهلات أخرى خاصة بالعملية).
الاختبارات غير منفذة حاليًا وقد قمت فقط باختبار مجموعة صغيرة من الميزات يدويًا.
The MIT License (MIT)
Copyright (c) 2023 Artur Henrique Marzano Gonzaga
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.