macOS Apps - Inspecting, debugging and Fuzzing
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
आप यहां से disarm डाउनलोड कर सकते हैं।
आप यहाँ jtool2 डाउनलोड कर सकते हैं या इसे brew
के साथ इंस्टॉल कर सकते हैं।
jtool का उपयोग disarm के पक्ष में बंद कर दिया गया है
Codesign
macOS में पाया जा सकता है जबकि ldid
iOS में पाया जा सकता है
SuspiciousPackage एक उपकरण है जो .pkg फ़ाइलों (इंस्टॉलर) की जांच करने के लिए उपयोगी है और इसे स्थापित करने से पहले इसके अंदर क्या है, यह देखने के लिए।
इन इंस्टॉलरों में preinstall
और postinstall
बैश स्क्रिप्ट होते हैं जिनका आमतौर पर मैलवेयर लेखक persist the malware के लिए दुरुपयोग करते हैं।
यह उपकरण Apple डिस्क इमेज (.dmg) फ़ाइलों को mount करने की अनुमति देता है ताकि उन्हें चलाने से पहले जांचा जा सके:
It will be mounted in /Volumes
उच्च एंट्रॉपी के लिए जांचें
स्ट्रिंग्स की जांच करें (क्या लगभग कोई समझने योग्य स्ट्रिंग नहीं है, पैक किया गया)
MacOS के लिए UPX पैकर एक सेक्शन बनाता है जिसे "__XHDR" कहा जाता है
ध्यान दें कि Objective-C में लिखे गए प्रोग्राम क्लास डिक्लेरेशन को बनाए रखते हैं जब कंपाइल किया जाता है Mach-O binaries में। ऐसे क्लास डिक्लेरेशन में शामिल हैं:
परिभाषित इंटरफेस
इंटरफेस विधियाँ
इंटरफेस इंस्टेंस वेरिएबल्स
परिभाषित प्रोटोकॉल
ध्यान दें कि ये नाम उलझाए जा सकते हैं ताकि बाइनरी का रिवर्सिंग करना अधिक कठिन हो जाए।
जब एक बाइनरी में एक फ़ंक्शन को कॉल किया जाता है जो Objective-C का उपयोग करता है, तो कंपाइल किया गया कोड उस फ़ंक्शन को कॉल करने के बजाय objc_msgSend
को कॉल करेगा। जो अंतिम फ़ंक्शन को कॉल करेगा:
इस फ़ंक्शन की अपेक्षित पैरामीटर हैं:
पहला पैरामीटर (self) "एक पॉइंटर है जो उस क्लास के इंस्टेंस की ओर इशारा करता है जो संदेश प्राप्त करने वाला है"। या सरल शब्दों में, यह वह ऑब्जेक्ट है जिस पर विधि को लागू किया जा रहा है। यदि विधि एक क्लास विधि है, तो यह क्लास ऑब्जेक्ट का एक इंस्टेंस होगा (जैसे एक संपूर्ण), जबकि एक इंस्टेंस विधि के लिए, self उस क्लास का एक इंस्टेंस ऑब्जेक्ट की ओर इशारा करेगा।
दूसरा पैरामीटर, (op), "विधि का चयनकर्ता है जो संदेश को संभालता है"। फिर से, सरल शब्दों में, यह बस विधि का नाम है।
शेष पैरामीटर वे मान हैं जो विधि द्वारा आवश्यक हैं (op)।
देखें कि lldb
का उपयोग करके इस जानकारी को आसानी से कैसे प्राप्त करें ARM64 में इस पृष्ठ पर:
x64:
Argument
Register
(for) objc_msgSend
1st argument
rdi
self: object that the method is being invoked upon
2nd argument
rsi
op: name of the method
3rd argument
rdx
1st argument to the method
4th argument
rcx
2nd argument to the method
5th argument
r8
3rd argument to the method
6th argument
r9
4th argument to the method
7th+ argument
rsp+ (on the stack)
5th+ argument to the method
Dynadump एक उपकरण है जो Objective-C बाइनरी को क्लास-डंप करता है। गिटहब में dylibs निर्दिष्ट हैं लेकिन यह निष्पादन योग्य फ़ाइलों के साथ भी काम करता है।
लेखन के समय, यह वर्तमान में सबसे अच्छा काम करने वाला है।
class-dump मूल उपकरण है जो ObjetiveC स्वरूपित कोड में वर्गों, श्रेणियों और प्रोटोकॉल के लिए घोषणाएँ उत्पन्न करता है।
यह पुराना और अनुपयुक्त है इसलिए यह शायद ठीक से काम नहीं करेगा।
iCDump एक आधुनिक और क्रॉस-प्लेटफ़ॉर्म Objective-C क्लास डंप है। मौजूदा उपकरणों की तुलना में, iCDump Apple पारिस्थितिकी तंत्र से स्वतंत्र रूप से चल सकता है और यह Python बाइंडिंग को उजागर करता है।
Swift बाइनरी के साथ, चूंकि इसमें Objective-C संगतता है, कभी-कभी आप class-dump का उपयोग करके घोषणाएँ निकाल सकते हैं लेकिन हमेशा नहीं।
jtool -l
या otool -l
कमांड लाइनों के साथ यह संभव है कि आप कई सेक्शन पा सकें जो __swift5
उपसर्ग से शुरू होते हैं:
आप इस अनुभाग में संग्रहीत जानकारी के बारे में आगे की जानकारी इस ब्लॉग पोस्ट में पा सकते हैं।
इसके अलावा, Swift बाइनरी में प्रतीक हो सकते हैं (उदाहरण के लिए पुस्तकालयों को प्रतीकों को संग्रहीत करने की आवश्यकता होती है ताकि इसके कार्यों को कॉल किया जा सके)। प्रतीकों में आमतौर पर कार्य का नाम और विशेषता के बारे में जानकारी होती है, इसलिए वे बहुत उपयोगी होते हैं और ऐसे "डेमैंग्लर्स" होते हैं जो मूल नाम प्राप्त कर सकते हैं:
ध्यान दें कि बाइनरी को डिबग करने के लिए, SIP को अक्षम करना आवश्यक है (csrutil disable
या csrutil enable --without debug
) या बाइनरी को एक अस्थायी फ़ोल्डर में कॉपी करना और हस्ताक्षर को हटाना codesign --remove-signature <binary-path>
के साथ या बाइनरी के डिबगिंग की अनुमति देना (आप इस स्क्रिप्ट का उपयोग कर सकते हैं)
ध्यान दें कि macOS पर सिस्टम बाइनरीज़ को इंस्ट्रूमेंट करने के लिए, (जैसे cloudconfigurationd
), SIP को अक्षम करना आवश्यक है (सिर्फ हस्ताक्षर हटाना काम नहीं करेगा)।
macOS कुछ दिलचस्प APIs को उजागर करता है जो प्रक्रियाओं के बारे में जानकारी देते हैं:
proc_info
: यह मुख्य है जो प्रत्येक प्रक्रिया के बारे में बहुत सारी जानकारी देता है। आपको अन्य प्रक्रियाओं की जानकारी प्राप्त करने के लिए रूट होना आवश्यक है लेकिन आपको विशेष अधिकार या मच पोर्ट की आवश्यकता नहीं है।
libsysmon.dylib
: यह XPC द्वारा उजागर की गई कार्यों के माध्यम से प्रक्रियाओं के बारे में जानकारी प्राप्त करने की अनुमति देता है, हालाँकि, इसके लिए com.apple.sysmond.client
का अधिकार होना आवश्यक है।
Stackshotting एक तकनीक है जिसका उपयोग प्रक्रियाओं की स्थिति को कैप्चर करने के लिए किया जाता है, जिसमें सभी चल रहे थ्रेड्स के कॉल स्टैक शामिल होते हैं। यह विशेष रूप से डिबगिंग, प्रदर्शन विश्लेषण, और किसी विशेष समय पर सिस्टम के व्यवहार को समझने के लिए उपयोगी है। iOS और macOS पर, stackshotting कई उपकरणों और विधियों का उपयोग करके किया जा सकता है जैसे sample
और spindump
।
यह उपकरण (/usr/bini/ysdiagnose
) मूल रूप से आपके कंप्यूटर से बहुत सारी जानकारी एकत्र करता है, जिसमें ps
, zprint
जैसे दर्जनों विभिन्न कमांड चलाना शामिल है...
इसे रूट के रूप में चलाना आवश्यक है और डेमन /usr/libexec/sysdiagnosed
के पास बहुत दिलचस्प अधिकार हैं जैसे com.apple.system-task-ports
और get-task-allow
।
इसका plist /System/Library/LaunchDaemons/com.apple.sysdiagnose.plist
में स्थित है जो 3 MachServices की घोषणा करता है:
com.apple.sysdiagnose.CacheDelete
: /var/rmp में पुराने आर्काइव को हटाता है
com.apple.sysdiagnose.kernel.ipc
: विशेष पोर्ट 23 (kernel)
com.apple.sysdiagnose.service.xpc
: Libsysdiagnose
Obj-C वर्ग के माध्यम से उपयोगकर्ता मोड इंटरफ़ेस। एक dict में तीन तर्क पास किए जा सकते हैं (compress
, display
, run
)
MacOS बहुत सारे लॉग उत्पन्न करता है जो एक एप्लिकेशन चलाते समय यह समझने में बहुत उपयोगी हो सकते हैं कि यह क्या कर रहा है।
इसके अलावा, कुछ लॉग में <private>
टैग होगा ताकि कुछ उपयोगकर्ता या कंप्यूटर पहचानने योग्य जानकारी को छिपाया जा सके। हालाँकि, इस जानकारी को प्रकट करने के लिए एक प्रमाणपत्र स्थापित करना संभव है। यहाँ से स्पष्टीकरण का पालन करें।
Hopper के बाएँ पैनल में बाइनरी के प्रतीक (Labels), प्रक्रियाओं और कार्यों की सूची (Proc) और स्ट्रिंग्स (Str) देखी जा सकती हैं। ये सभी स्ट्रिंग्स नहीं हैं बल्कि वे हैं जो Mac-O फ़ाइल के कई भागों में परिभाषित हैं (जैसे cstring या objc_methname
)।
मध्य पैनल में आप डिस्सेम्बल्ड कोड देख सकते हैं। और आप इसे कच्चे डिस्सेम्बल, ग्राफ के रूप में, डीकंपाइल्ड और बाइनरी के रूप में देख सकते हैं, संबंधित आइकन पर क्लिक करके:
कोड ऑब्जेक्ट पर दाएँ क्लिक करने पर आप उस ऑब्जेक्ट के लिए/से संदर्भ देख सकते हैं या यहां तक कि इसका नाम बदल सकते हैं (यह डी-कंपाइल्ड प्सेडोकोड में काम नहीं करता):
इसके अलावा, मध्य नीचे आप पायथन कमांड लिख सकते हैं।
दाएँ पैनल में आप दिलचस्प जानकारी देख सकते हैं जैसे नेविगेशन इतिहास (ताकि आप जान सकें कि आप वर्तमान स्थिति पर कैसे पहुँचे), कॉल ग्राफ जहाँ आप देख सकते हैं सभी कार्य जो इस कार्य को कॉल करते हैं और सभी कार्य जो यह कार्य कॉल करता है, और स्थानीय चर की जानकारी।
यह उपयोगकर्ताओं को अनुप्रयोगों तक अत्यधिक निम्न स्तर पर पहुँच प्रदान करता है और उपयोगकर्ताओं को प्रोग्रामों को ट्रेस करने और यहां तक कि उनके निष्पादन प्रवाह को बदलने का एक तरीका प्रदान करता है। Dtrace प्रोब्स का उपयोग करता है जो कर्नेल के चारों ओर रखे जाते हैं और सिस्टम कॉल के प्रारंभ और अंत जैसे स्थानों पर होते हैं।
DTrace प्रत्येक सिस्टम कॉल के लिए एक प्रोब बनाने के लिए dtrace_probe_create
फ़ंक्शन का उपयोग करता है। ये प्रोब्स प्रवेश और निकास बिंदु पर फायर किए जा सकते हैं। DTrace के साथ इंटरैक्शन /dev/dtrace के माध्यम से होता है जो केवल रूट उपयोगकर्ता के लिए उपलब्ध है।
SIP सुरक्षा को पूरी तरह से अक्षम किए बिना Dtrace को सक्षम करने के लिए आप पुनर्प्राप्ति मोड में निष्पादित कर सकते हैं: csrutil enable --without dtrace
आप dtrace
या dtruss
बाइनरी भी उपयोग कर सकते हैं जो आपने संकलित की हैं।
dtrace के उपलब्ध प्रोब्स को प्राप्त किया जा सकता है:
The probe name consists of four parts: the provider, module, function, and name (fbt:mach_kernel:ptrace:entry
). If you not specifies some part of the name, Dtrace will apply that part as a wildcard.
DTrace को प्रॉब्स को सक्रिय करने और जब वे फायर होते हैं तो कौन से कार्य करने हैं, यह निर्दिष्ट करने के लिए, हमें D भाषा का उपयोग करने की आवश्यकता होगी।
एक अधिक विस्तृत व्याख्या और अधिक उदाहरण https://illumos.org/books/dtrace/chp-intro.html पर पाया जा सकता है।
Run man -k dtrace
to list the DTrace scripts available. Example: sudo dtruss -n binary
In line
स्क्रिप्ट
यह एक कर्नेल ट्रेसिंग सुविधा है। प्रलेखित कोड /usr/share/misc/trace.codes
में पाए जा सकते हैं।
latency
, sc_usage
, fs_usage
और trace
जैसे उपकरण इसका आंतरिक रूप से उपयोग करते हैं।
kdebug
के साथ इंटरफेस करने के लिए sysctl
का उपयोग kern.kdebug
नामस्थान पर किया जाता है और उपयोग करने के लिए MIBs sys/sysctl.h
में पाए जा सकते हैं जिसमें कार्य bsd/kern/kdebug.c
में लागू किए गए हैं।
कस्टम क्लाइंट के साथ kdebug के साथ इंटरैक्ट करने के लिए ये आमतौर पर कदम होते हैं:
KERN_KDSETREMOVE के साथ मौजूदा सेटिंग्स को हटाएं
KERN_KDSETBUF और KERN_KDSETUP के साथ ट्रेस सेट करें
बफर प्रविष्टियों की संख्या प्राप्त करने के लिए KERN_KDGETBUF का उपयोग करें
KERN_KDPINDEX के साथ ट्रेस से अपने क्लाइंट को प्राप्त करें
KERN_KDENABLE के साथ ट्रेसिंग सक्षम करें
KERN_KDREADTR को कॉल करके बफर पढ़ें
प्रत्येक थ्रेड को उसके प्रोसेस से मेल करने के लिए KERN_KDTHRMAP को कॉल करें।
इस जानकारी को प्राप्त करने के लिए Apple उपकरण trace
या कस्टम उपकरण kDebugView (kdv)** का उपयोग करना संभव है।**
ध्यान दें कि Kdebug केवल एक ग्राहक के लिए एक समय में उपलब्ध है। इसलिए एक समय में केवल एक k-debug संचालित उपकरण चलाया जा सकता है।
ktrace_*
APIs libktrace.dylib
से आती हैं जो Kdebug
के उन परतों को लपेटती हैं। फिर, एक क्लाइंट बस ktrace_session_create
और ktrace_events_[single/class]
को कॉल कर सकता है ताकि विशिष्ट कोड पर कॉलबैक सेट कर सके और फिर इसे ktrace_start
के साथ शुरू कर सके।
आप इसे SIP सक्रिय होने पर भी उपयोग कर सकते हैं।
आप क्लाइंट के रूप में उपयोगिता ktrace
का उपयोग कर सकते हैं:
Or tailspin
.
यह कर्नेल स्तर की प्रोफाइलिंग करने के लिए उपयोग किया जाता है और इसे Kdebug
कॉलआउट्स का उपयोग करके बनाया गया है।
बुनियादी रूप से, वैश्विक चर kernel_debug_active
की जांच की जाती है और इसे सेट किया जाता है, यह kperf_kdebug_handler
को Kdebug
कोड और कर्नेल फ्रेम के पते के साथ कॉल करता है। यदि Kdebug
कोड में से एक चयनित के साथ मेल खाता है, तो यह "क्रियाएँ" को बिटमैप के रूप में कॉन्फ़िगर करता है (विकल्पों के लिए osfmk/kperf/action.h
देखें)।
Kperf का एक sysctl MIB तालिका भी है: (रूट के रूप में) sysctl kperf
। ये कोड osfmk/kperf/kperfbsd.c
में पाए जा सकते हैं।
इसके अलावा, Kperfs की कार्यक्षमता का एक उपसमुच्चय kpc
में स्थित है, जो मशीन प्रदर्शन काउंटर के बारे में जानकारी प्रदान करता है।
ProcessMonitor एक बहुत उपयोगी उपकरण है जो यह जांचने के लिए है कि एक प्रक्रिया कौन-कौन से क्रियाएँ कर रही है (उदाहरण के लिए, यह मॉनिटर करें कि एक प्रक्रिया कौन-कौन से नए प्रक्रियाएँ बना रही है)।
SpriteTree एक उपकरण है जो प्रक्रियाओं के बीच संबंधों को प्रिंट करता है।
आपको अपने मैक को एक कमांड के साथ मॉनिटर करना होगा जैसे sudo eslogger fork exec rename create > cap.json
(इसकी आवश्यकता के लिए टर्मिनल को FDA की आवश्यकता है)। और फिर आप इस उपकरण में json लोड कर सकते हैं ताकि सभी संबंधों को देख सकें:
FileMonitor फ़ाइल घटनाओं (जैसे निर्माण, संशोधन, और विलोपन) की निगरानी करने की अनुमति देता है, जो ऐसी घटनाओं के बारे में विस्तृत जानकारी प्रदान करता है।
Crescendo एक GUI उपकरण है जिसका रूप और अनुभव Windows उपयोगकर्ताओं को Microsoft Sysinternal के Procmon से परिचित हो सकता है। यह उपकरण विभिन्न प्रकार की घटनाओं के रिकॉर्डिंग को शुरू और बंद करने की अनुमति देता है, इन घटनाओं को फ़ाइल, प्रक्रिया, नेटवर्क आदि जैसी श्रेणियों द्वारा फ़िल्टर करने की अनुमति देता है, और json प्रारूप में रिकॉर्ड की गई घटनाओं को सहेजने की कार्यक्षमता प्रदान करता है।
Apple Instruments Xcode के डेवलपर उपकरणों का हिस्सा हैं - जो अनुप्रयोग प्रदर्शन की निगरानी, मेमोरी लीक की पहचान और फ़ाइल प्रणाली गतिविधि को ट्रैक करने के लिए उपयोग किए जाते हैं।
यह प्रक्रियाओं द्वारा किए गए कार्यों का पालन करने की अनुमति देता है:
Taskexplorer एक बाइनरी द्वारा उपयोग की जाने वाली लाइब्रेरीज़, इसके द्वारा उपयोग किए जा रहे फाइलों और नेटवर्क कनेक्शनों को देखने के लिए उपयोगी है। यह बाइनरी प्रक्रियाओं की जांच virustotal के खिलाफ भी करता है और बाइनरी के बारे में जानकारी दिखाता है।
इस ब्लॉग पोस्ट में आप एक उदाहरण पा सकते हैं कि कैसे एक चल रहे डेमन को PT_DENY_ATTACH
का उपयोग करके डिबग किया जाए ताकि डिबगिंग को रोका जा सके, भले ही SIP अक्षम हो।
lldb macOS बाइनरी डिबगिंग के लिए de facto tool है।
आप अपने होम फ़ोल्डर में .lldbinit
नामक फ़ाइल बनाकर lldb का उपयोग करते समय intel स्वाद सेट कर सकते हैं, जिसमें निम्नलिखित पंक्ति हो:
lldb के अंदर, process save-core
के साथ एक प्रक्रिया को डंप करें
(lldb) कमांड
विवरण
run (r)
कार्यवाही शुरू करना, जो तब तक जारी रहेगा जब तक कि एक ब्रेकपॉइंट हिट न हो या प्रक्रिया समाप्त न हो जाए।
process launch --stop-at-entry
प्रवेश बिंदु पर रुकते हुए कार्यवाही शुरू करें
continue (c)
डीबग की गई प्रक्रिया की कार्यवाही जारी रखें।
nexti (n / ni)
अगली निर्देश को निष्पादित करें। यह कमांड फ़ंक्शन कॉल को छोड़ देगा।
stepi (s / si)
अगली निर्देश को निष्पादित करें। अगली कमांड के विपरीत, यह कमांड फ़ंक्शन कॉल में कदम रखेगा।
finish (f)
वर्तमान फ़ंक्शन (“फ्रेम”) में शेष निर्देशों को निष्पादित करें, लौटें और रुकें।
control + c
कार्यवाही को रोकें। यदि प्रक्रिया को चलाया गया है (r) या जारी रखा गया है (c), तो यह प्रक्रिया को रोक देगा ...जहाँ भी यह वर्तमान में निष्पादित हो रही है।
breakpoint (b)
b main
#कोई भी फ़ंक्शन जिसे main कहा जाता है
b <binname>`main
#बिन का मुख्य फ़ंक्शन
b set -n main --shlib <lib_name>
#संकेतित बिन का मुख्य फ़ंक्शन
breakpoint set -r '\[NSFileManager .*\]$'
#कोई भी NSFileManager विधि
breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'
break set -r . -s libobjc.A.dylib
# उस पुस्तकालय के सभी फ़ंक्शनों में ब्रेक
b -a 0x0000000100004bd9
br l
#ब्रेकपॉइंट सूची
br e/dis <num>
#ब्रेकपॉइंट सक्षम/अक्षम करें
breakpoint delete <num>
help
help breakpoint #ब्रेकपॉइंट कमांड की मदद प्राप्त करें
help memory write #मेमोरी में लिखने के लिए मदद प्राप्त करें
reg
x/s <reg/memory address>
मेमोरी को एक शून्य-समाप्त स्ट्रिंग के रूप में प्रदर्शित करें।
x/i <reg/memory address>
मेमोरी को असेंबली निर्देश के रूप में प्रदर्शित करें।
x/b <reg/memory address>
मेमोरी को बाइट के रूप में प्रदर्शित करें।
print object (po)
यह उस ऑब्जेक्ट को प्रिंट करेगा जिसका संदर्भ पैरामीटर द्वारा दिया गया है
po $raw
{
dnsChanger = {
"affiliate" = "";
"blacklist_dns" = ();
ध्यान दें कि Apple के अधिकांश Objective-C APIs या विधियाँ ऑब्जेक्ट लौटाती हैं, और इसलिए उन्हें “print object” (po) कमांड के माध्यम से प्रदर्शित किया जाना चाहिए। यदि po कोई अर्थपूर्ण आउटपुट नहीं देता है तो x/b
का उपयोग करें
memory
memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 #उस पते में AAAA लिखें memory write -f s $rip+0x11f+7 "AAAA" #पते में AAAA लिखें
disassembly
dis #वर्तमान फ़ंक्शन का डिसास
dis -n <funcname> #फ़ंक्शन का डिसास
dis -n <funcname> -b <basename> #फ़ंक्शन का डिसास dis -c 6 #6 पंक्तियों का डिसास dis -c 0x100003764 -e 0x100003768 #एक जोड़ से दूसरे तक dis -p -c 4 #वर्तमान पते से डिसास करना शुरू करें
parray
parray 3 (char **)$x1 #x1 रजिस्टर में 3 घटकों का ऐरे जांचें
image dump sections
वर्तमान प्रक्रिया की मेमोरी का मानचित्र प्रिंट करें
image dump symtab <library>
image dump symtab CoreNLP
#CoreNLP से सभी प्रतीकों के पते प्राप्त करें
जब objc_sendMsg
फ़ंक्शन को कॉल किया जाता है, तो rsi रजिस्टर विधि का नाम एक शून्य-समाप्त (“C”) स्ट्रिंग के रूप में रखता है। lldb के माध्यम से नाम प्रिंट करने के लिए करें:
(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"
(lldb) print (char*)$rsi:
(char *) $1 = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"
(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"
कमांड sysctl hw.model
"Mac" लौटाता है जब होस्ट MacOS है लेकिन जब यह एक VM है तो कुछ अलग लौटाता है।
hw.logicalcpu
और hw.physicalcpu
के मानों के साथ खेलते हुए कुछ मैलवेयर यह पहचानने की कोशिश करते हैं कि क्या यह एक VM है।
कुछ मैलवेयर यह भी पहचान सकते हैं कि मशीन VMware आधारित है या नहीं, MAC पते (00:50:56) के आधार पर।
यह भी संभव है यदि एक प्रक्रिया को डीबग किया जा रहा है यह जानने के लिए एक साधारण कोड के साथ:
if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //प्रक्रिया को डीबग किया जा रहा है }
यह ptrace
सिस्टम कॉल को PT_DENY_ATTACH
फ्लैग के साथ भी कॉल कर सकता है। यह डीबग करने वाले को अटैच और ट्रेस करने से रोकता है।
आप जांच सकते हैं कि sysctl
या ptrace
फ़ंक्शन को आयात किया जा रहा है (लेकिन मैलवेयर इसे डायनामिक रूप से आयात कर सकता है)
जैसा कि इस लेख में नोट किया गया है, “Defeating Anti-Debug Techniques: macOS ptrace variants” : “संदेश प्रक्रिया # status = 45 (0x0000002d) के साथ समाप्त हो गया है, आमतौर पर यह एक संकेत है कि डीबग लक्ष्य PT_DENY_ATTACH का उपयोग कर रहा है”
कोर डंप तब बनाए जाते हैं यदि:
kern.coredump
sysctl 1 पर सेट है (डिफ़ॉल्ट रूप से)
यदि प्रक्रिया suid/sgid नहीं थी या kern.sugid_coredump
1 है (डिफ़ॉल्ट रूप से 0)
AS_CORE
सीमा ऑपरेशन की अनुमति देती है। कोड डंप निर्माण को दबाने के लिए ulimit -c 0
कॉल करके और उन्हें फिर से सक्षम करने के लिए ulimit -c unlimited
का उपयोग करना संभव है।
इन मामलों में कोर डंप kern.corefile
sysctl के अनुसार उत्पन्न होते हैं और आमतौर पर /cores/core/.%P
में संग्रहीत होते हैं।
ReportCrash क्रैश होने वाली प्रक्रियाओं का विश्लेषण करता है और डिस्क पर एक क्रैश रिपोर्ट सहेजता है। एक क्रैश रिपोर्ट में जानकारी होती है जो डेवलपर को क्रैश के कारण का निदान करने में मदद कर सकती है।
उपयोगकर्ता के प्रति-उपयोगकर्ता launchd संदर्भ में चलने वाली अनुप्रयोगों और अन्य प्रक्रियाओं के लिए, ReportCrash एक LaunchAgent के रूप में चलता है और उपयोगकर्ता के ~/Library/Logs/DiagnosticReports/
में क्रैश रिपोर्ट सहेजता है।
डेमन्स, अन्य प्रक्रियाएँ सिस्टम launchd संदर्भ में चलने वाली और अन्य विशेषाधिकार प्राप्त प्रक्रियाओं के लिए, ReportCrash एक LaunchDaemon के रूप में चलता है और सिस्टम के /Library/Logs/DiagnosticReports
में क्रैश रिपोर्ट सहेजता है।
यदि आप क्रैश रिपोर्टों के बारे में चिंतित हैं जो Apple को भेजी जा रही हैं तो आप उन्हें अक्षम कर सकते हैं। यदि नहीं, तो क्रैश रिपोर्टें यह पता लगाने में सहायक हो सकती हैं कि सर्वर कैसे क्रैश हुआ।
MacOS में फज़िंग करते समय यह महत्वपूर्ण है कि Mac को सोने न दिया जाए:
systemsetup -setsleep Never
pmset, System Preferences
यदि आप SSH कनेक्शन के माध्यम से फज़िंग कर रहे हैं, तो यह सुनिश्चित करना महत्वपूर्ण है कि सत्र समाप्त न हो। इसलिए sshd_config फ़ाइल को बदलें:
TCPKeepAlive Yes
ClientAliveInterval 0
ClientAliveCountMax 0
नीचे दिए गए पृष्ठ पर जाएं यह जानने के लिए कि आप किस ऐप के लिए निर्धारित स्कीम या प्रोटोकॉल को संभालने के लिए जिम्मेदार है:
macOS File Extension & URL scheme app handlersयह नेटवर्क डेटा का प्रबंधन करने वाले प्रक्रियाओं को खोजने के लिए दिलचस्प है:
या netstat
या lsof
का उपयोग करें
CLI टूल्स के लिए काम करता है
यह "बस काम करता है" macOS GUI टूल्स के साथ। ध्यान दें कि कुछ macOS ऐप्स में कुछ विशिष्ट आवश्यकताएँ होती हैं जैसे अद्वितीय फ़ाइल नाम, सही एक्सटेंशन, फ़ाइलों को सैंडबॉक्स से पढ़ने की आवश्यकता (~/Library/Containers/com.apple.Safari/Data
)...
कुछ उदाहरण:
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)