
मॉड्यूलर घटना प्रतिक्रिया टूलकिट जो संभावित रूप से संक्रमित 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 मॉड्यूलर है, और केवल उपयोग किए जाने वाले कलेक्टर मॉड्यूल को बदलकर आसानी से विस्तारित या घटाया जा सकता है।
collectors डेटा एक डिक्शनरी है जिसमें key लोड करने के लिए मॉड्यूल का नाम (.py एक्सटेंशन के बिना Python फ़ाइल का नाम) है और value उस मॉड्यूल में पाए जाने वाले Collector उपवर्ग का नाम है। आप कस्टम मॉड्यूल के लिए अतिरिक्त प्रविष्टियाँ जोड़ सकते हैं (देखें अपने स्वयं के मॉड्यूल लिखना), या उन मॉड्यूल को चलने से रोकने के लिए प्रविष्टियाँ हटा सकते हैं। मॉड्यूल को हटाने का एक आसान तरीका, बाद में उन्हें फिर से जोड़ने के लिए सटीक नाम देखने की आवश्यकता के बिना, उन्हें unused नामक एक शीर्ष-स्तरीय डिक्शनरी में ले जाना है।
यह डिक्शनरी वैश्विक सेटिंग्स प्रदान करती है।
keepLSData यह निर्दिष्ट करता है कि lsregister.txt फ़ाइल - जो काफी बड़ी हो सकती है - रखी जानी चाहिए या नहीं। (यह फ़ाइल स्वचालित रूप से उत्पन्न होती है और कुछ अन्य मॉड्यूल द्वारा आउटपुट बनाने के लिए उपयोग की जाती है। इसमें बहुत सारी उपयोगी जानकारी होती है, लेकिन इसका आकार 100 MB से अधिक हो सकता है। यदि आपको उस सभी डेटा की आवश्यकता नहीं है, या इतने अधिक डेटा से निपटना नहीं चाहते हैं, तो इसे false पर सेट करें और संग्रह समाप्त होने पर इसे हटा दिया जाएगा।)
zipIt यह निर्दिष्ट करता है कि संग्रह फ़ोल्डर की सामग्री के साथ स्वचालित रूप से एक ज़िप फ़ाइल उत्पन्न की जाए या नहीं। ध्यान दें कि डेटा को ज़िप और अनज़िप करने की प्रक्रिया कुछ विशेषताओं, जैसे फ़ाइल स्वामित्व, को बदल देगी।
यह डिक्शनरी मॉड्यूल-विशिष्ट सेटिंग्स निर्दिष्ट करती है। सभी मॉड्यूल की अपनी सेटिंग्स नहीं होती हैं, लेकिन यदि किसी मॉड्यूल में अपनी सेटिंग्स की अनुमति है, तो आप उन्हें यहाँ प्रदान कर सकते हैं। उपरोक्त उदाहरण में, आप browser मॉड्यूल के साथ collectArtifacts नामक एक बूलियन सेटिंग का उपयोग होते देख सकते हैं।
कलेक्टर वर्ग द्वारा बनाए रखी गई वैश्विक मॉड्यूल सेटिंग्स भी हैं, जिन्हें प्रत्येक मॉड्यूल के लिए अलग-अलग सेट किया जा सकता है।
collectArtifacts यह निर्दिष्ट करता है कि मॉड्यूल द्वारा सामान्य रूप से एकत्र किए जाने वाले फ़ाइल आर्टिफैक्ट्स को एकत्र किया जाए या नहीं। यदि false है, तो उस मॉड्यूल के लिए सभी आर्टिफैक्ट्स को छोड़ दिया जाएगा। इसकी आवश्यकता उन मामलों में हो सकती है जहां संग्रहण स्थान एक विचारणीय बिंदु है, और एकत्रित आर्टिफैक्ट्स बड़े हैं, या उन मामलों में जहां एकत्रित आर्टिफैक्ट्स उस उपयोगकर्ता के लिए गोपनीयता का मुद्दा हो सकते हैं जिसके सिस्टम का विश्लेषण किया जा रहा है।
मॉड्यूल में एक फ़ाइल होनी चाहिए जिसमें एक क्लास हो जो Collector ( collectors/collector.py में परिभाषित) से उपवर्गित हो, और उन्हें collectors फ़ोल्डर में रखा जाना चाहिए। collectors/template.py फ़ाइल की प्रतिलिपि बनाकर और इसे अपने उपयोग के अनुसार अनुकूलित करके एक नया Collector मॉड्यूल आसानी से बनाया जा सकता है।
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 विधि self.collectionPath पर पाई गई basic_info.txt या lsregister.txt फ़ाइलों में एकत्रित किसी भी डेटा का उपयोग कर सकती है। ये pict.py स्क्रिप्ट द्वारा शुरुआत में एकत्र किए जाते हैं, और माना जा सकता है कि ये किसी भी अन्य मॉड्यूल द्वारा उपयोग के लिए उपलब्ध हैं। हालांकि, आपको किसी अन्य मॉड्यूल के आउटपुट पर भरोसा नहीं करना चाहिए, क्योंकि इस बात की कोई गारंटी नहीं है कि जब आपका मॉड्यूल चलेगा तब फ़ाइलें उपलब्ध होंगी। मॉड्यूल आपके कॉन्फ़िगरेशन JSON में दिखाई देने वाले क्रम में नहीं चल सकते हैं, क्योंकि Python डिक्शनरी अनियंत्रित होती हैं।
FoundationPlist.py के लिए Greg Neagle का धन्यवाद, जिसने बाइनरी plists, दिनांक डेटा प्रकारों वाले plists आदि को पढ़ने की कई समस्याओं को हल किया।