osc 2016 hokkaido セミナー資料
Post on 16-Apr-2017
303 Views
Preview:
TRANSCRIPT
パケット解析ライブラリ
LibPGENを使用した新たなプロトコルに対する
パケット解析@slankdev
セキュリティ・キャンプ2015修了生
6/18/16 osc2016do 1
自己紹介
oすらんく
o理工学部 3年生o Twitter:@slankdevo Github:slankdevoセキュリティ・キャンプ {2015修了,2016チューター}oパケットとOSと開発を愛する
oゆる〜い感じに楽しくやらせていただきます
oどうぞお付き合いお願いいたします m(..)m
6/18/16 osc2016do 2
Agenda
1. パケット解析の課題2. LibPGENの紹介3. LibPGENを使用して新たなプロトコルを解析するプログラムを実装
oLinux環境がある方はデモの作業を一緒にやりましょう!以下URLを参照ください!ohttp://blog.slankdev.net/2016/06/17/osc2016do
6/18/16 osc2016do 3
既存の手法
oWiresharkやNetworkMinerでの解析
6/18/16 osc2016do 4
Wiresharkはすごいo メリット◦プロトコルアナライザとして最強◦異常検知までやってくれる◦多少知識なくても使える
oデメリットというか要望… ?◦ dissectorやプラグイン◦ Wiresharkの内部理解
6/18/16 osc2016do 5
異常検知例
6/18/16 osc2016do 6
でもこんなことやりたい
o便利だけど、もっとこうしてほしいってことがあった
o決まったしょりとか、ログ出力とか
oプログラミングしたい
o何かに頼るより自分でやったほうがかっこいいじゃん!
6/18/16 osc2016do 7
ここから生まれた課題
oプログラミング言語からパケット解析をしよう
o新たなプロトコルに迅速に対応できるように
6/18/16 osc2016do 8
パケット解析をプログラミング…?
o例えば以下のようなコード
oARPリプライだけ情報表示したいときとか…
6/18/16 osc2016do 9
新たなプトロコルに迅速に対応…?
oツールの対応してないプロトコルに遭遇したら…
6/18/16 osc2016do 10
おう、このパケットは?どうなってんの?
無理でシャークつらいでシャーク
解決策の一例
o今回はパケット解析ライブラリの使用でまかなうことにします
o先ほどの課題の解決策の実装を紹介します
6/18/16 osc2016do 11
LibPGENoパケット解析支援ライブラリ
oパケットに関する多数の仕事を簡単にする
o拡張可能
oC++11,Linux,BSDで動作oサイボウズ・ラボユース5thにて開発
6/18/16 osc2016do 12
LibPGENの設計
6/18/16 osc2016do 13
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を使って書かれたモジュール群• めんどくさい作業をまとめてやってくれるクラスや関数群• 説明は省略
パケットクラス 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
パケットクラスの継承関係
6/18/16 osc2016do 16
ストリームクラス
6/18/16 osc2016do 17
o幾つかのインターフェースを触れる◦ネットワークインターフェース◦ pcapファイル◦ pcapngファイル も完全対応ではない (最新版は知りません)
oOSごとの実装の違いを吸収
ここまでのまとめ
oパケット解析の課題の話
oパケット解析のライブラリを設計実装した◦プログラミング言語からパケット解析ができる◦新たなプロトコルの解析が簡単に行える
6/18/16 osc2016do 18
デモ内容
oLibPGENを使用して新たなプロトコルに対応できるように拡張
o簡単な解析スクリプトを実装
6/18/16 osc2016do 19
TMP(TestMessageProtocol)o今回のデモのために定義した仮のプロトコル
oクライアント->サーバの単方向メッセージ通信
oプロトコルの使用用途とかは特に考えてません
6/18/16 osc2016do 20
HelloWorld!
TMP(TestMessageProtocol)oデモで使用するプロトコル
oメッセージ用プロトコル
oIdentification:ユーザごとのidoseq num :シーケンス番号omsg len :メッセージ長omsg :メッセージ
6/18/16 osc2016do 21
通信環境
6/18/16 osc2016do 22
今日のデモ内容
o2台のクライアントでサーバと通信oサーバの別プロセスでパケットをキャプチャして解析各ユーザの発言を時間ごとにまとめてlogファイルに出力
oTMPサーバ,クライアントは独立してC++で実装
6/18/16 osc2016do 23
解析のための手順
1. TMP用のパケットクラスの実装2. 解析用スクリプトの実装
6/18/16 osc2016do 24
TMPの解析をする前にoTMPパケットクラスを実装する前にパケットクラスの構造を少し説明します
6/18/16 osc2016do 25
LibPGENの設計
6/18/16 osc2016do 26
クラス設計
oパケットクラス◦プロトコルごとのヘッダのインスタンスを持つ (has-a)
oヘッダクラス◦ヘッダの要素を持つ (UDPヘッダならsrc_portとかdst_portとか)
6/18/16 osc2016do 27
PacketClass
HeaderClass
HeaderClass
HeaderElement
HeaderElement
HeaderElementHeaderClass
新プロトコルのパケットクラスの実装
o拡張するユーザは新たなヘッダクラスを実装
oそのヘッダのバイナリ解析のコードのみを追加
6/18/16 osc2016do 28
新 PacketClass
既存のHeaderClass
新 HeaderClass
既存のHeaderClass
パケットクラスの継承関係
6/18/16 osc2016do 29
pgen::packet
pgen::ethernet
pgen::ipv6pgen::tcppgen::udp pgen::icmp
pgen::ippgen::arp
パケットクラスの継承関係
6/18/16 osc2016do 30
pgen::packet
pgen::ethernet
pgen::ipv6pgen::tcppgen::udp pgen::icmp
pgen::ippgen::arp
pgen::XXX
ヘッダクラスの継承関係
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
ヘッダクラスの継承関係
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
ヘッダクラスのメンバ関数
oヘッダクラスのメンバ関数 (一部)
◦ virtualwrite(buffer,bufferlen)=0ヘッダのバイナリを書き込む
◦ virtualread(buffer,bufferlen)=0ヘッダのバイナリを読み込む
◦ virtualsize_t length()=0 ヘッダの長さを返す
6/18/16 osc2016do 33
ヘッダクラスとパケットクラスの関係
oパケットのバイナリ解析を行う場合
oanalyze()は各ヘッダクラス::read()を上から呼び出して解析
oバイナリ生成も同じ構造
6/18/16 osc2016do 34
Ether
IP
UDP
Trailer
ethヘッダ::read()
ipヘッダ::read()
udpヘッダ::read()
udpパケット::analyze()
ヘッダクラスとパケットクラスの関係
oパケットのバイナリ解析を行う場合
oanalyze()は各ヘッダクラス::read()を上から呼び出して解析
oバイナリ生成も同じ構造
6/18/16 osc2016do 35
Ether
IP
UDP
Trailer
ethヘッダ::read()
ipヘッダ::read()
udpヘッダ::read()
udpパケット::analyze()
新プロトコルでパケットクラスの実装
6/18/16 osc2016do 36
Ether
IP
UDP
Trailer
ethヘッダ::read()
ipヘッダ::read()
udpヘッダ::read()
新プロトコルパケット::analyze()
新
プロトコル
新プロトコル::read()
拡張をする開発者はヘッダクラスの実装のみを気に掛ければいい
UDPパケットクラスの構造
6/18/16 osc2016do 37
例えばUDPパケットクラスを実装する場合
UDPパケットクラスの構造
6/18/16 osc2016do 38
決まり文句だけの関数で1~4行程度
例えばUDPパケットクラスを実装する場合
UDPパケットクラスの構造
6/18/16 osc2016do 39
決まり文句だけの関数で1~4行程度
ここのみを新たに実装すればいい
例えばUDPパケットクラスを実装する場合
UDPヘッダクラスの構造
6/18/16 osc2016do 40
例えばUDPパケットクラスを実装する場合
UDPヘッダクラスの構造
6/18/16 osc2016do 41
UDPヘッダの要素
ヘッダ長の最大値と最小値
例えばUDPパケットクラスを実装する場合
UDPヘッダクラスの構造
6/18/16 osc2016do 42
決まり文句だけの関数で1~4行程度
バイナリ解析などのコードでここだけしっかり実装
UDPはチェックサムがあるので、それ用の関数
例えばUDPパケットクラスを実装する場合
TMPパケット解析までの道のり…1. LibPGENのインストール2. TMP解析環境の実装3. Let’sAnalyzePacket!
6/18/16 osc2016do 43
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
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
どうですか?o楽しくパケットが解析できたと思います
o (きっと私だけではないはず….!!)
6/18/16 osc2016do 46
今後の展望
o高速化 ->最大の課題
o他のAPIに頼るところと頼らないところをしっかりとする◦現在は何にも頼らず実装◦でも現実を見ると高速IOのAPIがある
6/18/16 osc2016do 47
まとめ
oパケット解析のライブラリを実装しました
oプログラミング言語からパケット解析を行う
o新たなプロトコルに迅速に対応可能
oより楽しくパケット解析できます
6/18/16 osc2016do 48
最後に…oこのライブラリは現在CybozuLab株式会社様の「サイボウズ・ラボユース」というプロジェクトで開発を支援していただいています。
oセキュリティ・キャンプ関係者の方々の意見なども参考にさせていただいています。
oこの場を借りてありがとうございます。
6/18/16 osc2016do 49
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
ありがとうございました
top related