Help us understand the problem. What is going on with this article?

hping3コマンドの使い方

More than 1 year has passed since last update.

0 はじめに

hping3は、任意のTCP/IPパケットを送信するツールです。

1 環境

  • VMware Workstation 12 Player上の仮想マシン
  • 仮想マシンは2台構成。ホスト名はそれぞれserver,clientです。
  • OSの版数は以下のとおり
[root@client ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@client ~]# uname -r
3.10.0-514.el7.x86_64

[root@client ~]# cat /etc/hosts
-中略-
192.168.0.10 server
192.168.0.20 client

2 事前準備

2.1 パッケージのインストール

hping3はepelリポジトリにあるので、epel-releaseパッケージを先にインストールする。
[root@client ~]# yum -y install epel-release
[root@client ~]# rpm -qa|grep epel-release
epel-release-7-9.noarch

hping3をインストールする。
[root@client ~]# yum -y install hping3
[root@client ~]# hping3 --version
hping version 3.0.0-alpha-1 ($Id: release.h,v 1.4 2004/04/09 23:38:56 antirez Exp $)
This binary is TCL scripting capable

ncコマンドをインストールする。
[root@server ~]# yum -y install nmap-ncat
[root@server ~]# nc --version
Ncat: Version 6.40 ( http://nmap.org/ncat )

2.2 firewalldの起動

server,clientともにfirewalldを起動した状態で確認をします。

[root@server ~]# systemctl start firewalld.service
[root@server ~]# systemctl is-active firewalld.service
active

[root@client ~]# systemctl start firewalld.service
[root@client ~]# systemctl is-active firewalld.service
active

3 オプション一覧

[root@client ~]# hping3 -h
usage: hping host [options]
  -h  --help      show this help
  -v  --version   show version
  -c  --count     packet count
  -i  --interval  wait (uX for X microseconds, for example -i u1000)
      --fast      alias for -i u10000 (10 packets for second)
      --faster    alias for -i u1000 (100 packets for second)
      --flood      sent packets as fast as possible. Don't show replies.
  -n  --numeric   numeric output
  -q  --quiet     quiet
  -I  --interface interface name (otherwise default routing interface)
  -V  --verbose   verbose mode
  -D  --debug     debugging info
  -z  --bind      bind ctrl+z to ttl           (default to dst port)
  -Z  --unbind    unbind ctrl+z
      --beep      beep for every matching packet received
Mode
  default mode     TCP
  -0  --rawip      RAW IP mode
  -1  --icmp       ICMP mode
  -2  --udp        UDP mode
  -8  --scan       SCAN mode.
                   Example: hping --scan 1-30,70-90 -S www.target.host
  -9  --listen     listen mode
IP
  -a  --spoof      spoof source address
  --rand-dest      random destionation address mode. see the man.
  --rand-source    random source address mode. see the man.
  -t  --ttl        ttl (default 64)
  -N  --id         id (default random)
  -W  --winid      use win* id byte ordering
  -r  --rel        relativize id field          (to estimate host traffic)
  -f  --frag       split packets in more frag.  (may pass weak acl)
  -x  --morefrag   set more fragments flag
  -y  --dontfrag   set dont fragment flag
  -g  --fragoff    set the fragment offset
  -m  --mtu        set virtual mtu, implies --frag if packet size > mtu
  -o  --tos        type of service (default 0x00), try --tos help
  -G  --rroute     includes RECORD_ROUTE option and display the route buffer
  --lsrr           loose source routing and record route
  --ssrr           strict source routing and record route
  -H  --ipproto    set the IP protocol field, only in RAW IP mode
ICMP
  -C  --icmptype   icmp type (default echo request)
  -K  --icmpcode   icmp code (default 0)
      --force-icmp send all icmp types (default send only supported types)
      --icmp-gw    set gateway address for ICMP redirect (default 0.0.0.0)
      --icmp-ts    Alias for --icmp --icmptype 13 (ICMP timestamp)
      --icmp-addr  Alias for --icmp --icmptype 17 (ICMP address subnet mask)
      --icmp-help  display help for others icmp options
UDP/TCP
  -s  --baseport   base source port             (default random)
  -p  --destport   [+][+]<port> destination port(default 0) ctrl+z inc/dec
  -k  --keep       keep still source port
  -w  --win        winsize (default 64)
  -O  --tcpoff     set fake tcp data offset     (instead of tcphdrlen / 4)
  -Q  --seqnum     shows only tcp sequence number
  -b  --badcksum   (try to) send packets with a bad IP checksum
                   many systems will fix the IP checksum sending the packet
                   so you'll get bad UDP/TCP checksum instead.
  -M  --setseq     set TCP sequence number
  -L  --setack     set TCP ack
  -F  --fin        set FIN flag
  -S  --syn        set SYN flag
  -R  --rst        set RST flag
  -P  --push       set PUSH flag
  -A  --ack        set ACK flag
  -U  --urg        set URG flag
  -X  --xmas       set X unused flag (0x40)
  -Y  --ymas       set Y unused flag (0x80)
  --tcpexitcode    use last tcp->th_flags as exit code
  --tcp-timestamp  enable the TCP timestamp option to guess the HZ/uptime
Common
  -d  --data       data size                    (default is 0)
  -E  --file       data from file
  -e  --sign       add 'signature'
  -j  --dump       dump packets in hex
  -J  --print      dump printable characters
  -B  --safe       enable 'safe' protocol
  -u  --end        tell you when --file reached EOF and prevent rewind
  -T  --traceroute traceroute mode              (implies --bind and --ttl 1)
  --tr-stop        Exit when receive the first not ICMP in traceroute mode
  --tr-keep-ttl    Keep the source TTL fixed, useful to monitor just one hop
  --tr-no-rtt       Don't calculate/show RTT information in traceroute mode
ARS packet description (new, unstable)
  --apd-send       Send the packet described with APD (see docs/APD.txt)

4 TCPに関するオプションの使い方

4.1 宛先ポート番号の指定方法(-p)

実行例
hping3を実行する。宛先ポート番号11111のパケットをserverに送信する。
[root@client ~]# hping3 -I eth0 -c 1 -p 11111 server
オプションの意味
-I : パケットの送信インタフェースを指定する。
-c : 送信するパケットの個数を指定する。
-p : 宛先ポート番号を指定する。
server : ホスト名(またはIPアドレス)を指定する。ホスト名は名前解決できるものを指定する。

4.2 送信元ポート番号の指定方法(-s)

tcpdumpの使い方は「tcpdumpの使い方」を参照してください。

hping3を実行する。送信元ポート番号22222,宛先ポート番号11111のパケットをserverに送信する。
[root@client ~]# hping3 -I eth0 -c 1 -s 22222 -p 11111 server

サーバ側でtcpdumpを実行する。送信元ポート番号(★)、宛先ポート番号(●)が表示されていることが確認できる。
[root@server ~]# tcpdump -i eth0 port 11111 -nn
15:20:21.801643 IP 192.168.0.110.★22222 > 192.168.0.100.●11111: Flags [], win 512, length 0

4.3 送信元IPアドレスを指定したIPアドレスにする方法(-a)

hping3を実行する。送信元IPアドレスとして1.1.1.1を指定する。
[root@client ~]# hping3 -I eth0 -c 1 -a 1.1.1.1 -s 22222 -p 11111 server

サーバ側でtcpdumpを実行する。
実際にTCPパケットを送信するクライアントのIPアドレスは 192.168.0.110 ですが、
-aオプションを使うことで任意の送信元IPアドレス(★)を指定できることがわかります。
[root@server ~]# tcpdump -i eth0 port 11111 -nn
18:42:36.139352 IP ★1.1.1.1.22222 > 192.168.0.100.11111: Flags [R.], seq 39710370:39710882, win 512, length 512

4.4 タイムスタンプオプションを付加する方法(--tcp-timestamp)

hping3を実行する。タイムスタンプオプションを付加したTCPパケットをサーバに送信する。
[root@client ~]# hping3 -I eth0 -c 1 --tcp-timestamp -s 22222 -p 11111 server

サーバ側でtcpdumpを実行する。TCPパケットにタイムスタンプオプション(★)が付加されていることがわかる。
[root@server ~]# tcpdump -i eth0 port 11111 -nn
19:12:20.419364 IP 192.168.0.110.22222 > 192.168.0.100.11111: Flags [], win 512, ★options [nop,nop,TS val 4216427340 ecr 0], length 0

4.5 送信データサイズを指定する方法(-d)

hping3を実行する。データサイズ(TCPペイロードのサイズ)が512バイトのパケットを送信する。
[root@client ~]# hping3 -I eth0 -c 1 -d 512 -s 22222 -p 11111 server

tcpdumpを実行する。データサイズが512バイト(★)のパケットが表示されていることが確認できる。
また、471369547から471370059までの512バイト分のシーケンス番号(●)も表示されていることが確認できる。
[root@server ~]# tcpdump -i eth0 port 11111 -nn
15:31:45.654217 IP 192.168.0.110.22222 > 192.168.0.100.11111: Flags [], ●seq 471369547:471370059, win 512, ★length 512

4.6 シーケンス番号を指定する方法(-M)

hping3を実行する。シーケンス番号1000から512バイト分のパケットを送信する。
[root@client ~]# hping3 -I eth0 -c 1 -M 1000 -d 512 -s 22222 -p 11111 server

サーバ側でtcpdumpを実行する。シーケンス番号(★)が1000から1512まで表示されていることが確認できる。
[root@server ~]# tcpdump -i eth0 port 11111 -nn
15:48:09.872529 IP 192.168.0.110.22222 > 192.168.0.100.11111: Flags [], ★seq 1000:1512, win 512, length 512

4.7 ACK番号を指定する方法(-L)

hping3を実行する。ACK番号2000のパケットを送信する。なお、ACKパケットを送信するので、-Aも同時に指定する。
[root@client ~]# hping3 -I eth0 -c 1 -A -L 2000 -s 22222 -p 11111 server

サーバ側でtcpdumpを実行する。ACK番号(★)が2000のパケットが表示されていることが確認できる。
[root@server ~]# tcpdump -i eth0 port 11111 -nn
20:48:09.870105 IP 192.168.0.110.22222 > 192.168.0.100.11111: Flags [.], ★ack 2000, win 512, length 0
20:48:09.870488 IP 192.168.0.100.11111 > 192.168.0.110.22222: Flags [R], seq 2000, win 0, length 0

4.8 TCP初期シーケンス番号を収集する方法(-Q)

ターゲットマシンの初期シーケンス番号およびその差分値を取得することができます。
初期シーケンス番号が推測し易いと攻撃の対象になりやすくなります。
つまり、本オプションは、初期シーケンス番号が推測し易い脆弱性を持ったサーバの検索に使います。
なお、シーケンス番号は4バイトです。つまり、4294967295が最大値となります。

hping3を実行する。
SYNパケットを5個送信する。左側に表示されているのが各リプライパケットの初期シーケンス番号で、右側は直前のシーケンス番号との差分です。
差分が大きいほど、初期シーケンス番号の推測が難しくなります。
以下の結果より、CentOS7.3は初期シーケンス番号の推測が難しいと判断できます。
[root@client ~]# hping3 -I eth0 -c 5 -Q -S -p 80  server
HPING server (eth0 192.168.0.100): S set, 40 headers + 0 data bytes
★279044716 + 279044716
■3740612290 +●3461567574   <=== 3740612290(■) = 279044716(★) + 3461567574(●)
 2187374341 + 2741729346   <=== 2187374341 = 3740612290 + 2741729346 - 4294967295(最大値)
 1341730580 + 3449323534
  990757472 + 3943994187

4.9 パケット送信間隔の指定方法(-i)

ここでは、-iにu1000を指定して、短時間の内にSYNパケットを大量に送信してみます。
いわゆる、SYN flood攻撃と呼ばれるものです。

4.9.1 SYN flood実行時のポイント

SYN floodの状態にするときのポイントは、-aオプション(spoof source address)を使うことです。
まず、-aオプション無し・有りのシーケンスの違いを示します。

オプションなしの場合
以下のようなシーケンスとなり、server側のソケットがsyn-recvの状態になりません。
なお、図中の()の数値はポート番号を表しています。

    偽装アドレス           client                        server
    192.168.0.30        192.168.0.20                   192.168.0.10
       |                     |                              |
       |                     |------------ SYN ------------>|(11111)
       |                     |<----------- SYN+ACK ---------|
       |                     |------------ RST ------------>| -*-
       |                     |                              |  |
       |                     |                              | CLOSED
       |                     |                              |  |
オプションありの場合
clientがserverに送信したSYNパケットの応答(SYN+ACK)が、clientではなくアドレス偽装したサーバに返信されます。
その結果、server側のソケットがsyn-recvの状態になることができます。つまり、clientからのack受信待ちの状態になります。

    偽装アドレス           client                        server
    192.168.0.30        192.168.0.20                   192.168.0.10
       |                     |                              |
       |               (1125)|------------ SYN ------------>|(11111)
       |                     |                              |
 (1125)|<--------------------------------- SYN+ACK ---------| -*-
       |                     |                              |  |
       |                     |                              | syn-recv
       |                     |                              |  |

4.9.2 実行結果

サーバでncコマンドを実行する。-lはListenするポート番号を指定する。
[root@server ~]# nc -l 11111

clientでhping3を実行する。パラメータの意味は下記を参照ください。
[root@client ~]# hping3 -I eth0 -a 192.168.0.30 -S -p 11111 -i u1000 server

-------------------------------【パラメータの意味】-----------------------------------------------------
-I : SYNパケットを送信するインタフェースを指定する。
-a : 偽装するIPアドレスを指定する。
-S : SYNパケット送信を意味する。
-p : 宛先ポート番号を指定する。ここの例では、11111番ポートにSYNパケットを送信することになります。
-i : SYNパケット送信間隔を指定する。u1000は1000マイクロ秒(1ミリ秒)を表す。つまり、1ミリ秒間隔でSYNパケットを送信することになる。
server : SYNパケット送信先です。ここでは、IPアドレスではなくホスト名を指定しています。
------------------------------------------------------------------------------------------------------

サーバでssコマンドを実行する。syn-recv状態のソケットが多数存在するのがわかる。
[root@server ~]# ss -n4 state syn-recv
Netid Recv-Q Send-Q           Local Address:Port                          Peer Address:Port
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1125
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1124
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1121
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1120
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1117
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1116
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1114
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1128
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:2906
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1126
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1118
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1127
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1122
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1123
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1119
tcp   0      0                 192.168.0.10:11111                         192.168.0.30:1115

このとき、ジャーナルログを確認する。SYN flood攻撃を受けている旨のログが出力されていることがわかる(★印)。
[root@server ~]# journalctl -k -f
7月 08 08:58:40 server kernel: TCP: request_sock_TCP: ★Possible SYN flooding on port 11111. Sending cookies.

4.10 TCPヘッダのチェックサム値を不正な値に変更する方法(-b)

ファイアウォール(netfiler)にも、TCPヘッダのチェックサムをチェックする処理があるので、
ファイアウォールを停止しておきます。
[root@server ~]# systemctl stop firewalld.service

SYNパケットを送信する(-S)。このとき、TCPヘッダのチェックサム値を不正なものに変更する(-b)。
[root@client ~]# hping3 -I eth0 -c 1 -b -S -s 22222 -p 11111 server

サーバ側でnetstatコマンドを実行する。
不正なチェックサム値のパケットを受信するたびに、InCsumErrorsが増えていくことがわかります。
[root@server ~]# netstat -s|grep InCsumErrors
    InCsumErrors: 12

4.11 フラグの使い方

TCPヘッダのフラグフィールドに設定できるフラグは以下のとおりです。
以下はman hping3からの抜粋です。

-F --fin : Set FIN tcp flag.
-S --syn : Set SYN tcp flag.
-R --rst : Set RST tcp flag.
-P --push : Set PUSH tcp flag.
-A --ack : Set ACK tcp flag.
-U --urg : Set URG tcp flag.

4.11.1 SYNパケットの送信方法(-S)

SYNパケットを送信する。
[root@client ~]# hping3 -I eth0 -c 1 -S -s 22222 -p 11111 server

サーバ側でtcpdumpを実行する。SYNパケット(★)を受信したことがわかる。
[root@server ~]# tcpdump -i eth0 port 11111 -nn
20:06:13.698017 IP 192.168.0.110.22222 > 192.168.0.100.11111: Flags ★[S], seq 36750120, win 512, length 0

4.11.2 FINパケットの送信方法(-F)

FINパケットを送信する。
[root@client ~]# hping3 -I eth0 -c 1 -F -s 22222 -p 11111 server

サーバ側でtcpdumpを実行する。FINパケット(★)を受信したことがわかる。
20:06:21.037623 IP 192.168.0.110.22222 > 192.168.0.100.11111: Flags ★[F], seq 1909676431, win 512, length 0

4.11.3 RSTパケットの送信方法(-R)

RSTパケットを送信する。
[root@client ~]# hping3 -I eth0 -c 1 -R -s 22222 -p 11111 server

サーバ側でtcpdumpを実行する。RSTパケット(★)を受信したことがわかる。
20:13:33.805001 IP 192.168.0.110.22222 > 192.168.0.100.11111: Flags ★[R], seq 1520364464, win 512, length 0

5 IPに関するオプションの使い方

5.1 TTLの変更方法(-t)

デフォルト値の場合
clientからserverにICMP echo requestを送信する。c(小文字)は送信回数、-1はICMP echo requestを表す。
[root@client ~]# hping3 -c 1 -1 server

serverでtcpdumpを実行する。clientが送信したICMPパケットのTTLが64(デフォルト値)であることがわかる(★印)。
[root@server ~]# tcpdump -i eth0 icmp -v
21:47:34.660784 IP (tos 0x0, ★ttl 64, id 25644, offset 0, flags [none], proto ICMP (1), length 28)
    client > server: ICMP echo request, id 59397, seq 0, length 8
21:47:34.660917 IP (tos 0x0, ttl 64, id 59894, offset 0, flags [none], proto ICMP (1), length 28)
    server > client: ICMP echo reply, id 59397, seq 0, length 8
TTL=1に変更した場合
TTL=1を設定したICMPパケットを送信する。c(小文字)は送信回数、-1はICMP echo request -tはTTLを指定する。
[root@client ~]# hping3 -c 1 -1 -t 1 server

serverでtcpdumpを実行する。clientが送信したICMPパケットのTTLが1であることがわかる(★印)。
[root@server ~]# tcpdump -i eth0 icmp -v
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:51:06.667040 IP (tos 0x0, ★ttl 1, id 27222, offset 0, flags [none], proto ICMP (1), length 28)
    client > server: ICMP echo request, id 59909, seq 0, length 8
21:51:06.667239 IP (tos 0x0, ttl 64, id 62149, offset 0, flags [none], proto ICMP (1), length 28)
    server > client: ICMP echo reply, id 59909, seq 0, length 8

6 ICMPに関するオプションの使い方

6.1 Echo requestの送信方法(ICMPタイプ=8)

serverに対してICMP Echo requestパケットを1つ送信する。
[root@client ~]# hping3 -I eth0 -c 1 -C 8 server

serverでtcpdumpを実行する。ICMP Echo requestパケットを受信していることがわかる。
[root@server ~]# tcpdump -i eth0 icmp -nn
17:24:17.988073 IP 192.168.0.110 > 192.168.0.100: ICMP echo request, id 33541, seq 0, length 8
17:24:17.990064 IP 192.168.0.100 > 192.168.0.110: ICMP echo reply, id 33541, seq 0, length 8

6.2 Destination Unreachable(Type=3)の送信方法

Destination Unreachable Message

6.2.1 network unreachableの送信方法(ICMPタイプ=3, コード=0)

6.2.2 host unreachableの送信方法(ICMPタイプ=3, コード=1)

-------------------------------------------
1. ICMP host unreachableが発生する状況の説明
-------------------------------------------

                                   172.17.0.0/16                     172.16.0.0/16
                         client                           router                     server
                         (eth1) .10                .20 (eth2) (eth1) .20          .10 (eth1)
                           |                            |      |                        |
                           |                            |      |                        | # ifdown eth1
                           |                            |      |                        |
 # nc -u 172.16.0.10 11111 |                            |      |                        |
 # test                    |                            |      |                        |
                           |--------- UDP ------------->|      |                        |
                           |                            |      |------ ARP request ---->|
                           |                            |      |------ ARP request ---->|
                           |                            |      |------ ARP request ---->|
                           |                            |      |                        |
                        (a)|<-- ICMP host unreachable --|      |                        |
                           |                            |      |                        |
                           |                            |      |                        |


------------
2. 実行結果
------------
routerでhping3を実行して、上記(a)のICMP host unreachableを送信します。パラメータの意味は、5.1.3を参照ください。
[root@router ~]# hping3 -I eth2 -1 -c 1 -C 3 -K 1 --icmp-ipproto 17 --icmp-ipsrc 172.16.0.10 --icmp-ipdst 172.16.0.10 --icmp-srcport 20000 --icmp-dstport 11111 172.17.0.10

[root@client ~]# tcpdump -i eth1 icmp -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
17:38:34.064909 IP 172.17.0.20 > 172.17.0.10: ICMP host 172.16.0.10 unreachable, length 36

icmp.png

6.2.3 port unreachableの送信方法(ICMPタイプ=3, コード=3)

-------------------------------------------
1. ICMP Port unreachableが発生する状況の説明
-------------------------------------------
clientでncコマンドを実行する。
53番ポートが閉じているため、serverからclientにICMP Port unreachableが返信される。


                   client                                     server
                192.168.0.20                                192.168.0.10
                      |                                          |
                      |                                          | # lsof -i:53  <-- 53番ポートが閉じていることがわかる。
                      |                                          |
   # nc -u server 53  |                                          |
   # test             |                                          |
                      |---------- UDP (dst port=53) ------------>| ●
                      |<--------- ICMP Port unreachable ---------| ★
                      |                                          |
                      |                                          |

------------
2. 実行結果
------------
serverでhping3を実行して、上記★印のICMP Port unreachableを送信します。パラメータの意味は下記を参照ください。
[root@server ~]# hping3 -I eth0 -1 -c 1 -C 3 -K 3 --icmp-ipproto 17 --icmp-ipsrc 192.168.0.20 --icmp-ipdst 192.169.0.10 --icmp-srcport 20000 --icmp-dstport 53 client

-------------------------------【パラメータの意味】-----------------------------------------------------
-I : ICMP redirectを送信するインタフェースを指定する。
-1 : ICMPパケット送信を意味する。
-c(小文字) : 送信回数を指定する。ここでは1回だけICMP Port unreachableを送信する。
-C(大文字) : ICMPタイプを指定する。
--icmp-ipproto : UDP(17)を指定します。デフォルトはTCPです。
--icmp-ipsrc : Port unreachableの原因となったオリジナルUDPパケット(上記●印)の送信元IPアドレス
--icmp-ipdst : Port unreachableの原因となったオリジナルUDPパケット(上記●印)の宛先IPアドレス
--icmp-srcport : Port unreachableの原因となったオリジナルUDPパケット(上記●印)の送信元ポート番号
--icmp-dstport : Port unreachableの原因となったオリジナルUDPパケット(上記●印)の宛先ポート番号
client : ICMP Port unreachableパケットの送信先です。ここでは、IPアドレスではなくホスト名を指定しています。
------------------------------------------------------------------------------------------------------

clientでtcpdumpを実行する。serverがICMP Port unreachableパケットを送信していることがわかる。
[root@client ~]# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:02:19.310173 IP server > client: ★ICMP 192.169.0.10 udp port domain unreachable, length 36

icmp2.png

6.3 Redirect(Type=5)の送信方法

第12回 TCP/IPプロトコルを支えるICMPメッセージ (3/3)
What does ICMP | Redirect | (redirect for host) mean?

5.3.1 Redirect Datagrams for the Host(ICMPタイプ=5, コード=1)

構成
ここの動作確認で実際に送信するパケットは(2)のICMP redirectだけです。
(1),(3)は、ICMP redirectの仕様に基づいて描いたものです。


             +------- (1)IPパケット ------>
             |
             |     +---------------------- client -----
           --+     |          192.168.0.10
                   |
                   |
           <------------- (2) ICMP redirect
                   |
    server --------+
  192.168.0.20     |
                   |
           --+     |
             |     |
             |     +---------------------- GW ---------  ... ホスト(172.16.0.10)
             |               192.168.0.254
             |
             |
             +---------(3) IPパケット ---->
実行結果
clientでhping3を実行する。hping3のパラメータの意味は下記参照。
[root@client ~]# hping3 -I eth0 -1 -c 1 -C 5 -K 1 --icmp-ipsrc 192.168.0.20 --icmp-ipdst 172.16.0.10 --icmp-gw 192.168.0.254 server

【パラメータの意味】
-I : ICMP redirectを送信するインタフェースを指定する。
-1 : ICMPパケット送信を意味する。
-c(小文字) : 送信回数を指定する。ここでは1回だけICMP redirectを送信する。
-C(大文字) : ICMPタイプを指定する。
-K : ICMPコードを指定する。
--icmp-ipsrc : オリジナルIPパケットの送信元IPアドレスを指定する。
--icmp-ipdst : オリジナルIPパケットの宛先IPアドレスを指定する。
--icmp-gw : オリジナルIPパケットの転送先ルータ(GW)のIPアドレスを指定する。
サーバで採取したtcpdump
serverでtcpdumpを実行する。clientからserverにICMP redirect(★印)が送信されていることがわかる。
[root@server ~]# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:14:20.367478 IP client > server: ★ICMP redirect server to host 192.168.0.254, length 36

icmp1.png

6.4 送信元を偽装したICMPパケットを送信する方法(--rand-source)

tcpdumpを実行する。受信するICMPパケットだけを表示する(-P in)。
[root@server ~]# tcpdump -i bond0 -p icmp -n -P in

サーバ(192.168.0.10)に対してpingを実行する。
[root@client ~]# hping3 -1 --rand-source 192.168.0.10

ICMPパケットの送信元IPアドレス(★)がランダムであることがわかる。
[root@server ~]# tcpdump -i bond0 -p icmp -n -P in
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:30:49.105716 IP ★98.160.255.11 > 192.168.0.10: ICMP echo request, id 10247, seq 0, length 8
21:30:50.106717 IP ★150.53.70.68 > 192.168.0.10: ICMP echo request, id 10247, seq 256, length 8
21:30:51.107346 IP ★123.4.150.51 > 192.168.0.10: ICMP echo request, id 10247, seq 512, length 8
21:30:52.108393 IP ★151.179.170.35 > 192.168.0.10: ICMP echo request, id 10247, seq 768, length 8
-以下、略-

7 負荷のかけかた

clientからserverに対してパケットを大量に送信する方法を説明します。

7.1 ICMP echo requestパケットをμ秒間隔で送信する方法(--faster,またはu1)

manとhelpの説明が異なる。ここでは、manの説明にしたがって説明する。

clientからserverにICMPパケットを送信する。
[root@client ~]# hping3 -1 server -i u1

serverでtcpdumpを実行する。およそμ秒の間隔でICMP echo requestを受信していることがわかる。
[root@server ~]# tcpdump -i bond0 icmp -P in -ttt
00:00:00.001298 IP client > server: ICMP echo request, id 6663, seq 32273, length 8
00:00:00.000052 IP client > server: ICMP echo request, id 6663, seq 32529, length 8
00:00:00.000138 IP client > server: ICMP echo request, id 6663, seq 32785, length 8
00:00:00.000047 IP client > server: ICMP echo request, id 6663, seq 33041, length 8
00:00:00.009299 IP client > server: ICMP echo request, id 6663, seq 33297, length 8
00:00:00.000288 IP client > server: ICMP echo request, id 6663, seq 33553, length 8
00:00:00.095984 IP client > server: ICMP echo request, id 6663, seq 38930, length 8
00:00:00.000051 IP client > server: ICMP echo request, id 6663, seq 39186, length 8
00:00:00.000374 IP client > server: ICMP echo request, id 6663, seq 39442, length 8
00:00:00.000053 IP client > server: ICMP echo request, id 6663, seq 39698, length 8

7.2 UDPパケットをμ秒間隔で送信する方法(--faster,またはu1)

clientからserverにUDPパケットを送信する。
[root@client stap]# hping3 -2 -i eth0 server -i u1

[root@server stap]# tcpdump -i bond0 udp -P in -ttt -nn
00:00:00.000019 IP 192.168.0.110.8514 > 192.168.0.10.0: UDP, length 0
00:00:00.000021 IP 192.168.0.110.8515 > 192.168.0.10.0: UDP, length 0
00:00:00.000120 IP 192.168.0.110.8516 > 192.168.0.10.0: UDP, length 0
00:00:00.000032 IP 192.168.0.110.8517 > 192.168.0.10.0: UDP, length 0
00:00:00.000020 IP 192.168.0.110.8518 > 192.168.0.10.0: UDP, length 0
00:00:00.000021 IP 192.168.0.110.8519 > 192.168.0.10.0: UDP, length 0
00:00:00.000021 IP 192.168.0.110.8520 > 192.168.0.10.0: UDP, length 0
00:00:00.000021 IP 192.168.0.110.8521 > 192.168.0.10.0: UDP, length 0
00:00:00.000019 IP 192.168.0.110.8522 > 192.168.0.10.0: UDP, length 0
00:00:00.000021 IP 192.168.0.110.8523 > 192.168.0.10.0: UDP, length 0

8 データサイズを指定する方法(-d)

8.1 ICMPパケットの場合

オプション(-d)は、ICMP Headerに続く領域のサイズを指定します。
なお、図中の()内はバイト数を表します。

オプションで指定する領域について
  |<- Ethernet Header(14) ->|<- IP Header(20) ->|<- ICMP Header(8) ->|<- data(d) ->|
  +-------------------------+-------------------+--------------------+-------------+
  |                         |                   |                    |             |
  |                         |                   |                    |             |
  +-------------------------+-------------------+--------------------+-------------+

IPヘッダ(20バイト)とICMPヘッダ(8バイト)に加え、パラメータで指定した100バイトのデータが
送信されていることがわかる。

データサイズに100バイトを指定した場合
[root@client ~]# hping3 -I eth0 -c 1 -C 8 server -d 100
HPING server (eth0 192.168.3.50): icmp mode set, 28 headers + 100 data bytes
len=128 ip=192.168.3.50 ttl=64 id=46366 icmp_seq=0 rtt=0.6 ms
(以下、略)

x 参考情報

ネットワーク入門サイト(ICMP)
HPING tutorial
Denial of Service Attacks
1.3.2 ICMP

オンラインソフトを使え! 「第3回 hping2」
researchhping
researchhping

hana_shin
写真は淡路島SAから明石海峡大橋を撮影したものです('19夏撮影)。'20年夏も3年連続で四国、大阪に行く予定でしたが、コロナ終息しないので断念。甲子園で高校野球もみれない。ほんと悲しい!コロナなんとかならないか!治療薬の研究開発している人がんばってほしいな。ソフトが少しでも役に立てればと思う今日この頃。取得済資格:ネットワークスペシャリスト、オンライン情報処理技術者。
https://hana-shin.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away