Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
1
趣味と実益のためのVMware
RPCインターフェースの活用
2
アジェンダ
• 自己紹介
• VMwareの一般的なアーキテクチャ (Simplified)
• ホスト<->ゲスト 間の通信
– バックドアインターフェース
• VM RPCインターフェース
– 機能
– Recording Guest ...
3
自己紹介
4
Abdul-Aziz Hariri
• コンピューターサイエンスの学士 – Balamand大学
• 現在はZDIのSenior Security Researcher
– 根本原因分析 / 脆弱性分析 / 攻撃ツール作成
– ZDI ケー...
5
Jasiel Spelman
• コンピューターサイエンスの学士 – テキサス大学オースティン校
• 現在はZDIのSenior Security Researcher
– 根本原因分析 / 脆弱性研究 / 攻撃ツール作成
– ZDI リサ...
6
Brian Gorenc
• コンピューターエンジニアリングの学士 – テキサスA&M大学
• ソフトウェアエンジニアリングの修士 – Southern Methodist 大学
• トレンドマイクロにおける脆弱性研究所のディレクター
– ...
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命令のハイジャック
– 複数コマンドのサポート
– 二...
12
ホスト<->ゲスト 間の通信 -Backdoor
• 複数のコマンド/機能のサ
ポート
– コマンドは Github上のOpn-
vm-toolsで入手可能
– backdoor_def.h がそれらのコ
マンドを定義
• ゲストは思って...
13
ホスト<->ゲスト 間の通信 - Backdoor
• バックドア機能の実行はシンプル:
mov eax, 564D5868h /* magic number */
mov ebx, command-specific-parameter
...
14
ホスト<->ゲスト 間の通信 - Backdoor
ハイパー
バイザー
(ホスト)
ゲスト
(vm)
バックドアチャネル
TCLO
RPCI
低-帯域
高-帯域
バックドアチャネル
その他
15
ホスト<->ゲスト 間の通信 - RPCI
• 複数コマンドのサポー
ト
– Rpctool.exe はいくつかの
コマンドのクエリに利用
可能。
– Rpctool.exe はオープン
ソースでありopen-vm-
toolsから入手可...
16
ホスト<->ゲスト 間の通信 - RPCI
17
ホスト<->ゲスト 間の通信 – まとめ
• バックドアインターフェースがホスト/ゲスト間通信に使われる
• in/out命令のハイジャック
• RPCI がゲストからホストへの通信に使われる
• TCLO がホストからゲストへの通信に使...
18
VM RPC インターフェース
19
GuestRPC
• RPC リクエストは”backdoor”チャネルを通して送信される
• 具体的には、BDOOR_CMD_MESSAGE (0x1E)となる
• ゲストメッセージはguest_msg_def.hに定義される
• Gue...
20
GuestRPC
• 単純なGuestRPCメッセージの例:
mov eax, 0x564D5868
mov ecx, 0x001e //MESSAGE_TYPE_OPEN
mov edx, 0x5658
mov ebx, 0xC9435...
21
GuestRPC
• GuestRPC リクエストは vmware-vmx{.exe}内で解析される
• GuestRPC メッセージ/機能もまた vmware-vmx{.exe}内部で実装されている
• GuestRPC_Funcs を...
22
GuestRPC – ExecRPCRequest
• RPCリクエストを引数として参照する
• 渡されたRPC関数が正しいかのチェック
• 関数の実行に十分な権限があるかのチェック
• 実行
23
GuestRPC – RPC リクエストの盗聴
• RPC リクエストは確かにここで解析されているので実際に関数を
フックし、送られたリクエストを盗聴可能
• このためにはpykdを利用 J
– ExecRPCRequest 関数にブレイ...
24
GuestRPC – RPC リクエストの盗聴- デモ
• デモ
25
RPC インターフェースクエリツール
の開発
26
ツール開発
• VMware と RPC の課題の一つは次のようなツールの開発である:
– ケース分析
– 攻撃手法の開発
– ファジング
• C++でツールを開発するために open-vm-tools を利用することができる
が、いくつ...
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
• あい...
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 のデバッグ...
36
RPC インターフェースのファジング
Host
VMWare
WorkStation
フレーム
ワーク
vmrunを通じたマネジメント
アタッチ
エージ
ェント
モニタリング
テストケースの送信
ミュー
テータ
start vmx
37
RPCインターフェースのファジング - メモリ内
• RPCリクエストは確かに解析されたので、実際にメモリ内のファ
ジングが可能:
– ExecRPCRequest(ホストOS上)のフック
– 解析される前にRPCリクエストの変更
– ク...
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リク...
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...
46
VMware ドラッグ&ドロップのUse-After-Free
47
結論
49
Upcoming SlideShare
Loading in …5
×

大義のために:趣味と実益のためのVMware RPCインターフェースの活用 by アブドゥル・アジズ・ハリリ, ジャシエル・スペルマン, ブライアン・ゴーレンク

351 views

Published on

仮想マシンは近年のコンピューティングにおいて重要な位置を占めている。単一の物理サーバー上に複数の顧客のインスタンスを配置させることや、研究者やセキュリティ専門家が有害なおそれのあるコードを隔離させ、分析や評価を行うこともある。仮想マシン上で稼働させることにより、ほかの環境には有害な影響を与えないであろうという仮説が作られているのである。しかしながら、これは確実ではなく仮想マシンのハイパーバイザーの脆弱性によりシステム全体のアクセス権を与えてしまうという可能性も存在する。かつては仮定上の話と考えられていたが、Pwn2Own 2017において2つの独立したデモによる実証によって確実に存在しうるシナリオであると考えられるようになった。

本セッションではVMwareにおけるホスト‐ゲスト間の通信の詳細について解説を行う。さらにプレゼンテーションではRPCインターフェイスの機能についても説明する。またこのセクションでは、ゲストOSからホストOSに対して自動的に送られるRPCリクエストの盗聴や記録に使用できるテクニックについても解説する。またここでは、ファジングを行うためにPythonおよびC++のRPCインターフェイスにクエリするためのツールの書き方を紹介する。

これらを通じて、パッチ適用済みの脆弱性を通じたVMwareのUse-After-Free脆弱性攻撃を検証する。

Published in: Software
  • Be the first to comment

  • Be the first to like this

大義のために:趣味と実益のためのVMware RPCインターフェースの活用 by アブドゥル・アジズ・ハリリ, ジャシエル・スペルマン, ブライアン・ゴーレンク

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

×