狠狠撸

狠狠撸Share a Scribd company logo
パケット解析
ライブラリの開発
セキュリティ?キャンプ卒業生 活動報告
すらんく (@slankdev)
セキュリティ?キャンプ 2015	
 ?卒業生
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 1
Agenda
o パケット解析の現状
? パケット解析の定石
? パケット解析はもっとこうあるべき
o LibPGENの紹介
o LibPGENの設計
o LibPGENの使用例
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 2
はじめに
o このライブラリは現在CybozuLab株式会社様の「サイボウ
ズ?ラボユース」というプロジェクトで開発を支援していただ
いています。
o 他にもセキュリティ?キャンプ関係者の方々をはじめたくさ
んの方の意見なども参考にさせていただいています。
o この場を借りてありがとうございます。
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 3
本当は今日は….
o 去年の12月に公開したversion1について発表しようと思っ
ていたのですが…
oラボユースでの開発中にいろいろなことがありまして
o今回のと関係ありませんが、ラボユースとてもたのしい
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 4
サイボウズ ラボユースにて
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 5
ここの実装はどうしてこうなんですか?	
 ?
こうしないとダメじゃないんですか?
ラボユース初期の開発打ち合わせにて
ここはry)
そもそもC++のソフトウェアなのにいろい
ろできていなry)
あ、そうです。なおします
はい、そこもです。
。。。。
。。。。
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 6
全部設計しなおして作り直そう
ってことでまだ全て実装しきれてないです
注意!!
o 開発中のversion2.0の開発に関しての発表を行います
o ここでの意見や見解は個人的なものです。
o あんまり気にしすぎないでください
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 7
Agenda
o パケット解析の現状
? パケット解析の定石
? パケット解析はもっとこうあるべき
o LibPGENの紹介
o LibPGENの設計
o LibPGENの使用例
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 8
パケット解析の定石
o Wiresharkに頼った解析(ダメとは全く言っていない)
o ディスプレイフィルタや、豊富な情報処理機能が最高
o はっきり言って、解析しているのは人でなく鮫
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 9
おう、このパケットどうよ?
lengthがあってないでシャーク
おかしいでシャーク
このパケット解析だけでは…
o 鮫のしらないプロトコルの出現!!	
 ?	
 ?	
 ?	
 ?à? ドウスル…
o パケット解析、処理能力の必要性
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 10
理想
現実
Agenda
o パケット解析の現状
? パケット解析の定石
? パケット解析はもっとこうあるべき
o LibPGENの紹介
o LibPGENの設計
o LibPGENの使用例
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 11
パケット解析はもっとこうあるべき
o 自由にプログラミングしたい。。もっと色々遊びたい
o 見るだけじゃ。。。キマらない
o パケットを作りたい、変えたい
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 12
おう、頼りにしてるけど
一人でもある程度出来るぜ
すごいでシャーク
すごいでシャーク
理想
o プログラミングしたい
o 簡単で自由自在にパケットを弄くり倒したい
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 13
パ
ケ
ッ
ト
解
析
な
ん
て
Agenda
o パケット解析の現状
? パケット解析の定石
? パケット解析はもっとこうあるべき
o LibPGENの紹介
o LibPGENの設計
o LibPGENの使用例
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 14
LibPGEN:	
 ?とは
o 読み方は「りぶ ぴーじぇん」です
o C++で利用可能なパケット解析ライブラリ
oユーザが正しくパケットを作る補助などの機能あり
oもちろん好き勝手にいじくれるようにしました
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 15
LibPGEN:	
 ?概要
o 簡単なコードでパケットを弄り倒せる
o パケット解析だけでなく、様々な機能を追加予定
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 16
LibPGEN:	
 ?特徴と新規性
o 新規性
? パケットを扱うライブラリ
? 既存ライブラリでは目的を重視
? このライブラリでは仮定を重視
? その方が勉強になるんじゃね
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 17
LibPGEN:	
 ?特徴と新規性
o 有名どころのライブラリは…
o 目的重視 → アプリケーション開発などには最適
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 18
LibPGEN:	
 ?特徴と新規性
o LibPGENは…
o パケット単位でのプログラミング
o 通信に至る過程を重視 → いろんなことを学べるかもね
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 19
LibPGEN:	
 ?特徴と新規性
o 特徴
? 拡張しやすい設計に
? プロトコルの知識さえあれば弄り倒せる
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 20
LibPGEN:	
 ?特徴と新規性
o 現在対応のプロトコル (version1では)
? Ethernet,	
 ?ARP,	
 ?IP,	
 ?ICMP,	
 ?TCP,	
 ?UDP	
 ?
o これ以外のプロトコルは拡張が容易な設計に(後述)
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 21
LibPGEN:	
 ?今後の展開
o 様々なプロトコルをサポート?
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 22
Agenda
o パケット解析の現状
? パケット解析の定石
? パケット解析はもっとこうあるべき
o LibPGENの紹介
o LibPGENの設計
o LibPGENの使用例
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 23
アーキテクチャ
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 24
IO	
 ?Controller
Address	
 ?Controller
Module
Packet	
 ?Controller
3つのコンポーネントに分割
o IO	
 ?Controller
? データの入出力を担当
? ネットワークインターフェースに送受信
? PCAP,	
 ?PCAPNGファイルに書き込み
o Address	
 ?Controller
? アドレス処理などを担当
? 文字列からアドレスなど
o Packet	
 ?Controller
? 様々なプロトコルのパケットを解析、作成などを担当
o Module
? 上の三つを使って書かれたモジュール群
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 25
Packet,	
 ?Address	
 ?Controller
o パケットやアドレスのバイナリの生成や、解析などを行う
o 簡単なインターフェースでパケットのデータを編集などを
可能にします
o 例えばARPパケットならこんな感じ
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 26
Packet,	
 ?Address	
 ?class
o Packet	
 ?class
? 各プロトコルに対応したパケットクラスがある
? TCPパケットなら pgen::tcp クラス
? (まだないけど)	
 ?HTTPパケットなら pgen::http	
 ?クラス
o Address	
 ?class
? MACアドレスとIPアドレスがある
? pgen::macaddress クラス
? pgen::ipv4addressクラス
? pgen::ipv6addressクラス
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 27
IO	
 ?Controller
o データの入出力を管理するクラス
? ネットワークインターフェース
? pcapファイル
? pcapNgファイル
o 既存のstreamクラスと使い方は全く一緒
o 以下以外の方法もあります
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 28
実装について
o 初めてC++での開発っぽいものをしたので
僕にはかなりむずかしいです (もやし)
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 29
ユーザのミスを知らせる
o 標準ではおかしいパケットを作成できないように
ユーザをある程度束縛
o プロトコルごとで依存しあう要素などがけっこうある
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 30
ユーザのミスを知らせる
o lengthに問題がある場合
? こんな感じに依存しあう値があると…
o 実装は…
? 高レイヤのフィールドから設定させる
(カプセル化の基本)
? パケット通信の基本どうりに作るぜ
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 31
E
T
H
I
P
U
D
P
D
a
t
a
データ長
UDP	
 ?length
IP	
 ?total	
 ?length
パケット長
拡張しやすい設計の可能性
o 新規プロトコルへの拡張を簡単に出来るようにしました
o プロトコルの拡張方法
? 新たなパケットクラスを実装するだけ
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 32
新規プロトコルに拡張するには
o パケットに関するクラスのナカミ (一部)
o pgen::packetクラスを継承するだけ
o pgen::packetクラスの仮装関数を実装するだけ
? compile()	
 ?	
 ?パケットのバイナリを生成
? analyze() バイナリをパケットとして解析
? summary()	
 ?情報出力
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 33
本当の
やるだけ
pgen::packetクラスのヘッダ
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 34
Agenda
o パケット解析の現状
? パケット解析の定石
? パケット解析はもっとこうあるべき
o LibPGENの紹介
o LibPGENの設計
o LibPGENの使用例
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 35
使用例の紹介
o 時間に応じて変更します
1. Pingプログラム
2. 鮫ができないFollow	
 ?ICMP	
 ?Stream
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 36
Pingコマンドの作成
o とてもシンプルなpingコマンドの作成
o ICMPパケットを送って受け取り次第表示して、次にすすむ
だけ
oEthernetヘッダとかの設定は詳しくはしない。
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 37
Pingコマンドの作成
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 38
Pingコマンドの作成
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 39
鮫ができないFollow	
 ?ICMP	
 ?Stream
o 現実的なメリットとかは気にせず Let’s	
 ?パケット解析
o WiresharkのFollow	
 ?TCP	
 ?Streamは最高にクール
でもFollow	
 ?ICMP	
 ?Streamはない (ある必要は別に…)
o パケット解析の遊びです
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 40
鮫ができないFollow	
 ?ICMP	
 ?Stream
o 問題
? icmpパケットに対して画像データを分割してデータ部に
くっつけられたパケットが与えられる
? そこから元の画像にもどす
? パケットは以下を使います
https://www.cloudshark.org/captures/97e668880ded
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 41
鮫ができないFollow	
 ?ICMP	
 ?Stream
o このような通信のパケットを解析して、元の画像を整形
o 実用性。。。 ないです。
o 解析の遊びとしてはおもしろい
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 42
ETH IP ICMP 分割された画像データ
鮫ができないFollow	
 ?ICMP	
 ?Stream
o 作成するプログラムはこんな感じ
1. パケットを受信
2. 受信したパケットがICMP	
 ?Echo	
 ?Requestならそのデータ部分を
ファイルに出力
o これだけ、だけど何もないところからやると少しだけ大変
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 43
鮫ができないFollow	
 ?ICMP	
 ?Stream
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 44
鮫ができないFollow	
 ?ICMP	
 ?Stream
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 45
これじゃ何も
わかんないから
鮫ができないFollow	
 ?ICMP	
 ?Stream
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 46
こうして…
こうじゃ!!
やったぜ
もしLibPGENを使わないと
o まずデータの入出力のインターフェースを用意しないとい
けない。
o パケット一つ一つをその場で解析するスクリプトをいちい
ち作成するのに時間がかかる。
o アイディアが浮かんでからすぐに実装できない
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 47
こんな人におすすめ
o パケットをつかって遊びたい人(僕)
o ネットワークの勉強中の人
o 既知の攻撃方法などのテストやファジングなど
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 48
More	
 ?Information
oライブラリの紹介サイト
http://libpgen.org
o OSPN	
 ?Press	
 ?に掲載していただきました。 (version1が)
http://www.ospn.jp/press/20160209no44-?‐useit-?‐oss.html
o僕のブログでも情報公開します
http://blog.slankdev.net
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 49
最後に
o パケットで遊ぼう
o Thanks	
 ?
my	
 ?packet	
 ?and	
 ?friends
Feb	
 ?26	
 ?2016 OSC	
 ?2016	
 ?Tokyo/Spring 50
命
よ
り
重
い
!
パ
ケ
ッ
ト
は

More Related Content

OSC2016 Tokyo/Spring セミナー資料