macOS Apps - Inspecting, debugging and Fuzzing
WhiteIntel, şirketin veya müşterilerinin hırsız kötü amaçlı yazılımlar tarafından kompromize edilip edilmediğini kontrol etmek için ücretsiz işlevler sunan dark-web destekli bir arama motorudur.
WhiteIntel'in asıl amacı, bilgi çalan kötü amaçlı yazılımlardan kaynaklanan hesap ele geçirmeleri ve fidye yazılımı saldırılarıyla mücadele etmektir.
Websitesini ziyaret edebilir ve motorlarını ücretsiz deneyebilirsiniz:
Statik Analiz
otool
objdump
jtool2
Bu araç, codesign, otool ve objdump için bir yerine olarak kullanılabilir ve birkaç ek özellik sunar. Buradan indirebilirsiniz veya brew
ile kurabilirsiniz.
Codesign / ldid
Codesign
, macOS'ta bulunabilirken ldid
, iOS'ta bulunabilir.
SuspiciousPackage
SuspiciousPackage kurulum dosyaları olan .pkg dosyalarını incelemek ve içeriğini kurulumdan önce görmek için faydalı bir araçtır.
Bu kurulum dosyaları genellikle 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 kullanıdığı preinstall
ve postinstall
bash betiklerine sahiptir.
hdiutil
Bu araç, Apple disk görüntülerini (.dmg) incelemek için dosyaları bağlamayı sağlar:
Objective-C
Metadata
Objective-C ile yazılan programlar, Mach-O ikili dosyalarına derlendiğinde sınıf bildirimlerini saklar. Bu sınıf bildirimleri şunları içerir:
Sınıfı
Sınıf metodlarını
Sınıf örnek değişkenlerini
Bu bilgilere class-dump kullanarak erişebilirsiniz:
Fonksiyon çağrısı
Bir binary dosyasında bir fonksiyon çağrıldığında ve bu binary Objective-C kullandığında, derlenmiş kod o fonksiyonu çağırmak yerine objc_msgSend
'i çağıracaktır. Bu fonksiyon, nihai fonksiyonu çağıracaktır:
Bu fonksiyonun beklediği parametreler şunlardır:
İlk parametre (self), "mesajı alacak sınıf örneğine işaret eden bir işaretçi"dir. Daha basitçe ifade etmek gerekirse, bu, yöntemin çağrıldığı nesnedir. Eğer yöntem bir sınıf yöntemi ise, bu, sınıf nesnesinin bir örneği olacaktır, bir örnek yöntem için ise self, bir nesne olarak sınıfın örneğine işaret edecektir.
İkinci parametre (op), "mesajı işleyen yöntemin seçicisi"dir. Daha basitçe ifade etmek gerekirse, bu sadece yöntemin adıdır.
Geri kalan parametreler, yöntem tarafından gereken değerlerdir (op).
Bu bilgilere ARM64'te lldb
ile kolayca nasıl ulaşılacağını bu sayfada görebilirsiniz:
x64:
Argüman | Register | (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ığın üzerinde) | Yönteme gönderilen 5. ve sonrası argüman |
Swift
Swift binary dosyalarıyla, Objective-C uyumluluğu olduğundan bazen class-dump kullanarak deklarasyonları çıkarabilirsiniz, ancak her zaman değil.
jtool -l
veya otool -l
komut satırlarıyla, __swift5
önekiyle başlayan birkaç bölüm bulunabilir:
Ayrıca, bu bölümde depolanan bilgiler hakkında daha fazla bilgiye bu blog yazısında ulaşabilirsiniz.
Ayrıca, Swift ikili dosyalarının sembolleri olabilir (örneğin kütüphaneler sembolleri depolamalıdır böylece işlevlerine çağrı yapılabilir). Semboller genellikle işlev adı ve özniteliği hakkında bilgi içerir ve çirkin bir şekilde saklanır, bu nedenle çok yararlıdır ve orijinal adı alabilen "demanglers" bulunmaktadır:
Paketlenmiş ikili dosyalar
Yüksek entropi kontrol edin
Dizeleri kontrol edin (anlaşılabilir bir dize neredeyse yoksa, paketlenmiş)
MacOS için UPX paketleyici bir "__XHDR" adında bir bölüm oluşturur
Dinamik Analiz
İkili dosyaları hata ayıklamak için SIP'nin devre dışı bırakılması gerektiğini unutmayın (csrutil disable
veya csrutil enable --without debug
) veya ikili dosyaları geçici bir klasöre kopyalayın ve codesign --remove-signature <binary-path>
ile imzayı kaldırın veya ikili dosyanın hata ayıklanmasına izin verin (bunu kullanabilirsiniz bu betik)
MacOS'ta sistem ikili dosyalarını (örneğin cloudconfigurationd
) enstrümanize etmek için SIP'nin devre dışı bırakılması gerektiğini unutmayın (yalnızca imzayı kaldırmak işe yaramaz).
Birleşik Günlükler
MacOS, bir uygulama çalıştırılırken ne yaptığını anlamaya çalışırken çok yararlı olabilecek birçok günlük oluşturur.
Ayrıca, bazı günlüklerin, bazı kullanıcı veya bilgisayar tanımlanabilir bilgileri gizlemek için <private>
etiketini içereceğini unutmayın. Bununla birlikte, bu bilgileri açıklamak için bir sertifika yüklenebilir. Buradan açıklamaları takip edin.
Hopper
Sol panel
Hopper'ın sol panelinde, ikilinin sembollerini (Etiketler), prosedürlerin ve işlevlerin listesini (Proc) ve dizeleri (Str) görebilirsiniz. Bunlar, Mac-O dosyasının çeşitli bölümlerinde tanımlanan dizelerin tamamı değildir (örneğin cstring veya objc_methname
gibi).
Orta panel
Orta panelde dizilmiş kodu görebilirsiniz. Ve bunu ham olarak, grafik olarak, derlenmiş olarak ve ikili olarak görebilirsiniz ilgili simgeye tıklayarak:
Bir kod nesnesine sağ tıklayarak o nesneye referansları/gelenleri görebilir veya hatta adını değiştirebilirsiniz (bu, derlenmiş yalancı kodda çalışmaz):
Ayrıca, orta aşağıda python komutları yazabilirsiniz.
Sağ panel
Sağ panelde, gezinme geçmişini (şu anki duruma 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ğini ve yerel değişkenler bilgilerini görebilirsiniz.
dtrace
Kullanıcılara uygulamalara son derece düşük seviyede erişim sağlar ve kullanıcılara programları izleme ve hatta çalışma akışlarını değiştirme olanağı sağlar. Dtrace, çekirdeğin her yerine yerleştirilen ve sistem çağrılarının başlangıcı ve sonu gibi konumlarda bulunan probeleri kullanır.
DTrace, her sistem çağrısı için bir prob oluşturmak için dtrace_probe_create
işlevini kullanır. Bu probeler, her sistem çağrısının giriş ve çıkış noktasında tetiklenebilir. DTrace ile etkileşim /dev/dtrace üzerinden gerçekleşir ve yalnızca kök kullanıcılar için kullanılabilir.
SIP korumasını tamamen devre dışı bırakmadan Dtrace'ı etkinleştirmek için kurtarma modunda şunu çalıştırabilirsiniz: csrutil enable --without dtrace
Ayrıca, derlediğiniz ikili dosyaları dtrace
veya dtruss
ile çalıştırabilirsiniz.
Dtrace'ın mevcut probeleri şu şekilde alınabilir:
Sonda 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'yi probeleri etkinleştirmek ve ateşlendiklerinde ne tür işlemlerin gerçekleştirileceğini belirtmek için yapılandırmak 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
DTrace betiklerinin listesini görmek için man -k dtrace
komutunu çalıştırın. Örnek: sudo dtruss -n binary
Satırda
betik
dtruss
ktrace
Bunu SIP etkinleştirilmiş olsa bile kullanabilirsiniz.
ProcessMonitor
ProcessMonitor, bir işlemin gerçekleştirdiği işlemlerle ilgili 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 komutun çalıştırılması FDA gerektirir). Daha sonra bu araca json dosyasını yükleyerek tüm ilişkileri görebilirsiniz:
FileMonitor
FileMonitor, dosya etkinliklerini (oluşturma, değiştirme ve silme gibi) izlemeyi sağlayarak bu tür etkinlikler hakkında detaylı bilgi sağlar.
Crescendo
Crescendo, Microsoft Sysinternal’s Procmon 'dan Windows kullanıcılarının tanıdığı görünüm ve hisse sahip GUI bir araçtır. Bu araç, çeşitli olay türlerinin kaydedilmesine izin verir, bu olayları dosya, işlem, ağ vb. gibi kategorilere göre filtrelemeye olanak tanır ve kaydedilen olayları json formatında kaydetme işlevselliği sağlar.
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 izlemek için kullanılır.
fs_usage
İşlemler tarafından gerçekleştirilen eylemleri takip etmeyi sağlar.
TaskExplorer
Taskexplorer, bir ikili dosya tarafından kullanılan kütüphaneleri, kullandığı dosyaları ve ağ bağlantılarını görmek için faydalı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, PT_DENY_ATTACH
kullanan çalışan bir daemon'ı hata ayıklamanın nasıl yapıldığına dair bir örnek bulabilirsiniz, bu da hata ayıklamanın devre dışı bırakıldığı durumlarda bile SIP'in devre dışı bırakılmasını önlemek için kullanılır.
lldb
lldb, macOS ikili dosyalarını hata ayıklamak için de facto araçtır.
lldb kullanırken intel lezzetini ayarlayabilirsiniz, aşağıdaki satırı içeren .lldbinit
adında bir dosya oluşturarak ev klasörünüzde:
lldb içinde bir işlemi process save-core
ile dump et.
(lldb) Komut | Açıklama |
run (r) | Kesinti noktasına ulaşılana veya işlem sona erene kadar sürecek olan yürütme işlemi başlatılır. |
continue (c) | Hata ayıklanan işlemin yürütmesine devam edilir. |
nexti (n / ni) | Sonraki talimatı yürütür. Bu komut fonksiyon çağrılarını atlar. |
stepi (s / si) | Sonraki talimatı yürütür. nexti komutunun aksine, bu komut fonksiyon çağrılarına girer. |
finish (f) | Geçerli fonksiyondaki kalan talimatları ("frame") yürütür ve duraklatır. |
control + c | Yürütmeyi duraklatır. Eğer işlem çalıştırılmış (r) veya devam ettirilmiş (c) ise, bu işlemi duraklatır ve bulunduğu yeri durdurur. |
breakpoint (b) | b main #Main fonksiyonu çağrıldığında b <binname>`main #Belirtilen bin dosyasının Main fonksiyonu b set -n main --shlib <lib_name> #Belirtilen bin dosyasının Main fonksiyonu b -[NSDictionary objectForKey:] b -a 0x0000000100004bd9 br l #Kesinti noktası listesi br e/dis <num> #Kesinti noktasını etkinleştir/devre dışı bırak breakpoint delete <num> |
help | help breakpoint #Kesinti noktası komutunun yardımını al help memory write #Belleğe yazma yardımını al |
reg | |
x/s <reg/memory address | Belleği null karakterle sonlandırılmış 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 byte olarak görüntüler. |
print object (po) | Bu, parametre tarafından referans edilen nesneyi yazdırır po $raw
Apple'ın Objective-C API'lerinin çoğu veya yöntemleri nesneler döndürür, bu nedenle "print object" (po) komutuyla 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 #Geçerli fonksiyonu 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 dis -p -c 4 # Geçerli adresin derlemesine başla |
parray | parray 3 (char **)$x1 # x1 reg içindeki 3 bileşenli diziyi kontrol et |
objc_sendMsg
fonksiyonu çağrıldığında, rsi kaydı metodun adını null karakterle sonlandırılmış ("C") bir dize olarak 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:"
Anti-Dinamik Analiz
VM tespiti
sysctl hw.model
komutu, ana bilgisayar MacOS ise "Mac" döndürür, farklı bir şey döndürürse bir VM olduğunu gösterir.Bazı kötü amaçlı yazılımlar, bir VM olup olmadığını tespit etmek için
hw.logicalcpu
vehw.physicalcpu
değerleriyle oynar.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 kodla bir işlemin hata ayıklanıp ayıklanmadığını kontrol etmek de 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ıklamanın eklenmesini ve izlenmesini engeller.sysctl
veyaptrace
fonksiyonunun ithal edilip edilmediğini kontrol edebilirsiniz (ancak kötü amaçlı yazılım bunu dinamik olarak da ithal edebilir)Bu yazıda belirtildiği gibi, “Anti-Hata Ayıklama Tekniklerini Yenme: macOS ptrace varyantları” : “Process # status = 45 (0x0000002d) ile çıktı veren mesaj genellikle hedefin PT_DENY_ATTACH kullandığının açık bir işaretidir”
Fuzzing
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şlatma 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 başlatma 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 duyuyorsanız, bunları devre dışı bırakabilirsiniz. Aksi takdirde, çökme raporları bir sunucunun nasıl çöktüğünü anlamanıza yardımcı olabilir.
Uyku
MacOS'ta fuzzing yaparken Mac'in uyumasına izin vermemek önemlidir:
systemsetup -setsleep Never
pmset, Sistem Tercihleri
SSH Bağlantısı Kesme
SSH bağlantısı aracılığıyla fuzzing yapıyorsanız, oturumun gün boyunca devam etmeyeceğinden emin olmak önemlidir. Bu nedenle sshd_config dosyasını aşağıdaki gibi değiştirin:
TCPKeepAlive Yes
ClientAliveInterval 0
ClientAliveCountMax 0
Dahili İşleyiciler
Belirli bir şemanın veya protokolün işlenmesinden sorumlu olan uygulamanın nasıl bulunacağını öğrenmek için aşağıdaki sayfaya göz atın:
pagemacOS File Extension & URL scheme app handlersAğ İşlemlerini Sıralama
Ağ verilerini yöneten işlemleri bulmak ilginçtir:
Veya netstat
veya lsof
kullanın
Libgmalloc
Fuzzers
CLI araçları için çalışır
macOS GUI araçları ile "sadece çalışır". Bazı macOS uygulamalarının benzersiz dosya adları, doğru uzantılar gibi belirli gereksinimleri olabilir, dosyaları sandbox'tan okuma ihtiyacı olabilir (~/Library/Containers/com.apple.Safari/Data
)...
Bazı örnekler:
Daha Fazla Fuzzing MacOS Bilgisi
Referanslar
WhiteIntel bir şirketin veya müşterilerinin stealer kötü amaçlı yazılımlar tarafından kompromize edilip edilmediğini kontrol etmek için dark web destekli bir arama motoru sunan ücretsiz işlevsellikler sunar.
WhiteIntel'in asıl amacı, bilgi çalan kötü amaçlı yazılımlardan kaynaklanan hesap ele geçirmeleri ve fidye saldırılarıyla mücadele etmektir.
Websitesini ziyaret edebilir ve motorlarını ücretsiz deneyebilirsiniz:
Last updated