KEMBAR78
OSC2016 Tokyo/Spring セミナー資料 | PDF
パケット解析
ライブラリの開発
セキュリティ・キャンプ卒業生 活動報告
すらんく (@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
命
よ
り
重
い
!
パ
ケ
ッ
ト
は

OSC2016 Tokyo/Spring セミナー資料