
Pig(Packet intruder generator の略)は、Linux パケットクラフティングツールです。
Pig を使用して、IDS/IPS などをテストできます。
Pig は、すぐに使用できる既知の攻撃シグネチャを多数提供しており、要件に応じてより具体的なものを追加してコレクションを拡張できます。
現時点では、TCP、UDP、ICMP に基づくトランスポート層を持つ IPv4 シグネチャを作成できます。
また、Ethernet フレームからパケットを構築するだけでなく、ARP プロトコルに基づくシグネチャも作成できます。
もし私の SPRING 2016 号の 2600 記事からここにたどり着いたなら、この小さな Pig はその後も進化し続けているので、以下のドキュメントセクションを読み進めてください。
とても簡単です:
[email protected]:~/src# git clone https://github.com/rafael-santiago/pig pig
[email protected]:~/src# cd pig
[email protected]:~/src/pig# git submodule update --init
pig をビルドするには、Hefesto を使用する必要があります。Hefesto をシステム上で動作させる手順を実行した後、pig の src というサブディレクトリに移動し、次のコマンドを実行します:
[email protected]:~/src/pig/src# hefesto
このコマンドの後、src/bin パスに pig バイナリが見つかるはずです。バイナリは src/bin から相対的に使用するか、インストールすることができます。
何らかの理由でビルドに問題がある場合は、BUILD.md にある注意事項を読んでみてください。
インストールするには、src サブディレクトリ内で次のコマンドを実行します:
[email protected]:~/src/pig/src# hefesto --install
アンインストールするには、src サブディレクトリ内で次のコマンドを実行します:
[email protected]:~/src/pig/src# hefesto --uninstall
Pigsty ファイル は、一連のパケットシグネチャを定義するプレーンテキストファイルです。従うべき特定の構文があります。pigsty ファイルの例を見てみましょう:
[ signature = "Hello",
ip.version = 4,
ip.ihl = 5,
ip.tos = 0,
ip.src = 192.30.70.10,
ip.dst = 192.30.70.3,
ip.protocol = 17,
udp.dst = 1008,
udp.src = 32000,
udp.payload = "Hello!!" ]
基本的に、すべてのシグネチャデータは角括弧 [ ... ] で囲む必要があります。
この領域内では、情報は field = data の形式で指定します。
コンピュータネットワークの経験があれば、表1 にリストされているフィールドの大部分が強い意味を持つことは間違いありません。これらのフィールドを使用して、さらにシグネチャを作成する必要があります。
表1: pig シグネチャフィールド。
| フィールド | 意味 | プロトコル | データ型 | 定義例 |
|---|---|---|---|---|
signature | シグネチャ名 | - | 文字列 | signature = "Udp flood" |
eth.hwdst | Ethernet 宛先MAC | Ethernet | MAC | eth.hwdst = "00:de:ad:be:ef:00" |
eth.hwsrc | Ethernet 送信元MAC | Ethernet | MAC | eth.hwsrc = "00:de:ad:be:ef:00" |
eth.type | Ether タイプ | Ethernet | 数値 | eth.type = 0x0800 |
eth.payload | Ethernet ペイロード | Ethernet | 文字列 | eth.payload = "f\x00ob\x04r" |
ip.version | IP バージョン | IP | 数値 | ip.version = 4 |
ip.ihl | インターネットヘッダ長 | IP | 数値 | ip.ihl = 5 |
ip.tos | サービス種別 | IP | 数値 | ip.tos = 0 |
ip.tlen | 総長 | IP | 数値 | ip.tlen = 20 |
ip.id | パケットID | IP | 数値 | ip.id = 0xbeef |
ip.flags | IP フラグ | IP | 数値 | ip.flags = 4 |
ip.offset | フラグメントオフセット | IP | 数値 | ip.offset = 0 |
ip.ttl | 生存時間 (TTL) | IP | 数値 | ip.ttl = 64 |
ip.protocol | プロトコル | IP | 数値 | ip.protocol = 6 |
ip.checksum | チェックサム | IP | 数値 | ip.checksum = 0 |
ip.src | 送信元アドレス | IP | IPアドレス | ip.src = 192.30.70.3 |
ip.dst | 宛先アドレス | IP | IPアドレス | ip.dst = 192.30.70.3 |
ip.payload | IP 生ペイロード | IP | 文字列 | ip.payload = "\x01\x02" |
tcp.src | 送信元ポート | TCP | 数値 | tcp.src = 80 |
tcp.dst | 宛先ポート | TCP | 数値 | tcp.dst = 21 |
tcp.seqno | シーケンス番号 | TCP | 数値 | tcp.seqno = 10202 |
tcp.ackno | 確認応答番号 | TCP | 数値 | tcp.ackno = 10200 |
tcp.size | TCP 長 | TCP | 数値 | tcp.size = 4 |
tcp.reserv | TCP 予約フィールド | TCP | 数値 | tcp.reserv = 0 |
tcp.urg | TCP URG フラグ | TCP | ビット | tcp.urg = 0 |
tcp.ack | TCP ACK フラグ | TCP | ビット | tcp.ack = 1 |
tcp.psh | TCP PSH フラグ | TCP | ビット | tcp.psh = 0 |
tcp.rst | TCP RST フラグ | TCP | ビット | tcp.rst = 0 |
tcp.syn | TCP SYN フラグ | TCP | ビット | tcp.syn = 0 |
tcp.fin | TCP FIN フラグ | TCP | ビット | tcp.fin = 0 |
tcp.wsize | TCP ウィンドウサイズ | TCP | 数値 | tcp.wsize = 0 |
tcp.checksum | チェックサム | TCP | 数値 | tcp.checksum = 0 |
tcp.urgp | 緊急ポインタ | TCP | 数値 | tcp.urgp = 0 |
tcp.payload | ペイロード | TCP | 文字列 | tcp.payload = "\x01abc" |
udp.src | 送信元ポート | UDP | 数値 | udp.src = 53 |
udp.dst | 宛先ポート | UDP | 数値 | udp.dst = 7 |
udp.size | UDP 長 | UDP | 数値 | udp.size = 8 |
udp.checksum | チェックサム | UDP | 数値 | udp.checksum = 0 |
udp.payload | ペイロード | UDP | 数値 | udp.payload = "boo!" |
icmp.type | ICMP タイプ | ICMP | 数値 | icmp.type = 0 |
icmp.code | ICMP コード | ICMP | 数値 | icmp.code = 0 |
icmp.checksum | チェックサム | ICMP | 数値 | icmp.checksum = 0 |
icmp.payload | ペイロード | ICMP | 文字列 | icmp.payload = "ping!" |
arp.hwtype | ARP ハードウェアタイプ | ARP | 数値 | arp.hwtype = 0x1 |
arp.ptype | ARP プロトコルタイプ | ARP | 数値 | arp.ptype = 0x0800 |
arp.hwlen | ARP ハードウェア長 | ARP | 数値 | arp.hwlen = 6 |
arp.opcode | ARP オペレーションコード | ARP | 数値 | arp.opcode = 2 |
arp.hwsrc | ARP 送信元ハードウェアアドレス | ARP | MAC | arp.hwsrc = "de:ad:be:ef:0:0" |
arp.psrc | ARP 送信元プロトコルアドレス | ARP | IPアドレス | arp.psrc = 192.30.70.3 |
arp.hwdst | ARP 宛先ハードウェアアドレス | ARP | MAC | arp.hwdst = "de:ad:be:ef:0:0" |
arp.pdst | ARP 宛先プロトコルアドレス | ARP | IPアドレス | arp.pdst = 192.30.70.3 |
シグネチャを作成する際、すべてのデータを指定する必要はありません。パケットの最も関連する部分のみを指定すると、残りの部分はデフォルト値で埋められます。チェックサム は 常に 再計算されます。
ヒント: pigsty サブディレクトリを見てください。多くのシグネチャファイルが見つかり、新しいものを定義するのが非常に簡単であることがわかります。
はい、可能です。この機能を使用するには、ip address タイプのフィールドに 表2 にリストされている値を指定するだけです。
表2: 地理的領域別IP。