
مجموعة أدوات معيارية للاستجابة للحوادث لجمع بيانات الطب الشرعي من نقاط نهاية macOS المحتملة الإصابة، والتقاط آثار المتصفح، وآليات الثبات، والعمليات، وتكوينات الشبكة.
تم تصميم هذه المجموعة من البرامج النصية لجمع مجموعة متنوعة من البيانات من نقطة نهاية يُعتقد أنها مصابة، لتسهيل عملية الاستجابة للحوادث. لا ينبغي اعتبار هذه البيانات مجموعة كاملة من البيانات الجنائية، لكنها تلتقط الكثير من المعلومات الجنائية المفيدة.
إذا كنت تريد بيانات جنائية حقيقية، فيجب عليك حقًا التقاط تفريغ كامل للذاكرة وتصوير محرك الأقراص بأكمله. هذا ليس ضمن نطاق هذه المجموعة.
يجب تشغيل البرنامج النصي على نظام مباشر، وليس على صورة أو مخزن بيانات جنائية آخر. لا يتطلب بشكل صارم صلاحيات الجذر للتشغيل، لكنه لن يتمكن من جمع الكثير من البيانات المقصودة بدونها.
سيتم جمع البيانات في شكلين. الأول في شكل ملفات ملخصة، تحتوي على مخرجات أوامر الصدفة، البيانات المستخرجة من قواعد البيانات، وما شابه ذلك. على سبيل المثال، ستخرج وحدة browser ملفًا باسم browser_extensions.txt يحتوي على ملخص لجميع ملحقات المتصفح المثبتة لـ Safari وChrome وFirefox.
الثاني هو الملفات الكاملة التي تم جمعها من نظام الملفات. يتم تخزينها في مجلد فرعي باسم artifacts داخل مجلد التجميع.
البرنامج النصي بسيط جدًا في التشغيل. يأخذ معاملًا واحدًا فقط، وهو مطلوب، لتمرير برنامج نصي للتكوين بتنسيق JSON:
./pict.py -c /path/to/config.json
يصف برنامج التكوين النصي ما سيجمع البرنامج النصي، وكيف. يجب أن يبدو شيئًا كهذا:
{
"collection_dest" : "~/Desktop/",
"all_users" : true,
"collectors" : {
"browser" : "BrowserExtCollector",
"persist" : "PersistenceCollector",
"suspicious" : "SuspiciousBehaviorCollector",
"browserhist" : "BrowserHistoryCollector",
"bash_config" : "BashConfigCollector",
"bash_hist" : "BashHistoryCollector",
"processes" : "ProcessCollector",
"network_config" : "NetworkConfigCollector",
"profiles" : "ProfileCollector",
"certs" : "TrustedCertCollector"
},
"settings" : {
"keepLSData" : true,
"zipIt" : true
},
"moduleSettings" : {
"browser" : {
"collectArtifacts" : true
}
},
"unused" : {
"installs" : "InstallationCollector"
}
}
يحدد هذا المسار لتخزين البيانات المجمعة فيه. يمكن أن يكون مسارًا مطلقًا أو مسارًا نسبيًا لمجلد المستخدم الرئيسي (عن طريق البدء بعلامة المد (~)). المسار الافتراضي، إذا لم يتم تحديده، هو /Users/Shared.
سيتم جمع البيانات في مجلد يتم إنشاؤه في هذا الموقع. سيكون لهذا المجلد اسم على الشكل PICT-computername-YYYY-MM-DD، حيث اسم الكمبيوتر هو اسم الجهاز المحدد في تفضيلات النظام > المشاركة والتاريخ هو تاريخ التجميع.
إذا كان صحيحًا (true)، يقوم بجمع البيانات من جميع المستخدمين على الجهاز كلما أمكن. إذا كان خاطئًا (false)، يقوم بجمع البيانات فقط للمستخدم الذي يشغل البرنامج النصي. إذا لم يتم تحديده، فإن هذه القيمة تكون صحيحة (true) بشكل افتراضي.
PICT معياري، ويمكن توسيع نطاقه أو تقليله بسهولة، ببساطة عن طريق تغيير وحدات Collector المستخدمة.
بيانات collectors هي قاموس حيث المفتاح هو اسم الوحدة المراد تحميلها (اسم ملف Python بدون امتداد .py) والقيمة هي اسم الفئة الفرعية Collector الموجودة في تلك الوحدة. يمكنك إضافة إدخالات إضافية للوحدات المخصصة (انظر كتابة وحداتك الخاصة)، أو يمكنك إزالة الإدخالات لمنع تشغيل تلك الوحدات. إحدى الطرق السهلة لإزالة الوحدات، دون الحاجة إلى البحث عن الأسماء الدقيقة لاحقًا إذا كنت تريد إضافتها مرة أخرى، هي نقلها إلى قاموس من المستوى الأعلى يُسمى unused.
يوفر هذا القاموس إعدادات عالمية.
يحدد keepLSData ما إذا كان يجب الاحتفاظ بملف lsregister.txt - والذي قد يكون كبيرًا جدًا. (يتم إنشاء هذا الملف تلقائيًا ويستخدم لبناء المخرجات بواسطة بعض الوحدات الأخرى. يحتوي على ثروة من المعلومات المفيدة، لكن يمكن أن يزيد حجمه عن 100 ميغابايت. إذا لم تكن بحاجة إلى كل تلك البيانات، أو لا تريد التعامل مع هذا الكم من البيانات، فاضبط هذا على false وسيتم حذفه عند الانتهاء من التجميع.)
يحدد zipIt ما إذا كان سيتم إنشاء ملف مضغوط (zip) تلقائيًا بمحتويات مجلد التجميع. لاحظ أن عملية الضغط وفك الضغط ستغير بعض السمات، مثل ملكية الملفات.
يحدد هذا القاموس إعدادات خاصة بالوحدة. ليست كل الوحدات لها إعداداتها الخاصة، ولكن إذا كانت الوحدة تسمح بإعداداتها الخاصة، فيمكنك تقديمها هنا. في المثال أعلاه، يمكنك رؤية إعداد منطقي (boolean) باسم collectArtifacts يُستخدم مع وحدة browser.
هناك أيضًا إعدادات وحدات عالمية يتم الحفاظ عليها بواسطة فئة Collector، ويمكن تعيينها بشكل فردي لكل وحدة.
يحدد collectArtifacts ما إذا كان يجب جمع القطع الأثرية للملفات التي يتم جمعها عادةً بواسطة الوحدة. إذا كان خاطئًا (false)، فسيتم حذف جميع القطع الأثرية لتلك الوحدة. قد يكون هذا ضروريًا في الحالات التي تكون فيها مساحة التخزين عاملاً مهمًا، وتكون القطع الأثرية المجمعة كبيرة، أو في الحالات التي قد تمثل فيها القطع الأثرية المجمعة مشكلة خصوصية للمستخدم الذي يتم تحليل نظامه.
يجب أن تتكون الوحدات من ملف يحتوي على فئة فرعية من Collector (المعرفة في collectors/collector.py)، ويجب وضعها في مجلد collectors. يمكن إنشاء وحدة Collector جديدة بسهولة عن طريق نسخ ملف collectors/template.py وتخصيصه لاستخدامك الخاص.
def __init__(self, collectionPath, allUsers)يمكن تجاوز هذه الطريقة إذا لزم الأمر، ولكن يجب استدعاء Collector.__init__() الأصلية في هذه الحالة، ويفضل أن يكون ذلك قبل تنفيذ الكود المخصص الخاص بك. وهذا يعطي الكائن فرصة لإعداد خصائصه قبل أن يحاول الكود الخاص بك استخدامها.
def printStartInfo(self)هذه طريقة بسيطة جدًا سيتم استدعاؤها عند بدء جمع هذه الوحدة. الغرض منها هو طباعة رسالة إلى stdout لإعطاء المستخدم إحساسًا بالتقدم، من خلال تقديم ملاحظات حول ما يحدث.
def applySettings(self, settingsDict)يمنح هذا الوحدة فرصة لتطبيق أي إعدادات مخصصة. يمكن أن تحتوي كل وحدة على إعداداتها الخاصة المعرفة ذاتيًا، ولكن يجب أيضًا تمرير settingsDict إلى الفئة الأصلية، حتى تتمكن فئة Collection من التعامل مع أي إعدادات تعرفها.
def collect(self)هذه الطريقة هي جوهر الوحدة. يتم استدعاؤها عندما يحين وقت بدء الجمع. يمكنها كتابة أي عدد من الملفات حسب الحاجة، ولكن يجب حصر هذا النشاط في الملفات الموجودة ضمن المسار self.collectionPath، ويجب استخدام أسماء ملفات غير مستخدمة بالفعل من قبل وحدات أخرى.
إذا كنت ترغب في جمع القطع الأثرية، فلا تحاول القيام بذلك بنفسك. ما عليك سوى إضافة المسارات إلى مصفوفة self.pathsToCollect، وستتولى فئة Collector نسخها إلى المسارات الفرعية المناسبة في مجلد artifacts، والحفاظ على البيانات الوصفية (الأذونات، السمات الموسعة، العلامات، إلخ) على القطع الأثرية.
عند انتهاء الطريقة، تأكد من استدعاء الطريقة الأصلية (Collector.collect(self)) لإعطاء فئة Collector الفرصة للتعامل مع مسؤولياتها، مثل جمع القطع الأثرية.
يمكن لطريقتك collect استخدام أي بيانات تم جمعها في الملفات basic_info.txt أو lsregister.txt الموجودة في self.collectionPath. يتم جمع هذه في البداية بواسطة برنامج pict.py النصي، ويمكن افتراض أنها متاحة للاستخدام من قبل أي وحدات أخرى. ومع ذلك، لا يجب أن تعتمد على مخرجات أي وحدات أخرى، حيث لا يوجد ضمان بأن الملفات ستكون متاحة عند تشغيل وحدتك. قد لا يتم تشغيل الوحدات بالترتيب الذي تظهر به في JSON التكوين الخاص بك، نظرًا لأن قواميس Python غير مرتبة.
شكرًا لـ Greg Neagle على FoundationPlist.py، الذي حل العديد من المشكلات المتعلقة بقراءة plists الثنائية، وplists التي تحتوي على أنواع بيانات التاريخ، إلخ.