OSC 2016 Hokkaido セミナー資料

244 views

Published on

オープンソースカンファレンス2016北海道で「セキュリティ・キャンプ同窓会」として成果報告を行った時のセミナー資料です。

Published in: Engineering
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
244
On SlideShare
0
From Embeds
0
Number of Embeds
130
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

OSC 2016 Hokkaido セミナー資料

  1. 1. パケット解析ライブラリ LibPGEN を使用した新たなプロトコルに対する パケット解析 @slankdev セキュリティ・キャンプ2015修了生 6/18/16 osc2016do 1
  2. 2. 自己紹介 o すらんく o 理工学部 3年生 o Twitter: @slankdev o Github: slankdev o セキュリティ・キャンプ {2015修了,2016チューター} o パケットとOSと開発を愛する oゆる〜い感じに楽しくやらせていただきます oどうぞお付き合いお願いいたします m(. .)m 6/18/16 osc2016do 2
  3. 3. Agenda 1. パケット解析の課題 2. LibPGENの紹介 3. LibPGENを使用して 新たなプロトコルを解析するプログラムを実装 oLinux環境がある方はデモの作業を一緒にやりましょう! 以下URLを参照ください! ohttp://blog.slankdev.net/2016/06/17/osc2016do 6/18/16 osc2016do 3
  4. 4. 既存の手法 o WiresharkやNetwork Minerでの解析 6/18/16 osc2016do 4
  5. 5. Wiresharkはすごい o メリット ◦ プロトコルアナライザとして最強 ◦ 異常検知までやってくれる ◦ 多少知識なくても使える o デメリットというか要望… ? ◦ dissectorやプラグイン ◦ Wiresharkの内部理解 6/18/16 osc2016do 5
  6. 6. 異常検知例 6/18/16 osc2016do 6
  7. 7. でもこんなことやりたい o 便利だけど、もっとこうしてほしいってことがあった o決まったしょりとか、ログ出力とか oプログラミングしたい o何かに頼るより自分でやったほうがかっこいいじゃん! 6/18/16 osc2016do 7
  8. 8. ここから生まれた課題 oプログラミング言語からパケット解析をしよう o新たなプロトコルに迅速に対応できるように 6/18/16 osc2016do 8
  9. 9. パケット解析をプログラミング…? o 例えば以下のようなコード oARPリプライだけ情報表示したいときとか… 6/18/16 osc2016do 9
  10. 10. 新たなプトロコルに迅速に対応…? oツールの対応してないプロトコルに遭遇したら… 6/18/16 osc2016do 10 おう、このパケットは? どうなってんの? 無理でシャーク つらいでシャーク
  11. 11. 解決策の一例 o 今回はパケット解析ライブラリの 使用でまかなうことにします o 先ほどの課題の解決策の実装を紹介します 6/18/16 osc2016do 11
  12. 12. LibPGEN oパケット解析支援ライブラリ oパケットに関する多数の仕事を簡単にする o拡張可能 oC++11, Linux, BSDで動作 oサイボウズ・ラボユース5thにて開発 6/18/16 osc2016do 12
  13. 13. LibPGENの設計 6/18/16 osc2016do 13
  14. 14. LibPGENの設定 6/18/16 osc2016do 14 o 大きく分けて三つのコンポーネントに分かれてます • IO • データをネットワークインターフェースやpcap, pcapngファイルに 入出力するクラス群 • pgen::net_stream, pgen::pcap_stream …etc • Core • パケットやアドレスのバイナリを解析したり、変更したりする部分 • pgen::ethernet, pgen::ip, …etc • Module • Core, IOを使って書かれたモジュール群 • めんどくさい作業をまとめてやってくれるクラスや関数群 • 説明は省略
  15. 15. パケットクラス in COREコンポーネント 6/18/16 osc2016do 15 o使用用途 ◦ ゼロからパケットのバイナリを 組み立て ◦ 既存のバイナリを変更 ◦ 長さを変えたり途中に追加な ど柔軟に o設計部分は後述 Packet Class ffff ffff ffff 703e aceb 27a5 0806 0001 0800 0604 0001 703e aceb 27a5 0000 0000 0000 0000 0000 0ad2 7c7e 5b2a 0100 2d1a ac19 1bff ffff 0000 0000 0000 aaaa aaaa aaaa 703e aceb 27a5 0806 0001 0800 0604 0002 703e aceb 27a5 0000 0000 0000 0000 0000 0ad2 7c7e 5b2a 0100 2d1a ac19 1bff ffff 0000 0000 0000 4920 6c6f 7665 2070 6163 6b65 742e
  16. 16. パケットクラスの継承関係 6/18/16 osc2016do 16
  17. 17. ストリームクラス 6/18/16 osc2016do 17 o幾つかのインターフェースを触れる ◦ ネットワークインターフェース ◦ pcapファイル ◦ pcapngファイル も完全対応ではない (最新版は知りません) oOSごとの実装の違いを吸収
  18. 18. ここまでのまとめ oパケット解析の課題の話 oパケット解析のライブラリを設計実装した ◦ プログラミング言語からパケット解析ができる ◦ 新たなプロトコルの解析が簡単に行える 6/18/16 osc2016do 18
  19. 19. デモ内容 oLibPGENを使用して 新たなプロトコルに対応できるように拡張 o簡単な解析スクリプトを実装 6/18/16 osc2016do 19
  20. 20. TMP (Test Message Protocol) o 今回のデモのために定義した仮のプロトコル o クライアント->サーバの単方向メッセージ通信 oプロトコルの使用用途とかは特に考えてません 6/18/16 osc2016do 20 Hello World!
  21. 21. TMP (Test Message Protocol) oデモで使用するプロトコル oメッセージ用プロトコル oIdentification: ユーザごとのid oseq num : シーケンス番号 omsg len : メッセージ長 omsg : メッセージ 6/18/16 osc2016do 21
  22. 22. 通信環境 6/18/16 osc2016do 22
  23. 23. 今日のデモ内容 o2台のクライアントでサーバと通信 oサーバの別プロセスでパケットをキャプチャして解析 各ユーザの発言を時間ごとにまとめてlogファイルに出力 oTMPサーバ, クライアントは独立してC++で実装 6/18/16 osc2016do 23
  24. 24. 解析のための手順 1. TMP用のパケットクラスの実装 2. 解析用スクリプトの実装 6/18/16 osc2016do 24
  25. 25. TMPの解析をする前に oTMPパケットクラスを実装する前に パケットクラスの構造を少し説明します 6/18/16 osc2016do 25
  26. 26. LibPGENの設計 6/18/16 osc2016do 26
  27. 27. クラス設計 oパケットクラス ◦ プロトコルごとのヘッダのインスタンスを持つ (has-a) oヘッダクラス ◦ ヘッダの要素を持つ (UDPヘッダならsrc_portとかdst_portとか) 6/18/16 osc2016do 27 Packet Class Header Class Header Class Header Element Header Element Header Element Header Class
  28. 28. 新プロトコルのパケットクラスの実装 o拡張するユーザは新たな ヘッダクラスを実装 oそのヘッダのバイナリ解析 のコードのみを追加 6/18/16 osc2016do 28 新 Packet Class 既存のHeader Class 新 Header Class 既存のHeader Class
  29. 29. パケットクラスの継承関係 6/18/16 osc2016do 29 pgen::packet pgen::ethernet pgen::ipv6pgen::tcppgen::udp pgen::icmp pgen::ippgen::arp
  30. 30. パケットクラスの継承関係 6/18/16 osc2016do 30 pgen::packet pgen::ethernet pgen::ipv6pgen::tcppgen::udp pgen::icmp pgen::ippgen::arp pgen::XXX
  31. 31. ヘッダクラスの継承関係 6/18/16 osc2016do 31 pgen::header pgen::ethernet _header pgen::ipv6_headerpgen::tcp_headerpgen::udp_header pgen::icmp_header pgen::ip_headerpgen::arp_header
  32. 32. ヘッダクラスの継承関係 6/18/16 osc2016do 32 pgen::header pgen::ethernet _header pgen::ipv6_headerpgen::tcp_headerpgen::udp_header pgen::icmp_header pgen::ip_headerpgen::arp_header pgen::XXX_header
  33. 33. ヘッダクラスのメンバ関数 oヘッダクラスのメンバ関数 (一部) ◦ virtual write(buffer, bufferlen) = 0 ヘッダのバイナリを書き込む ◦ virtual read(buffer, bufferlen) = 0 ヘッダのバイナリを読み込む ◦ virtual size_t length() = 0 ヘッダの長さを返す 6/18/16 osc2016do 33
  34. 34. ヘッダクラスとパケットクラスの関係 oパケットの バイナリ解析を行う場合 oanalyze()は 各ヘッダクラス::read()を 上から呼び出して解析 oバイナリ生成も同じ構造 6/18/16 osc2016do 34 Ether IP UDP Trailer ethヘッダ::read() ipヘッダ::read() udpヘッダ::read() udpパケット ::analyze()
  35. 35. ヘッダクラスとパケットクラスの関係 oパケットの バイナリ解析を行う場合 oanalyze()は 各ヘッダクラス::read()を 上から呼び出して解析 oバイナリ生成も同じ構造 6/18/16 osc2016do 35 Ether IP UDP Trailer ethヘッダ::read() ipヘッダ::read() udpヘッダ::read() udpパケット ::analyze()
  36. 36. 新プロトコルでパケットクラスの実装 6/18/16 osc2016do 36 Ether IP UDP Trailer ethヘッダ::read() ipヘッダ::read() udpヘッダ::read() 新プロトコル パケット ::analyze() 新 プロト コル 新プロトコル ::read() 拡張をする開発者はヘッダクラスの 実装のみを気に掛ければいい
  37. 37. UDPパケットクラスの構造 6/18/16 osc2016do 37 例えばUDPパケットクラスを実装する場合
  38. 38. UDPパケットクラスの構造 6/18/16 osc2016do 38 決まり文句だけの 関数で1~4行程度 例えばUDPパケットクラスを実装する場合
  39. 39. UDPパケットクラスの構造 6/18/16 osc2016do 39 決まり文句だけの 関数で1~4行程度 ここのみを新たに 実装すればいい 例えばUDPパケットクラスを実装する場合
  40. 40. UDPヘッダクラスの構造 6/18/16 osc2016do 40 例えばUDPパケットクラスを実装する場合
  41. 41. UDPヘッダクラスの構造 6/18/16 osc2016do 41 UDPヘッダの要素 ヘッダ長の 最大値と最小値 例えばUDPパケットクラスを実装する場合
  42. 42. UDPヘッダクラスの構造 6/18/16 osc2016do 42 決まり文句だけの 関数で1~4行程度 バイナリ解析など のコードでここだけ しっかり実装 UDPはチェックサム があるので、それ用の関数 例えばUDPパケットクラスを実装する場合
  43. 43. TMPパケット解析までの道のり… 1. LibPGENのインストール 2. TMP解析環境の実装 3. Let’s Analyze Packet! 6/18/16 osc2016do 43
  44. 44. LibPGENのインストール 1. 標準の開発環境の構築 2. LibPGENのソースコード入手 $ git clone http://github.com/slankdev/libpgen.git 3. LibPGENのコンパイル、インストール $ cd libpgen $ make && sudo make install 4. Hello Worldしよう $ cd sample/send_packet $ make $ ./a.out 6/18/16 osc2016do 44
  45. 45. oここからは 大変なのでコードを見ましょう ohttp://blog.slankdev.net/2016/06/17/osc2016do クラス図 6/18/16 osc2016do 45 tmp pgen::header pgen::packet tmp_header is-a is-a has-a
  46. 46. どうですか? o楽しくパケットが解析できたと思います o (きっと私だけではないはず….!!) 6/18/16 osc2016do 46
  47. 47. 今後の展望 o高速化 -> 最大の課題 o他のAPIに頼るところと頼らないところをしっかりとする ◦ 現在は何にも頼らず実装 ◦ でも現実を見ると高速IOのAPIがある 6/18/16 osc2016do 47
  48. 48. まとめ oパケット解析のライブラリを実装しました oプログラミング言語からパケット解析を行う o新たなプロトコルに迅速に対応可能 oより楽しくパケット解析できます 6/18/16 osc2016do 48
  49. 49. 最後に… o このライブラリは現在CybozuLab株式会社様の「サイボウ ズ・ラボユース」というプロジェクトで開発を支援していただ いています。 o セキュリティ・キャンプ関係者の方々の意見なども参考に させていただいています。 o この場を借りてありがとうございます。 6/18/16 osc2016do 49
  50. 50. 6/18/16 osc2016do 50 aabb ccdd eeff 0011 2233 4455 0800 4500 2800 0001 0000 4006 b9a2 c0a8 b302 c0a8 6501 3039 3039 0000 0000 0000 0000 5001 2000 961c 0000 ありがとうございました

×