osc 2016 hokkaido セミナー資料

50
パケット解析ライブラリ LibPGEN を使用した新たなプロトコルに対する パケット解析 @slankdev セキュリティ・キャンプ 2015 修了生 6/18/16 osc2016do 1

Upload: slankdev

Post on 16-Apr-2017

300 views

Category:

Engineering


2 download

TRANSCRIPT

Page 1: OSC 2016 Hokkaido セミナー資料

パケット解析ライブラリ

LibPGENを使用した新たなプロトコルに対する

パケット解析@slankdev

セキュリティ・キャンプ2015修了生

6/18/16 osc2016do 1

Page 2: OSC 2016 Hokkaido セミナー資料

自己紹介

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 セミナー資料

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 セミナー資料

既存の手法

oWiresharkやNetworkMinerでの解析

6/18/16 osc2016do 4

Page 5: OSC 2016 Hokkaido セミナー資料

Wiresharkはすごいo メリット◦プロトコルアナライザとして最強◦異常検知までやってくれる◦多少知識なくても使える

oデメリットというか要望… ?◦ dissectorやプラグイン◦ Wiresharkの内部理解

6/18/16 osc2016do 5

Page 6: OSC 2016 Hokkaido セミナー資料

異常検知例

6/18/16 osc2016do 6

Page 7: OSC 2016 Hokkaido セミナー資料

でもこんなことやりたい

o便利だけど、もっとこうしてほしいってことがあった

o決まったしょりとか、ログ出力とか

oプログラミングしたい

o何かに頼るより自分でやったほうがかっこいいじゃん!

6/18/16 osc2016do 7

Page 8: OSC 2016 Hokkaido セミナー資料

ここから生まれた課題

oプログラミング言語からパケット解析をしよう

o新たなプロトコルに迅速に対応できるように

6/18/16 osc2016do 8

Page 9: OSC 2016 Hokkaido セミナー資料

パケット解析をプログラミング…?

o例えば以下のようなコード

oARPリプライだけ情報表示したいときとか…

6/18/16 osc2016do 9

Page 10: OSC 2016 Hokkaido セミナー資料

新たなプトロコルに迅速に対応…?

oツールの対応してないプロトコルに遭遇したら…

6/18/16 osc2016do 10

おう、このパケットは?どうなってんの?

無理でシャークつらいでシャーク

Page 11: OSC 2016 Hokkaido セミナー資料

解決策の一例

o今回はパケット解析ライブラリの使用でまかなうことにします

o先ほどの課題の解決策の実装を紹介します

6/18/16 osc2016do 11

Page 12: OSC 2016 Hokkaido セミナー資料

LibPGENoパケット解析支援ライブラリ

oパケットに関する多数の仕事を簡単にする

o拡張可能

oC++11,Linux,BSDで動作oサイボウズ・ラボユース5thにて開発

6/18/16 osc2016do 12

Page 13: OSC 2016 Hokkaido セミナー資料

LibPGENの設計

6/18/16 osc2016do 13

Page 14: OSC 2016 Hokkaido セミナー資料

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 セミナー資料

パケットクラス 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 セミナー資料

パケットクラスの継承関係

6/18/16 osc2016do 16

Page 17: OSC 2016 Hokkaido セミナー資料

ストリームクラス

6/18/16 osc2016do 17

o幾つかのインターフェースを触れる◦ネットワークインターフェース◦ pcapファイル◦ pcapngファイル も完全対応ではない (最新版は知りません)

oOSごとの実装の違いを吸収

Page 18: OSC 2016 Hokkaido セミナー資料

ここまでのまとめ

oパケット解析の課題の話

oパケット解析のライブラリを設計実装した◦プログラミング言語からパケット解析ができる◦新たなプロトコルの解析が簡単に行える

6/18/16 osc2016do 18

Page 19: OSC 2016 Hokkaido セミナー資料

デモ内容

oLibPGENを使用して新たなプロトコルに対応できるように拡張

o簡単な解析スクリプトを実装

6/18/16 osc2016do 19

Page 20: OSC 2016 Hokkaido セミナー資料

TMP(TestMessageProtocol)o今回のデモのために定義した仮のプロトコル

oクライアント->サーバの単方向メッセージ通信

oプロトコルの使用用途とかは特に考えてません

6/18/16 osc2016do 20

HelloWorld!

Page 21: OSC 2016 Hokkaido セミナー資料

TMP(TestMessageProtocol)oデモで使用するプロトコル

oメッセージ用プロトコル

oIdentification:ユーザごとのidoseq num :シーケンス番号omsg len :メッセージ長omsg :メッセージ

6/18/16 osc2016do 21

Page 22: OSC 2016 Hokkaido セミナー資料

通信環境

6/18/16 osc2016do 22

Page 23: OSC 2016 Hokkaido セミナー資料

今日のデモ内容

o2台のクライアントでサーバと通信oサーバの別プロセスでパケットをキャプチャして解析各ユーザの発言を時間ごとにまとめてlogファイルに出力

oTMPサーバ,クライアントは独立してC++で実装

6/18/16 osc2016do 23

Page 24: OSC 2016 Hokkaido セミナー資料

解析のための手順

1. TMP用のパケットクラスの実装2. 解析用スクリプトの実装

6/18/16 osc2016do 24

Page 25: OSC 2016 Hokkaido セミナー資料

TMPの解析をする前にoTMPパケットクラスを実装する前にパケットクラスの構造を少し説明します

6/18/16 osc2016do 25

Page 26: OSC 2016 Hokkaido セミナー資料

LibPGENの設計

6/18/16 osc2016do 26

Page 27: OSC 2016 Hokkaido セミナー資料

クラス設計

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 セミナー資料

新プロトコルのパケットクラスの実装

o拡張するユーザは新たなヘッダクラスを実装

oそのヘッダのバイナリ解析のコードのみを追加

6/18/16 osc2016do 28

新 PacketClass

既存のHeaderClass

新 HeaderClass

既存のHeaderClass

Page 29: OSC 2016 Hokkaido セミナー資料

パケットクラスの継承関係

6/18/16 osc2016do 29

pgen::packet

pgen::ethernet

pgen::ipv6pgen::tcppgen::udp pgen::icmp

pgen::ippgen::arp

Page 30: OSC 2016 Hokkaido セミナー資料

パケットクラスの継承関係

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 セミナー資料

ヘッダクラスの継承関係

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 セミナー資料

ヘッダクラスの継承関係

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 セミナー資料

ヘッダクラスのメンバ関数

oヘッダクラスのメンバ関数 (一部)

◦ virtualwrite(buffer,bufferlen)=0ヘッダのバイナリを書き込む

◦ virtualread(buffer,bufferlen)=0ヘッダのバイナリを読み込む

◦ virtualsize_t length()=0 ヘッダの長さを返す

6/18/16 osc2016do 33

Page 34: OSC 2016 Hokkaido セミナー資料

ヘッダクラスとパケットクラスの関係

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 セミナー資料

ヘッダクラスとパケットクラスの関係

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 セミナー資料

新プロトコルでパケットクラスの実装

6/18/16 osc2016do 36

Ether

IP

UDP

Trailer

ethヘッダ::read()

ipヘッダ::read()

udpヘッダ::read()

新プロトコルパケット::analyze()

プロトコル

新プロトコル::read()

拡張をする開発者はヘッダクラスの実装のみを気に掛ければいい

Page 37: OSC 2016 Hokkaido セミナー資料

UDPパケットクラスの構造

6/18/16 osc2016do 37

例えばUDPパケットクラスを実装する場合

Page 38: OSC 2016 Hokkaido セミナー資料

UDPパケットクラスの構造

6/18/16 osc2016do 38

決まり文句だけの関数で1~4行程度

例えばUDPパケットクラスを実装する場合

Page 39: OSC 2016 Hokkaido セミナー資料

UDPパケットクラスの構造

6/18/16 osc2016do 39

決まり文句だけの関数で1~4行程度

ここのみを新たに実装すればいい

例えばUDPパケットクラスを実装する場合

Page 40: OSC 2016 Hokkaido セミナー資料

UDPヘッダクラスの構造

6/18/16 osc2016do 40

例えばUDPパケットクラスを実装する場合

Page 41: OSC 2016 Hokkaido セミナー資料

UDPヘッダクラスの構造

6/18/16 osc2016do 41

UDPヘッダの要素

ヘッダ長の最大値と最小値

例えばUDPパケットクラスを実装する場合

Page 42: OSC 2016 Hokkaido セミナー資料

UDPヘッダクラスの構造

6/18/16 osc2016do 42

決まり文句だけの関数で1~4行程度

バイナリ解析などのコードでここだけしっかり実装

UDPはチェックサムがあるので、それ用の関数

例えばUDPパケットクラスを実装する場合

Page 43: OSC 2016 Hokkaido セミナー資料

TMPパケット解析までの道のり…1. LibPGENのインストール2. TMP解析環境の実装3. Let’sAnalyzePacket!

6/18/16 osc2016do 43

Page 44: OSC 2016 Hokkaido セミナー資料

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 セミナー資料

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 セミナー資料

どうですか?o楽しくパケットが解析できたと思います

o (きっと私だけではないはず….!!)

6/18/16 osc2016do 46

Page 47: OSC 2016 Hokkaido セミナー資料

今後の展望

o高速化 ->最大の課題

o他のAPIに頼るところと頼らないところをしっかりとする◦現在は何にも頼らず実装◦でも現実を見ると高速IOのAPIがある

6/18/16 osc2016do 47

Page 48: OSC 2016 Hokkaido セミナー資料

まとめ

oパケット解析のライブラリを実装しました

oプログラミング言語からパケット解析を行う

o新たなプロトコルに迅速に対応可能

oより楽しくパケット解析できます

6/18/16 osc2016do 48

Page 49: OSC 2016 Hokkaido セミナー資料

最後に…oこのライブラリは現在CybozuLab株式会社様の「サイボウズ・ラボユース」というプロジェクトで開発を支援していただいています。

oセキュリティ・キャンプ関係者の方々の意見なども参考にさせていただいています。

oこの場を借りてありがとうございます。

6/18/16 osc2016do 49

Page 50: OSC 2016 Hokkaido セミナー資料

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

ありがとうございました