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

Reading time: 22 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin

Statik Analiz

otool & objdump & nm

bash
otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application
bash
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
bash
nm -m ./tccd # List of symbols

jtool2 & Disarm

Buradan disarm'ı indirebilirsiniz.

bash
ARCH=arm64e disarm -c -i -I --signature /path/bin # Get bin info and signature
ARCH=arm64e disarm -c -l /path/bin # Get binary sections
ARCH=arm64e disarm -c -L /path/bin # Get binary commands (dependencies included)
ARCH=arm64e disarm -c -S /path/bin # Get symbols (func names, strings...)
ARCH=arm64e disarm -c -d /path/bin # Get disasembled
jtool2 -d __DATA.__const myipc_server | grep MIG # Get MIG info

Buradan jtool2'yi indirebilirsiniz veya brew ile kurabilirsiniz.

bash
# 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

[!CAUTION] > jtool, disarm lehine kullanımdan kaldırılmıştır

Codesign / ldid

[!TIP] > Codesign macOS'de bulunabilirken, ldid iOS'de bulunabilir

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

# Check if the app’s 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, yükleme öncesi .pkg dosyalarını (kurulum dosyaları) incelemek için yararlı bir araçtır ve içeriğini görmek için kullanılı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 betikleri içerir.

hdiutil

Bu araç, herhangi bir şey çalıştırmadan önce Apple disk görüntülerini (.dmg) incelemek için monte etmeye olanak tanır:

bash
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

It will be mounted in /Volumes

Packed binaries

  • Yüksek entropi kontrolü
  • String'leri kontrol et (anlaşılır string yoksa, packed)
  • MacOS için UPX packer, "__XHDR" adlı bir bölüm oluşturur

Statik Objective-C analizi

Metadata

caution

Objective-C ile yazılmış programların derlendiğinde Mach-O ikili dosyalarına sınıf bildirimlerini koruduğunu unutmayın. Bu tür sınıf bildirimleri şunları içerir:

  • Tanımlanan arayüzler
  • Arayüz yöntemleri
  • Arayüz örnek değişkenleri
  • Tanımlanan protokoller

Bu isimlerin, ikilinin tersine mühendislik sürecini zorlaştırmak için obfuscate edilebileceğini unutmayın.

Fonksiyon çağrısı

Bir ikili dosyada Objective-C kullanan bir fonksiyon çağrıldığında, derlenmiş kod o fonksiyonu çağırmak yerine objc_msgSend çağrısını yapar. Bu, nihai fonksiyonu çağıracaktır:

Bu fonksiyonun beklediği parametreler şunlardır:

  • İlk parametre (self) "mesajı alacak sınıfın örneğine işaret eden bir işaretçi"dir. Daha basit bir ifadeyle, bu, metodun çağrıldığı nesnedir. Eğer metod bir sınıf metoduysa, bu sınıf nesnesinin (bütün olarak) bir örneği olacaktır, oysa bir örnek metodu için self, sınıfın bir örneğine işaret edecektir.
  • İkinci parametre (op), "mesajı işleyen metodun seçicisidir". Yine, daha basit bir ifadeyle, bu sadece metodun adıdır.
  • Kalan parametreler, metodun gerektirdiği herhangi bir değerdir (op).

Bu bilgiyi ARM64'te lldb ile kolayca nasıl alacağınızı bu sayfada görün:

Introduction to ARM64v8

x64:

ArgumentRegister(for) objc_msgSend
1st argumentrdiself: methodun çağrıldığı nesne
2nd argumentrsiop: metodun adı
3rd argumentrdxmetodun 1. argümanı
4th argumentrcxmetodun 2. argümanı
5th argumentr8metodun 3. argümanı
6th argumentr9metodun 4. argümanı
7th+ argument

rsp+
(stack'te)

metodun 5. ve sonrası argümanları

Dump ObjectiveC metadata

Dynadump

Dynadump, Objective-C ikili dosyalarını sınıf dökümü yapmak için bir araçtır. Github, dylib'leri belirtir ancak bu yürütülebilir dosyalarla da çalışır.

bash
./dynadump dump /path/to/bin

Yazma zamanı itibarıyla, bu şu anda en iyi çalışan olanıdır.

Düzenli araçlar

bash
nm --dyldinfo-only /path/to/bin
otool -ov /path/to/bin
objdump --macho --objc-meta-data /path/to/bin

class-dump

class-dump , ObjectiveC formatında kodlardaki sınıflar, kategoriler ve protokoller için bildirimler üreten orijinal araçtır.

Eski ve bakımsız olduğu için muhtemelen düzgün çalışmayacaktır.

ICDump

iCDump modern ve çapraz platform Objective-C sınıf dökümüdür. Mevcut araçlarla karşılaştırıldığında, iCDump Apple ekosisteminden bağımsız olarak çalışabilir ve Python bağlamalarını açığa çıkarır.

python
import icdump
metadata = icdump.objc.parse("/path/to/bin")

print(metadata.to_decl())

Statik Swift analizi

Swift ikili dosyaları ile, Objective-C uyumluluğu olduğundan, bazen class-dump kullanarak bildirimleri çıkartabilirsiniz ama her zaman değil.

jtool -l veya otool -l komut satırları ile __swift5 ön eki ile başlayan birkaç bölüm bulmak mümkündür:

bash
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 saklanan bilgiler hakkında daha fazla bilgiye bu blog yazısında ulaşabilirsiniz.

Ayrıca, Swift ikili dosyaları sembollere sahip olabilir (örneğin, kütüphanelerin fonksiyonlarının çağrılabilmesi için sembolleri saklaması gerekir). Semboller genellikle fonksiyon adı ve attr hakkında çirkin bir şekilde bilgi içerir, bu nedenle çok kullanışlıdırlar ve orijinal adı alabilen "demanglers" vardır:

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

# Swift cli
swift demangle

Dinamik Analiz

warning

İkili dosyaları hata ayıklamak için, SIP'nin devre dışı bırakılması gerekir (csrutil disable veya csrutil enable --without debug) veya ikili dosyaları geçici bir klasöre kopyalayıp imzayı kaldırmak için codesign --remove-signature <binary-path> ya da ikili dosyanın hata ayıklanmasına izin vermek gerekir (bunu bu script ile kullanabilirsiniz).

warning

macOS'ta sistem ikili dosyalarını enstrümante etmek için, (örneğin cloudconfigurationd) SIP'nin devre dışı bırakılması gerekir (sadece imzayı kaldırmak işe yaramaz).

API'ler

macOS, süreçler hakkında bilgi veren bazı ilginç API'ler sunar:

  • proc_info: Her süreç hakkında çok fazla bilgi veren ana API'dir. Diğer süreçlerin bilgilerini almak için root olmanız gerekir, ancak özel yetkilere veya mach portlarına ihtiyacınız yoktur.
  • libsysmon.dylib: XPC ile sunulan işlevler aracılığıyla süreçler hakkında bilgi almayı sağlar, ancak com.apple.sysmond.client yetkisine sahip olmak gerekir.

Stackshot & mikrostackshotlar

Stackshotting, süreçlerin durumunu, tüm çalışan iş parçacıklarının çağrı yığınlarını içerecek şekilde yakalamak için kullanılan bir tekniktir. Bu, hata ayıklama, performans analizi ve sistemin belirli bir zamanda davranışını anlamak için özellikle yararlıdır. iOS ve macOS'ta, stackshotting, sample ve spindump gibi çeşitli araçlar ve yöntemler kullanılarak gerçekleştirilebilir.

Sysdiagnose

Bu araç (/usr/bini/ysdiagnose), bilgisayarınızdan ps, zprint gibi onlarca farklı komut çalıştırarak çok fazla bilgi toplar...

root olarak çalıştırılmalıdır ve daemon /usr/libexec/sysdiagnosed çok ilginç yetkilere sahiptir, örneğin com.apple.system-task-ports ve get-task-allow.

Plist'i /System/Library/LaunchDaemons/com.apple.sysdiagnose.plist konumunda bulunur ve 3 MachServices tanımlar:

  • com.apple.sysdiagnose.CacheDelete: /var/rmp içindeki eski arşivleri siler
  • com.apple.sysdiagnose.kernel.ipc: Özel port 23 (kernel)
  • com.apple.sysdiagnose.service.xpc: Libsysdiagnose Obj-C sınıfı aracılığıyla kullanıcı modu arayüzü. Bir dict içinde üç argüman geçirilebilir (compress, display, run)

Birleşik Günlükler

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

Ayrıca, bazı günlükler, bazı kullanıcı veya bilgisayar tanımlanabilir bilgileri gizlemek için <private> etiketini içerecektir. Ancak, bu bilgileri ifşa etmek için bir sertifika yüklemek mümkündür. buradaki açıklamaları takip edin.

Hopper

Sol panel

Hopper'ın sol panelinde, ikilinin sembollerini (Etiketler), prosedürler ve işlevler listesini (Proc) ve dizeleri (Str) görebilirsiniz. Bunlar tüm dizeler değildir, ancak Mac-O dosyasının çeşitli bölümlerinde tanımlananlardır (örneğin cstring veya objc_methname).

Orta panel

Orta panelde dağıtılmış kodu görebilirsiniz. Ve bunu ham dağıtım, graf olarak, dekompile edilmiş ve ikili olarak ilgili simgeye tıklayarak görebilirsiniz:

Bir kod nesnesine sağ tıkladığınızda, o nesneye referansları/gelen referansları görebilir veya adını değiştirebilirsiniz (bu, dekompile edilmiş sahte kodda çalışmaz):

Ayrıca, orta alanda python komutları yazabilirsiniz.

Sağ panel

Sağ panelde, navigasyon geçmişi (bu sayfaya nasıl geldiğinizi bilmenizi sağlar), 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 bilgileri gibi ilginç bilgiler görebilirsiniz.

dtrace

Kullanıcılara uygulamalara son derece düşük seviyede erişim sağlar ve kullanıcılara programları izleme ve hatta yürütme akışlarını değiştirme imkanı sunar. Dtrace, kernel boyunca yerleştirilen prob'lar kullanır ve sistem çağrılarının başlangıç ve bitiş noktaları gibi yerlerde bulunur.

DTrace, her sistem çağrısı için bir prob oluşturmak üzere dtrace_probe_create işlevini kullanır. Bu prob'lar, her sistem çağrısının giriş ve çıkış noktasında tetiklenebilir. DTrace ile etkileşim, yalnızca root kullanıcı için mevcut olan /dev/dtrace aracılığıyla gerçekleşir.

tip

Dtrace'ı SIP korumasını tamamen devre dışı bırakmadan etkinleştirmek için kurtarma modunda şunu çalıştırabilirsiniz: csrutil enable --without dtrace

Ayrıca, derlediğiniz dtrace veya dtruss ikili dosyalarını da kullanabilirsiniz.

Dtrace'ın mevcut prob'ları şu şekilde elde edilebilir:

bash
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

Probe 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 o bölümü joker karakter olarak uygular.

DTrace'i probeleri etkinleştirmek ve ateşlendiklerinde hangi eylemlerin gerçekleştirileceğini belirtmek için D dilini kullanmamız gerekecek.

Daha ayrıntılı bir açıklama ve daha fazla örnek için https://illumos.org/books/dtrace/chp-intro.html adresine bakabilirsiniz.

Örnekler

man -k dtrace komutunu çalıştırarak mevcut DTrace betiklerini listeleyin. Örnek: sudo dtruss -n binary

  • Satır
bash
#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
  • betik
bash
syscall:::entry
/pid == $1/
{
}

#Log every syscall of a PID
sudo dtrace -s script.d 1234
bash
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"
bash
syscall:::entry
{
;
}
syscall:::return
{
printf("=%d\n", arg1);
}

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

dtruss

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

kdebug

Bu, bir çekirdek izleme aracıdır. Belgelendirilmiş kodlar /usr/share/misc/trace.codes içinde bulunabilir.

latency, sc_usage, fs_usage ve trace gibi araçlar bunu dahili olarak kullanır.

kdebug ile etkileşim kurmak için sysctl, kern.kdebug ad alanı üzerinden kullanılır ve kullanılacak MIB'ler bsd/kern/kdebug.c içinde uygulanan fonksiyonlarla birlikte sys/sysctl.h dosyasında bulunabilir.

Özel bir istemci ile kdebug ile etkileşim kurmak için genellikle şu adımlar izlenir:

  • Mevcut ayarları KERN_KDSETREMOVE ile kaldırın
  • KERN_KDSETBUF ve KERN_KDSETUP ile izlemeyi ayarlayın
  • KERN_KDGETBUF ile tampon girişlerinin sayısını alın
  • KERN_KDPINDEX ile izlemeyi kendi istemcinizden çıkarın
  • KERN_KDENABLE ile izlemeyi etkinleştirin
  • KERN_KDREADTR çağrısını yaparak tamponu okuyun
  • Her bir iş parçacığını kendi süreci ile eşleştirmek için KERN_KDTHRMAP çağrısını yapın.

Bu bilgiyi almak için Apple aracı trace veya özel araç kDebugView (kdv)** kullanılabilir.**

Kdebug'un aynı anda yalnızca 1 müşteri için mevcut olduğunu unutmayın. Yani aynı anda yalnızca bir k-debug destekli araç çalıştırılabilir.

ktrace

ktrace_* API'leri, Kdebug'ın sarmalayıcıları olan libktrace.dylib'den gelir. Ardından, bir istemci sadece ktrace_session_create ve ktrace_events_[single/class] çağrısını yaparak belirli kodlar üzerinde geri çağırmalar ayarlayabilir ve ardından ktrace_start ile başlatabilir.

Bunu SIP etkinleştirilmişken bile kullanabilirsiniz.

İstemci olarak ktrace aracını kullanabilirsiniz:

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

Or tailspin.

kperf

Bu, bir çekirdek düzeyinde profil oluşturmak için kullanılır ve Kdebug çağrıları kullanılarak oluşturulmuştur.

Temelde, global değişken kernel_debug_active kontrol edilir ve ayarlandığında kperf_kdebug_handler çağrılır, Kdebug kodu ve çağrılan çekirdek çerçevesinin adresi ile. Eğer Kdebug kodu seçilenlerden biriyle eşleşirse, "hareketler" bitmap olarak yapılandırılır (seçenekler için osfmk/kperf/action.h dosyasına bakın).

Kperf ayrıca bir sysctl MIB tablosuna sahiptir: (root olarak) sysctl kperf. Bu kodlar osfmk/kperf/kperfbsd.c dosyasında bulunabilir.

Ayrıca, Kperf'in işlevselliğinin bir alt kümesi kpc içinde yer alır ve bu, makine performans sayaçları hakkında bilgi sağlar.

ProcessMonitor

ProcessMonitor, bir sürecin gerçekleştirdiği süreçle ilgili eylemleri kontrol etmek için çok yararlı bir araçtır (örneğin, bir sürecin hangi yeni süreçleri oluşturduğunu izlemek).

SpriteTree

SpriteTree süreçler arasındaki ilişkileri yazdıran bir araçtır.
Mac'inizi sudo eslogger fork exec rename create > cap.json gibi bir komutla izlemelisiniz (bunu başlatan terminal FDA gerektirir). Ardından, bu aracı kullanarak json'u yükleyebilir ve tüm ilişkileri görüntüleyebilirsiniz:

FileMonitor

FileMonitor, dosya olaylarını (oluşturma, değişiklikler ve silme gibi) izlemeye olanak tanır ve bu tür olaylar hakkında ayrıntılı bilgi sağlar.

Crescendo

Crescendo, Windows kullanıcılarının Microsoft Sysinternal’s Procmon'dan tanıyabileceği bir GUI aracıdır. Bu araç, çeşitli olay türlerinin kaydedilmesini başlatıp durdurmaya, bu olayları dosya, süreç, ağ vb. gibi kategorilere göre filtrelemeye 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

Süreçler tarafından gerçekleştirilen eylemleri takip etmeye olanak tanır:

bash
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 faydalıdır.
Ayrıca, ikili süreçleri virustotal ile 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 bir çalışan daemon'u hata ayıklama örneğini bulabilirsiniz.

lldb

lldb, macOS ikili hata ayıklama için de facto aracıdır.

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

Intel lezzetini ayarlamak için, ana dizininizde .lldbinit adında bir dosya oluşturarak aşağıdaki satırı ekleyebilirsiniz:

bash
settings set target.x86-disassembly-flavor intel

warning

lldb içinde bir işlemi process save-core ile dökme

(lldb) KomutAçıklama
run (r)Bir kesme noktası vurulana veya işlem sonlanana kadar devam edecek şekilde yürütmeyi başlatır.
process launch --stop-at-entryGiriş noktasında durarak yürütmeyi başlatır
continue (c)Debug edilen işlemin yürütmesini devam ettirir.
nexti (n / ni)Sonraki talimatı yürüt. Bu komut, fonksiyon çağrılarını atlar.
stepi (s / si)Sonraki talimatı yürüt. nexti komutunun aksine, bu komut fonksiyon çağrılarına girer.
finish (f)Mevcut fonksiyondaki (“çerçeve”) geri kalan talimatları yürüt, geri dön ve dur.
control + cYürütmeyi duraklat. Eğer işlem çalıştırıldıysa (r) veya devam ettirildiyse (c), bu işlem duraklatılacaktır ...şu anda yürütüldüğü yerde.
breakpoint (b)

b main #Herhangi bir main fonksiyonu

b `main #Binin ana fonksiyonu

b set -n main --shlib #Belirtilen binin ana fonksiyonu

breakpoint set -r '\[NSFileManager .*\]$' #Herhangi bir NSFileManager metodu

breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'

break set -r . -s libobjc.A.dylib # O kütüphanedeki tüm fonksiyonlarda kesme noktası

b -a 0x0000000100004bd9

br l #Kesme noktası listesi

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

breakpoint delete

help

help breakpoint #Kesme noktası komutu hakkında yardım al

help memory write #Belleğe yazma hakkında yardım al

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s Belleği null-terminatlı string olarak gösterir.
x/i Belleği assembly talimatı olarak gösterir.
x/b Belleği byte olarak gösterir.
print object (po)

Bu, parametre ile referans edilen nesneyi yazdırır

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Apple’ın Objective-C API'lerinin veya yöntemlerinin çoğu nesne döndürdüğünden, bu nedenle “print object” (po) komutu ile gösterilmelidir. Eğer po anlamlı bir çıktı üretmiyorsa x/b kullanın.

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

dis #Mevcut fonksiyonu disassemble et

dis -n #Fonksiyonu disassemble et

dis -n -b #Fonksiyonu disassemble et
dis -c 6 #6 satır disassemble et
dis -c 0x100003764 -e 0x100003768 #Bir eklemden diğerine
dis -p -c 4 #Mevcut adreste disassemble etmeye başla

parrayparray 3 (char **)$x1 # x1 reg'inde 3 bileşenli diziyi kontrol et
image dump sectionsMevcut işlem belleğinin haritasını yazdırır
image dump symtab image dump symtab CoreNLP #CoreNLP'den tüm sembollerin adresini al

note

objc_sendMsg fonksiyonu çağrıldığında, rsi kaydedicisi metodun adını null-terminatlı (“C”) string olarak tutar. Adı lldb üzerinden 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:"

Anti-Dinamik Analiz

VM tespiti

  • sysctl hw.model komutu host bir MacOS olduğunda "Mac" döner, ancak bir VM olduğunda farklı bir şey döner.
  • hw.logicalcpu ve hw.physicalcpu değerleri ile oynayarak bazı kötü amaçlı yazılımlar 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 tabanlı olup olmadığını da tespit edebilir.
  • Basit bir kod ile bir işlemin debug edilip edilmediğini bulmak da mümkündür:
  • if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //işlem debug ediliyor }
  • Ayrıca ptrace sistem çağrısını PT_DENY_ATTACH bayrağı ile çağırabilir. Bu, bir debugugger'ın bağlanmasını ve izlenmesini engeller.
  • sysctl veya ptrace fonksiyonunun içe aktarılıp aktarılmadığını kontrol edebilirsiniz (ancak kötü amaçlı yazılım bunu dinamik olarak içe aktarabilir).
  • Bu yazıda belirtildiği gibi, “Anti-Debug Tekniklerini Aşmak: macOS ptrace varyantları” :
    Process # exited with status = 45 (0x0000002d) mesajı genellikle debug hedefinin PT_DENY_ATTACH kullandığını gösteren bir işarettir

Core Dumps

Core dump'lar aşağıdaki durumlarda oluşturulur:

  • kern.coredump sysctl 1 olarak ayarlanmışsa (varsayılan olarak)
  • Eğer işlem suid/sgid değilse veya kern.sugid_coredump 1 ise (varsayılan olarak 0)
  • AS_CORE limiti işlemi izin veriyorsa. Kod dump'larının oluşturulmasını engellemek için ulimit -c 0 çağrısı yapılabilir ve bunları yeniden etkinleştirmek için ulimit -c unlimited kullanılabilir.

Bu durumlarda core dump, kern.corefile sysctl'ine göre oluşturulur ve genellikle /cores/core/.%P dizininde saklanır.

Fuzzing

ReportCrash

ReportCrash çöken işlemleri analiz eder ve bir çökme raporunu diske kaydeder. Bir çökme raporu, bir geliştiricinin çökme nedenini teşhis etmesine yardımcı olabilecek bilgileri 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/ dizininde saklar.
Daimonlar, 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ı sistemin /Library/Logs/DiagnosticReports dizininde saklar.

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

bash
#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 uykuya dalmasına izin vermemek önemlidir:

SSH Bağlantısı Kesilmesi

Eğer bir SSH bağlantısı üzerinden fuzzing yapıyorsanız, oturumun kapanmayacağından emin olmak önemlidir. Bu nedenle sshd_config dosyasını şu şekilde değiştirin:

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

İçsel İşleyiciler

Aşağıdaki sayfayı kontrol edin hangi uygulamanın belirtilen şemayı veya protokolü işlemekten sorumlu olduğunu bulmak için:

macOS File Extension & URL scheme app handlers

Ağ Süreçlerini Sayma

Ağ verilerini yöneten süreçleri bulmak için bu ilginçtir:

bash
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

Ya da netstat veya lsof kullanın

Libgmalloc

bash
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"

Fuzzers

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ı gibi belirli gereksinimleri olduğunu ve dosyaların sandbox'tan (~/Library/Containers/com.apple.Safari/Data) okunması gerektiğini unutmayın...

Bazı örnekler:

bash
# 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

Daha Fazla Fuzzing MacOS Bilgisi

Referanslar

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin