Windows Kernel Mode Driverのreflectiveなロードをやってみる
Windows Kernel Mode Driverのreflectiveなロードをやってみる
最新のWindows OSに対して任意の非署名ドライバをロードするツールとしてkdmapperなどが知られている.
kdmapperは脆弱なIntel製ドライバiqvw64e.sys
をエクスプロイトし,任意のシステムルーチンを呼び出せるようにしたうえで,実行時引数に与えられた非署名ドライバをカーネルアドレス空間にロードし実行させることができる.
また,GhostEmperorと呼ばれるアクティビティでは,CheatEngineに同梱される署名済みドライバdbk64.sys
が非署名ドライバ(すなわちrootkit)をロードさせるローダーとして利用されたことが報告されている.
ここではそれらを参考にWindows Kernel Mode Driverのreflectiveなロードをやってみる.ドライバをロードするドライバを作成したうえで,ユーザー空間からDeviceIoControl
をcallし,単純なメッセージをDbgViewに出力するドライバを読み込ませてみる.
kdmapperをforkして新しいbranchを切ってこれを調整する形で実装した.
https://github.com/ry0kvn/kdmapper/tree/2287593f44b63c0fa0909d1ce1e8fad3234bd741
実行すると以下のようにうまくメッセージを出力できているようだ.もちろんこれは非署名ドライバをロードできるテストモードでの実験だ.
やってることは新規性のない単純なWindowsのシステムプログラミングでコードも不格好だ.
しかし例えばGhostEmperorのやり方に倣えば,正規署名済みの脆弱なドライバを見つけてきて,IRP_MJ_DEVICE_CONTROL
にパッチを当て,IRPをフックしたうえで,今回作成したドライバのコードをシェルコードなどの位置に依存しない形で配置してやれば,通常のDriver Signature Enforcement + PatchGuardが有効な実行環境で署名済みドライバを使って非署名ドライバをロードすることができるはずだ.
本来ならここまでやって記事化すべきだが間に合わなかったのでこれを公開する.
おわりに
このエントリは,IPFactory Advent Calendar 2021 21日目のエントリです.詳細はこちら.
前日の記事は@n01e0nによる「おもしろマルウェアの解析」でした. 明日の記事は@futabatoによる「MBSD Cybersecurity Challenges 2021 参加記」です.楽しみですね.