大義のために:趣味と実益のためのvmware rpcインターフェースの活用 by...
TRANSCRIPT
1
趣味と実益のためのVMware RPCインターフェースの活用
2
アジェンダ• 自己紹介• VMwareの一般的なアーキテクチャ (Simplified)• ホスト<->ゲスト 間の通信
– バックドアインターフェース• VM RPCインターフェース
– 機能– Recording Guest -> Host RPC requests
• RPCインターフェースクエリツールの開発– C++– Python
• C拡張• CTypes
• VMwareのUse-After-Free攻撃– 解放されたオブジェクト– 攻撃の原点– デモ
• 結論
3
自己紹介
4
Abdul-Aziz Hariri• コンピューターサイエンスの学士 – Balamand大学• 現在はZDIのSenior Security Researcher
– 根本原因分析 / 脆弱性分析 / 攻撃ツール作成– ZDI ケースリード– Pwn2Own 準備 / 申し込みの審査
• 過去の経歴– Bits Arabia, Insight-Tech , Morgan Stanley
• 過去の研究:– Pwn4Fun 2014 renderer攻撃ツールの作成– Microsoft バウンティへの投稿– Exploit低減技術の特許– Adobe Reader の分析
• Twitter: @abdhariri
5
Jasiel Spelman• コンピューターサイエンスの学士 – テキサス大学オースティン校• 現在はZDIのSenior Security Researcher
– 根本原因分析 / 脆弱性研究 / 攻撃ツール作成– ZDI リサーチリード– Pwn2Own 監督官
• 過去の経歴– TippingPoint の電子ワクチンチーム
• 過去の研究:– Pwn4Fun 2014 sandbox escape 攻撃ツールの作成– ゼロデイ攻撃保護技術の特許– Windows カーネル情報の漏洩– Adobe Flash RE & RCE 脆弱性
• Twitter: @WanderingGlitch
6
Brian Gorenc• コンピューターエンジニアリングの学士 – テキサスA&M大学• ソフトウェアエンジニアリングの修士 – Southern Methodist 大学• トレンドマイクロにおける脆弱性研究所のディレクター
– the Zero Day Initiativeのリード– Pwn2Ownの主催者– (物あるいは賞金)の支払い決定者
• 過去の経歴– Lockheed Martinの主任開発者
• 過去の研究:– Microsoft バウンティへの投稿– Exploit 低減技術の特許– 多くの製品に対するバグの指摘
• Twitter: @MaliciousInput
7
VMwareの一般的なアーキテクチャ
8
VMwareの一般的なアーキテクチャ (非常に単純化*)
ハイパーバイザー
ゲスト
vmware-vmx
CPU
vmware-vmx
CPU
vmware tools libs
ゲスト
I/O I/O
マネジメントレイヤー
* very
何が起こっている?
9
良い質問• 調査していく内に、良い着眼点と分かる• VMware Toolsのインストールの有無に関わらない
10
ホスト<->ゲスト 間の通信
11
ホスト<->ゲスト 間の通信• 通信は特定のI/Oポートへのアクセスによって行われる• VMware は『Backdoor』と呼ばれるインターフェースを備えている
– IN/OUT命令のハイジャック– 複数コマンドのサポート– 二つのプロトコルのサポート:RPCIとTCLO– ホスト情報の抽出が可能– ゲスト→ホスト RPCリクエストが送信可能
• バックドアインターフェースはデフォルトで利用可能
12
ホスト<->ゲスト 間の通信 -Backdoor• 複数のコマンド/機能のサポート– コマンドは Github上のOpn-
vm-toolsで入手可能– backdoor_def.h がそれらのコマンドを定義
• ゲストは思っている以上に多くのコマンドを実行可能…
13
ホスト<->ゲスト 間の通信 - Backdoor• バックドア機能の実行はシンプル:
mov eax, 564D5868h /* magic number */mov ebx, command-specific-parametermov cx, command-number /* 1001e = RPC */mov dx, 5658h /* VMware I/O port */in eax, dx
14
ホスト<->ゲスト 間の通信 - Backdoor
ハイパーバイザー(ホスト)
ゲスト(vm)
バックドアチャネル
TCLO
RPCI低-帯域
高-帯域
バックドアチャネル
その他
15
ホスト<->ゲスト 間の通信 - RPCI• 複数コマンドのサポート– Rpctool.exe はいくつかのコマンドのクエリに利用可能。
– Rpctool.exe はオープンソースでありopen-vm-toolsから入手可能
– それらのRPCコマンドはvmware-vmx.exe にあり、 open-vm-tools のソースコードに散見される。
16
ホスト<->ゲスト 間の通信 - RPCI
17
ホスト<->ゲスト 間の通信 – まとめ• バックドアインターフェースがホスト/ゲスト間通信に使われる• in/out命令のハイジャック• RPCI がゲストからホストへの通信に使われる• TCLO がホストからゲストへの通信に使われる• RPCI コマンドが vmware-vmx{.exe}にある• open-vm-tools は宝の山!
18
VM RPC インターフェース
19
GuestRPC• RPC リクエストは”backdoor”チャネルを通して送信される• 具体的には、BDOOR_CMD_MESSAGE (0x1E)となる
• ゲストメッセージはguest_msg_def.hに定義される• GuestRPC は複数のメッセージタイプをサポートしている:
20
GuestRPC• 単純なGuestRPCメッセージの例:
mov eax, 0x564D5868mov ecx, 0x001e //MESSAGE_TYPE_OPEN
mov edx, 0x5658mov ebx, 0xC9435052in eax, dx
mov eax, 0x564D5868mov ecx, 0x1001e //MESSAGE_TYPE_SENDSIZE
mov edx, 0x5658mov ebx, SIZEin eax, dx
mov eax, 0x564D5868mov ecx, 0x6001e //MESSAGE_TYPE_CLOSE
mov edx, 0x5658mov ebx, SIZEin eax, dx
21
GuestRPC• GuestRPC リクエストは vmware-vmx{.exe}内で解析される• GuestRPC メッセージ/機能もまた vmware-vmx{.exe}内部で実装されている
• GuestRPC_Funcs を調べると次のような内容を見つけることができる:
22
GuestRPC – ExecRPCRequest• RPCリクエストを引数として参照する• 渡されたRPC関数が正しいかのチェック• 関数の実行に十分な権限があるかのチェック• 実行
23
GuestRPC – RPC リクエストの盗聴• RPC リクエストは確かにここで解析されているので実際に関数をフックし、送られたリクエストを盗聴可能
• このためにはpykdを利用 J– ExecRPCRequest 関数にブレイクポイントを設定– リクエストへのポインタはr8 レジスタにセットされる– リクエスト長はr9 レジスタにセットされる
• 次のように見えるようになる
24
GuestRPC – RPC リクエストの盗聴- デモ• デモ
25
RPC インターフェースクエリツールの開発
26
ツール開発• VMware と RPC の課題の一つは次のようなツールの開発である:
– ケース分析– 攻撃手法の開発– ファジング
• C++でツールを開発するために open-vm-tools を利用することができるが、いくつかの課題がある:– ASMに実装する必要のある関数が存在する– ASMがない場合、 vmtools.dllからエクスポートしなければならない
• 結構大変
27
Tools Dev - C++, テイク 1• 辞書に含めるためにopen-vm-tools を追加
28
Tools Dev - C++, テイク 2• アセンブリ、いくつかの関数はツールに完全に実装されてはいないので、vmtools.dllから抽出するためにASM内の関数を実装する必要がある
29
Tools Dev - C++, テイク 2, 続き• ASM内のバックドアチャネルを通してRPCリクエストを送信するための関数を実装するため、単純化すべき
30
ツール開発• すべてにおいて十分とはいえない• 高速なツール開発のための何かが必要だ• Python? そうだ、Pythonを使ってRPCリクエストを送信するシンプルなやり方を実装しよう:– C 拡張– Ctypes
• あいにく、 Josh (@kernelsmith) (私たちの DevOps マネージャー) はRubyで同じようなことを実装したがっているけど。
31
ツール開発 – Python, C 拡張• C 拡張は素晴らしい• Windows上の初期化関数をエクスポートする共有ライブラリ
(.pyd)• 共有ライブラリはPythonからインポート可能
32
ツール開発 – Python, C 拡張
33
ツール開発 – Python, CTypes• Ctypes はC互換のデータタイプを提供• 共有ライブラリもしくはDLL上の関数呼び出しを許可
34
RPCインターフェースのファジング
35
RPC インターフェースのファジング• RPC インターフェースのファジングはゲストOSとホストOS両方に対し
てのツールが必要• 対処すべき課題が存在:
– ホストのクラッシュ検出(この場合、多くは vmware-vmx のデバッグ)– テストケースの生成 (ゲストOS上で可能であるがゲストは軽量にしておきたい)– ホストOSからのゲストOSのVM管理
36
RPC インターフェースのファジング
HostVMWare
WorkStation
フレームワーク
vmrunを通じたマネジメント
アタッチ
エージェント
モニタリング
テストケースの送信ミューテータ
start vmx
37
RPCインターフェースのファジング - メモリ内• RPCリクエストは確かに解析されたので、実際にメモリ内のファジングが可能:– ExecRPCRequest(ホストOS上)のフック– 解析される前にRPCリクエストの変更– クラッシュを待つ
• 追加のツールの必要性:– クラッシュ検出 (ホストOSから)– 変更の記録(ホストOSから)
38
RPCインターフェースのファジング - メモリ内
デモ
39
VMware ドラッグ&ドロップのUse-After-Free
40
VMware ドラッグ&ドロップの Use-After-Free – 根本原因• 解放は複数回DnDバージョンが変更された場合に引き起こされる• 再利用はランダムのDnD関数が上記の解放の後に呼ばれた場合に起きる• PoC は単純なものである:
41
VMware ドラッグ&ドロップのUse-After-Free – 根本原因• 成功裏にトリガーされた場合、このようにクラッシュして終わる:
• さらに確認するために、!heap –p –a @RCX が解放の起きた場所に発見される:
42
VMwareドラッグ&ドロップのUse-After-Free – 根本原因• 次に、解放されたオブジェクトのサイズを得る必要がある• そのため、解放が起きて実行される前に正しくブレイクし、!heap ‒p ‒a
を解放するアドレスの前で実行する必要がある。
43
VMware ドラッグ&ドロップのUse-After-Free – 脆弱性を攻撃• まずはじめに、再利用前に解放されたオブジェクトの操作を行う方法を発見する必要がある
• これはバックドアチャネルを通して任意のGuestRPCリクエストを送ることによって行われる
• 例えばtools.capability.guest_temp_directory RPC 関数を利用
44
VMware ドラッグ&ドロップのUse-After-Free – 脆弱性を攻撃• 次の問題は、ROPチェーンをpopすべきか、Heap sprayすべきか?• 答えは、 unity.window.contents.start RPC 関数にあった
45
VMware ドラッグ&ドロップのUse-After-Free – 脆弱性を攻撃• 現時点で実行プランはどのようなもの?
– RSPからRDIをセットするROP チェーンにあわせて unity.window.contents.start リクエストを送信– 解放をトリガ。– 他のもので解放されたオブジェクトを上書き。解放されたオブジェクトは vmware_vmx
+0xb870f8のアドレスを含む。– RCEを得るためにROPチェーン含むリクエストを使って再使用をトリガ。
• vmware-vmx上のRWX regionがあるのでどのROPチェーンが実行すべきかを知ることが可能 ;)
46
VMware ドラッグ&ドロップのUse-After-Free
47
結論
49