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)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Statik Analiz
otool & objdump & nm
otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application
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
nm -m ./tccd # List of symbols
jtool2 & Disarm
Buradan disarm'ı indirebilirsiniz.
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.
# 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'te bulunabilirken,ldid
iOS'te bulunabilir
# 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 , .pkg dosyalarını (kurulum dosyaları) incelemek ve yüklemeden önce içeriğini görmek için yararlı 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 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:
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
/Volumes
altında monte edilecektir.
Paketlenmiş ikili dosyalar
- Yüksek entropi kontrolü
- String'leri kontrol et (anlaşılır string yoksa, paketlenmiş)
- MacOS için UPX paketleyici, "__XHDR" adında 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:
x64:
Argüman | Kayıt | (için) objc_msgSend |
---|---|---|
1. argüman | rdi | self: metodun çağrıldığı nesne |
2. argüman | rsi | op: metodun adı |
3. argüman | rdx | metoda 1. argüman |
4. argüman | rcx | metoda 2. argüman |
5. argüman | r8 | metoda 3. argüman |
6. argüman | r9 | metoda 4. argüman |
7. ve üzeri argüman | rsp+ | metoda 5. ve üzeri argüman |
ObjectiveC metadata dökümü
Dynadump
Dynadump, Objective-C ikili dosyalarını sınıf dökümü yapmak için bir araçtır. Github, dylib'leri belirtmektedir ancak bu yürütülebilir dosyalarla da çalışır.
./dynadump dump /path/to/bin
Yazma zamanı itibarıyla, bu şu anda en iyi çalışan olanıdır.
Normal araçlar
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 kod için sınıflar, kategoriler ve protokoller için bildirimler üreten orijinal araçtır.
Eski ve bakımsızdır, bu yüzden muhtemelen düzgün çalışmayacaktır.
ICDump
iCDump modern ve çok platformlu bir 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.
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:
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
[...]
Daha fazla bilgiye bu bölümde saklanan bilgiler hakkında 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 faydalıdırlar ve orijinal adı alabilen "demanglers" vardır:
# 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>
veya 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, ancakcom.apple.sysmond.client
yetkisine sahip olmak gerekir.
Stackshot & microstackshots
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 /usr/libexec/sysdiagnosed
daemon'u com.apple.system-task-ports
ve get-task-allow
gibi çok ilginç yetkilere sahiptir.
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 silercom.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 sözlükte üç 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 açığa çıkarmak için bir sertifika yüklemek mümkündür. Açıklamaları buradan 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, decompile edilmiş ve ikili olarak ilgili simgeye tıklayarak görebilirsiniz:
.png)
Bir kod nesnesine sağ tıkladığınızda, o nesneye referansları görebilir veya adını değiştirebilirsiniz (bu, decompile edilmiş psödo kodda çalışmaz):
.png)
Ayrıca, orta altta python komutları yazabilirsiniz.
Sağ panel
Sağ panelde, navigasyon geçmişi gibi ilginç bilgileri görebilirsiniz (bu sayede 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.
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 dtrace
veya dtruss
ikililerini derlediğiniz dosyaları kullanarak çalıştırabilirsiniz.
Dtrace'ın mevcut prob'ları ş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
Probe adı dört bölümden oluşur: sağlayıcı, modül, işlev ve ad (fbt:mach_kernel:ptrace:entry
). Eğer adın bazı bölümlerini belirtmezseniz, Dtrace o bölümü joker karakter olarak uygular.
DTrace'i probeleri etkinleştirmek ve tetiklendiğinde 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
#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
- betik
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
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 izleme kaydından kendi istemcinizi çı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ı yaparak belirli kodlar üzerinde geri çağırmalar ayarlayabilir ve ardından ktrace_start
ile başlatabilir.
Bunu SIP etkinleştirildiğinde bile kullanabilirsiniz.
İstemci olarak ktrace
aracını kullanabilirsiniz:
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 işlemle 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 (bu komutu başlatan terminal FDA gerektirir). Ardından, bu aracı kullanarak json'u yükleyebilir ve tüm ilişkileri görüntüleyebilirsiniz:
.png)
FileMonitor
FileMonitor, dosya olaylarını (oluşturma, değişiklikler ve silmeler gibi) izlemeye olanak tanır ve bu 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:
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 ağ 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 PT_DENY_ATTACH
kullanan bir çalışan daemon'u nasıl hata ayıklayacağınız hakkında bir örnek bulabilirsiniz; bu, SIP devre dışı bırakılmış olsa bile hata ayıklamayı engellemek için kullanılır.
lldb
lldb, macOS ikili hata ayıklama için de facto araçtır.
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:
settings set target.x86-disassembly-flavor intel
warning
lldb içinde bir işlemi process save-core
ile dökme
(lldb) Komut | Açıklama |
run (r) | Bir kesme noktası vurulana veya işlem sona erene kadar devam edecek şekilde yürütmeyi başlatır. |
process launch --stop-at-entry | Giriş noktasında durarak yürütmeyi başlatır |
continue (c) | Hata ayıklanan işlemin yürütmesini devam ettirir. |
nexti (n / ni) | Sonraki talimatı yürüt. Bu komut, işlev çağrılarını atlayacaktır. |
stepi (s / si) | Sonraki talimatı yürüt. nexti komutunun aksine, bu komut işlev çağrılarına adım atar. |
finish (f) | Mevcut işlevdeki (“çerçeve”) geri dönüş ve durma ile kalan talimatları yürütür. |
control + c | Yürütmeyi duraklat. İşlem run (r) veya continue (c) ile çalıştırılmışsa, bu işlem mevcut yürütme yerinde durmasına neden olur. |
breakpoint (b) |
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ı dize olarak görüntüler. |
x/i | Belleği montaj talimatı olarak görüntüler. |
x/b | Belleği bayt olarak görüntüler. |
print object (po) | Bu, parametre ile referans verilen nesneyi yazdırır po $raw
Apple’ın Objective-C API'lerinin veya yöntemlerinin çoğu nesneler döndürdüğünden, bunlar “print object” (po) komutu ile görüntülenmelidir. Eğer po anlamlı bir çıktı üretmiyorsa |
memory | memory 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 işlevi disassemble et dis -n dis -n |
parray | parray 3 (char **)$x1 # x1 reg'inde 3 bileşenli diziyi kontrol et |
image dump sections | Mevcut işlem belleğinin haritasını yazdırır |
image dump symtab | image dump symtab CoreNLP #CoreNLP'den tüm sembollerin adresini al |
tip
objc_sendMsg
fonksiyonu çağrıldığında, rsi kaydedicisi metodun adını null-terminatlı (“C”) dize 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
vehw.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 hata ayıklanıp ayıklanmadığını bulmak da mümkündür:
if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //işlem hata ayıklanıyor }
- Ayrıca
ptrace
sistem çağrısınıPT_DENY_ATTACH
bayrağı ile çağırabilir. Bu, bir hata ayıklayıcının bağlanmasını ve izlenmesini engeller. sysctl
veyaptrace
fonksiyonunun içe aktarıldığı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 hata ayıklama 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)- İş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çinulimit -c 0
çağrısı yapılabilir ve tekrar etkinleştirmek içinulimit -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/
dizinine kaydeder.
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
dizinine kaydeder.
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.
#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:
- systemsetup -setsleep Never
- pmset, Sistem Tercihleri
- KeepingYouAwake
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
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şlediğini 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:
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

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 unutmayın, dosyaları sandbox'tan (~/Library/Containers/com.apple.Safari/Data
) okumaları gerekir...
Bazı örnekler:
# 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
- https://www.youtube.com/watch?v=T5xfL9tEg44
- https://github.com/bnagy/slides/blob/master/OSXScale.pdf
- https://github.com/bnagy/francis/tree/master/exploitaben
- https://github.com/ant4g0nist/crashwrangler
Referanslar
- OS X Olay Yanıtı: Betik ve Analiz
- https://www.youtube.com/watch?v=T5xfL9tEg44
- https://taomm.org/vol1/analysis.html
- Mac Kötü Amaçlı Yazılımı Sanatı: Kötü Amaçlı Yazılımları Analiz Etme Rehberi
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)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.