libpgen 1st step guide

41
LibPGEN version 1.0 1 st ステップガイド Slank [@slankdev, http://slankdev.net] libpgen.org 1

Upload: slankdev

Post on 16-Apr-2017

501 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: LibPGEN 1st Step Guide

LibPGEN  version  1.01stステップガイドSlank    [@slankdev,   http://slankdev.net]

libpgen.org 1

Page 2: LibPGEN 1st Step Guide

Who  is  Slank  ?oパケットが好きな大学生oLibPGEN開発者oIPA  Security  Camp  2015  卒業生o学生の間はパケット屋さんになりたいです。

libpgen.org 2

Page 3: LibPGEN 1st Step Guide

What  Is  LibPGEN  ?◦ http://libpgen.org◦パケット解析を簡単に行うためのライブラリ◦ C++で開発している◦ Linux,  BSDで動作します(もちろんOSXも)◦ネットワークインターフェースを使わないならwindowsでも動くはず。。(まだ試していない)◦プロトコル対応数はまだ少ない◦その代わりに拡張しやすい設計を

libpgen.org 3

Page 4: LibPGEN 1st Step Guide

Agenda1. LibPGENの使用例2. 設計について3. LibPGENの機能紹介

libpgen.org 4

Page 5: LibPGEN 1st Step Guide

libpgen.org 5

Page 6: LibPGEN 1st Step Guide

Sample  Codes  with  LibPGEN◦詳細な使用方法を説明する前に簡単なサンプルコードで感じ取ってください。。。

libpgen.org 6

Page 7: LibPGEN 1st Step Guide

Easy  Packet  Capture◦簡単なパケットキャプチャプログラム◦ネットワークインターフェースから受信したパケットを簡単にLibPGENで解析します◦プログラムの流れ1. パケットを受信待機2. 受信したら情報表示

libpgen.org 7

Page 8: LibPGEN 1st Step Guide

Sample  Code

libpgen.org 8

Page 9: LibPGEN 1st Step Guide

Execution  Result

libpgen.org 9

Page 10: LibPGEN 1st Step Guide

ARP  Scan  Program◦ ARPパケットを送ってIPアドレスからMACアドレスを調べるプログラム

◦プログラムの流れ1. ARPパケット作成、送信2. パケット受信待機3. 送信先からのARPパケットならそのパケットを表示

libpgen.org 10

Page 11: LibPGEN 1st Step Guide

Sample  Code

libpgen.org 11

Page 12: LibPGEN 1st Step Guide

Execution  Result

libpgen.org 12

Page 13: LibPGEN 1st Step Guide

Could  You  Feel  ?◦なんとなくわかってもらえればとても幸せです。◦ここからは詳しくLibPGENの構造と使いかたを説明していきます。

libpgen.org 13

Page 14: LibPGEN 1st Step Guide

libpgen.org 14

Page 15: LibPGEN 1st Step Guide

LibPGENのアーキテクチャ

libpgen.org 15

Page 16: LibPGEN 1st Step Guide

3  Big  Components◦ LibPGENは大きく3つに分けられる。◦ PGEN-­‐IO   入出力関数群

◦ PGEN-­‐Core アドレスやパケットのバイナリを解析

◦ PGEN-­‐Module PGEN-­‐IO,PGEN-­‐Coreを使ったモジュール群

libpgen.org 16

Page 17: LibPGEN 1st Step Guide

PGEN-­‐IO◦バイナリの入出力用の関数群◦入出力先はネットワークインターフェース、pcapファイルに対応しています。(NGは現在実装中)◦ライブラリのコアの開発に参加しない場合はほとんど意識しなくて構わないので、詳しい説明は公式ドキュメントを参考にしてください

◦ http://libpgen.org/documentation/pgen-­‐io◦よく使う関数だけ紹介します

libpgen.org 17

Page 18: LibPGEN 1st Step Guide

pgen_open()   in  PGEN-­‐IO◦ pgen_t*  pgen_open(const  char*  if,  void*  nouse)◦ネットワークインターフェースを指定してパケットの送受信用のディスクリプタを確保

◦第二引数は予約用でまだ使わない◦成功すると、ディスクリプタのポインタ、失敗するとNULLを返す

libpgen.org 18

Page 19: LibPGEN 1st Step Guide

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

pgen_close()   in  PGEN-­‐IO◦ void  pgen_close(pgen_t*  handle)◦確保したディスクリプタを開放する。◦マナーとして

libpgen.org 20

Page 21: LibPGEN 1st Step Guide

pgen_perror()   in  PGEN-­‐IO◦ void  pgen_perror(const  char*  msg)◦標準ライブラリ関数のperror関数のLibPGEN版◦内部でエラー番号を持っているので、それを利用して情報出力する。

libpgen.org 21

Page 22: LibPGEN 1st Step Guide

That’s  a  PGEN-­‐IO◦こんな感じの基本関数から、細かいとこまで手を伸ばす関数までいろいろあります。

◦さらに詳しい情報は公式ドキュメント◦ http://libpgen.org/documentation/pgen-­‐io/

libpgen.org 22

Page 23: LibPGEN 1st Step Guide

PGEN-­‐Core◦最も重要で機能豊富なコンポーネント◦パケット解析を担当◦ PGEN-­‐PacketとPGEN-­‐Addressの二つを子に持つコンポーネント

◦さらに詳しい情報は公式ドキュメントを参照◦ http://libpgen.org/documentation/pgen-­‐core/

libpgen.org 23

Page 24: LibPGEN 1st Step Guide

PGEN-­‐Address   in  PGEN-­‐Core◦アドレス操作を簡単に行えるようにするクラス群◦以降のPGEN-­‐Packetでさんざん出てくるので、ここでの説明は省略します

◦簡単に説明すると、アドレス操作をNULLポインタ文字列で操作できるようにしました。

libpgen.org 24

Page 25: LibPGEN 1st Step Guide

PGEN-­‐Packet   in  PGEN-­‐Core◦パケット解析を行うLibPGENの核◦プロトコルごとに様々なクラスがたくさんある◦標準でサポートしているのはEthernet,  ARP,  IP,  ICMP,  TCP,  UDP(2015/12/07現在)

libpgen.org 25

Page 26: LibPGEN 1st Step Guide

PGEN-­‐Packet   in  PEGN-­‐Core

libpgen.org 26

◦クラスの継承関係は以下のようになっている。

Page 27: LibPGEN 1st Step Guide

PGEN-­‐Packet   in  PGEN-­‐Core◦それぞれのクラスは親クラスのメンバも保持する◦ ex)  pgen_ipクラスは

pgen_packet,  pgen_ethのメンバも保持する

libpgen.org 27

Page 28: LibPGEN 1st Step Guide

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

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

cast()  in  PGEN-­‐Packet◦ void  cast(const  void*  buf,  int buflen)◦ バイナリを解析してメンバ変数に格納する◦ buf,  buflenにはバイナリの先頭ポインタ、バイナリ長を指定する。

libpgen.org 30

Page 31: LibPGEN 1st Step Guide

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

Protocols  of  PGEN-­‐Packet◦ PGEN-­‐Packetは標準でEthernet,  ARP,  IP,  ICMP,  TCP,  UDPをサポート◦プロトコルごとのクラスの簡単な使い方は後述

libpgen.org 32

Page 33: LibPGEN 1st Step Guide

PGEN-­‐Module◦ PGEN-­‐IO,  PGEN-­‐Coreを使って作られたモジュール群

◦現在安定版なのはsniff()のみ◦ sniff()はパケット受信で使用

libpgen.org 33

Page 34: LibPGEN 1st Step Guide

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

libpgen.org 35

Page 36: LibPGEN 1st Step Guide

For  Analyze  Protocols◦先ほど飛ばした PGEN-­‐Packetの派生クラスについて説明します

◦作者お気に入りのプロトコルのクラスをいくつか紹介します

libpgen.org 36

Page 37: LibPGEN 1st Step Guide

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

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

That’s  a  PGEN-­‐Packet◦このようにして、プロトコルごとのパケットを詳しく簡単に解析します。

◦他のプロトコルに関する情報は公式ドキュメントを参照してください。

◦ http://libpgen.org/pgen-­‐core/packet-­‐class

libpgen.org 39

Page 40: LibPGEN 1st Step Guide

How  Do  You  Think  ?◦これで基本的な使用方法は説明しました。◦ LibPGENの構造、使い方の基本は以上です◦ぜひ使って文句をたくさん◦これで楽しくパケット解析をするだけ……

libpgen.org 40

Page 41: LibPGEN 1st Step Guide

What  is  Next…◦今回はLibPGENの簡単な使い方を紹介しました。◦次回はLibPGENの「拡張しやすい設計」について紹介します

◦ライブラリの詳しい情報はhttp://libpgen.orgを参照してください

libpgen.org 41