pingパケットに任意のペイロードを埋め込むには

ネットワークの疎通確認でお馴染みのping。pingはICMPのEcho Requestを送ることによって宛先ホストの疎通状況を確認する。ICMPパケットには任意のペイロード (通常はASCII文字)を埋め込むことが出来る。

以下はpingコマンドで任意のペイロードをICMPのEcho Request パケットに埋め込む方法。

まずは普通にpingを実行してみる。

$ ping -c1 www.google.com
PING www.google.com (172.217.194.99): 56 data bytes
64 bytes from 172.217.194.99: icmp_seq=0 ttl=107 time=5.448 ms

--- www.google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 5.448/5.448/5.448/0.000 ms

以下は上記のping通信をtcpdumpでキャプチャした結果。

$ tcpdump -i en0 -vXn host www.google.com
tcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:09:31.560315 IP (tos 0x0, ttl 64, id 53333, offset 0, flags [none], proto ICMP (1), length 84)
    192.168.1.106 > 172.217.194.99: ICMP echo request, id 8170, seq 0, length 64
	0x0000:  4500 0054 d055 0000 4001 7904 c0a8 016a  E..T.U..@.y....j
	0x0010:  acd9 c263 0800 e164 1fea 0000 607d 1e9b  ...c...d....`}..
	0x0020:  0008 8c8d 0809 0a0b 0c0d 0e0f 1011 1213  ................
	0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223  .............!"#
	0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233  $%&'()*+,-./0123
	0x0050:  3435 3637                                4567
14:09:31.565681 IP (tos 0x0, ttl 107, id 0, offset 0, flags [none], proto ICMP (1), length 84)
    172.217.194.99 > 192.168.1.106: ICMP echo reply, id 8170, seq 0, length 64
	0x0000:  4500 0054 0000 0000 6b01 1e5a acd9 c263  E..T....k..Z...c
	0x0010:  c0a8 016a 0000 e964 1fea 0000 607d 1e9b  ...j...d....`}..
	0x0020:  0008 8c8d 0809 0a0b 0c0d 0e0f 1011 1213  ................
	0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223  .............!"#
	0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233  $%&'()*+,-./0123
	0x0050:  3435 3637                                4567

ICMPパケットの末尾に!"#&'()*+,-./012367という文字列が確認できる。自分の使用しているMacOSのpingコマンドはデフォルトで!"#&'()*+,-./012367という文字列をICMPパケットに埋め込む模様。

この値をデフォルトのものから変更する場合は-pオプションを使用する。
以下のpingコマンドはICMPパケットの末尾にhelloという文字列をパディングする。

ping -c1 -p '68656c6c6f' www.google.com

$ ping -c1 -p '68656c6c6f' www.google.com
PATTERN: 0x68656c6c6f
PING www.google.com (74.125.200.147): 56 data bytes
64 bytes from 74.125.200.147: icmp_seq=0 ttl=108 time=4.894 ms

--- www.google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 4.894/4.894/4.894/0.000 ms

以下は上記のping通信をtcpdumpでキャプチャした結果。

$ tcpdump -i en0 -vXn host www.google.com
tcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:21:04.495289 IP (tos 0x0, ttl 64, id 57732, offset 0, flags [none], proto ICMP (1), length 84)
    192.168.1.106 > 74.125.200.147: ICMP echo request, id 60394, seq 0, length 64
	0x0000:  4500 0054 e184 0000 4001 c401 c0a8 016a  E..T....@......j
	0x0010:  4a7d c893 0800 f9b5 ebea 0000 607d 2150  J}..........`}!P
	0x0020:  0007 8e8b 6865 6c6c 6f68 656c 6c6f 6865  ....hellohellohe
	0x0030:  6c6c 6f68 656c 6c6f 6865 6c6c 6f68 656c  llohellohellohel
	0x0040:  6c6f 6865 6c6c 6f68 656c 6c6f 6865 6c6c  lohellohellohell
	0x0050:  6f68 656c                                ohel
14:21:04.500104 IP (tos 0x0, ttl 108, id 0, offset 0, flags [none], proto ICMP (1), length 84)
    74.125.200.147 > 192.168.1.106: ICMP echo reply, id 60394, seq 0, length 64
	0x0000:  4500 0054 0000 0000 6c01 7986 4a7d c893  E..T....l.y.J}..
	0x0010:  c0a8 016a 0000 01b6 ebea 0000 607d 2150  ...j........`}!P
	0x0020:  0007 8e8b 6865 6c6c 6f68 656c 6c6f 6865  ....hellohellohe
	0x0030:  6c6c 6f68 656c 6c6f 6865 6c6c 6f68 656c  llohellohellohel
	0x0040:  6c6f 6865 6c6c 6f68 656c 6c6f 6865 6c6c  lohellohellohell
	0x0050:  6f68 656c                                ohel

参考
https://en.wikipedia.org/wiki/Ping_(networking_utility)

Leave a Reply

Your email address will not be published. Required fields are marked *