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