hping2 を使ってみる

Misc 階層に戻る  |  ホームに戻る

hping2 とは

hping2 は antirez@invece.org 氏によって開発されているIPパケット生成 ソフトウェアである。このソフトウェアの凄いところは、TCP、UDP、ICMP のパケットを自在に生成できることである。source address/port、 destination address/port、さらに TCP のフラグも指定することが出来るので、 ファイアウォールやパケットフィルタリングルータの検証試験に使用すると 便利である。

hping2 の入手とコンパイル/インストール

hping オフィシャルサイトから ソースアーカイブ をダウンロードして、コンパイルしてインストールする。以下に FreeBSD と Solaris の場合の例を示す。

このソフトウェアは libpcap を必要とするので、システムにこのライブラリを標準で持っていない場合は あらかじめインストールしておく必要がある。

FreeBSD の場合

システムに libpcap が含まれているので、あとはアーカイブを展開・configure ・make・make install するだけである。

# tar xzf hping2.0.0-rc1.tar.gz
# cd hping2
# ./configure
# make all
# make strip install

それすらも面倒臭いという場合は、 port を用意したので、こちらを利用してほしい。

Solaris の場合

開発環境を整えた上で、 まず libpcap をインストールしておく。

# gzip -cd libpcap-0.6.2.tar.gz | tar xf -
# cd libpcap-0.6.2
# gpatch -p1 < ../libpcap-0.6.2-sol.patch
# env CFLAGS=-O3 ./configure --prefix=/usr/local
# make
# make install

その上で、FreeBSD と同じように hping2 をインストールする。

# gzip -cd hping2.0.0-rc1.tar.gz | tar xf -
# cd hping2
# gpatch -p1 < ../hping2.0.0-rc1-sol.patch
# CC=gcc ./configure
# make all
# make strip install

使用方法

hping2 の利用には、一般に root 権限が必要である。

では、実際の使用例を見てみよう。 hping2 は、デフォルトでは TCP のパケットを投げる。 UDP にしたい場合は --udp (または -2) オプションをつける。 ICMP の場合は --icmp (または -1) を使う。

例1: IP アドレス 192.168.0.100、TCP 80 番宛てのパケットを 自分の IP アドレスの非特権ポートから投げる

# hping2 192.168.0.100 --destport 80
HPING 192.168.0.100 (fxp0 192.168.0.100): NO FLAGS are set, 40 headers + 0 data bytes
len=46 ip=192.168.0.100 flags=RA DF seq=0 ttl=32 id=930 win=256 rtt=14.3 ms
len=46 ip=192.168.0.100 flags=RA DF seq=1 ttl=32 id=931 win=256 rtt=6.5 ms
len=46 ip=192.168.0.100 flags=RA DF seq=2 ttl=32 id=932 win=256 rtt=5.1 ms
^C
--- 192.168.0.100 hping statistic ---
3 packets tramitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 5.1/8.7/14.3 ms

通常の ping と同じように、コマンドの停止には Ctrl-C キーを使う。 TCP モードの場合、デフォルトではフラグ無しのパケットを投げるので、 80番ポートの空いていない 192.168.0.100 のホストからは RST+ACK パケットが返ってきている (flags=RA は RST+ACK パケットを表す)。

例2: 自ホストの TCP 20 番ポートから、IP アドレス 192.168.0.15 の FTP サーバ の TCP 1024 番ポートへ ACK パケットを投げる

# hping2 192.168.0.15 -A --keep --baseport 20 --destport 1024
HPING 192.168.0.15 (fxp0 192.168.0.15): A set, 40 headers + 0 data bytes
len=46 ip=192.168.0.15 flags=R DF seq=0 ttl=64 id=15180 win=0 rtt=0.3 ms
DUP! len=46 ip=192.168.0.15 flags=R DF seq=0 ttl=64 id=15181 win=0 rtt=1004.8 ms
DUP! len=46 ip=192.168.0.15 flags=R DF seq=0 ttl=64 id=15182 win=0 rtt=2014.8 ms
DUP! len=46 ip=192.168.0.15 flags=R DF seq=0 ttl=64 id=15183 win=0 rtt=3024.8 ms
^C
--- 192.168.0.15 hping statistic ---
4 packets tramitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.3/1511.2/3024.8 ms

-A オプションは送出パケットに ACK フラグを立てる。 (--ack でもよい)。 SYN+ACK ならば -SA、 FIN+PSH+ACK なら -FPA などとする。

上の例では RST パケットが返ってきたため、 相手方のホストにパケットは到達しており、 かつポートが開いていないことがわかる。 途中でフィルタリングされて落ちている場合は、 何も返ってこないはずだからである (途中のファイアウォールで RST を返している可能性も考えられるが)。

--baseport オプションは source port を指定できるが、 これだけでは2つめ以降のパケットは source port をインクリメントしてしまう (この場合は 21 番、22 番、… となる) ため、 --keep オプションを付ける。 これで全てのパケットが 20 番ポートから出ていく。

実行結果の2行目以降に "DUP!" が付いているのは、 hping2 が毎回同じ TCP sequence number を使用するからである。 あまり気にする必要は無い。

例3: 自ホストの UDP 53 番ポートから、IP アドレス 172.16.10.10 の DNS サーバ の UDP 53 番ポートへパケットを投げる

# hping2 172.16.10.10 --udp --keep --baseport 53 --destport 53
HPING 172.16.10.10 (fxp0 172.16.10.10): udp mode set, 28 headers + 0 data bytes
^C
--- 172.16.10.10 hping statistic ---
3 packets tramitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

UDP の場合、結果を解釈するのは少々難しい。上の例の場合、 何のパケットも返ってきていないが、これが何を意味するかというと、

  1. 相手方ホストで 53 番のサービスを受け付けている
  2. 途中でフィルタリングされている

のいずれかである。一方、相手方でサービスを受け付けておらず、 しかも途中でフィルタリングがかかっていない場合、ICMP port unreachable が返ってくるはずである。

例4: Source IP アドレスを 10.11.10.10 と偽って 10.11.10.22 のホストへ TCP SYN パケットを投げてみる

# hping2 10.11.10.22 -S --spoof 10.11.10.10
HPING 10.11.10.22 (fxp0 10.11.10.22): S set, 40 headers + 0 data bytes
^C
--- 10.11.10.22 hping statistic ---
3 packets tramitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms

IP spoofing 攻撃の例。当然パケットは返ってこない。

ファイアウォールの外側からこの例を実行してみて、IP アドレス 10.11.10.22 の LAN 内ホストにパケットが到達しているようであれば (10.11.10.22 のホストでは、パケットをモニタできるよう tcpdump、ethereal 等を実行しておく)、 ファイアウォールの anti-spoofing ルールが正しく設定されていない。

Misc 階層に戻る  |  ホームに戻る

Copyright (C) 2001-2004
Last modified: Wed Aug 16 16:50:38 JST 2006
You are the 140003 th visitor.