hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing
2024-03-28 09:04:44 +00:00
..
arm64-basic-assembly.md Translated ['exploiting/tools/README.md', 'macos-hardening/macos-securit 2024-03-28 09:04:44 +00:00
introduction-to-x64.md Translated ['a.i.-exploiting/bra.i.nsmasher-presentation/BIM_Bruteforcer 2024-02-08 23:20:46 +00:00
README.md Translated ['exploiting/tools/README.md', 'macos-hardening/macos-securit 2024-03-28 09:04:44 +00:00

macOS Apps - निरीक्षण, डीबगिंग और फजिंग

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

स्थैतिक विश्लेषण

otool

otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application

objdump

{% code overflow="wrap" %}

objdump -m --dylibs-used /bin/ls #List dynamically linked libraries
objdump -m -h /bin/ls # Get headers information
objdump -m --syms /bin/ls # Check if the symbol table exists to get function names
objdump -m --full-contents /bin/ls # Dump every section
objdump -d /bin/ls # Dissasemble the binary
objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemble a function using intel flavour

{% endcode %}

jtool2

यह टूल codesign, otool, और objdump के लिए एक प्रतिस्थापन के रूप में उपयोग किया जा सकता है, और कुछ अतिरिक्त सुविधाएँ प्रदान करता है। यहाँ से डाउनलोड करें या brew के साथ इंस्टॉल करें।

# Install
brew install --cask jtool2

jtool2 -l /bin/ls # Get commands (headers)
jtool2 -L /bin/ls # Get libraries
jtool2 -S /bin/ls # Get symbol info
jtool2 -d /bin/ls # Dump binary
jtool2 -D /bin/ls # Decompile binary

# Get signature information
ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Automator

# Get MIG information
jtool2 -d __DATA.__const myipc_server | grep MIG

Codesign / ldid

{% hint style="danger" %} Codesign मैकओएस में पाया जा सकता है जबकि ldid आईओएस में पाया जा सकता है। {% endhint %}

# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"

# Check if the apps contents have been modified
codesign --verify --verbose /Applications/Safari.app

# Get entitlements from the binary
codesign -d --entitlements :- /System/Applications/Automator.app # Check the TCC perms

# Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app

# Sign a binary
codesign -s <cert-name-keychain> toolsdemo

# Get signature info
ldid -h <binary>

# Get entitlements
ldid -e <binary>

# Change entilements
## /tmp/entl.xml is a XML file with the new entitlements to add
ldid -S/tmp/entl.xml <binary>

SuspiciousPackage

SuspiciousPackage एक उपकरण है जो .pkg फ़ाइलें (इंस्टॉलर) की जांच करने के लिए उपयोगी है और इंस्टॉल करने से पहले देखने की सुविधा प्रदान करता है।
इन इंस्टॉलर में preinstall और postinstall बैश स्क्रिप्ट होते हैं जिन्हें मैलवेयर लेखक सामान्यत: दुरुपयोग करते हैं ताकि मैलवेयर को टिकाऊ बना सकें

hdiutil

यह उपकरण Apple डिस्क छवियों (.dmg) फ़ाइलों को माउंट करने की अनुमति देता है ताकि इन्हें कुछ चलाने से पहले जांच सकें:

hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

यह /Volumes में माउंट किया जाएगा।

Objective-C

मेटाडेटा

{% hint style="danger" %} ध्यान दें कि Objective-C में लिखे गए कार्यक्रम Mach-O binaries में कॉम्पाइल होने पर अपनी क्लास घोषणाएं बनाए रखते हैं। ऐसी क्लास घोषणाएं निम्नलिखित का नाम और प्रकार शामिल होता है: {% endhint %}

  • कक्षा
  • कक्षा के विधियाँ
  • कक्षा के उदाहरण संदर्भ

आप class-dump का उपयोग करके इस जानकारी को प्राप्त कर सकते हैं:

class-dump Kindle.app

कार्य को बुलाना

जब एक फ़ंक्शन को कॉल किया जाता है जो एक Objective-C का उपयोग करने वाले बाइनरी में है, तो कॉम्पाइल कोड उस फ़ंक्शन को बुलाने की बजाय, objc_msgSend को बुलाएगा। जो अंतिम फ़ंक्शन को बुलाएगा:

इस फ़ंक्शन की उम्मीद की जाने वाली पैरामीटर हैं:

  • पहला पैरामीटर (self) "एक पॉइंटर है जो संदेश प्राप्त करने वाली कक्षा के उदाहरण की ओर पॉइंट करता है"। या और सरल शब्दों में कहें, यह वस्तु है जिस पर विधि को आमंत्रित किया जा रहा है। यदि विधि एक कक्षा विधि है, तो यह कक्षा वस्तु का एक उदाहरण होगा (सम्पूर्ण रूप से), जबकि एक उदाहरण विधि के लिए, self कक्षा के एक उदाहरण को एक वस्तु के रूप में संकेत करेगा।
  • दूसरा पैरामीटर, (op), "संदेश का संभालने वाली विधि का चयनकर्ता" है। फिर भी, और सरल शब्दों में कहें, यह बस विधि का नाम है।
  • शेष पैरामीटर वह कोई मान हैं जो विधि के द्वारा आवश्यक हैं (op)।

इस जानकारी को lldb में ARM64 के साथ आसानी से कैसे प्राप्त किया जा सकता है देखें:

{% content-ref url="arm64-basic-assembly.md" %} arm64-basic-assembly.md {% endcontent-ref %}

x64:

विधि रजिस्टर (के लिए) objc_msgSend
1वां पैरामीटर rdi self: वस्तु जिस पर विधि को आमंत्रित किया जा रहा है
2वां पैरामीटर rsi op: विधि का नाम
3वां पैरामीटर rdx विधि के लिए 1वां पैरामीटर
4वां पैरामीटर rcx विधि के लिए 2वां पैरामीटर
5वां पैरामीटर r8 विधि के लिए 3वां पैरामीटर
6वां पैरामीटर r9 विधि के लिए 4वां पैरामीटर
7वां+ पैरामीटर

rsp+
(स्टैक पर)

विधि के लिए 5वां+ पैरामीटर

स्विफ्ट

स्विफ्ट बाइनरी के साथ, क्योंकि यहाँ Objective-C संगतता है, कभी-कभी आप class-dump का उपयोग करके घोषणाएँ निकाल सकते हैं लेकिन हमेशा नहीं।

jtool -l या otool -l कमांड लाइन के साथ कई खंड खोजना संभव है जो __swift5 उपसर्ग से शुरू होते हैं:

jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
LC 00: LC_SEGMENT_64              Mem: 0x000000000-0x100000000    __PAGEZERO
LC 01: LC_SEGMENT_64              Mem: 0x100000000-0x100028000    __TEXT
[...]
Mem: 0x100026630-0x100026d54        __TEXT.__swift5_typeref
Mem: 0x100026d60-0x100027061        __TEXT.__swift5_reflstr
Mem: 0x100027064-0x1000274cc        __TEXT.__swift5_fieldmd
Mem: 0x1000274cc-0x100027608        __TEXT.__swift5_capture
[...]

आप इस ब्लॉग पोस्ट में इन सेक्शन में संग्रहित जानकारी के बारे में अधिक जानकारी पा सकते हैं

इसके अतिरिक्त, स्विफ्ट बाइनरी में प्रतीक हो सकते हैं (उदाहरण के लिए पुस्तकालयों को प्रतीक संग्रहित करने की आवश्यकता होती है ताकि उनके कार्य को बुलाया जा सके)। **प्रतीकों में सामान्यत: फ़ंक्शन के नाम और एट्रिब्यूट की जानकारी होती है और यह एक बेहद अद्भुत तरीके से होती है, इसलिए वे बहुत उपयोगी होते हैं और वहाँ "डीमैंगलर्स" होते हैं जो मूल नाम प्राप्त कर सकते हैं:

# Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py

# Swift cli
swift demangle

पैक किए गए बाइनरी

  • उच्च एंट्रोपी की जांच करें
  • स्ट्रिंग की जांच करें (क्या कोई समझने योग्य स्ट्रिंग है, पैक किया गया है)
  • MacOS के लिए UPX पैकर एक धारा उत्पन्न करता है जिसे "__XHDR" कहा जाता है

गतिशील विश्लेषण

{% hint style="warning" %} ध्यान दें कि बाइनरी को डीबग करने के लिए SIP को अक्षम करना आवश्यक है (csrutil disable या csrutil enable --without debug) या बाइनरी को एक अस्थायी फ़ोल्डर में कॉपी करना और codesign --remove-signature <binary-path> के साथ सिग्नेचर को हटाना या बाइनरी का डीबगिंग अनुमति देना (आप इस स्क्रिप्ट का उपयोग कर सकते हैं) {% endhint %}

{% hint style="warning" %} ध्यान दें कि सिस्टम बाइनरी (जैसे cloudconfigurationd) को इंस्ट्रुमेंट करने के लिए macOS पर, SIP को अक्षम किया जाना चाहिए (सिग्नेचर को बस हटाना काम नहीं करेगा)। {% endhint %}

एकीकृत लॉग

MacOS बहुत सारे लॉग उत्पन्न करता है जो एक एप्लिकेशन चलाने पर उसके कार्य को समझने में बहुत उपयोगी हो सकते हैं।

इसके अतिरिक्त, कुछ लॉग होंगे जिनमें <private> टैग होगा ताकि कुछ उपयोगकर्ता या कंप्यूटर संदर्भीय पहचाननीय जानकारी छुपाई जा सके। हालांकि, इस जानकारी को खोलने के लिए एक प्रमाणपत्र स्थापित करना संभव हैयहां से विवरणों का पालन करें।

हॉपर

बाएं पैनल

हॉपर के बाएं पैनल में बाइनरी के प्रतीक (लेबल), प्रक्रियाएँ और कार्य (प्रोसेड्यूर्स) की सूची और स्ट्रिंग (स्ट्र) देखना संभव है। ये सभी स्ट्रिंग नहीं हैं लेकिन वे मैक-ओ फ़ाइल के कई हिस्सों में परिभाषित हैं (जैसे cstring या objc_methname की तरह)।

मध्य पैनल

मध्य पैनल में आप डिसएंबल कोड देख सकते हैं। और आप इसे रॉ डिसएंबल, ग्राफ, डीकंपाइल्ड और बाइनरी के रूप में देख सकते हैं जिसके लिए आपको संबंधित आइकन पर क्लिक करना होगा:

किसी कोड ऑब्जेक्ट पर राइट क्लिक करके आप उस ऑब्जेक्ट से/के लिए संदर्भ देख सकते हैं या उसका नाम बदल सकते हैं (यह डिकंपाइल्ड प्यूडोकोड में काम नहीं करता):

इसके अतिरिक्त, नीचे मध्य में आप पायथन कमांड लिख सकते हैं

दाएं पैनल

दाएं पैनल में आप नेविगेशन हिस्ट्री (ताकि आप जानें कि आप वर्तमान स्थिति तक कैसे पहुंचे), कॉल ग्राफ जहां आप सभी कार्यों को देख सकते हैं जो इस कार्य को कॉल करते हैं और सभी कार्यों को यह कार्य किसे कॉल करता है, और स्थानीय चर जानकारी देख सकते हैं।

dtrace

यह उपयोगकर्ताओं को एक अत्यधिक निचले स्तर पर एप्लिकेशन तक पहुंचने और उनके निष्पादन फ्लो को बदलने का एक तरीका प्रदान करता है। Dtrace प्रोब्स का उपयोग करता है जो कर्नेल के भीतर विभिन्न स्थानों पर रखे गए होते हैं और ऐसे स्थानों पर होते हैं जैसे सिस्टम कॉल के आरंभ और समापन।

DTrace उपयोगकर्ताओं को प्रत्येक सिस्टम कॉल के प्रवेश और निकास स्थान में प्रोब बनाने के लिए dtrace_probe_create फ़ंक्शन का उपयोग करता है। ये प्रोब्स प्रत्येक सिस्टम कॉल के प्रवेश और निकास स्थान में फायर किए जा सकते हैं। DTrace के साथ बातचीत /dev/dtrace के माध्यम से होती है जो केवल रूट उपयोगकर्ता के लिए ही उपलब्ध है।

{% hint style="success" %} SIP सुरक्षा को पूरी तरह से अक्षम किए बिना Dtrace को सक्षम करने के लिए आप रिकवरी मोड पर निम्नलिखित को कार्यान्वित कर सकते हैं: csrutil enable --without dtrace

आप उन बाइनरी को भी dtrace या dtruss कर सकते हैं जो आपने कंपाइल किया है। {% endhint %}

dtrace के उपलब्ध प्रोब्स को प्राप्त करने के लिए निम्नलिखित के साथ कार्यान्वित किया जा सकता ह।

dtrace -l | head
ID   PROVIDER            MODULE                          FUNCTION NAME
1     dtrace                                                     BEGIN
2     dtrace                                                     END
3     dtrace                                                     ERROR
43    profile                                                     profile-97
44    profile                                                     profile-199

प्रोब नाम चार भागों से मिलकर बनता है: प्रदाता, मॉड्यूल, कार्य, और नाम (fbt:mach_kernel:ptrace:entry). यदि आप नाम के किसी भाग को निर्दिष्ट नहीं करते हैं, तो Dtrace उस भाग को वाइल्डकार्ड के रूप में लागू करेगा।

प्रोब्स को सक्रिय करने और जब वे फायर होते हैं तो क्या क्रियाएँ करनी है, इसे कॉन्फ़िगर करने के लिए हमें डी भाषा का उपयोग करना होगा।

एक और विस्तृत व्याख्या और अधिक उदाहरण https://illumos.org/books/dtrace/chp-intro.html में देखा जा सकता है।

उदाहरण

man -k dtrace चलाकर उपलब्ध DTrace स्क्रिप्ट की सूची देखें। उदाहरण: sudo dtruss -n binary

  • लाइन में
#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
  • स्क्रिप्ट
syscall:::entry
/pid == $1/
{
}

#Log every syscall of a PID
sudo dtrace -s script.d 1234
syscall::open:entry
{
printf("%s(%s)", probefunc, copyinstr(arg0));
}
syscall::close:entry
{
printf("%s(%d)\n", probefunc, arg0);
}

#Log files opened and closed by a process
sudo dtrace -s b.d -c "cat /etc/hosts"
syscall:::entry
{
;
}
syscall:::return
{
printf("=%d\n", arg1);
}

#Log sys calls with values
sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"

dtruss

dtruss -c ls #Get syscalls of ls
dtruss -c -p 1000 #get syscalls of PID 1000

ktrace

आप इसे SIP सक्रिय होने पर भी उपयोग कर सकते हैं

ktrace trace -s -S -t c -c ls | grep "ls("

ProcessMonitor

ProcessMonitor एक बहुत ही उपयोगी उपकरण है जो यह जांचने के लिए उपयोगी है कि कोई प्रक्रिया किस प्रकार की क्रियाएँ कर रही है (उदाहरण के लिए, देखें कि कोई प्रक्रिया कौन से नए प्रक्रियाएँ बना रही है)।

SpriteTree

SpriteTree एक उपकरण है जो प्रक्रियाओं के बीच संबंधों को प्रिंट करता है।
आपको अपने मैक को एक ऐसे कमांड के साथ मॉनिटर करने की आवश्यकता है जैसे sudo eslogger fork exec rename create > cap.json (इसे लॉन्च करने के लिए टर्मिनल में FDA की आवश्यकता है)। और फिर आप इस उपकरण में JSON लोड कर सकते हैं ताकि आप सभी संबंधों को देख सकें:

FileMonitor

FileMonitor फाइल घटनाओं (जैसे निर्माण, संशोधन और हटाने) का मॉनिटर करने की अनुमति देता है जो इन घटनाओं के बारे में विस्तृत जानकारी प्रदान करता है।

Crescendo

Crescendo एक GUI उपकरण है जिसका लुक और फ़ील Windows उपयोगकर्ता जान सकते हैं Microsoft Sysinternals Procmon से। यह उपकरण विभिन्न घटना प्रकारों को शुरू और बंद करने की अनुमति देता है, इन घटनाओं को फ़ाइल, प्रक्रिया, नेटवर्क आदि जैसे श्रेणियों द्वारा फ़िल्टर करने की अनुमति देता है, और जो घटनाएँ जोड़ी गई हैं उन्हें एक JSON प्रारूप में सहेजने की क्षमता प्रदान करता है।

Apple Instruments

Apple Instruments Xcode के डेवलपर उपकरणों का हिस्सा हैं - जो अनुप्रयोग के प्रदर्शन को मॉनिटर करने, मेमोरी लीक्स की पहचान करने और फ़ाइल सिस्टम गतिविधि को ट्रैक करने के लिए उपयोग किया जाता है।

fs_usage

प्रक्रियाओं द्वारा किए गए कार्रवाई का पालन करने की अनुमति देता है:

fs_usage -w -f filesys ls #This tracks filesystem actions of proccess names containing ls
fs_usage -w -f network curl #This tracks network actions

TaskExplorer

Taskexplorer किसी बाइनरी द्वारा उपयोग की जाने वाली लाइब्रेरी, उसके द्वारा उपयोग की जा रही फ़ाइलें और नेटवर्क कनेक्शन देखने के लिए उपयोगी है।
यह बाइनरी प्रक्रियाओं को virustotal के खिलाफ जांचता है और बाइनरी के बारे में जानकारी दिखाता है।

PT_DENY_ATTACH

इस ब्लॉग पोस्ट में आपको एक उदाहरण मिलेगा कि कैसे PT_DENY_ATTACH का उपयोग करके चल रहे डेमन को डीबग किया जा सकता है, जिसने डीबगिंग को रोकने के लिए SIP भी अक्षम किया था।

lldb

lldb macOS बाइनरी डीबगिंग के लिए डी फैक्टो टूल है।

lldb ./malware.bin
lldb -p 1122
lldb -n malware.bin
lldb -n malware.bin --waitfor

जब आप lldb का उपयोग कर रहे हो तो आप इंटेल फ्लेवर सेट कर सकते हैं अपने होम फ़ोल्डर में निम्नलिखित लाइन के साथ फ़ाइल बनाकर .lldbinit कहा जाता है:

settings set target.x86-disassembly-flavor intel

{% hint style="warning" %} ल्लडब में, process save-core के साथ एक प्रक्रिया को डंप करें। {% endhint %}

(lldb) कमांडविवरण
run (r)एक्सिक्यूशन शुरू करें, जो एक ब्रेकपॉइंट हिट होने या प्रक्रिया समाप्त होने तक जारी रहेगा।
continue (c)डीबग की गई प्रक्रिया का एक्सिक्यूशन जारी रखें।
nexti (n / ni)अगले इंस्ट्रक्शन को एक्सीक्यूट करें। यह कमांड फंक्शन कॉल को छोड़ देगा।
stepi (s / si)अगले इंस्ट्रक्शन को एक्सीक्यूट करें। nexti कमांड की तरह, यह कमांड फंक्शन कॉल में स्टेप करेगा।
finish (f)वर्तमान फंक्शन ("फ्रेम") में शेष इंस्ट्रक्शन को एक्सीक्यूट करें और रोकें।
control + cएक्सीक्यूशन को रोकें। अगर प्रक्रिया को चलाया गया है (r) या जारी रखा गया है (c), तो यह प्रक्रिया को वर्तमान में कहीं भी रोक देगा।
breakpoint (b)

b main #कोई फंक्शन जिसे मेन कहा गया है

b <binname>`main #बिन का मुख्य फंक्शन

b set -n main --shlib <lib_name> #निर्दिष्ट बिन का मुख्य फंक्शन

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l #ब्रेकपॉइंट सूची

br e/dis <num> #ब्रेकपॉइंट को सक्षम/अक्षम करें

breakpoint delete <num>

help

help breakpoint #ब्रेकपॉइंट कमांड की मदद प्राप्त करें

help memory write #मेमोरी में लिखने की मदद प्राप्त करें

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

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 API या मेथड्स ऑब्जेक्ट वापस करते हैं, और इसलिए "प्रिंट ऑब्जेक्ट" (po) कमांड के माध्यम से प्रदर्शित किए जाना चाहिए। यदि po से कोई अर्थपूर्ण आउटपुट नहीं निकालता है, तो x/b का उपयोग करें

memorymemory 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 #वर्तमान पते से डिसैसेंबल करना शुरू करें

parrayparray 3 (char **)$x1 # x1 रेजिस्टर में 3 घटकों के एरे की जाँच करें

{% hint style="info" %} objc_sendMsg फंक्शन को कॉल करते समय, rsi रजिस्टर में मेथड का नाम एक नल-समाप्त (“सी”) स्ट्रिंग के रूप में होता है। 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:" {% endhint %}

एंटी-डायनामिक विश्लेषण

वीएम पता लगाना

  • sysctl hw.model कमांड "Mac" लौटाता है जब होस्ट एक MacOS होता है, लेकिन कुछ अलग होता है जब यह एक वीएम होता है।
  • hw.logicalcpu और hw.physicalcpu के मानों के साथ खेलने से कुछ मैलवेयर यह जांचने की कोशिश करते हैं कि यह एक वीएम है या नहीं।
  • कुछ मैलवेयर यह भी पता लगा सकते हैं कि मशीन VMware पर आधारित है MAC पते (00:50:56) के आधार पर।
  • यह भी संभव है कि एक प्रक्रिया की डीबगिंग हो रही है या नहीं इसे एक सरल कोड के साथ जैसे:
  • if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //प्रक्रिया डीबग हो रही है }
  • यह भी ptrace सिस्टम कॉल को PT_DENY_ATTACH फ्लैग के साथ आवंटित कर सकता है। यह एक डेबगर को जोड़ने और ट्रेसिंग करने से रोकता है।
  • आप यह जांच सकते हैं कि क्या sysctl या ptrace फ़ंक्शन आयात किया जा रहा है (लेकिन मैलवेयर इसे गतिशील रूप से आयात कर सकता है)
  • जैसा कि इस लेखन में दर्शाया गया है, “एंटी-डीबग तकनीकों को पराजित करना: macOS ptrace variants” :
    संदेश प्रक्रिया # के साथ बाहर निकल गई जिसकी स्थिति = 45 (0x0000002d) है आम तौर पर एक संकेत है कि डीबग लक्ष्य PT_DENY_ATTACH का उपयोग कर रहा है

Fuzzing

ReportCrash

ReportCrash क्रैश हो रहे प्रक्रियाओं का विश्लेषण करता है और एक क्रैश रिपोर्ट को डिस्क पर सहेजता है। एक क्रैश रिपोर्ट में जानकारी होती है जो एक डिवेलपर को क्रैश के कारण का निदान करने में मदद कर सकती है
एप्लिकेशनों और अन्य प्रक्रियाओं के लिए प्रति-उपयोगकर्ता लॉन्चडी संदर्भ में चल रहे, ReportCrash एक लॉन्चएजेंट के रूप में चलता है और क्रैश रिपोर्ट को उपयोगकर्ता के ~/Library/Logs/DiagnosticReports/ में सहेजता है।
डेमन्स, अन्य प्रक्रियाएं सिस्टम लॉन्चडी संदर्भ में चल रही हैं और अन्य प्रिविलेज्ड प्रक्रियाएं के लिए, ReportCrash एक लॉन्चडेमन के रूप में चलता है और क्रैश रिपोर्ट को सिस्टम के /Library/Logs/DiagnosticReports में सहेजता है।

अगर आप क्रैश रिपोर्ट को एप्पल को भेजने की चिंता कर रहे हैं तो आप इन्हें अक्षम कर सकते हैं। अगर नहीं, तो क्रैश रिपोर्ट सर्वर क्रैश कैसे हुआ पता लगाने में उपयोगी हो सकते हैं।

#To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

#To re-enable crash reporting:
launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

नींद

MacOS में फज़िंग करते समय, Mac को सोने नहीं देने का महत्वपूर्ण है:

  • systemsetup -setsleep Never
  • pmset, सिस्टम प्राथमिकताएँ
  • KeepingYouAwake

SSH डिस्कनेक्ट

यदि आप SSH कनेक्शन के माध्यम से फज़िंग कर रहे हैं, तो सुनिश्चित करें कि सत्र दिन भर नहीं जा रहा है। इसलिए sshd_config फ़ाइल को निम्नलिखित से बदलें:

  • TCPKeepAlive Yes
  • ClientAliveInterval 0
  • ClientAliveCountMax 0
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

आंतरिक हैंडलर

निम्नलिखित पृष्ठ की जाँच करें ताकि आप पता लगा सकें कि निर्दिष्ट स्कीम या प्रोटोकॉल का हैंडलिंग कौन सा ऐप जिम्मेदार है:

{% content-ref url="../macos-file-extension-apps.md" %} macos-file-extension-apps.md {% endcontent-ref %}

नेटवर्क प्रक्रियाओं की गणना

यह दिलचस्प है कि नेटवर्क डेटा का प्रबंधन कर रही प्रक्रियाएं खोजना:

dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
#wait some time
sort -u recv.log > procs.txt
cat procs.txt

या netstat या lsof का उपयोग करें

Libgmalloc

{% code overflow="wrap" %}

lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib" -o "run arg1 arg2" -o "bt" -o "reg read" -o "dis -s \$pc-32 -c 24 -m -F intel" -o "quit"

{% endcode %}

फज़र्स

AFL++

CLI टूल्स के लिए काम करता है

Litefuzz

यह macOS GUI टूल्स के साथ "बस काम करता है"। कृपया ध्यान दें कि कुछ macOS ऐप्स के कुछ विशेष आवश्यकताएं हो सकती हैं जैसे अद्वितीय फ़ाइल नाम, सही एक्सटेंशन, सैंडबॉक्स से फ़ाइलों को पढ़ने की आवश्यकता (~/Library/Containers/com.apple.Safari/Data)...

कुछ उदाहरण:

{% code overflow="wrap" %}

# iBooks
litefuzz -l -c "/System/Applications/Books.app/Contents/MacOS/Books FUZZ" -i files/epub -o crashes/ibooks -t /Users/test/Library/Containers/com.apple.iBooksX/Data/tmp -x 10 -n 100000 -ez

# -l : Local
# -c : cmdline with FUZZ word (if not stdin is used)
# -i : input directory or file
# -o : Dir to output crashes
# -t : Dir to output runtime fuzzing artifacts
# -x : Tmeout for the run (default is 1)
# -n : Num of fuzzing iterations (default is 1)
# -e : enable second round fuzzing where any crashes found are reused as inputs
# -z : enable malloc debug helpers

# Font Book
litefuzz -l -c "/System/Applications/Font Book.app/Contents/MacOS/Font Book FUZZ" -i input/fonts -o crashes/font-book -x 2 -n 500000 -ez

# smbutil (using pcap capture)
litefuzz -lk -c "smbutil view smb://localhost:4455" -a tcp://localhost:4455 -i input/mac-smb-resp -p -n 100000 -z

# screensharingd (using pcap capture)
litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash screensharingd -p -n 100000

{% endcode %}

अधिक Fuzzing MacOS जानकारी

संदर्भ

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके: