尝试分析UDP

Host

准备环境
Server

1
2
3
4
5
6
7
8
ens3      Link encap:Ethernet  HWaddr 02:42:ac:11:00:36  
inet addr:172.17.0.54 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:36/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3733 errors:0 dropped:0 overruns:0 frame:0
TX packets:1723 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1216408 (1.2 MB) TX bytes:678036 (678.0 KB)

Client

1
2
3
4
5
6
7
8
ens3      Link encap:Ethernet  HWaddr 02:42:ac:11:00:18  
inet addr:172.17.0.24 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:18/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1717 errors:0 dropped:0 overruns:0 frame:0
TX packets:904 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1021151 (1.0 MB) TX bytes:301129 (301.1 KB)

Program

在各自主机上启动进程
Server

1
2
3
4
5
6
7
8
9
10
11
12
import socket
import sys

BUFSIZE = 1024
ip_port = ('0.0.0.0', 9999)
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # udp
server.bind(ip_port)
while True:
data,client_addr = server.recvfrom(BUFSIZE)
print(data)
sys.stdout.flush()
server.close()

Client

1
2
3
4
5
6
7
8
import socket
BUFSIZE = 1024
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = raw_input(">> ").strip()
ip_port = ('172.17.0.54', 9999)
client.sendto(msg.encode('utf-8'),ip_port)
client.close()

20210718195900.jpg


TCPDUMP

Linux cooked mode

首先尝试默认的linux处理模式

tcpdump udp -i any -w ./udp.cap

1
2
3
4
5
6
00000000: d4c3 b2a1 0200 0400 0000 0000 0000 0000  ................
00000010: 0000 0400 7100 0000 7315 f460 e14b 0300 ....q...s..`.K..
00000020: 3100 0000 3100 0000 0000 0001 0006 0242 1...1..........B
00000030: ac11 0018 0000 0800 4500 0021 783d 4000 ........E..!x=@.
00000040: 4011 6a1e ac11 0018 ac11 0036 9f66 270f @.j........6.f'.
00000050: 000d 9d1b 6865 6c6c 6f ..X.hello
  • 0xd4c3 b2a1 首四字节被称为幻数,它的主机序列用于传输识别
  • 0x0200 0400 两字节常数 + 两字节常数,代表主版本号 + 次版本号
  • 0x0000 0000 四字节常数,全为0,表示时区
  • 0x0000 0000 四字节常数,全为0,表示时间戳精度
  • 0x0000 0400 四字节常数,主机字节序为0x04000000,表示每个包抓包大小
  • 0x7100 0000 四字节常数,主机字节序为0x00000071,表示数据链路层类型DLT_LINUX_SLL
  • 0x7315 f460 四字节变量,代表秒时间戳
  • 0xe14b 0300 四字节变量,代表微秒部分时间戳
  • 0x3100 0000 四字节变量,抓包数据长度
  • 0x3100 0000 四字节变量,数据包数据的未截断长度
  • 0x0000 两字节变量,报文来源,来自他人
  • 0x0001 两字节变量,寻址类型,Novell 802.3
  • 0x0006 两字节变量,数据链路层地址长度,6 Octets
  • 0x0242 ac11 0018 六字节变量,发送方mac地址
    在默认模式里,没有记录下服务端的mac地址
    记录文件里,也没有记录下数据链路层头尾的数据
  • 0x0000 地址少于8个字节,填充补足8字节
  • 0x0800 协议类型

指定数据链路类型

列出本机支持的类型

1
2
3
4
$ tcpdump -L
Data link types for ens3 (use option -y to set):
EN10MB (Ethernet)
DOCSIS (DOCSIS) (printing not supported)

指定以太网协议
tcpdump udp port 9999 -i ens3 -y EN10MB -w ./udp.cap

1
2
3
4
5
6
00000000: d4c3 b2a1 0200 0400 0000 0000 0000 0000  ................
00000010: 0000 0400 0100 0000 0a16 f460 3a6f 0c00 ...........`:o..
00000020: 2f00 0000 2f00 0000 0242 ac11 0036 0242 /.../....B...6.B
00000030: ac11 0018 0800 4500 0021 a7d2 4000 4011 ......E..!..@.@.
00000040: 3a89 ac11 0018 ac11 0036 9f66 270f 000d :........6.f'...
00000050: 9d1b 6865 6c6c 6f X.hello

指定数据链路类型后,DLT字段主机序列变为0x00000001,类型为DLT_EN10MB
指定数据链路类型后,同时记录下服务端mac地址、客户端mac地址

https://www.tcpdump.org/manpages/tcpdump.1.html
https://www.tcpdump.org/manpages/pcap-savefile.5.html
https://www.tcpdump.org/linktypes.html
https://www.tcpdump.org/linktypes/LINKTYPE_LINUX_SLL.html
tcpdump文件格式分析
Linux cooked-mode capture 格式转换
tcpdump抓包分析


网络层

格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

4500 0021 783d 4000 4011 6a1e ac11 0018 ac11 0036

  • 4: 版本,IPv4
  • 5: 头长度,5个32位,共20字节
  • 00: 区分服务
  • 21: 长度,33字节
  • 783d:ID
  • 4000: 0b01000000 不分片,偏移为0
  • 40: 生存时间TTL,64
  • 6a1e:检验和
  • 11:协议,17(udp)
  • ac11 0018:来源ip
  • ac11 0036:目标ip

检验和

ip数据报,检验和仅检查头部是否正确:

1
2
3
4
5
6
7
8
9
10
11
12
    0100010100000000    4500
0000000000100001 0021
0111100000111101 783d
0100000000000000 4000
0100000000010001 4011
0000000000000000 0000
1010110000010001 ac11
0000000000011000 0018
1010110000010001 ac11
+ 0000000000110110 0036
--------------------
00101001010111011111 295DF

进位部分截断,加回低位,再取反:

1
2
3
4
5
6
7
00101001010111011111   295DF
+ 0010 0002
--------------------
1001010111100001 95E1
XOR 1111111111111111 ffff
--------------------
0110101000011110 6a1e

运输层

格式

1
2
3
4
5
6
7
8
9
10
11
 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| Length | Checksum |
+--------+--------+--------+--------+
|
| data octets ...
+---------------- ...

9f66 270f 000d 9d1b 6865 6c6c 6f

  • 9f66:40806 来源端口
  • 270f:9999 目标端口
  • 000d:13 UDP报文长度
  • 9d1b:检验和
  • 6865 6c6c 6fhello

检验和

pseudo header:

1
2
3
4
5
6
7
8
 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
| source address |
+--------+--------+--------+--------+
| destination address |
+--------+--------+--------+--------+
| zero |protocol| UDP length |
+--------+--------+--------+--------+

假头(不传)+真头+数据,计算检验和:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    1010110000010001    ac11
0000000000011000 0018
1010110000010001 ac11
0000000000110110 0036
0000000000010001 0011
0000000000001101 000d
1001111101100110 9f66
0010011100001111 270f
0000000000001101 000d
0000000000000000 0000
0110100001100101 6865
0110110001101100 6c6c
0110111100000000 6f00
--------------------
00110110001011100001 362E1

进位部分截断,加回低位,再取反:

1
2
3
4
5
6
7
00110110001011100001   362E1
+ 0011
--------------------
0110001011100100 62E4
XOR 1111111111111111 ffff
--------------------
1001110100011011 9D1B

RFC-791: INTERNET PROTOCOL
RFC-768: User Datagram Protocol