hping2 は antirez@invece.org 氏によって開発されているIPパケット生成 ソフトウェアである。このソフトウェアの凄いところは、TCP、UDP、ICMP のパケットを自在に生成できることである。source address/port、 destination address/port、さらに TCP のフラグも指定することが出来るので、 ファイアウォールやパケットフィルタリングルータの検証試験に使用すると 便利である。
hping オフィシャルサイトから ソースアーカイブ をダウンロードして、コンパイルしてインストールする。以下に FreeBSD と Solaris の場合の例を示す。
このソフトウェアは libpcap を必要とするので、システムにこのライブラリを標準で持っていない場合は あらかじめインストールしておく必要がある。
システムに libpcap が含まれているので、あとはアーカイブを展開・configure ・make・make install するだけである。
# tar xzf hping2.0.0-rc1.tar.gz # cd hping2 # ./configure # make all # make strip install
それすらも面倒臭いという場合は、 port を用意したので、こちらを利用してほしい。
開発環境を整えた上で、 まず 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) を使う。
# 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 パケットを表す)。
# 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 を使用するからである。
あまり気にする必要は無い。
# 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 の場合、結果を解釈するのは少々難しい。上の例の場合、 何のパケットも返ってきていないが、これが何を意味するかというと、
のいずれかである。一方、相手方でサービスを受け付けておらず、 しかも途中でフィルタリングがかかっていない場合、ICMP port unreachable が返ってくるはずである。
# 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 ルールが正しく設定されていない。