プログラム解析による暗号通信文の解析方法

ネットエージェント株式会社
杉浦 隆幸

NetAgent

概要• 日ごろ使っているソフトウェアがどのような通信をしているか知っていますか。実際は送りたくない情報を送っているかもしれません、送りたくないような情報を送っているようなソフトウェアほど、通信を暗号化し、技術的に何を送っているのかを解明することが難しくなっています。難しい部分もありますが、これらを判明させていく手法を順を追って紹介します。
NetAgent• 独自プロトコルソフトは何を送っているのでしょうか？
– メッセンジャー– ウイルス対策ソフトのデータ– ブラウザ以外のSSL通信– Winny、Share、SpkypeなどのP2Pソフトウェア• クイズがあるので分かったら答えてください。
NetAgent

手法• 手法１：パケットをキャプチャする• 手法２：プロキシサーバ、中継サーバで記録する• 手法３：プログラムのメモリイメージを見てみる• 手法４：プログラムにディバッガを当てて暗号通信の使用部分に来たときのデータを見てみる。
NetAgent

対象暗号通信をして情報を隠したいようなソフトってどんなのことをするソフト？

• スパイウェア– 変な動作をするソフトウェア• ボット– 暗号化してボットネットにつながっている場合• P2Pソフト– WinnyとかShareとかPerfect Darkとか

NetAgentできる限り楽をして・・・• 解析には段階がある。
できれば楽な方法でやりたい。
– 1. 平分通信ならパケットキャプチャで– 2. 実行ファイルの文字列にあるならstringsで– 3. プログラムのメモリイメージでよいならそれで– 4. ソースがあるのならそれを読んで– 5. 仕方ないので、バイナリのプログラムを解析してNetAgent

パケットキャプチャの前に• TCPviewで調べるポート確認• http://www.microsoft.com/technet/sysint
ernals/utilities/TcpView.mspx• 使っているプログラムがグラフィカルに出るnetstat

NetAgent

NetAgentパケットキャプチャ

クイズ: この通信は何でしょう？
NetAgent

パケットキャプチャ•http://www.google-analytics.com/__utm.gif?utmwv=1&utmn=1208086912&utmcs=iso-2022jp&utmsr=1280x1024&utmsc=32bit&utmul=ja&utmje=1&utmfl=8.0&utmcn=1&utmdt=Sun%20Microsystems%20%20%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%
83%A7%E3%83%B3%E3%81%AE%E6%8B%A1%E5%BC%B5&utmhn=jp.sun.com&utmr=http://www.google.co.jp/search?hl=ja&q=off_t&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja&utmp=/products/software/solaris/wp/Sol_file/sol_3.html&utmac=UA-1500171&utmcc=__utma%3D164123876.1208086912.1169641053.1169641053.1169641053.1%3B%2
B__utmb%3D164123876%3B%2B__utmc%3D164123876%3B%2B__utmz%3D164123876.116
9641053.1.1.utmccn%3D(organic)%7Cutmcsr%3Dgoogle%7Cutmctr%3Doff_t%7Cutmcmd%3D
organic%3B%2B

妙に長いアクセス

結果
NetAgent

パケットキャプチャ
Googleのトラッキング用のURLで透過1x1ピクセルの画像表示

NetAgent

プログラムのメモリイメージを解析• 実際にやってみましょう。
• ProcessWalkerか、Ollydbgを使います

今日来た人が見られる特典です。
NetAgent

プログラムのメモリイメージを解析

NetAgent

プログラム解析ツール• ollydbg (free)– http://www.ollydbg.de/• IDA Pro (470 USD or 895 USD)
– http://www.datarescue.com/– FAXを送ってクレジットカードで買う• プログラム言語 (cとかperlとか)

NetAgent

プログラム解析を始めよう！
• まずは楽にできるところから– Regmon, filemon

NetAgentレジストリの読み書きを確認• Regmon• http://www.microsoft.com/technet/sysint
ernals/utilities/Regmon.mspx

NetAgentregmon

NetAgent

ファイルの読み書きを確認• Filemon• http://www.microsoft.com/technet/sysint
ernals/SystemInformation/Filemon.mspx

NetAgent

filemon

NetAgent

プロセスの状態を取得• Process walker– DLLやメモリイメージが見られるので、– 通信内容が平文で存在したらすぐにわかる。

NetAgentうさみみハリケーン• PEヘッダの解析• リソース解析• ＤＬＬからのインポート関数一覧表示

NetAgent

スタティック解析（IDA Pro)
• 実行ファイル、DLL、ocx等を読み込むと、1000～10000ぐらいのサブルーチンに分けてくれるので、それを１つ１つ読んでいく。
•IDA Proを使ってみよう
実際にデモしてみます
NetAgent

書かれた言語を知る

NetAgent
クイズ： このプログラムの書かれた言語を当ててみましょう。

Javaバイナリ

NetAgent

VC++

NetAgent

C++

NetAgent

C#/VB .NET

NetAgent判断方法• 各言語の特徴が出る• Stringで入っているのでそこを見る• バイナリエディッタでプログラムの最後のXMLを見る• PEid(後述)を使う– 一番楽に結果が出ます

NetAgent

通信箇所を探す• 目的は通信なので send() recv() を探してそこからたどるのみ。

NetAgent

Send 発見NetAgentSendを呼んでいるところのパラメータ

NetAgent

その関数の参照元

NetAgent

その関数のチャート

NetAgent

１つまえの関数のチャート

NetAgent

動的解析(ollydbg)• ディバック対策がされていると使えないことがある。
– ディバッグ対策を回避するメモリパッチを作成– Olly上で当てて実行• プログラムが不安定になることも多い

NetAgent呼び元がたどれない所は• 動的解析をしてブレイクポイントをセットして待つ。
• 呼び元もしくは、サブルーチンの最後まで動かして戻るポイントが呼び元実際にやってみます。
NetAgentネタ探し• RootkitRevealer• http://www.microsoft.com/technet/sysint
ernals/utilities/RootkitRevealer.mspx– 自分のPCで発見されても困ります。

NetAgent

Packer パッカー
• UPX日本語フロントエンド
http://www.vector.co.jp/soft/win95/util/se139612.html• ＵＰＸ http://upx.sourceforge.net/• ASPack• http://www.aspack.com/index.html• tElock• http://www.softpedia.com/get/Programming/P
ackers-Crypters-Protectors/Telock.shtml
NetAgentUPX

UPXのプログラム構造
NetAgentUPXうさみみ

NetAgent セクション情報で直ぐに分かるAspack

NetAgentASprotect

NetAgent

PEiD– パッカーのチェック• http://www.secretashell.com/codomain/peid/– 結果のサンプル用• Lhaplus• Winrar• DivX• XvidNetAgentPEid結果

NetAgent

動的解析とメモリ情報の取得• Ollyを使ってやってみましょう

NetAgent暗号サブルーチンの発見(IDA)• IDAのプラグインであたりをつけましょう。

NetAgent

暗号前のデータを入手• Ollyでやってみましょう。

NetAgent

まとめ• バイナリプログラムでもかなり用意に通信内容を解析できます。
• パケットキャプチャでできるならそっちの方が楽にできる。
• 暗号化されていても通信しているプログラムは実態を持っている。

NetAgent

NetAgent