Програми macOS – перевірка, налагодження та фаззинг (Частина 2)

18 березня 2024 3 хвилин Автор: Cyber Witcher

Це друга частина нашого дослідження, в якій ми продовжуємо розглядати різні аспекти аналізу, налагодження та фазінгу додатків macOS. У цій частині ми поглибимося в методи статичного та динамічного аналізу, а також розглянемо різні інструменти та техніки, які можна використовувати для дослідження програм на macOS.

Друга частина статі “Програми macOS – перевірка, налагодження та фаззинг” – продовження першої частини

ProcessMonitor

ProcessMonitor — це дуже корисний інструмент для перевірки дій, пов’язаних із процесом, які виконує процес (наприклад, відстеження того, які нові процеси створює процес).

SpriteTree

SpriteTree — це інструмент для друку зв’язків між процесами. Вам потрібно стежити за своїм Mac за допомогою команди на зразокsudo eslogger fork exec rename create > cap.json(термінал, який запускає це, вимагає FDA). Потім ви можете завантажити json у цей інструмент, щоб переглянути всі зв’язки:

FileMonitor

FileMonitor дозволяє відстежувати події у файлі (такі як створення, модифікація та видалення), надаючи детальну інформацію про такі події.

Crescendo

Crescendo — це інструмент із графічним інтерфейсом користувача, який користувачі Windows можуть знати з Procmon від Microsoft Sysinternal . Цей інструмент дозволяє починати та зупиняти запис різних типів подій, дозволяє фільтрувати ці події за такими категоріями, як файл, процес, мережа тощо, а також забезпечує функціональні можливості для збереження записаних подій у форматі json.

Інструменти Apple

Інструменти Apple є частиною інструментів розробника 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

Ви можете встановити смак Intel під час створення файлу .lldbinitу вашій домашній папці за допомогою lldb за допомогою такого рядка:

settings set target.x86-disassembly-flavor intel

Всередині lldb створіть дамп процесу за допомогоюprocess save-core

print object (po) 

Це надрукує об’єкт, на який посилається параметр

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Зауважте, що більшість API або методів Apple Objective-C повертають об’єкти, тому їх слід відображати за допомогою команди «print object» (po). Якщо po не дає значущого результату, використовуйте x/b

memory  

читання пам’яті 0x000…. читання пам’яті $x0+0xf2a запис пам’яті 0x100600000 -s 4 0x41414141 #Запис AAAA у цю адресу запис пам’яті -fs $rip+0x11f+7 “AAAA” #Запис AAAA в адресі

disassembly

dis #Disas current function

dis -n <funcname> #Disas func

dis -n <funcname> -b <basename> #Disas func dis -c 6 #Disas 6 lines

dis -c 0x100003764 -e 0x100003768 # Від одного додавання до іншого dis -p -c 4 # Почати розбирання поточної адреси

parray

parray 3 (char **)$x1 # Перевірити масив із 3 компонентів у x1 reg

Під час виклику objc_sendMsgфункції регістр rsi зберігає ім’я методу як рядок із закінченням нулем (“C”). Щоб надрукувати назву через 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:"

Антидинамічний аналіз

Виявлення ВМ
  • Команда sysctl hw.modelповертає «Mac», якщо хостом є MacOS , але щось інше, коли це віртуальна машина.

  • Граючи зі значеннями, hw.logicalcpuа hw.physicalcpuдеякі шкідливі програми намагаються визначити, чи це віртуальна машина.

  • Деякі зловмисні програми також можуть визначити , чи є машина VMware , на основі MAC-адреси (00:50:56).

  • Також можна дізнатися, чи процес налагоджується, за допомогою простого коду, наприклад:

  • if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }

  • Він також може викликати ptraceсистемний виклик з PT_DENY_ATTACHпрапором. Це запобігає приєднанню та трасуванню деб -уґера .

  • Ви можете перевірити, чи імпортується функція sysctlабо (але зловмисне програмне забезпечення може імпортувати її динамічно)ptrace

  • Як зазначалося в цьому описі, « Подолання методів захисту від налагодження: варіанти ptrace macOS »: « Повідомлення Process # exited with status = 45 (0x0000002d) зазвичай є ознакою того, що ціль налагодження використовує PT_DENY_ATTACH »

Фузінг

ReportCrash аналізує процеси збою та зберігає звіт про збій на диску . Звіт про збій містить інформацію, яка може допомогти розробнику діагностувати причину збою. Для програм та інших процесів , що виконуються в контексті launchd для кожного користувача , ReportCrash запускається як LaunchAgent і зберігає звіти про збої в користувача. ~/Library/Logs/DiagnosticReports/ Для демонов, інших процесів , що працюють у контексті launchd системи та інших привілейованих процесів, ReportCrash запускається як LaunchDaemon і зберігає збої. звіти в системі/Library/Logs/DiagnosticReports

Якщо ви турбуєтеся про надсилання звітів про збої в Apple, ви можете вимкнути їх. Якщо ні, звіти про збої можуть бути корисними для з’ясування причини збою сервера .

#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

Cон

Під час фуззингу в MacOS важливо не дозволяти Mac переходити в сплячий режим:

  • systemsetup -setsleep Never

  • pmset, Системні налаштування

  • KeepingYouAwake

Відключити SSH

Якщо ви працюєте через з’єднання SSH, важливо переконатися, що сеанс не триває сьогодні. Тож змініть файл sshd_config за допомогою:

  • TCPKeepAlive Так

  • ClientAliveInterval 0

  • ClientAliveCountMax 0

sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

Перерахування мережевих процесів

Цікаво знайти процеси, які керують мережевими даними:

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

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"

Фуззери

  • AFL++ Працює для інструментів CLI

  • Litefuzz Він « просто працює» з інструментами GUI macOS. Зауважте, що деякі програми macOS мають певні вимоги, як-от унікальні імена файлів, правильне розширення, необхідність читання файлів із пісочниці ( ~/Library/Containers/com.apple.Safari/Data)…

Деякі приклади:

# 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
Інші статті по темі
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.