macOS Apps - Inspecting, debugging and Fuzzing

htARTE(HackTricks AWS Red Team Expert) でゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法:

WhiteIntelは、ダークウェブを活用した検索エンジンで、企業やその顧客がスティーラーマルウェアによって侵害されていないかをチェックする無料機能を提供しています。

WhiteIntelの主な目標は、情報窃取マルウェアによるアカウント乗っ取りやランサムウェア攻撃と戦うことです。

彼らのウェブサイトをチェックし、無料でエンジンを試すことができます:


静的解析

otool

otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application

objdump

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

jtool2

このツールは、codesignotoolobjdump代替として使用でき、いくつかの追加機能を提供します。こちらからダウンロードするか、brewを使用してインストールしてください。

# 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

CodesignmacOS に、一方 ldidiOS に見つけることができます

# 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**ファイル(インストーラー)を検査するのに役立つツールです。 これらのインストーラーには、通常、マルウェア作者が悪用するpreinstallおよびpostinstall bashスクリプトが含まれており、マルウェアを****持続化するために悪用されます。

hdiutil

このツールは、Appleディスクイメージ(.dmg)ファイルを実行する前に検査するためにマウントすることを可能にします。

hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

Objective-C

メタデータ

Objective-Cで書かれたプログラムは、Mach-Oバイナリにコンパイルされる際に、クラス宣言を保持します。このようなクラス宣言には、以下の情報が含まれます:

  • クラス

  • クラスメソッド

  • クラスのインスタンス変数

class-dumpを使用して、この情報を取得できます。

class-dump Kindle.app

関数の呼び出し

Objective-Cを使用するバイナリで関数が呼び出されると、コンパイルされたコードはその関数を呼び出す代わりに objc_msgSend を呼び出します。これにより最終的な関数が呼び出されます:

この関数が期待するパラメータは次のとおりです:

  • 最初のパラメータ (self) は、「メッセージを受け取るクラスのインスタンスを指すポインタ」です。簡単に言うと、メソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドの場合、これはクラスオブジェクトのインスタンス(全体として)になりますが、インスタンスメソッドの場合、selfはクラスのインスタンスとしてインスタンス化されたインスタンスを指します。

  • 2番目のパラメータ (op) は、「メッセージを処理するメソッドのセレクタ」です。単純に言うと、これはメソッドの名前です。

  • 残りのパラメータは、メソッドで必要なです(op)。

ARM64でlldbを使用してこの情報を簡単に取得する方法を以下のページで確認してください:

pageIntroduction to ARM64v8

x64:

引数

レジスタ

(objc_msgSend用)

1番目の引数

rdi

self: メソッドが呼び出されるオブジェクト

2番目の引数

rsi

op: メソッドの名前

3番目の引数

rdx

メソッドへの第1引数

4番目の引数

rcx

メソッドへの第2引数

5番目の引数

r8

メソッドへの第3引数

6番目の引数

r9

メソッドへの第4引数

7番目以降の引数

スタック上の rsp+

メソッドへの第5引数以降

Swift

Swiftバイナリでは、Objective-C互換性があるため、class-dumpを使用して宣言を抽出することができますが、常にではありません。

jtool -l または otool -l コマンドラインを使用すると、__swift5 接頭辞で始まる複数のセクションを見つけることができます。

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

さらなる情報は、このブログ投稿でこのセクションに保存されている情報について見つけることができます。

さらに、Swift バイナリにはシンボルが含まれる可能性があります(たとえば、ライブラリは関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名と属性に関する情報が含まれており、見た目が醜いため、非常に役立ちます。そして、"デマングラー"**が元の名前を取得できます。

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

# Swift cli
swift demangle

パッキングされたバイナリ

  • 高いエントロピーをチェックする

  • 文字列をチェックする(理解できる文字列がほとんどない場合、パッキングされている可能性がある)

  • MacOS用のUPXパッカーは"__XHDR"というセクションを生成する

ダイナミック解析

バイナリをデバッグするには、SIPを無効にする必要があるcsrutil disableまたはcsrutil enable --without debug)か、バイナリを一時フォルダにコピーしてcodesign --remove-signature <binary-path>で署名を削除するか、バイナリのデバッグを許可する(このスクリプトを使用できます)

macOSのシステムバイナリ(例:cloudconfigurationdなど)をインストールするには、SIPを無効にする必要がある(単に署名を削除するだけでは機能しません)。

統合ログ

MacOSは多くのログを生成し、アプリケーションを実行する際に非常に役立ちます。

さらに、一部のログには、ユーザーコンピューター識別可能な情報を非表示にするための<private>タグが含まれています。ただし、この情報を開示するために証明書をインストールすることが可能です。こちらの説明に従ってください。

Hopper

左パネル

Hopperの左パネルでは、バイナリのシンボル(ラベル)、手続きと関数のリスト(Proc)、および文字列(Str)を見ることができます。これらはMac-Oファイルのさまざまな部分で定義された文字列のすべてではありませんが、(例:_cstringまたはobjc_methname)。

中央パネル

中央パネルでは、逆アセンブルされたコードを見ることができます。そして、生の逆アセンブル、グラフ逆コンパイルバイナリを見ることができます。それぞれのアイコンをクリックして:

コードオブジェクトを右クリックすると、そのオブジェクトへの参照/参照元を見ることができます。また、その名前を変更することもできます(逆コンパイルされた擬似コードでは機能しません):

さらに、中央下部にPythonコマンドを記述することができます。

右パネル

右パネルでは、ナビゲーション履歴(現在の状況に到達するまでの経緯を把握するため)、この関数を呼び出すすべての関数とこの関数が呼び出すすべての関数を見ることができるコールグラフローカル変数情報など、興味深い情報を見ることができます。

dtrace

これにより、ユーザーは非常に低レベルでアプリケーションにアクセスでき、プログラムをトレースしたり、実行フローを変更したりする方法が提供されます。 Dtraceは、システムコールの開始と終了などの場所に配置されたプローブを使用します。

DTraceは、各システムコールのエントリポイントと終了ポイントにプローブを作成するために**dtrace_probe_create**関数を使用します。これらのプローブは、各システムコールのエントリポイントと終了ポイントで発火することができます。DTraceとのやり取りは、ルートユーザー専用の/dev/dtraceを介して行われます。

SIP保護を完全に無効にせずにDtraceを有効にするには、回復モードで次のコマンドを実行できます:csrutil enable --without dtrace

また、コンパイルしたバイナリの**dtraceまたはdtruss**を実行できます。

dtraceの利用可能なプローブは、次のコマンドで取得できます:

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

プローブ名は、プロバイダー、モジュール、関数、および名前(fbt:mach_kernel:ptrace:entry)の4つの部分で構成されています。名前の一部を指定しない場合、Dtraceはその部分をワイルドカードとして適用します。

プローブをアクティブ化し、それらが発生したときに実行するアクションを指定するには、D言語を使用する必要があります。

詳細な説明やさらなる例は、https://illumos.org/books/dtrace/chp-intro.html で見つけることができます。

man -k dtrace を実行して、利用可能なDTraceスクリプトをリストアップします。例: sudo dtruss -n binary

  • 1行で

#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
  • スクリプト

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

ktrace

これはSIPが有効な状態でも使用できます

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

ProcessMonitor

ProcessMonitorは、プロセスが実行しているプロセス関連のアクションをチェックするための非常に便利なツールです(たとえば、プロセスが作成している新しいプロセスを監視します)。

SpriteTree

SpriteTreeは、プロセス間の関係を表示するツールです。 sudo eslogger fork exec rename create > cap.json のようなコマンドでMacを監視する必要があります(このコマンドを実行するためにはFDAが必要です)。その後、このツールでjsonをロードしてすべての関係を表示できます:

FileMonitor

FileMonitorは、ファイルイベント(作成、変更、削除など)を監視し、そのようなイベントに関する詳細情報を提供します。

Crescendo

Crescendoは、WindowsユーザーがMicrosoft Sysinternalの Procmon から知っている外観と感覚を持つGUIツールです。このツールを使用すると、さまざまなイベントタイプの記録を開始および停止でき、これらのイベントをファイル、プロセス、ネットワークなどのカテゴリでフィルタリングでき、記録されたイベントをjson形式で保存する機能が提供されます。

Apple Instruments

Apple Instrumentsは、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

このブログ投稿では、SIPが無効になっていても**PT_DENY_ATTACH**を使用してデバッグを防止する実行中のデーモンのデバッグ方法の例が示されています。

lldb

lldbmacOSバイナリのデバッグにおける事実上のツールです。

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

次の行を含むファイル**.lldbinit**をホームフォルダに作成することで、lldbを使用する際にintelフレーバーを設定できます:

settings set target.x86-disassembly-flavor intel

lldb内で、process save-coreを使用してプロセスをダンプします。

(lldb) コマンド

説明

run (r)

ブレークポイントがヒットするかプロセスが終了するまで続行される実行を開始します。

continue (c)

デバッグ対象プロセスの実行を継続します。

nexti (n / ni)

次の命令を実行します。このコマンドは関数呼び出しをスキップします。

stepi (s / si)

次の命令を実行します。nextiコマンドとは異なり、このコマンドは関数呼び出しに入ります。

finish (f)

現在の関数("frame")内の残りの命令を実行して停止します。

control + c

実行を一時停止します。プロセスが実行されている場合、現在の実行位置でプロセスを停止させます。

breakpoint (b)

b main # main関数を呼び出す

b `main # バイナリのmain関数

b set -n main --shlib # 指定されたバイナリのmain関数

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l # ブレークポイントリスト

br e/dis # ブレークポイントの有効化/無効化

breakpoint delete

help

help breakpoint # ブレークポイントコマンドのヘルプを取得

help memory write # メモリへの書き込みに関するヘルプを取得

reg

reg read

reg read $rax

reg read $rax --format format

reg write $rip 0x100035cc0

x/s

メモリをヌル終端文字列として表示します。

x/i

メモリをアセンブリ命令として表示します。

x/b

メモリをバイトとして表示します。

print object (po)

パラメータで参照されるオブジェクトを出力します

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

AppleのObjective-C APIやメソッドのほとんどはオブジェクトを返すため、「print object」(po)コマンドで表示する必要があります。意味のある出力が得られない場合は、x/bを使用してください

memory

memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 # そのアドレスにAAAAを書き込む memory write -f s $rip+0x11f+7 "AAAA" # そのアドレスにAAAAを書き込む

disassembly

dis # 現在の関数を逆アセンブル

dis -n # 関数を逆アセンブル

dis -n -b # 関数を逆アセンブル

dis -c 6 # 6行を逆アセンブル

dis -c 0x100003764 -e 0x100003768 # 1つのアドレスからもう1つのアドレスまで

dis -p -c 4 # 現在のアドレスから逆アセンブルを開始

parray

parray 3 (char **)$x1 # x1レジスタ内の3つのコンポーネントの配列をチェック

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

アンチダイナミック解析

VM 検出

  • sysctl hw.model コマンドは、ホストがMacOSの場合に "Mac" を返しますが、VMの場合は異なる値を返します。

  • 一部のマルウェアは、hw.logicalcpuhw.physicalcpu の値を操作して、VMであるかどうかを検出しようとします。

  • 一部のマルウェアは、MACアドレス(00:50:56)に基づいてマシンがVMwareであるかどうかを検出することもできます。

  • 単純なコードを使用して、プロセスがデバッグされているかどうかを検出することも可能です:

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

  • ptrace システムコールを PT_DENY_ATTACH フラグとともに呼び出すこともできます。これにより、デバッガがアタッチしてトレースするのを防ぎます。

  • sysctl または ptrace 関数が インポート されているかどうかを確認できます(ただし、マルウェアは動的にインポートする可能性があります)

  • この記事に記載されているように、"アンチデバッグテクニックの克服:macOSのptrace変種": "メッセージ「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

スリープ

MacOSでのFuzzing中は、Macがスリープモードに入らないようにすることが重要です:

SSHの切断

SSH接続を介してFuzzingを行う場合は、セッションが切断されないようにすることが重要です。そのために、sshd_configファイルを以下のように変更します:

  • TCPKeepAlive Yes

  • ClientAliveInterval 0

  • ClientAliveCountMax 0

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

インターナルハンドラ

次のページをチェックして、指定されたスキームやプロトコルを処理するアプリを特定する方法を見つけてください:

pagemacOS File Extension & URL scheme app handlers

ネットワークプロセスの列挙

これは興味深いです。ネットワークデータを管理しているプロセスを見つけるために:

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"

ファジャー

CLI ツールに適しています

macOS の GUI ツールと "just works" します。一部の 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

もっとFuzzing MacOS情報

参考文献

WhiteIntelは、ダークウェブを活用した検索エンジンで、企業やその顧客がスティーラーマルウェアによって侵害されていないかをチェックする無料機能を提供しています。

WhiteIntelの主な目標は、情報窃取マルウェアによるアカウント乗っ取りやランサムウェア攻撃と戦うことです。

彼らのウェブサイトをチェックし、無料でエンジンを試すことができます:

**htARTE (HackTricks AWS Red Team Expert)**を使って、ゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法:

Last updated