ipcat (ip packet generator/sniffer)

Version: 20030601

Author: Masaru Matsunami (mat@abelia.ocn.ne.jp)

penetration technique research site

(http://www.geocities.co.jp/SiliconValley/1667/index.htm)

1. ipcatとは

ipcatはipパケットのジェネレータとスニファをあわせたツールです。あの有名なツールNetcatのipパケット版のようなものです。PerlやRubyなどのスクリプト言語でipcatを利用すると、ipパケットレベルでさまざまなネットワークアプリケーションを作成することができます。

2. 主な機能

主な機能は次のようなものです。

3. 確認済み動作環境

Linuxカーネル2.4以降でPF_PACKETを利用できるものに限ります。以下のLinux環境で動作確認しています。

4. インストール

ipcat.20030601.tar.gzをダウンロードして次のように展開、コンパイル、インストールしてください。

# tar xzf ipcat.20030601.tar.gz    ←ファイル展開
# cd ipcat.20030601                ←展開したディレクトリへ入る
# make                             ←コンパイル
# make install                     ←/usr/local/binにipcatをコピー

5. 使用方法

ipcatを使用するにはroot権限が必要となります。ipcat -hで簡単なヘルプを見ることが出来ます。ipcatはさまざまなオプションがありますが引数は1つ、ネットワークカードを指定するインタフェース名のみです。

# ipcat -h
ipcat Ver. 20030601 --- Copyright (c) 2002-2003 Masaru Matsunami.
                        All rights reserved.
Usage: ipcat [options] <interface>
  <interface> must be an interface name like 'eth0'
  <options> are follows
  -p : ipcat makes the interface promiscuous mode
  -t : ipcat stops when the stdin is closed
  -I : ipcat recalculates the IP checksum
  -T : ipcat recalculates the TCP checksum
  -U : ipcat recalculates the UDP checksum
  -C : ipcat recalculates the ICMP checksum
  -h : ipcat shows this help and stops
  -c <number> : ipcat stops when it receives <number> packets
  -g <gateway>/<netmask> : ipcat uses default gateway and netmask
     <gateway>/<netmask> must be dotted IP address notation with mask,
     like 192.168.0.254/24
  -a <ipaddr> : ipcat does Proxy ARP for the IP address
  * multiple -a allows ipcat to do Proxy ARP for multiple IPs.

とりあえずオプションの細かい説明は後回しにして、パケットの受信をやってみましょう。ipcat -p eth0を実行してみましょう。

# ipcat -p eth0
4500003c20cc0000800197dcc0a80 ... 96a6b6c6d6e6f7071727374757677616263646566676869
4500003c5f53000040019955c0a80 ... 96a6b6c6d6e6f7071727374757677616263646566676869
4500003c20ce0000800197dac0a80 ... 96a6b6c6d6e6f7071727374757677616263646566676869

-pオプションはプロミスキャスモードオプションです。インタフェースeth0をプロミスキャスモードにして受信します。出力される16進数はIPパケットの中身をそのままダンプしたものです。1行が1パケットに相当します。

出力される16進数を↓のIPヘッダフォーマットと比較してみてください。16進数の表記がそのままIPパケットのフォーマットどおりになるはずです。

    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | Ver=4 |  IHL  |Type of Service|          Total Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Identification         | Flg |     Fragment Offset     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Time      |    Protocol   |        Header Checksum        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         source address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      destination address                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   /                                                               /
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

このように受信パケットはリアルタイムに標準出力へ16進数形式で出力されます。1パケットは1行の16進数形式で表現されます。1行の最後は改行コードで終わります。

次にIPパケットを送信してみましょう。先ほど受信した16進数形式の1行をコピーしておいて、ipcatの標準入力に与えてみてください。改行を入力したところでIPパケットがインタフェースeth0から送信されます。そうそう、送信されているかどうかはEtherealなどのネットワークスニファツールで確認してくださいね。

さて簡単ではありますがipcatの基本を押さえることができました。標準入力から与えた16進数はそのままIPパケットとなってネットワークへ送信されます。ネットワークから受信したIPパケットは標準出力へ16進数形式で出力されます。

ipcatから16進数文字列を読み込み、それを加工・変換するなどして生成した16進数文字列を再びipcatへ出力する、といったプログラムを作ることでいろんなネットワークアプリケーションを作成可能です。たとえばNATルータもどきなんてのも作れるでしょう。あとは工夫と根性次第です。

ipcatを終了するためにはCTRL+Cを押してください。

6. オプション

-p
ネットワークインタフェースをプロミスキャスモードに設定します。受信のみに意味があるオプションで送信には一切影響がありません。
-t
標準入力がクローズされたときにipcatを終了します。この指定がなければipcatは標準入力がクローズされても実行しつづけます。Perlなどのスクリプト言語から外部コマンドとしてipcatを利用する際に、このオプションがよく使われます。スクリプト言語はipcatとの通信用パイプをクローズすることで、ipcatを終了させることができます。
-I
IPチェックサムを再計算し正しいIPチェックサム値を送信パケットに上書きします。パケット送信にのみ意味があるオプションです。Perlなどで送信用IPパケットの16進数を生成するときに、IPチェックサムの計算をipcatに任せることができます。Perlなどのスクリプトが簡単になるだけでなく、計算コストの削減に効果があります。
-T
TCPチェックサムを再計算し正しいTCPチェックサム値を送信パケットに上書きします。送信TCPパケットのみに意味のあるオプションです。
-U
UDPチェックサムを再計算し正しいUDPチェックサム値を送信パケットに上書きします。送信UDPパケット送信にのみ意味があるオプションです。
-C
ICMPチェックサムを再計算し正しいICMPチェックサム値を送信パケットに上書きします。送信ICMPパケット送信にのみ意味があるオプションです。
-h
簡単なヘルプメッセージを表示します。
-c <number>
指定個数分だけIPパケットを受信したときにipcatを終了します。1個だけ受信したい場合によく使います。
-g <gateway>/<netmask>
-g 192.168.0.254/24のようにデフォルトゲートウェイのIPアドレスとネットマスクのビット数を指定します。この指定によりipcatはローカルセグメントのIPレンジを知ることができ、あて先がローカルセグメント外のIPパケットをgateway(ルータ)へ送信します。ルータ越えが必要な場合にこのオプションを使用してください。
-a <ipaddr>
ProxyArpの指定をします。ここで指定するIPアドレス宛のArpRequestを受信するとipcatは自らのMACアドレスを含んだArpReplyで返答します。これはipcat自身にIPアドレスを割り当てることを意味します。-aオプションを複数回指定すると、複数のIPアドレスに対してProxyArpを行います。ipcatで送信したパケットに対する応答パケットを受信するためには、送信パケットのソースIPアドレスが-aで指定してある必要があります。

7. ちょっと詳しいこと

ipcatはRaw IPを使っていません。Raw IPより下層に位置するPF_PACKETを使用してパケットの送受信を実装しています。次のような特徴があります。

iptablesやipchainsの影響をまったく受けません。
iptablesやipchainsで送受パケットのアクセス制御を行ってもすべてバイパスしてしまいます。
ifconfigのIPアドレスとは無関係です。
ipcatはifconfigでIPアドレスが割り当てられていないネットワークインタフェースでも動作します。-aオプションを複数指定することで、ipcatはいくらでも自身のIPアドレスを持つことができます。
送信パケットのMACアドレス決定ルールはちょっと複雑です。
基本的に送信パケットの送信元IPアドレス、宛先IPアドレスをそれぞれARPで解決したMACアドレスを使用します。送信元IPもARP解決するので、応答パケットがipcatに戻ってこないこともあります。ただし-aで指定しているIPアドレスについては自身のネットワークインタフェースのMACを使用しますので、応答パケットを受信したければ-aオプションで自分用のIPアドレスを指定し、このIPアドレスを送信IPパケットの送信元IPアドレスとしてください。実際にはまだMACについての細かい仕様(ブロードキャスト、マルチキャスト)がありますが、ここでは割愛します。

一般的な使い方は↓のような感じです。

ipcat -p -I -T -U -C -g 192.168.0.254/24 -a 192.168.0.10 -a 192.168.0.20 eth0  

プロミスキャスモードで受信。IPチェックサム、TCPチェックサム、UDPチェックサム、ICMPチェックサムの自動補正機能付き。デフォルトゲートウェイは192.168.0.254、ネットマスクは24ビット(255.255.255.0)。ipcatに割り当てるIPアドレスは192.168.0.10と192.168.0.20の2つ。使用するネットワークインタフェースはeth0。

あとはipcatの標準入力と標準出力をPerlなどのスクリプトで扱う、といった感じです。16進数文字列なのでPerlの文字列処理機能を駆使することで、入力パケットを加工して出力する、といったことができます。また2つのネットワークインタフェースのそれぞれにipcatを実行させてスクリプトで両者の入出力を加工しながら繋ぐ、といったことでルータもどきも作れます。

8. 著作権その他

ipcatはフリーソフトです。作者は一切の責任を負いません。ご自分の責任の下に私用、商用に限らずご使用いただけます。ただしipcatを使うネットワークの管理者の許可なくしてipcatを使用することは禁止いたします。

ipcatはIPパケットアプリケーションのプロトタイピングツールです。またネットワークセキュリティ監査の基礎ツールとしても使えます。決して不正アクセスのために使用しないでください。

ipcatの著作権は Masaru Matsunami が保有しています。またipcatマスコットキャラクタの著作権は Shiho Matsunami が保有しています。

ipcat --- Copyright (c) 2002-2003 Masaru Matsunami. All rights reserved.
ipcat mascot --- Copyright (c) 2003 Shiho Matsunami. All rights reserved.