410 likes | 781 Views
ニューラルネットワークによる 遠隔 OS 同一確認 Using Neural Networks for remote OS Identification. Javier Burroni PacSec/core05 conference . 概要. 1.序論 2. DCE-RPC Endpoint mapper 3. Nmap signatures による OS 探知 4.次元削減とトレーニング. 1.序論 2. DCE-RPC Endpoint mapper 3. Nmap signatures による OS 探知 4.次元削減とトレーニング. OS 同一確認.
E N D
ニューラルネットワークによる遠隔OS同一確認Using Neural Networks for remote OS Identification Javier Burroni PacSec/core05 conference
概要 1.序論2.DCE-RPC Endpoint mapper3.Nmap signaturesによるOS探知 4.次元削減とトレーニング
1.序論2.DCE-RPC Endpoint mapper3.Nmap signaturesによるOS探知4.次元削減とトレーニング
OS同一確認 • OS同一確認 =OS探知 =OSフィンガープリンティング • 侵入テストプロセスにおける重要なステップ • テストパケットを送り続け、ホストの応答を調査 • 第一世代: TCP/IPスタックインプリメンテーションの違いを分析 • 次世代: アプリケーション層のデータ (DCE RPC endpoints)を分析 • ウィンドーズバージョン/エディション/サービスパックのより的確な探知
OSフィンガープリンティングツールの限界 • 情報を分析するために、ある“best fit”アルゴリズムのバリエーションが用いられている • 非標準的な状況では通用しない • 重要要素が引き出せない • 我々の提案: • データを分析するために使用されるテクニックに注目 • ニューラルネットワークを用いたツールを開発 • 商用ソフトウェアとして統合に成功
1.序章2.DCE-RPC Endpoint mapper3.Nmap signaturesによるOS探知4.次元削減とトレーニング
ウィンドーズDCE-RPCサービス • ホストポート135にRPCクエリーを送る事によって、どのサービスかプログラムが記録されているか確定できる • 応答に含まれているのは: • 各プログラムのUUID = universal unique identifier • 注釈された名前 • 各プログラムが使うプロトコル • ネットワークアドレスにあてられたプログラム • プログラムのendpoint
2000 Professional edition service pack 0のEndpoints • uuid="5A7B91F8-FF00-11D0-A9B2-00C04FB6E6FC" annotation="Messenger Service" • protocol="ncalrpc" endpoint="ntsvcs" id="msgsvc.1" • protocol="ncacn_np" endpoint="\PIPE\ntsvcs" id="msgsvc.2" • protocol="ncacn_np" endpoint="\PIPE\scerpc" id="msgsvc.3" • protocol="ncadg_ip_udp" id="msgsvc.4" • uuid="1FF70682-0A51-30E8-076D-740BE8CEE98B" • protocol="ncalrpc" endpoint="LRPC" id="mstask.1" • protocol="ncacn_ip_tcp" id="mstask.2" • uuid="378E52B0-C0A9-11CF-822D-00AA0051E40F" • protocol="ncalrpc" endpoint="LRPC" id="mstask.3" • protocol="ncacn_ip_tcp" id="mstask.4"
ニューラルネットワークが活用される‥ • DCE-RPCサービスで用意されたendpointsコンビネーションによってウィンドーズバージョン/エディション/サービスパックを識別する事が可能 • アイディア: マルチ層パーセプトロンニューラルネットワークを加えたendpointsコンビネーションをOSバージョンにマップする関数を設計 • 問題: • どのようなニューラルネットワークを使う? • どのようにニューロンを整理する? • どうやってendpointsコンビネーションをニューラルネットワーク入力にマップする? • どうやってネットワークを学習させる?
マルチ層パーセプトロンニューラルネットワークマルチ層パーセプトロンニューラルネットワーク 413 ニューロン 42 ニューロン 25 ニューロン
3層接続形態 • 入力層: 413ニューロン • 各UUIDにニューロンを一つ • UUIDに一致する各endpointにニューロンを一つ • 未知のendpointにつき柔軟に対応 • 中間層: 42ニューロン • 各ニューロンは入力コンビネーションを表す • 出力層: 25ニューロン • 各ウィンドーズバージョンとエディションにつきニューロンを一つ • Windows 2000 professional edition • 各ウィンドーズバージョンとサービスパックにつきニューロンを一つ • Windows 2000 service pack 2 • ある一つの次元の誤差は他の次元に影響を与えない
パーセプトロンとは何か? • x1 … xn ニューロンの入力 • wi,j,0 … wi,j,n ウェイト • f 非線形関数 • ハイパボリックタンジェント関数 tanhを使用 • vi,j ニューロンの出力 ネットワークのトレーニング=各ニューロンのウェイトを見つけ出す
バックプロパゲーション法 (逆誤差伝搬法) • バックプロパゲーション法によるトレーニング: • 出力層 • y1 … ymを期待出力と仮定 • 推定誤差を計算 • この誤差は前の層に伝送される:
新しいウェイト • 時刻t+1で新しいウェイトは: • で: 学習速度 運動量
教師付きトレーニング • 入力と期待出力を備えたデータセットを所有 • 第一世代: 各入出力ペアのウェイトを再計算 • 完全トレーニング = 10350世代 • ネットワークトレーニングを14時間(python code) • 入力の順番が影響を与えないように、各世代のトレーニングプロセスでは入力がランダムで再配列される
サンプル結果 Neural Network Output (1に近いほど良い): Windows NT4: 4.87480503763e-005 Editions: Enterprise Server: 0.00972694324639 Server: -0.00963500026763 Service Packs: 6: 0.00559659167371 6a: -0.00846224120952 Windows 2000: 0.996048928128 Editions: Server: 0.977780526016 Professional: 0.00868998746624 Advanced Server: -0.00564873813703 Service Packs: 4: -0.00505441088081 2: -0.00285674134367 3: -0.0093665583402 0: -0.00320117552666 1: 0.921351036343
サンプル結果 (続) Windows 2003: 0.00302898647853 Editions: Web Edition: 0.00128127138728 Enterprise Edition: 0.00771786077082 Standard Edition: -0.0077145024893 Service Packs: 0: 0.000853988551952 Windows XP: 0.00605168045887 Editions: Professional: 0.00115635710749 Home: 0.000408057333416 Service Packs: 2: -0.00160404945542 0: 0.00216065240615 1: 0.000759109188052 Setting OS to Windows 2000 Server sp1 Setting architecture: i386
比較結果 • 我々のラボの結果:
1.序章2.DCE-RPC Endpoint mapper3.Nmap signaturesによるOS探知4.次元削減とトレーニング
Nmap テスト • Nmapはネットワーク調査ツールであり、セキュリティースキャナーでもある • 9つのテストに対し、ホストの応答によってOS探知が可能
Nmap signature データベース • 我々の手法はNmap signatureデータベースに基づくものである • Signatureとはある特定のバージョン/エディションのOSがテストにどう応答するか記述するルールである。例えば: # Linux 2.6.0-test5 x86 Fingerprint Linux 2.6.0-test5 x86 Class Linux | Linux | 2.6.X | general purpose TSeq(Class=RI%gcd=<6%SI=<2D3CFA0&>73C6B%IPID=Z%TS=1000HZ) T1(DF=Y%W=16A0%ACK=S++%Flags=AS%Ops=MNNTNW) T2(Resp=Y%DF=Y%W=0%ACK=S%Flags=AR%Ops=) T3(Resp=Y%DF=Y%W=16A0%ACK=S++%Flags=AS%Ops=MNNTNW) T4(DF=Y%W=0%ACK=O%Flags=R%Ops=) T5(DF=Y%W=0%ACK=S++%Flags=AR%Ops=) T6(DF=Y%W=0%ACK=O%Flags=R%Ops=) T7(DF=Y%W=0%ACK=S++%Flags=AR%Ops=) PU(DF=N%TOS=C0%IPLEN=164%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
Nmapの長所と短所 • 1464個ものsignaturesがNmapデータベースに含まれている • ホストの応答がNmapデータベースにある全てのsignatureと比較される: • 各signatureにスコアが割り当てられる • スコア = ルールがマッチした数/考慮されたルールの数 • Hamming distanceによる“best fit” • 問題: 有りえないOS • テストに対して応答が少ない • よってスコアが高い • 例: Windows 2000 versionがAtari 2600かHPUXとして間違われる
階層型ネットワーク構成 • ニューラルネットワークを用いて応答を分析 • OS探知とは侵入テストプロセスのステップである • 我々はWindows, Linux, Solaris, OpenBSD, FreeBSD, NetBSDのみ探知したい Windows DCE-RPC endpoint Linux kernel version 適切 Solaris version OpenBSD version 無関係 FreeBSD version NetBSD version
5つのニューラルネットワークが必要‥ • 適切なOSかを見分けるニューラルネットワーク • OSファミリーを見分けるニューラルネットワーク: • Windows, Linux, Solaris, OpenBSD, FreeBSD, NetBSD • Linux versionを見分けるニューラルネットワーク • Solaris version見分けるニューラルネットワーク • OpenBSD version見分けるニューラルネットワーク • 各ニューラルネットワークはそれそれ特別な接続形態とトレーニングを要する
ニューラルネットワーク入力 • 各テストに入力ニューロンを割り当てる • テストT1...T7の詳細: • ACKフラッグにニューロンを一つ • 各応答にニューロンを一つ: S, S++, O • DFフラグにニューロンを一つ • 各応答にニューロンを一つ: yes/no • フラッグフィールドにニューロンを一つ • 各フラッグにニューロンを一つ: ECE, URG, ACK, PSH, RST, SYN, FIN • オプションフィールドに6つのニューロンを10グループ • 各グループにつきニューロンを一つ、以下のオプションのため活用 EOL, MAXSEG, NOP, TIMESTAMP, WINDOW, ECHOED • Wフィールド(ウィンドウサイズ)にニューロンを一つ
ニューラルネットワーク入力の例 • フラッグやオプション: 入力は1か-1(ある/なし) • 他は数字で入力 • Wのフィールド(ウィンドウサイズ) • GCD(初期の数列の最大公約数) • Linux 2.6.0の応答例: T3(Resp=Y%DF=Y%W=16A0%ACK=S++%Flags=AS%Ops=MNNTNW) • マップ:
ニューラルネットワーク接続形態 • 560次元の入力層 • 冗長が多い • 未知の応答に柔軟 • しかしパフォーマンスが問題に • 次元削減は必須‥ • 4層あるニューラルネットワークに例えば一つ目のネットワークに: 入力層: 204ニューロン 中層1: 96ニューロン 中層2: 20ニューロン 出力層: 1ニューロン
データセット生成 • ニューラルネットワークトレーニングに必要なのは • 入力(ホスト応答) • 符合する出力(ホストOS) • Signatureには1464ものルールがある • ネットワークトレーニングに15000台のコンピューターが必要 • そんなにアクセスできない‥ • インターネットを検索するのは問題外 • モンテカルロシミュレーションを用いて入力生成 • 各ルールにあった入力を生成 • 入力数はOSの経験分布に従属する • 統計調査に基づく • もしルールがオプションや値域を必要としたら • 一様分布を使って値を選ぶ
1. 序章2. DCE-RPC Endpoint mapper3. Nmap signaturesによるOS探知4. 次元削減とトレーニング
入力をランダム変数とする • 今まで入力に対し、厳しくなかった • 冗長に加え、560次元 • 入力データセットはすごく大きい • トレーニング収束が遅い‥ • 入力次元をランダム変数 Xiとする • 入力次元は桁数が異なる • フラッグは1か-1の値を持つ • ISN (initial sequence number/初期の数列) は整数 • ランダム変数を正規化: 期待値 標準偏差
相関マトリックス • 相関マトリックスR を計算: • 正規化: • 相関とは統計的な従属を示す、次元のない値である • 1か-1に近いほどより従属する • Rの線形従属カラム(列)は従属変数を示す • 一つをキープし、他を削除 • 定数は分散0なので削除 期待値
Principal Component Analysis (PCA) • Principal Component Analysis (PCA)により、更に縮約 • アイディア: 入力空間に新しい基礎(座標系)を計算 • k次元の部分空間のデータセットのどの推計から最も大きな分散 • その分散は最初の kベーシスベクトルから得られる • PCA アルゴリズム: • マトリックス R の固有ベクトルと固有値を計算 • 固有値の大きい順に並び替える • データを推計するにあたって、最初の k ベクトルをキープ • 全体の分散の98%を保つためパラメーター kを選ぶ
結果として得られるニューラルネットワーク接続形態結果として得られるニューラルネットワーク接続形態 • PCAを行った後、以下のニューラルネットワーク継続形成が得られる (元の入力サイズは全ケース560)
順応学習率 • トレーニング収束を早める戦略 • 二次元推定誤差を計算 (期待出力 yi と実際の出力 vi ): • 世代の合間(データセット全ての入出力ペアのプロセス後)に • もし誤差が下がれば学習率を上げる • もし誤差が上がれば学習率を下げる • アイディア: 方向が合っていれば早く進む
部分空間トレーニング • トレーニング収束を早めるもう一つの戦略 • 幾つかの小さいデータセット(部分空間)でネットワークを学習させる • 誤差を推定するのに適合度Gを計算 • もし出力が0か1ならば: G = 1 – ( Pr[偽陽性率] + Pr[偽陰性率] ) • それ以外は: G = 1 – 誤差の数/出力の数 • 順応学習率: • 適合度Gが高ければ、初期の学習率も上がる
サンプル結果(ホストはSolaris 8を稼動) • Relevant / not relevant analysis (適切分析) 0.99999999999999789 relevant(適切) • Operating System analysis -0.99999999999999434 Linux 0.99999999921394744 Solaris -0.99999999999998057 OpenBSD -0.99999964651426454 FreeBSD -1.0000000000000000 NetBSD -1.0000000000000000 Windows • Solaris version analysis 0.98172780325074482 Solaris 8 -0.99281382458335776 Solaris 9 -0.99357586906143880 Solaris 7 -0.99988378968003799 Solaris 2.X -0.99999999977837983 Solaris 2.5.X
今後の課題1 • 以下からNmapテストの重要要素の分析 • 最終ウェイトの分析 • 相関マトリックスの縮約 • Principal Component Analysis • 情報量を減らすためにNmapを最適化 • ノイズとファイアーウォールフィルターを加える • ファイアーウォールの有無を探知 • 様々なファイアーウォールを識別 • ロバストなテストを作り上げる
今後の課題2 • この分析は他の探知法にも応用が可能: • xprobe2 – Ofir Arkin, Fyodor & Meder Kydyraliev • ICMP, SMB, SNMPによる探知 • p0f (Passive OS Identification) – Michal Zalewski • SUN RPCによる OS探知 / Portmapper • Sun / Linux / other System V versions • MUA (Outlook / Thunderbird / etc) Mail Headersによる探知
何かご質問はございますか?どうもありがとうございました何かご質問はございますか?どうもありがとうございました