tcpdump 过滤tcp body第6,7字节为0x00a2的报文

tcpdump -i eth0 -s 0 -X "tcp[(tcp[12]>>4)*4+5:2] = 0x00a2 and src host 10.106.40.88 and port 443" -n -N
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:24:51.992499 IP 10.106.40.88.443 > 10.102.16.5.52889: Flags [P.], seq 34357818:34357894, ack 3484122796, win 31236, options [nop,nop,TS val 1493364891 ecr 2120630492], length 76
0x0000: 4500 0080 ea2b 4000 4006 0320 0a6a 2858 E....+@.@....j(X
0x0010: 0a66 1005 01bb ce99 020c 423a cfab 7eac .f........B:..~.
0x0020: 8018 7a04 4d9f 0000 0101 080a 5902 f09b ..z.M.......Y...
0x0030: 7e66 40dc 7720 8000 0000 a200 0000 0000 ~f@.w...........
0x0040: 0000 0000 4c00 0000 0014 0000 001c 019e ....L...........
0x0050: 7710 9c00 a000 a100 000f 0000 0000 05a4 w...............
0x0060: a000 05a4 a00a 0000 0030 04b8 09b0 7f36 .........0.....6
0x0070: b000 0002 0000 55af 1994 0ca0 0000 047d ......U........}

appclass(1.5)+command(2.5)位于tcp body4-7字节

命令解释
​​tcpdump 命令:​​

tcpdump -i eth0 -s 0 -X "tcp[(tcp[12]>>4)*4+5:2] = 0x00a2 and src host 10.106.40.88 and port 443" -n -N
​​-i eth0​​:监听 eth0网络接口。
​​-s 0​​:捕获完整数据包(无截断)。
​​-X​​:以十六进制 + ASCII 格式输出报文内容。
​​-n​​:禁用 IP/端口的主机名解析(显示原始数字)。
​​-N​​:禁用域名解析(不显示 FQDN)。
​​过滤器 "tcp[(tcp[12]>>4)*4+5:2] = 0x00a2 and src host 10.106.40.88 and port 443"​​:
src host 10.106.40.88 and port 443:源 IP 为 10.106.40.88且源端口为 443(HTTPS)。
tcp[(tcp[12]>>4)*4+5:2] = 0x00a2:检查 TCP 负载中特定偏移量的 2 字节值等于 0x00a2(即十进制 162):
tcp[12]是 TCP 头部的第 13 字节(数据偏移字段)。
(tcp[12] >> 4) * 4:计算 TCP 头部长度(单位:字节)。
(tcp[12]>>4)*4 + 5:定位到 TCP 负载的第 5 字节(跳过 TCP 头部)。
:2:取该位置的 2 字节进行比较。
输出解释
报文摘要
10:24:51.992499 IP 10.106.40.88.443 > 10.102.16.5.52889: Flags [P.], seq 34357818:34357894, ack 3484122796, win 31236, options [nop,nop,TS val 1493364891 ecr 2120630492], length 76
​​时间​​:10:24:51.992499
​​源​​:10.106.40.88:443(HTTPS 服务器)
​​目的​​:10.102.16.5:52889
​​TCP 标志​​:
[P.]:PUSH+ ACK(表示携带有效数据且确认之前的数据)。
​​序列号​​:seq 34357818:34357894(数据范围 76 字节,即 34357894 - 34357818 = 76)。
​​确认号​​:ack 3484122796(期望收到的下一个序列号)。
​​窗口大小​​:win 31236(接收窗口大小)。
​​TCP 选项​​:
TS val 1493364891(发送方时间戳)。
ecr 2120630492(回显之前收到的时间戳)。
​​长度​​:76字节(TCP 负载的长度)。
十六进制转储分析
报文内容分为 4 行(每行 16 字节),总计 76 字节负载:

0x0000: 4500 0080 ea2b 4000 4006 0320 0a6a 2858 E....+@.@....j(X // IP 头部(20 字节)
0x0010: 0a66 1005 01bb ce99 020c 423a cfab 7eac .f........B:..~. // IP 头部 + TCP 头部(源端口 443)
0x0020: 8018 7a04 4d9f 0000 0101 080a 5902 f09b ..z.M.......Y... // TCP 头部(选项等)
0x0030: 7e66 40dc 7720 8000 0000 a200 0000 0000 ~f@.w........... // 负载开始(关键数据)
0x0040: 0000 0000 4c00 0000 0014 0000 001c 019e ....L...........
0x0050: 7710 9c00 a000 a100 000f 0000 0000 05a4 w...............
0x0060: a000 05a4 a00a 0000 0030 04b8 09b0 7f36 .........0.....6
0x0070: b000 0002 0000 55af 1994 0ca0 0000 047d ......U........}
关键字段定位
​​TCP 头部长度计算​​:
tcp[12]位于偏移 0x0020的第一个字节 0x80。
0x80 >> 4 = 0x08(TCP 头部长度 = 0x08 * 4 = 32 字节)。
​​负载起始位置​​:IP 头(20 字节) + TCP 头(32 字节) = 偏移 0x0030的第 4 字节 0x7720(实际负载从 0x0030: 7720开始)。
​​过滤器目标值 0x00a2​​:
计算位置:(tcp[12]>>4)*4 + 5 = 32 + 5 = 37(从 TCP 头部开始算)。
实际对应:负载的第 5 字节(因为负载起始是 TCP 头部结束后的字节 0)。
偏移 0x0030行:
7720 8000 0000→ 第 37 字节是 0000中的 ​​第 2 个 0x00​​(偏移 4),第 38 字节是 a200中的 ​​0xa2​​。
合并为 ​​0x00a2​​(符合过滤条件)。

 
喜欢 0
分享