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