libpgen 1st step guide
TRANSCRIPT
![Page 1: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/1.jpg)
LibPGEN version 1.01stステップガイドSlank [@slankdev, http://slankdev.net]
libpgen.org 1
![Page 2: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/2.jpg)
Who is Slank ?oパケットが好きな大学生oLibPGEN開発者oIPA Security Camp 2015 卒業生o学生の間はパケット屋さんになりたいです。
libpgen.org 2
![Page 3: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/3.jpg)
What Is LibPGEN ?◦ http://libpgen.org◦パケット解析を簡単に行うためのライブラリ◦ C++で開発している◦ Linux, BSDで動作します(もちろんOSXも)◦ネットワークインターフェースを使わないならwindowsでも動くはず。。(まだ試していない)◦プロトコル対応数はまだ少ない◦その代わりに拡張しやすい設計を
libpgen.org 3
![Page 4: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/4.jpg)
Agenda1. LibPGENの使用例2. 設計について3. LibPGENの機能紹介
libpgen.org 4
![Page 5: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/5.jpg)
libpgen.org 5
![Page 6: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/6.jpg)
Sample Codes with LibPGEN◦詳細な使用方法を説明する前に簡単なサンプルコードで感じ取ってください。。。
libpgen.org 6
![Page 7: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/7.jpg)
Easy Packet Capture◦簡単なパケットキャプチャプログラム◦ネットワークインターフェースから受信したパケットを簡単にLibPGENで解析します◦プログラムの流れ1. パケットを受信待機2. 受信したら情報表示
libpgen.org 7
![Page 8: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/8.jpg)
Sample Code
libpgen.org 8
![Page 9: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/9.jpg)
Execution Result
libpgen.org 9
![Page 10: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/10.jpg)
ARP Scan Program◦ ARPパケットを送ってIPアドレスからMACアドレスを調べるプログラム
◦プログラムの流れ1. ARPパケット作成、送信2. パケット受信待機3. 送信先からのARPパケットならそのパケットを表示
libpgen.org 10
![Page 11: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/11.jpg)
Sample Code
libpgen.org 11
![Page 12: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/12.jpg)
Execution Result
libpgen.org 12
![Page 13: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/13.jpg)
Could You Feel ?◦なんとなくわかってもらえればとても幸せです。◦ここからは詳しくLibPGENの構造と使いかたを説明していきます。
libpgen.org 13
![Page 14: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/14.jpg)
libpgen.org 14
![Page 15: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/15.jpg)
LibPGENのアーキテクチャ
libpgen.org 15
![Page 16: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/16.jpg)
3 Big Components◦ LibPGENは大きく3つに分けられる。◦ PGEN-‐IO 入出力関数群
◦ PGEN-‐Core アドレスやパケットのバイナリを解析
◦ PGEN-‐Module PGEN-‐IO,PGEN-‐Coreを使ったモジュール群
libpgen.org 16
![Page 17: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/17.jpg)
PGEN-‐IO◦バイナリの入出力用の関数群◦入出力先はネットワークインターフェース、pcapファイルに対応しています。(NGは現在実装中)◦ライブラリのコアの開発に参加しない場合はほとんど意識しなくて構わないので、詳しい説明は公式ドキュメントを参考にしてください
◦ http://libpgen.org/documentation/pgen-‐io◦よく使う関数だけ紹介します
libpgen.org 17
![Page 18: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/18.jpg)
pgen_open() in PGEN-‐IO◦ pgen_t* pgen_open(const char* if, void* nouse)◦ネットワークインターフェースを指定してパケットの送受信用のディスクリプタを確保
◦第二引数は予約用でまだ使わない◦成功すると、ディスクリプタのポインタ、失敗するとNULLを返す
libpgen.org 18
![Page 19: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/19.jpg)
pgen_open_offline() in PGEN-‐IO◦ pgen_t* pgen_open_offline(
const char* f, int mode)◦ pgen_open()のpcapファイル版。◦ pcapファイルの読み書き用のディスクリプタを確保
◦第一引数にファイル名、第二引数にモードを指定する。
◦成功すればディスクリプタのポインタ、失敗すれはNULLを返す
libpgen.org 19
![Page 20: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/20.jpg)
pgen_close() in PGEN-‐IO◦ void pgen_close(pgen_t* handle)◦確保したディスクリプタを開放する。◦マナーとして
libpgen.org 20
![Page 21: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/21.jpg)
pgen_perror() in PGEN-‐IO◦ void pgen_perror(const char* msg)◦標準ライブラリ関数のperror関数のLibPGEN版◦内部でエラー番号を持っているので、それを利用して情報出力する。
libpgen.org 21
![Page 22: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/22.jpg)
That’s a PGEN-‐IO◦こんな感じの基本関数から、細かいとこまで手を伸ばす関数までいろいろあります。
◦さらに詳しい情報は公式ドキュメント◦ http://libpgen.org/documentation/pgen-‐io/
libpgen.org 22
![Page 23: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/23.jpg)
PGEN-‐Core◦最も重要で機能豊富なコンポーネント◦パケット解析を担当◦ PGEN-‐PacketとPGEN-‐Addressの二つを子に持つコンポーネント
◦さらに詳しい情報は公式ドキュメントを参照◦ http://libpgen.org/documentation/pgen-‐core/
libpgen.org 23
![Page 24: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/24.jpg)
PGEN-‐Address in PGEN-‐Core◦アドレス操作を簡単に行えるようにするクラス群◦以降のPGEN-‐Packetでさんざん出てくるので、ここでの説明は省略します
◦簡単に説明すると、アドレス操作をNULLポインタ文字列で操作できるようにしました。
libpgen.org 24
![Page 25: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/25.jpg)
PGEN-‐Packet in PGEN-‐Core◦パケット解析を行うLibPGENの核◦プロトコルごとに様々なクラスがたくさんある◦標準でサポートしているのはEthernet, ARP, IP, ICMP, TCP, UDP(2015/12/07現在)
libpgen.org 25
![Page 26: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/26.jpg)
PGEN-‐Packet in PEGN-‐Core
libpgen.org 26
◦クラスの継承関係は以下のようになっている。
![Page 27: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/27.jpg)
PGEN-‐Packet in PGEN-‐Core◦それぞれのクラスは親クラスのメンバも保持する◦ ex) pgen_ipクラスは
pgen_packet, pgen_ethのメンバも保持する
libpgen.org 27
![Page 28: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/28.jpg)
PGEN-‐Packet in PGEN-‐Core◦よく使うメンバ関数◦ send(pgen_t* handle) ,send_dev(const char* if) パケット送信
◦ cast(const void* buf, int buflen) バイナリ解析
◦ hex(), info(), summary(), help() 情報出力
◦ clear() 要素値リセット
◦たまに使うメンバ関数◦ byte() パケット先頭ポインタ
◦ length() パケット長
libpgen.org 28
![Page 29: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/29.jpg)
send(), send_dev() in PGEN-‐Packet◦ void send(pgen_t* handle)◦ PGENディスクリプタを指定してパケットを送信◦ 引数のディスクリプタはpgen_open()やpgen_open_offline()などで確保したものを指定する。
◦ void send(const char* if)◦ ネットワークインターフェースを指定してパケットを送信◦ 引数にはインターフェース名を指定(ex. “wlan0”など)
libpgen.org 29
![Page 30: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/30.jpg)
cast() in PGEN-‐Packet◦ void cast(const void* buf, int buflen)◦ バイナリを解析してメンバ変数に格納する◦ buf, buflenにはバイナリの先頭ポインタ、バイナリ長を指定する。
libpgen.org 30
![Page 31: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/31.jpg)
hex(), info(), summary(), help()in PGEN-‐Packet◦情報出力用関数◦ void hex()◦ パケットのhexdumpを出力
◦ void info()◦ 詳細情報を出力
◦ void summary()◦ 簡易情報を一行で出力
◦ void help()◦ メンバ変数の使い方を出力
libpgen.org 31
![Page 32: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/32.jpg)
Protocols of PGEN-‐Packet◦ PGEN-‐Packetは標準でEthernet, ARP, IP, ICMP, TCP, UDPをサポート◦プロトコルごとのクラスの簡単な使い方は後述
libpgen.org 32
![Page 33: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/33.jpg)
PGEN-‐Module◦ PGEN-‐IO, PGEN-‐Coreを使って作られたモジュール群
◦現在安定版なのはsniff()のみ◦ sniff()はパケット受信で使用
libpgen.org 33
![Page 34: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/34.jpg)
sniff() in PGEN-‐Module
◦ void sniff(pgen_t* handle, bool (*callback)(const u_char* buf, int buflen))◦ handleで指定されたインターフェースからパケットを一つ受信し、そのパケットを第二引数のcallback()に渡す。◦ callback()がtrueを返す間パケットを受信し続ける
libpgen.org 34
![Page 35: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/35.jpg)
libpgen.org 35
![Page 36: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/36.jpg)
For Analyze Protocols◦先ほど飛ばした PGEN-‐Packetの派生クラスについて説明します
◦作者お気に入りのプロトコルのクラスをいくつか紹介します
libpgen.org 36
![Page 37: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/37.jpg)
pgen_arp class◦お気に入りプロトコル◦メンバ変数◦ ETH.src◦ ETH.dst◦ ETH.type◦ ARP.operation◦ ARP.hwsrc◦ ARP.psrc◦ ARP.hwdst◦ ARP.pdst
libpgen.org 37
![Page 38: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/38.jpg)
pgen_tcp class◦ メンバ変数◦ ETH…(省略)◦ IP.hlen◦ IP.tos◦ IP.tot_len◦ IP.id◦ IP.frag_off◦ IP.ttl◦ IP.protocol◦ IP.src◦ IP.dst
libpgen.org 38
◦ TCP.src◦ TCP.dst◦ TCP.seq◦ TCP.ack◦ TCP.doff◦ TCP.flags.fin◦ TCP.flags.syn◦ TCP.flags.rst◦ TCP.flags.psh◦ TCP.fgags.ack◦ TCP.flags.urg◦ TCP.window
![Page 39: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/39.jpg)
That’s a PGEN-‐Packet◦このようにして、プロトコルごとのパケットを詳しく簡単に解析します。
◦他のプロトコルに関する情報は公式ドキュメントを参照してください。
◦ http://libpgen.org/pgen-‐core/packet-‐class
libpgen.org 39
![Page 40: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/40.jpg)
How Do You Think ?◦これで基本的な使用方法は説明しました。◦ LibPGENの構造、使い方の基本は以上です◦ぜひ使って文句をたくさん◦これで楽しくパケット解析をするだけ……
libpgen.org 40
![Page 41: LibPGEN 1st Step Guide](https://reader035.vdocuments.net/reader035/viewer/2022081521/587152371a28ab8e5b8b471d/html5/thumbnails/41.jpg)
What is Next…◦今回はLibPGENの簡単な使い方を紹介しました。◦次回はLibPGENの「拡張しやすい設計」について紹介します
◦ライブラリの詳しい情報はhttp://libpgen.orgを参照してください
libpgen.org 41