osc 2016 hokkaido セミナー資料

Post on 16-Apr-2017

303 Views

Category:

Engineering

2 Downloads

Preview:

Click to see full reader

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