macOS IOKit
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
基本情報
I/O Kitは、XNUカーネル内のオープンソースのオブジェクト指向デバイスドライバーフレームワークであり、動的にロードされたデバイスドライバーを処理します。これにより、さまざまなハードウェアをサポートするために、モジュールコードをカーネルにオンザフライで追加できます。
IOKitドライバーは基本的にカーネルから関数をエクスポートします。これらの関数パラメータの型は事前定義されており、検証されます。さらに、XPCと同様に、IOKitはMachメッセージの上にある別のレイヤーです。
IOKit XNUカーネルコードは、Appleによってhttps://github.com/apple-oss-distributions/xnu/tree/main/iokitでオープンソース化されています。さらに、ユーザースペースのIOKitコンポーネントもオープンソースですhttps://github.com/opensource-apple/IOKitUser。
しかし、IOKitドライバーはオープンソースではありません。とはいえ、時折、ドライバーのリリースにはデバッグを容易にするシンボルが付属することがあります。ここでファームウェアからドライバー拡張を取得する方法を確認してください。
これは**C++**で書かれています。デマングルされたC++シンボルを取得するには:
IOKit 公開された関数は、クライアントが関数を呼び出そうとする際に追加のセキュリティチェックを実行する可能性がありますが、アプリは通常、IOKit関数と対話できるサンドボックスによって制限されています。
ドライバー
macOSでは、次の場所にあります:
/System/Library/Extensions
OS Xオペレーティングシステムに組み込まれたKEXTファイル。
/Library/Extensions
サードパーティソフトウェアによってインストールされたKEXTファイル
iOSでは、次の場所にあります:
/System/Library/Extensions
9までのリストされたドライバーはアドレス0にロードされています。これは、それらが実際のドライバーではなく、カーネルの一部であり、アンロードできないことを意味します。
特定の拡張機能を見つけるには、次のコマンドを使用できます:
カーネル拡張をロードおよびアンロードするには、次のようにします:
IORegistry
IORegistryは、macOSおよびiOSのIOKitフレームワークの重要な部分であり、システムのハードウェア構成と状態を表すデータベースとして機能します。これは、システムにロードされたすべてのハードウェアとドライバを表すオブジェクトの階層的コレクションであり、それらの相互関係を示しています。
CLI **ioreg
**を使用してIORegistryを取得し、コンソールから検査できます(特にiOSに便利です)。
IORegistryExplorer
をXcode Additional Toolsからhttps://developer.apple.com/download/all/でダウンロードし、macOS IORegistryをグラフィカルインターフェースを通じて検査できます。
IORegistryExplorerでは、「プレーン」はIORegistry内の異なるオブジェクト間の関係を整理し表示するために使用されます。各プレーンは、特定のタイプの関係またはシステムのハードウェアとドライバ構成の特定のビューを表します。IORegistryExplorerで遭遇する可能性のある一般的なプレーンは以下の通りです:
IOService Plane: これは最も一般的なプレーンで、ドライバとナブ(ドライバ間の通信チャネル)を表すサービスオブジェクトを表示します。これらのオブジェクト間のプロバイダ-クライアント関係を示します。
IODeviceTree Plane: このプレーンは、デバイスがシステムに接続される物理的な接続を表します。USBやPCIのようなバスを介して接続されたデバイスの階層を視覚化するために使用されることがよくあります。
IOPower Plane: 電力管理の観点からオブジェクトとその関係を表示します。どのオブジェクトが他のオブジェクトの電力状態に影響を与えているかを示すことができ、電力関連の問題のデバッグに役立ちます。
IOUSB Plane: USBデバイスとその関係に特化しており、USBハブと接続されたデバイスの階層を示します。
IOAudio Plane: このプレーンは、システム内のオーディオデバイスとその関係を表すためのものです。
...
ドライバコミュニケーションコード例
以下のコードは、IOKitサービス "YourServiceNameHere"
に接続し、セレクタ0内の関数を呼び出します。そのために:
まず**
IOServiceMatching
とIOServiceGetMatchingServices
**を呼び出してサービスを取得します。次に、**
IOServiceOpen
**を呼び出して接続を確立します。最後に、セレクタ0を示す**
IOConnectCallScalarMethod
**を使用して関数を呼び出します(セレクタは呼び出したい関数に割り当てられた番号です)。
他にも**IOConnectCallScalarMethod
の他にIOKit関数を呼び出すために使用できる関数がいくつかあります。例えば、IOConnectCallMethod
、IOConnectCallStructMethod
**などです。
ドライバエントリポイントのリバースエンジニアリング
これらは例えばファームウェアイメージ (ipsw)から取得できます。その後、お気に入りのデコンパイラにロードします。
**externalMethod
**関数のデコンパイルを開始することができます。これは呼び出しを受け取り、正しい関数を呼び出すドライバ関数です:
そのひどい呼び出しのデマグルは次の意味です:
前の定義では self
パラメータが欠けていることに注意してください。良い定義は次のようになります:
実際、真の定義はhttps://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388で見つけることができます:
この情報を使って、Ctrl+Right -> Edit function signature
を再記述し、既知の型を設定できます:
新しい逆コンパイルされたコードは次のようになります:
次のステップでは、IOExternalMethodDispatch2022
構造体を定義する必要があります。これはオープンソースで https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176 にあります。これを定義できます:
今、(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray
に従って、多くのデータが見えます:
データ型を IOExternalMethodDispatch2022:
に変更します:
変更後:
そして、ここにあるのは 7つの要素の配列 です(最終的な逆コンパイルされたコードを確認してください)。7つの要素の配列を作成するためにクリックします:
配列が作成された後、すべてのエクスポートされた関数が見えます:
覚えておいてください、ユーザースペースから エクスポートされた 関数を 呼び出す には、関数の名前を呼び出す必要はなく、セレクタ番号 を呼び出す必要があります。ここでは、セレクタ 0 が関数 initializeDecoder
、セレクタ 1 が startDecoder
、セレクタ 2 が initializeEncoder
であることがわかります...
AWSハッキングを学び、練習する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、練習する:HackTricks Training GCP Red Team Expert (GRTE)
Last updated