hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing
2024-02-10 18:14:16 +00:00
..
arm64-basic-assembly.md Translated to Turkish 2024-02-10 18:14:16 +00:00
introduction-to-x64.md Translated to Turkish 2024-02-10 18:14:16 +00:00
README.md Translated to Turkish 2024-02-10 18:14:16 +00:00

macOS Uygulamaları - İnceleme, hata ayıklama ve Fuzzing

AWS hackleme konusunda sıfırdan kahramana dönüşmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları:

Statik Analiz

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

Bu araç, codesign, otool ve objdump için bir yerine geçme olarak kullanılabilir ve birkaç ek özellik sunar. Buradan indirebilirsiniz veya brew ile kurabilirsiniz.

# 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, macOS'ta bulunurken ldid, iOS'ta bulunur. {% 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, kurmadan önce içeriğini görmek için .pkg dosyalarını (kurulum dosyaları) incelemek için kullanışlı bir araçtır.
Bu kurulum dosyaları, kötü amaçlı yazılım yazarlarının genellikle kötü amaçlı yazılımı sürdürmek için kötüye kullandığı preinstall ve postinstall bash komut dosyalarına sahiptir.

hdiutil

Bu araç, Apple disk görüntülerini (.dmg) çalıştırmadan önce incelemek için mount etmeyi sağlar:

hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

Objective-C

Metadata

{% hint style="danger" %} Objective-C ile yazılan programlar, Mach-O ikili dosyalarına derlendiklerinde sınıf bildirimlerini saklar. Bu sınıf bildirimleri aşağıdaki bilgileri içerir: {% endhint %}

  • Sınıfın adı
  • Sınıfın metodları
  • Sınıfın örnek değişkenleri

Bu bilgilere class-dump kullanarak erişebilirsiniz:

class-dump Kindle.app

Fonksiyon çağırma

Objective-C kullanan bir ikili dosyada bir fonksiyon çağırıldığında, derlenmiş kod bu fonksiyonu çağırmak yerine objc_msgSend'i çağırır. Bu da son fonksiyonu çağırır:

Bu fonksiyonun beklediği parametreler şunlardır:

  • İlk parametre (self), "mesajı alan sınıfın örneğine işaret eden bir işaretçi"dir. Daha basit bir ifadeyle, yöntemin çağrıldığı nesnedir. Eğer yöntem bir sınıf yöntemi ise, bu bir sınıf nesnesinin bir örneği olacaktır, bir örnek yöntem için ise self, bir nesne olarak sınıfın bir örneğine işaret edecektir.
  • İkinci parametre (op), "mesajı işleyen yöntemin seçicisi"dir. Yine daha basit bir ifadeyle, bu sadece yöntemin adıdır.
  • Geri kalan parametreler, yöntem tarafından gereken herhangi bir değerdir (op).
Argüman Kayıt (için) objc_msgSend
1. argüman rdi self: yöntemin çağrıldığı nesne
2. argüman rsi op: yöntemin adı
3. argüman rdx yönteme gönderilen 1. argüman
4. argüman rcx yönteme gönderilen 2. argüman
5. argüman r8 yönteme gönderilen 3. argüman
6. argüman r9 yönteme gönderilen 4. argüman
7. ve sonrası

rsp+
(yığında)

yönteme gönderilen 5. ve sonrası argümanlar

Swift

Swift ikili dosyalarıyla, Objective-C uyumluluğu olduğu için bazen class-dump kullanarak bildirimleri çıkarabilirsiniz, ancak her zaman mümkün olmayabilir.

jtool -l veya otool -l komut satırlarıyla __swift5 önekiyle başlayan birkaç bölüm bulunabilir.

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
[...]

Bu bölümde depolanan bilgiler hakkında daha fazla bilgiye bu blog yazısında ulaşabilirsiniz.

Ayrıca, Swift ikili dosyalarında semboller olabilir (örneğin, kütüphaneler sembolleri depolamalıdır, böylece işlevlerine çağrı yapılabilir). Semboller genellikle işlev adı ve öznitelik hakkında bilgi içerir ve karmaşık bir şekilde temsil edilir, bu yüzden oldukça faydalıdırlar ve orijinal adı alabilen "demanglers" bulunmaktadır.

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

# Swift cli
swift demangle

Paketlenmiş ikili dosyalar

  • Yüksek entropi kontrol edin
  • Dizeleri kontrol edin (anlaşılabilir bir dize neredeyse yoksa, paketlenmiş)
  • MacOS için UPX paketleyici, "__XHDR" adında bir bölüm oluşturur

Dinamik Analiz

{% hint style="warning" %} Not olarak, ikili dosyaları hata ayıklamak için SIP devre dışı bırakılmalıdır (csrutil disable veya csrutil enable --without debug) veya ikili dosyaları geçici bir klasöre kopyalayıp codesign --remove-signature <binary-path> ile imzayı kaldırmak veya ikili dosyanın hata ayıklanmasına izin vermek (bu betiği kullanabilirsiniz: bu betik) {% endhint %}

{% hint style="warning" %} Not olarak, macOS'ta cloudconfigurationd gibi sistem ikili dosyalarını enstrümantal hale getirmek için SIP devre dışı bırakılmalıdır (yalnızca imzayı kaldırmak işe yaramaz). {% endhint %}

Birleşik Günlükler

MacOS, bir uygulama çalıştırılırken ne yaptığını anlamaya çalışırken çok faydalı olabilecek birçok günlük oluşturur.

Ayrıca, bazı günlükler, bazı kullanıcıya veya bilgisayara tanımlanabilir bilgileri gizlemek için <private> etiketini içerecektir. Bununla birlikte, bu bilgileri açıklamak için bir sertifika yüklenebilir. Buradakiıklamaları takip edin.

Hopper

Sol panel

Hopper'ın sol panelinde ikili dosyanın sembolleri (Etiketler), prosedürlerin ve fonksiyonların listesi (Proc) ve dizeler (Str) görülebilir. Bunlar tüm dizeler değildir, ancak Mac-O dosyasının çeşitli bölümlerinde tanımlananlar (cstring veya objc_methname gibi).

Orta panel

Orta panelde ayrıştırılmış kodu görebilirsiniz. Ve bunu ham bir şekilde, grafik olarak, decompile olarak ve ikili olarak görebilirsiniz, ilgili simgeye tıklayarak:

Kod nesnesine sağ tıklayarak, o nesneye yapılan başvuruları görebilir veya hatta adını değiştirebilirsiniz (bu, decompile edilmiş sahte kodda çalışmaz):

Ayrıca, orta aşağıda python komutları yazabilirsiniz.

Sağ panel

Sağ panelde, gezinme geçmişi (bu şekilde mevcut duruma nasıl geldiğinizi bilirsiniz), bu işlevi çağıran tüm işlevleri ve bu işlevin çağırdığı tüm işlevleri görebileceğiniz çağrı grafiği ve yerel değişkenler bilgisi gibi ilginç bilgileri görebilirsiniz.

dtrace

Kullanıcılara uygulamalara son derece düşük seviyede erişim sağlar ve kullanıcılara programları izlemelerine ve hatta yürütme akışlarını değiştirmelerine olanak tanır. Dtrace, çekirdeğin her yerine yerleştirilen probeleri kullanır ve sistem çağrılarının başlangıcı ve sonu gibi konumlarda bulunur.

DTrace, her sistem çağrısı için bir prob oluşturmak için dtrace_probe_create işlevini kullanır. Bu probler, her sistem çağrısının giriş ve çıkış noktasında tetiklenebilir. DTrace ile etkileşim, yalnızca kök kullanıcısı için kullanılabilen /dev/dtrace üzerinden gerçekleşir.

{% hint style="success" %} SIP korumasını tamamen devre dışı bırakmadan Dtrace'i etkinleştirmek için kurtarma modunda şunu çalıştırabilirsiniz: csrutil enable --without dtrace

Ayrıca, derlediğiniz dtrace veya dtruss ikili dosyalarını kullanabilirsiniz. {% endhint %}

dtrace'in mevcut probeleri şu şekilde elde edilebilir:

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

Sondalama adı dört bölümden oluşur: sağlayıcı, modül, işlev ve ad (fbt:mach_kernel:ptrace:entry). Adın bazı bölümlerini belirtmezseniz, Dtrace bu bölümü joker karakter olarak uygular.

DTrace'i yapılandırmak ve tetiklendiklerinde ne tür eylemler gerçekleştireceğini belirtmek için D dilini kullanmamız gerekecek.

Daha detaylı bir açıklama ve daha fazla örnek https://illumos.org/books/dtrace/chp-intro.html adresinde bulunabilir.

Örnekler

Kullanılabilir DTrace komut dosyalarını listelemek için man -k dtrace komutunu çalıştırın. Örnek: sudo dtruss -n binary

  • Satırda
#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'

macOS Uygulamalarını İnceleme, Hata Ayıklama ve Fuzzing

Bu bölümde, macOS işletim sisteminde uygulamaları incelemek, hata ayıklamak ve fuzzing yapmak için bazı teknikler hakkında bilgi bulacaksınız.

Uygulama İnceleme

Uygulamaları incelemek için çeşitli araçlar ve yöntemler vardır. İşte bazıları:

  • otool: Bu araç, bir uygulamanın içindeki paylaşılan kütüphaneleri ve bağımlılıkları listeler.
  • strings: Bu araç, bir uygulamanın içindeki metin dizelerini görüntüler.
  • class-dump: Bu araç, bir uygulamanın içindeki sınıfları ve yöntemleri görüntüler.
  • Hopper Disassembler: Bu ticari bir araçtır ve bir uygulamanın içindeki makine kodunu analiz etmek için kullanılır.

Hata Ayıklama

Hata ayıklama, bir uygulamanın çalışma zamanında hataları bulmak ve düzeltmek için kullanılan bir tekniktir. macOS'ta hata ayıklama yapmak için aşağıdaki araçları kullanabilirsiniz:

  • lldb: Bu, macOS'ta yerleşik bir hata ayıklama aracıdır. Bir uygulamayı lldb ile başlatarak, adım adım kodu izleyebilir, değişken değerlerini kontrol edebilir ve hataları tespit edebilirsiniz.
  • GDB: Bu, GNU Hata Ayıklama Aracı'dır ve macOS'ta da kullanılabilir. lldb'ye benzer şekilde çalışır ve bir uygulamayı hata ayıklamak için kullanılabilir.

Fuzzing

Fuzzing, bir uygulamanın girişine rastgele veya özel olarak oluşturulmuş verileri besleyerek hataları tespit etmek için kullanılan bir tekniktir. macOS'ta fuzzing yapmak için aşağıdaki araçları kullanabilirsiniz:

  • AFL: Bu, American Fuzzy Lop'un kısaltmasıdır ve birçok platformda kullanılabilen bir fuzzing aracıdır. AFL, uygulamaları otomatik olarak test etmek için giriş verilerini değiştirir ve hataları tespit eder.
  • honggfuzz: Bu, honggfuzz adlı bir fuzzing aracıdır ve macOS'ta da kullanılabilir. AFL gibi çalışır ve uygulamaları otomatik olarak test etmek için giriş verilerini değiştirir.

Bu araçlar ve teknikler, macOS uygulamalarını incelemek, hata ayıklamak ve fuzzing yapmak için başlangıç noktası olabilir. Daha fazla bilgi için ilgili araçların belgelerini ve kaynaklarını inceleyebilirsiniz.

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 is a command-line tool available on macOS that allows you to inspect and debug applications by tracing system calls and signals. It provides a way to monitor the interactions between an application and the operating system, which can be useful for understanding how an application works or identifying potential vulnerabilities.

To use dtruss, you simply need to run it followed by the command or application you want to trace. For example, to trace the ls command, you would run:

dtruss ls

This will display a list of system calls and signals that are being executed by the ls command. Each line of output includes the system call or signal name, the arguments passed to the call, and the return value.

By analyzing the output of dtruss, you can gain insights into how an application interacts with the operating system and identify any abnormal behavior or potential security issues. It can be particularly useful for identifying privilege escalation vulnerabilities, as it allows you to see if an application is making unauthorized system calls or accessing sensitive resources.

Keep in mind that dtruss requires root privileges to trace system calls from other processes. You can use the sudo command to run dtruss with elevated privileges:

sudo dtruss <command>

Overall, dtruss is a powerful tool for inspecting and debugging applications on macOS, providing valuable insights into their behavior and potential security vulnerabilities.

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

ktrace

Bu, SIP etkinleştirilmiş olsa bile kullanabileceğiniz bir yöntemdir.

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

ProcessMonitor

ProcessMonitor, bir işlemin gerçekleştirdiği işlemlerle ilgili bilgileri kontrol etmek için çok kullanışlı bir araçtır (örneğin, bir işlemin hangi yeni işlemleri oluşturduğunu izlemek).

SpriteTree

SpriteTree, işlemler arasındaki ilişkileri yazdıran bir araçtır.
Mac'inizi sudo eslogger fork exec rename create > cap.json gibi bir komutla izlemeniz gerekmektedir (bu komutu çalıştıran terminalin FDA'ya ihtiyacı vardır). Ardından bu araca json dosyasını yükleyerek tüm ilişkileri görebilirsiniz:

FileMonitor

FileMonitor, dosya olaylarını (oluşturma, değiştirme ve silme gibi) izlemeyi sağlar ve bu olaylar hakkında detaylı bilgi sağlar.

Crescendo

Crescendo, Microsoft Sysinternal's Procmon aracından Windows kullanıcılarının aşina olabileceği bir görünüm ve hisse sahip olan bir GUI aracıdır. Bu araç, çeşitli olay türlerinin kaydedilip durdurulmasına izin verir, bu olayları dosya, işlem, ağ vb. kategorilere göre filtrelemeye olanak sağlar ve kaydedilen olayları json formatında kaydetme işlevselliği sunar.

Apple Instruments

Apple Instruments, Xcode'un Geliştirici araçlarının bir parçasıdır - uygulama performansını izlemek, bellek sızıntılarını tanımlamak ve dosya sistemi etkinliğini takip etmek için kullanılır.

fs_usage

İşlemler tarafından gerçekleştirilen işlemleri takip etmeyi sağlar:

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, bir ikili dosyanın kullandığı kütüphaneleri, kullandığı dosyaları ve bağlantılarını görmek için kullanışlıdır.
Ayrıca, ikili işlemleri virustotal'a karşı kontrol eder ve ikili hakkında bilgi gösterir.

PT_DENY_ATTACH

Bu blog yazısında, SIP devre dışı bırakılmış olsa bile hata ayıklamayı önlemek için PT_DENY_ATTACH kullanan çalışan bir daemon'ı nasıl hata ayıklayacağınız hakkında bir örnek bulabilirsiniz.

lldb

lldb, macOS ikili dosyalarını hata ayıklama için kullanılan de facto araçtır.

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

lldb kullanırken intel lezzetini ayarlayabilirsiniz. Ev klasörünüzde .lldbinit adında bir dosya oluşturarak aşağıdaki satırı ekleyin:

settings set target.x86-disassembly-flavor intel

{% hint style="warning" %} lldb içinde process save-core komutunu kullanarak bir işlemi dökün. {% endhint %}

(lldb) Komutıklama
run (r)Çalıştırmayı başlatır ve işlem bir kesme noktasına ulaşana veya işlem sona erene kadar kesintisiz devam eder.
continue (c)Hata ayıklanan işlemin yürütmesini devam ettirir.
nexti (n / ni)Sonraki talimatı yürütür. Bu komut, işlev çağrılarını atlar.
stepi (s / si)Sonraki talimatı yürütür. nexti komutunun aksine, bu komut işlev çağrılarına adım atar.
finish (f)Geçerli işlevin geri kalan talimatlarını ("çerçeve") yürütür ve durur.
control + cYürütme duraklatılır. Eğer işlem çalıştırıldıysa (r) veya devam ettirildiyse (c), bu işlemi mevcut olarak yürütülen yerde durdurur.
breakpoint (b)

b main #Herhangi bir main fonksiyonu çağrılır

b <binname>`main #Belirtilen binin ana fonksiyonu

b set -n main --shlib <lib_name> #Belirtilen binin ana fonksiyonu

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l #Kesme noktası listesi

br e/dis <num> #Kesme noktasını etkinleştir/devre dışı bırak

breakpoint delete <num>

help

help breakpoint #Kesme noktası komutunun yardımını al

help memory write #Belleğe yazmak için yardım al

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s <reg/memory address>Belleği null-ile sonlanmış bir dize olarak görüntüler.
x/i <reg/memory address>Belleği derleme talimatı olarak görüntüler.
x/b <reg/memory address>Belleği bayt olarak görüntüler.
print object (po)

Bu, parametre tarafından referans alınan nesneyi yazdırır

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Apple'ın Objective-C API'lerinin çoğu veya yöntemleri nesneler döndürür ve bu nedenle "print object" (po) komutuyla görüntülenmelidir. Eğer po anlamlı bir çıktı üretmezse x/b kullanın

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 #Bu adrese AAAA yazın
memory write -f s $rip+0x11f+7 "AAAA" #Bu adrese AAAA yazın
disassembly

dis #Geçerli işlevi derler

dis -n <funcname> #Fonksiyonu derler

dis -n <funcname> -b <basename> #Fonksiyonu derler
dis -c 6 #6 satırı derler
dis -c 0x100003764 -e 0x100003768 #Bir adresten diğerine kadar derler
dis -p -c 4 #Mevcut adreste derlemeye başlar

parrayparray 3 (char **)$x1 #x1 reg içindeki 3 bileşenli diziyi kontrol edin

{% hint style="info" %} objc_sendMsg fonksiyonu çağrıldığında, rsi kaydedici, bir null-ile sonlanmış ("C") dize olarak yöntem adını tutar. lldb ile adı yazdırmak için:

(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 %}

Anti-Dinamik Analiz

VM tespiti

  • sysctl hw.model komutu, ana bilgisayar MacOS ise "Mac" döndürür, ancak bir VM ise farklı bir değer döndürür.
  • Bazı kötü amaçlı yazılımlar, hw.logicalcpu ve hw.physicalcpu değerlerini oynayarak bir VM olup olmadığını tespit etmeye çalışır.
  • Bazı kötü amaçlı yazılımlar, MAC adresine (00:50:56) dayanarak makinenin VMware olup olmadığını da tespit edebilir.
  • Bir işlemin hata ayıklanıp ayıklanmadığını basit bir kodla tespit etmek de mümkündür:
  • if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //hata ayıklanan işlem }
  • Ayrıca, ptrace sistem çağrısını PT_DENY_ATTACH bayrağıyla çağırabilirsiniz. Bu, bir hata ayıklayıcının eklenmesini ve izlenmesini engeller.
  • sysctl veya ptrace işlevinin ithal edilip edilmediğini kontrol edebilirsiniz (ancak kötü amaçlı yazılım bunu dinamik olarak da içe aktarabilir)
  • Bu yazıda belirtildiği gibi, "Defeating Anti-Debug Techniques: macOS ptrace variants" :
    "Process # exited with status = 45 (0x0000002d) genellikle hata ayıklama hedefinin PT_DENY_ATTACH kullandığının bir işareti olabilir"

Fuzzing

ReportCrash

ReportCrash, çöken işlemleri analiz eder ve bir çökme raporunu diske kaydeder. Bir çökme raporu, bir çökmenin nedenini teşhis etmeye yardımcı olabilecek bilgiler içerir.
Kullanıcı başına launchd bağlamında çalışan uygulamalar ve diğer işlemler için, ReportCrash, bir LaunchAgent olarak çalışır ve çökme raporlarını kullanıcının ~/Library/Logs/DiagnosticReports/ dizinine kaydeder.
Daemonlar, sistem launchd bağlamında çalışan diğer işlemler ve diğer ayrıcalıklı işlemler için, ReportCrash bir LaunchDaemon olarak çalışır ve çökme raporlarını sistemdeki /Library/Logs/DiagnosticReports dizinine kaydeder.

Eğer çökme raporlarının Apple'a gönderilmesinden endişe duyuyorsanız, bunları devre dışı bırakabilirsiniz. Aksi takdirde, çökme raporları bir sunucunun nasıl çöktüğünü anlamak için faydalı olabilir.

#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

Uyku

MacOS'ta fuzzing yaparken Mac'in uyumasına izin vermemek önemlidir:

SSH Bağlantısı Kesilmesi

SSH bağlantısı üzerinden fuzzing yapıyorsanız, oturumun sona ermemesi için aşağıdaki adımları izleyin:

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

Dahili İşleyiciler

Aşağıdaki sayfaya göz atarak, belirli bir şema veya protokolü işleme sorumluluğuna sahip olan uygulamayı nasıl bulabileceğinizi öğrenebilirsiniz:

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

Ağ İşlemlerini Sıralama

Bu, ağ verilerini yöneten işlemleri bulmak için ilginç bir yöntemdir:

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

Veya netstat veya lsof kullanın

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 %}

Fuzzerlar

AFL++

CLI araçları için çalışır.

Litefuzz

MacOS GUI araçlarıyla "sadece çalışır". Bazı macOS uygulamalarının benzersiz dosya adları, doğru uzantılar, dosyaların kum havuzundan (~/Library/Containers/com.apple.Safari/Data) okunması gibi belirli gereksinimleri vardır.

Bazı örnekler:

{% 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 %}

Daha Fazla Fuzzing MacOS Bilgisi

Referanslar

AWS hackleme konusunda sıfırdan kahramana dönüşmek için htARTE (HackTricks AWS Red Team Expert)'ı öğrenin!

HackTricks'ı desteklemenin diğer yolları: