今更ですが当時参加したことを思い出しながら投稿します
RCEへの近道:TightVNCの脆弱性を狙った実践的リバースエンジニアリング手法
リモートコード実行(RCE)やローカル特権昇格(LPE)の脆弱性を見つけるためのリアルな調査プロセスとは?
本記事では、GMOサイバーセキュリティ byイエラエ 川田柾浩(@kawakatz)さんがPentestSecJPで語った、TightVNCに対する脆弱性調査からPoC開発、CVE取得までの一連の流れを元に、RCEへ至る道筋を“練習可能な手順”として整理します。
🎯 調査の目的と背景
- 調査対象:TightVNC 2.8.81
- 目的:RCEまたはLPEに繋がる脆弱性を短期間(5〜10営業日)で発見・PoC開発まで完遂
- 結果:TightVNCの名前付きパイプ通信の脆弱性を利用し、リモートで暗号化パスワードを読み取り・復号 → VNC接続可能な状態に
🛡️ 発見された脆弱性は CVE-2024-42049 として掲載
🔍 ステップ1:解析対象ソフトウェアの選定
💡 ポイント
- 入力があるもの(ポート or 名前付きパイプ)を優先
- 検証しやすいように、ソースコードやバイナリが公開されているものが望ましい
- 複数の入口を洗い出し、絞り込む
🧰 入口の洗い出し方法
| タイプ | 説明 | 補助ツール例 |
|---|---|---|
| オープンポート | TCP/UDP通信の入口 |
Process Hacker, netstat
|
| 名前付きパイプ | プロセス間通信の入口 | Get-ProcessPipes.ps1 |
TightVNCの例
- ポート:
5800/tcp,5900/tcp - パイプ:
\\.\pipe\TightVNC_Service_Control
📥 ステップ2:入力受信箇所の特定
- ReadFile() をフックし、どの関数がデータを受け取っているかを特定
-
x64dbg,IDA Pro,Ghidra,Fridaを駆使して静的/動的解析
FridaでReadFile/WriteFileを監視し、対象プロセスがパイプを通じて何を受け取っているかを把握
- Breakpointを使い、入力の処理フローをトレース
🧬 ステップ3:入力解析と後続処理
- 入力値とデバッグ用パラメータを比較し、処理の分岐や認証判定を把握
- バッファコピーや暗号処理など、RCE/LPEに繋がる要素を確認
✅ 解析の視点
- 入力を信頼して扱っている箇所はないか?
- 暗号鍵やパスワードを復号するようなコードはないか?
- コマンドインジェクションやファイル書き込みに繋がる処理はないか?
💥 ステップ4:PoCの実装と成功条件
攻撃条件
- SMB (445/tcp) が利用可能
- 任意の認証情報でTightVNCサービスにアクセス可能
攻撃内容
- 名前付きパイプ経由で暗号化パスワードを読み取り
- 復号 → VNCセッションに接続可能
※ 特別なエクスプロイトではなく、サービスが誤って提供している内部情報を読み出す構成ミスが本質。
🧾 CVEの発行
- 開発元と連絡がつかない場合は、自力で申請可能
- JPCERTやMITREのフォームを活用
参考リンク
📆 タイムライン
| 日付 | 内容 |
|---|---|
| 2024/04/20 | 脆弱性報告 |
| 2024/04/26 | TightVNC側が報告確認 |
| 2024/05/28 | 修正バージョン(2.8.84)リリース |
| 2024/07/12 | CVE発行申請(MITREへ) |
✍️ まとめ:RCEへの最短ルートは「地道な分析力」
- RCE/LPEは一夜にして見つからない
- 見るべき場所(入力 → 処理 → 出力)を定めることで、調査の“迷子”を防げる
- 名前付きパイプやオープンポートなど、システムの入口を見逃さないことが重要
- CVE申請も含めて、成果物として形にするところまでがゴール
🛠 使用ツールまとめ
-
x64dbg: 動的解析デバッガ -
IDA Pro,Ghidra: 静的解析ツール -
Frida: Windows APIの監視と操作 -
Process Hacker: ポート・プロセス情報可視化 -
Get-ProcessPipes.ps1: 名前付きパイプの列挙