【抓包工具】实战:WireShark 捕获过滤器的超全使用教程

您所在的位置:网站首页 web服务主要使用哪两个协议类型 【抓包工具】实战:WireShark 捕获过滤器的超全使用教程

【抓包工具】实战:WireShark 捕获过滤器的超全使用教程

2024-06-29 01:49| 来源: 网络整理| 查看: 265

目录

一、应用场景

二、「捕获选项」弹框界面

(1)选项卡:Input

① 接口

② 流量

③ 链路层

④ 混杂

⑤ 捕获长度(B)

⑥ 缓冲区(MB)

⑦ 监控模式

⑧ 捕获过滤器

(2)选项卡:输出

(3)选项卡:选项

三、捕获过滤表达式

(1)语法说明

(2)限定符

(3)运算符

(4)特殊原语关键字

(5)语法解析

(6)过滤类型

①  基于类型过滤

② 基于传输方向的过滤

③ 基于协议过滤 

④ 基于数据过滤 

⑤ 使用多个捕获过滤器 

⑥ 使用预置表达式 

(7)常见的捕获过滤器表达式

① 只捕获某主机的HTTP流量

② 只捕获某主机的所有流量

③ 只捕获某主机的DNS流量

④ 只(不)捕获APR流量

⑤ 只捕获特定端口的流量

⑥ 捕获电子邮件的流量

⑦ 捕获 vlan 的流量

⑧ 捕获 PPPoE 流量

(8)过滤层次

① 二层过滤

② 三层过滤

③ 四层过滤

(9)复合型过滤

① 与、或、非

(10)特殊过滤

① 语法

② ether

③ len

④ arp

⑤ ip

⑥ icmp

⑦ icmptype (icmp 类型字段)

⑧ icmpcode (icmp 代码字段)

⑨ icmp6type (icmpv6 类型字段)

⑩ icmp6code (icmpv6 代码字段)

⑪ tcp

⑫ data

⑬ tcpflags(tcp 标记字段)

⑭ udp

四、数据包抓取实战

(1)抓取源 ip

(2)抓取本机 Mac 地址

(3)抓取指定端口的源 ip

(4)主机名和地址过滤器

(5)端口和协议过滤器

(6)协议过滤器

(7)协议域过滤器

(8)包含有 DATA 的 IPv4 数据包

(9)TCP 端口范围在 1501-1540 的数据包

(10)Welchia worm

(11)HTTP GET requests 数据包

(12)Heartbleed Exploit 数据包

(13)运算符实例

① To select all IPv4 HTTP packets to and from port 80, i.e. print only packets that contain data, not, for example, SYN and FIN packets and ACK-only packets.

② HTTP GET requests 数据包

一、应用场景

在开始捕捉前设置:用于提前过滤不同类型接口的流量数据,大流量网络环境故障检测,当进行数据包捕获时,只有满足给定的包含 or 排除表达式的数据包会被捕获,只会抓取匹配规则的数据包。

WireShark 菜单:「捕获(C)→ 选项(O)」

二、「捕获选项」弹框界面 (1)选项卡:Input

① 接口

接口:接口名称,某些接口允许或需要在捕获之前进行配置,这将由接口名称左侧的选项图标(❁)进行设置,单击图标将显示该接口的独立配置对话框

② 流量

流量:显示网络活动随时间变化的曲线图迷你图

③ 链路层

链路层:此接口捕获的数据包类型,在某些特殊情况下,可以修改

链接层标头类型:

在大多数情况下,您不必修改链接层标头类型,一些例外情况如下: 

如果您是在以太网设备上捕获,您可能会选择 「Ethernet」或 「DOCSIS」 。如果您正在从Cisco Cable Modem 终端系统捕获流量,该系统将 DOCSIS 流量传输到要捕获的以太网,请选择「DOCSIS」,否则选择 「Ethernet」。如果您在某些版本的 BSD 上的 802.11 设备上进行捕获,您可以选择「Ethernet」或 「802.11」。「Ethernet」将导致捕获的数据包具有虚假的 (“cooked”) 以太网报头。「802.11」将使它们具有完整的 IEEE 802.11 报头。除非捕获需要由不支持 802.11 标头的应用程序读取,否则应选择「802.11」。如果您在连接到同步串行线的 Endace DAG 卡上进行捕获,您可能会选择 「PPP over serial」或「Cisco HDLC」。如果串行线路上的协议是 PPP ,请选择「PPP over serial」,如果串行线路的协议是 Cisco HDLC ,则选择「Cisco HDLC」。如果您是在连接到 ATM 网络的 Endace DAG 卡上进行捕获,您可以选择「RFC 1483 IP over ATM」或「Sun raw ATM」。如果捕获的唯一流量是 RFC 1483 LLC 封装的 IP ,或者如果捕获需要由不支持 SunATM 标头的应用程序读取,请选择「RFC 1483 IP over ATM」,否则选择「Sun raw ATM」。

④ 混杂

混杂:允许您在捕获时将此界面置于混杂模式,请注意,其他应用程序可能会覆盖此设置。 

⑤ 捕获长度(B)

捕获长度: 快照长度或每个数据包要捕获的字节数,如果需要,例如出于性能或隐私原因,可以设置显式长度

⑥ 缓冲区(MB)

缓冲区:为捕获数据包而保留的内核缓冲区的大小,您可以根据需要增加或减少此值,但默认值通常就足够了

⑦ 监控模式

监控模式:允许您捕获完整的原始 802.11 标头,支持取决于接口类型、硬件、驱动程序和操作系统,请注意,启用此选项可能会断开您与无线网络的连接

⑧ 捕获过滤器

捕获过滤器:应用于此接口的捕获筛选器,您可以通过双击过滤器来编辑它,可以填写捕获过滤表达式

(2)选项卡:输出

输出:设置永久保存抓取结果文件路径

(3)选项卡:选项

选项:设置实时、名称解析、自动停止捕获定时、临时文件路径 

Display Options:显示选项

Update list of packets in real-time:实时更新数据包列表Automatically scroll during live capture:在实时捕捉过程中自动滚动Show capture information during live capture:显示实时捕获过程中的捕获信息

Name Resolution :名称解析

Resolve MAC addresses:解析 MAC 地址Resolve network names:Resolve 网络名称Resolve transport names :Resolve 传输名称

Stop capture automatical1y after…… :……后自动停止捕获

Directory for temporary files :临时文件目录

三、捕获过滤表达式 (1)语法说明

捕获过滤器:采用的是 BPF(Berkeley Packet Flter)语法

BPF(官方说明文档):是一个用于过滤网络报文的框架,主要有两个功能

根据外界输入的规则过滤报文将符合条件的报文由内核复制到用户空间

捕获过滤表达式:一个 “表达式” 包含多个 “原语” ,“原语” 通常包含一个 id(标识,比如 IP、域名、端口,可以是数字或者是名称)或多个 “限定符” 组成,原语之间可以使用逻辑运算符组合。

(2)限定符 限定词说明例子Type指出名字或数字所代表的意义host、net、portDir指明传输方向时前往还是来自名字或数字src、dstProto限定所要匹配的协议ether、ip、tcp、udp、http、ftp

在给定表达式的组成部分中,一个src限定词和192.168.0.10组成了一个原语。这个源于本身就是表达式,可以用它只捕获那些目标IP地址时192.168.0.10的流量。

你可以使用一下3中逻辑运算符,对原语进行组合,从而创建更高级的表达式。

连接运算符 与 (&&)选择运算符 或 (||)否定运算符 非 (!)

举例来说,下面的这个表达式只对源地址是192.168.0.10和源端口或目标端口是80的流量进行捕获。

src 192.168.0.10 && port 80

三种类型限定符,包括 type (类型)、dir (方向)、proto (协议) :

type (类型)

host, net, port 和 portrange

默认 host

dir (方向)

src, dst, src or dst, src and dst

默认 src or dst

proto (协议)

ether, ip, ip6, arp, tcp 和 udp

默认和 type 一致的所有协议

(3)运算符

relop

relop :>,=,,=,,=,=1000 IP 数据包总长度

ip[4]

Identification(字节偏移量 4 ,长度 2 字节)

示例

ip[4:2] = 0x0

ip[6]

Flags(3bit) + Fragment offset(13bit)(字节偏移量 6 ,长度 2 字节)

示例

ip[6] & 0x4f = 0x40 ip[6:2] & 0x4fff = 0x4000 Don't fragment 位设置为 1 的 IPv4 数据包 ip[6:2] & 0x3fff = 0 没被分片的 IPv4 数据包 ip[6:2] & 0x3fff = 0x2000 分片编号为 0 的被分片的 IPv4 数据包 ip[6:2] & 0x1fff = 0 没被分片的 IPv4 的数据包或者分片编号为 0 的被分片的 IPv4 数据包 ip[6] & 0x60 = 0 and ip[6:2] & 0x1fff != 0 最后一个分片的 IPv4 数据包

ip[8]

TTL(Time to live,8bit)(字节偏移量 8 ,长度 1 字节)

示例

ip[8] = 0x80 TTL 128

ip[9]

Protocol(8bit)(字节偏移量 9 ,长度 1 字节)

示例

ip[9] = 6 TCP ip[9] = 17 ip[9] = 0x11 UDP

ip[10]

Header checksum(16bit)(字节偏移量 10 ,长度 2 字节)

示例

ip[10:2] = 0x0000 首部检验和字段是根据 IP 首部计算的检验和码,它不对首部后面的数据进行计算; 首部中每 16 bit 进行二进制反码求和。

ip[12]

Source 源IP地址(32bit)(字节偏移量 12 ,长度 4 字节)

示例

ip[12:4] = 0x0a000001 源 IP 为 10.0.0.1 的 IPv4 数据包

ip[16]

Destination 目的IP地址(32bit)(字节偏移量 12 ,长度 4 字节)

示例

ip[16:4] = 0xac100001 目的 IP 为 172.16.0.1 的 IPv4 数据包 ip[16] >= 224 组播广播数据包

ip[20]

Options,可变长度Padding,可变长度0-40 字节 ⑥ icmp

icmp[0]

Type(8bit)(字节偏移量 0 ,长度 1 字节)

示例

icmp[0] = 8 Echo(ping)request icmp[0] = 0 Echo(ping)reply

icmp[1]

Code(8bit)(字节偏移量 1 ,长度 1 字节)

示例

icmp[0] = 0

icmp[2]

Checksum(16bit)(字节偏移量 2 ,长度 2 字节)

示例

icmp[2:2] = 0x4cf4 ICMP 校验和覆盖整个报文( ICMP 报头 + ICMP 数据)

icmp[4]

Identifier(BE)(字节偏移量 4 ,长度 2 字节) Identifier(LE)(字节偏移量 4 ,长度 2 字节)

icmp[6]

Sequence number(BE)(字节偏移量 6,长度 2 字节) Sequence number(LE)(字节偏移量 6,长度 2 字节)

icmp[8]

Data(n bytes)

Windows 默认 32 字节,填充 16 进制数据为 61626364......( ASCII 码与 16 进制转换,61 为 a,62 为 b 等等)

⑦ icmptype (icmp 类型字段)

icmp[icmptype] ==

示例

icmp[icmptype] == 0 icmp echo-reply 数据包 icmp[icmptype] == 8 icmp echo-request 数据包 icmp[icmptype] == icmp-echoreply icmp echo-reply 数据包 icmp[icmptype] == icmp-echo icmp echo-request 数据包 ICMP 类型字段值:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp,icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply。 ⑧ icmpcode (icmp 代码字段)

icmp[icmpcode] ==

示例

icmp[icmpcode] = 0

⑨ icmp6type (icmpv6 类型字段) ⑩ icmp6code (icmpv6 代码字段) ⑪ tcp

tcp[0]

Source Port(16bit)(字节偏移量 0 ,长度 2 字节)

示例

tcp[0:2] = 0xc871 等同于 tcp src port

tcp[2]

Destination Port(16bit)(字节偏移量 2 ,长度 2 字节)

示例

tcp[2:2] = 80 等同于 tcp dst port

tcp[4]

Sequence number(32bit)(字节偏移量 4 ,长度 4 字节)

示例

tcp[4:4] = 0x88cf222a 此段中第一个数据字节的序列号

tcp[8]

Acknowledgment number(32bit)(字节偏移量 8 ,长度 4 字节)

示例

tcp[8:4] = 0x424ade50 一旦连接建立,则总是发送。

tcp[12]

Data Offset(4bit)(字节偏移量 12 ,长度 4 bit),即 Header Length

示例

tcp[12] & 0xf0 = 80 TCP 头部长度 20 字节 number * 32-bit

tcp[13]

Reserved(3bit),必须为 0;

ECN(Explicit Congestion Notification,3bit),包括 Nonce、Congestion Window Reduced(CWR)、ECN-Echo 各 1bit;

Control Bits(6bit),包括 Urgent、Acknowledgment、Push、Reset、Syn、Fin 各 1bit。

示例

tcp[13] & 32 != 0、tcp[13] & 32 = 32 URG tcp[13] & 16 != 0、tcp[13] & 16 = 16 ACK tcp[13] & 8 != 0、tcp[13] & 8 = 8 PSH tcp[13] & 4 != 0、tcp[13] & 4 = 4 RST tcp[13] & 2 != 0、tcp[13] & 2 = 2 SYN tcp[13] & 1 != 0、tcp[13] & 1 = 1 FIN 匹配的标志位有值设置(1),其他标志位不确定。譬如 tcp[13] & 2 != 0 抓取的有 SYN ,也有 SYN+ACK tcp[13] = 32 URG tcp[13] = 16 ACK tcp[13] = 8 PSH tcp[13] = 4 RST tcp[13] = 2 SYN tcp[13] = 1 FIN 匹配的标志位有值设置(1),其他标志位没有设置。譬如 tcp[13] = 2 只匹配 SYN tcp[13] & 17 = 17 FIN+ACK 同时置 1,其他不确定 tcp[13] & 17 = 16 FIN 置 0,ACK 置 1,其他不确定 tcp[13] & 1|16 = 17 FIN 置 1,其他不确定,一般实际抓包 ACK 也置 1 tcp[13] & 16|1 = 17 ACK 置 1,其他不确定 tcp[13] & (1|16) = 17 FIN+ACK 同时置 1,其他不确定 tcp[13] & (16|1) = 17 FIN+ACK 同时置 1,其他不确定 tcp[13] & (1|16) = 1|16 FIN+ACK 同时置 1,其他不确定 tcp[13] & (1|16) = 16 FIN 置 0,ACK 置 1,其他不确定 tcp[13] = 17 FIN+ACK 同时置 1,其他无设置 tcp[13] = 1|16 FIN+ACK 同时置 1,其他无设置 &(and) 两者都为 1 则为 1,否则为 0 |(or) 两者都为 0 为 0 ,否则为 1

tcp[14]

Window size value(16bit)(字节偏移量 14 ,长度 2 字节)

示例

tcp[14:2] = 0x0200

tcp[16]

Checksum(16bit)(字节偏移量 16 ,长度 2 字节)

示例

tcp[16:2] = 0x2020

TCP伪首部

伪首部共有 12 字节,包含 IP 首部的一些字段,有如下信息:32 位源 IP 地址、32 位目的 IP 地址、8 位保留字节(置 0 )、8 位 IP 协议号( TCP 是 6 )、16 位报文总长度(首部+数据)。伪首部是为了增加校验和的检错能力:通过伪首部的目的IP地址来检查 TCP 报文是否收错了、通过伪首部的 IP 协议号来检查传输层协议是否选对了。 TCP 首部校验和计算三部分:TCP 首部+ TCP 数据+ TCP 伪首部; 如果总长度为奇数个字节,则在最后增添一个位都为 0 的字节; TCP 的检验和是必需的。

tcp[18]

Urgent Pointer(16bit)(字节偏移量 18 ,长度 2 字节)

示例

tcp[18:2] = 0

tcp[20]

Options,0 到 40 字节

⑫ data

可变长度

⑬ tcpflags(tcp 标记字段)

TCP 标记字段值:tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg

示例

tcp[tcpflags] & tcp-urg != 0、tcp[tcpflags] & tcp-urg = tcp-urg tcp[tcpflags] & tcp-ack != 0、tcp[tcpflags] & tcp-ack = tcp-ack tcp[tcpflags] & tcp-push != 0、tcp[tcpflags] & tcp-push = tcp-push tcp[tcpflags] & tcp-rst != 0、tcp[tcpflags] & tcp-rst = tcp-rst tcp[tcpflags] & tcp-syn != 0、tcp[tcpflags] & tcp-syn = tcp-syn tcp[tcpflags] & tcp-fin != 0、tcp[tcpflags] & tcp-fin = tcp-fin tcp[tcpflags] = tcp-urg tcp[tcpflags] = tcp-ack tcp[tcpflags] = tcp-push tcp[tcpflags] = tcp-rst tcp[tcpflags] = tcp-syn tcp[tcpflags] = tcp-fin tcp[tcpflags] & (tcp-rst|tcp-ack) = (tcp-rst|tcp-ack) tcp[tcpflags] & (tcp-syn|tcp-ack) = (tcp-syn|tcp-ack) ⑭ udp

udp[0]

Source Port(16bit)(字节偏移量 0 ,长度 2 字节)

示例

udp[0:2] = 0x104c 等同于 udp src port

udp[2]

Destination Port(16bit)(字节偏移量 2 ,长度 2 字节)

示例

udp[2:2] = 0x6722 等同于 udp dst port

udp[4]

Length(16bit)(字节偏移量 4 ,长度 2 字节)

示例

udp[4:2] = 0x00cc

udp[6]

Checksum(16bit)(字节偏移量 6 ,长度 2 字节)

示例

udp[6:2] = 0x459e

UDP伪首部

伪首部共有 12 字节,包含IP首部的一些字段,有如下信息:32 位源 IP 地址、32 位目的 IP 地址、8 位保留字节(置 0 )、8 位 IP 协议号( UDP 是 17 )、16 位报文总长度(首部+数据)。伪首部是为了增加校验和的检错能力:通过伪首部的目的IP地址来检查 UDP 报文是否收错了、通过伪首部的 IP 协议号来检查传输层协议是否选对了。 UDP 首部校验和计算三部分:UDP 首部+ UDP 数据+ UDP 伪首部; 如果总长度为奇数个字节,则在最后增添一个位都为 0 的字节; UDP 的检验和是可选的。

udp[8]

Data,可变长度

四、数据包抓取实战 (1)抓取源 ip

优酷番剧主页:抓取源 ip 为 14.17.92.74 的数据包

src host 14.17.92.74

 

(2)抓取本机 Mac 地址

抓取关于本机 Mac 地址的数据包:因为我的台式机连的是 WiFi 所以选中「WLAN」,如果是网线连接,则直接选择 「本地连接」媒体未断开连接的接口

ipconfig /all

ether src host 8C-...-8C-89

(3)抓取指定端口的源 ip

优酷番剧主页:抓取源 ip 为 183.158.198.19 的数据包,并指定端口为 4483

src port 4483 && host 183.158.198.19

(4)主机名和地址过滤器

你所创建的大多数过滤器都会关注与一个或一些特定的网络设备。根据这个情况,可以根据设备的MAC地址、IPv4地址、IPv6地址或者DNS主机名配置过滤规则。 举例来说,假设你对一个正在和你网络中某个服务器进行交互的主机所产生的流量感兴趣,你在这台服务器上可以创建一个使用host限定词的过滤器,来捕获所有和那台主机IPv4地址相关的流量。

host 172.16.16.149

去过你在使用一个IPv6网络,你可能需要使用基于IPv6地址的host限定词进行过滤,如下所示。

host 2001:0:9d38:6ab8:3845:3f91:9aca:947a

你同样可以使用基于一台设备的主机名host限定词进行过滤,就像一下这样。

host testserver2

或者,如果你考虑到一台主机的IP地址可能会变化,你可以通过加入ether协议限定词,对它的MAC地址进行过滤。

ether host 00-1a-a0-52-e2-a0

传输方向限定词通常会和前面例子演示的那些过滤器一起使用,来捕获流向或者流出某台主机的流量。举例来说,如果想捕获来自某台主机的流量,加入src限定词。

src host 172.16.16.149

当你在一个原语中没有指定一种类型限定符(host、net或者port)时,host限定词将作为默认选择。所以上面的那个例子也可以写成没有类型限定符的样子。

dst 172.16.16.149 (5)端口和协议过滤器

不仅仅可以基于主机过滤,你还可以对基于每个数据包的端口进行过滤。端口过滤通常被用来过滤使用已知端口的服务和应用。举例来说,下面是一个只对8080端口进行流量捕获的简单过滤器的例子。

port 8080

如果想要捕获除8080端口外的所有流量,如下所示。

!port 8080

端口过滤器可以和传输方向限定符一起使用。举例来说,如果希望只捕获前往监听标准HTTP80端口的Web服务器的流量,使用dst限定符。

dst port 80 (6)协议过滤器

协议过滤器可以让你基于特定协议进行数据包过滤。这通常被用于那些不是应用层的不能简单地使用特定端口进行定义的协议。所以如果你只想看看ICMP流量,可以使用下面这个过滤器。

icmp

如果你想看除了IPv6之外的所有流量,下面这个过滤器能够满足要求。

!ip6 (7)协议域过滤器

BPF语法提供给我们的一个强大功能,就是hi我们可以通过检查协议头中的每一字节来创建基于那些数据的特殊过滤器。 举例来说,假设我们想要基于ICMP过滤器的类型域进行过滤,而类型域位于数据包最开头也就是偏移量为0的位置,那么我们可以通过在协议限定符后输入由方括号括起的字节偏移量,在这个例子中就是icmp[0],来指定我们想在一个数据包内进行检查的位置。这样将返回一个1字节的整型值用于比较。比如只想要得到代表目标不可达(类型3)信息的ICMP数据包,我们在我们的过滤器表达式中令其等于3,如下所示。

icmp[0]==3

如果只想要检查代表echo请求(类型8)或echo回复(类型0)的ICMP数据包,使用带有OR运算符的两个原语。

icmp[0]==8||icmp[0]==0

这些过滤器尽管很好用,但是只能基于数据包头部的1个字节进行过滤。当然,你可以在方括号中偏移值的后面以冒号分割加上一个字节长度,来制定你希望返回给过滤器表达式的数据长度。 举例来说,我们想要创建一个捕获所有以类型3代码1表示的目标不可达、主机不可达的ICMP数据包,它们都是彼此相邻的1字节字段,位于数据包头部偏移量为0的位置。那么我们通过创建一个检查数据包头部偏移量为0处为2个字节数据的过滤器,并与十六进制值0301(类型3、代码1)进行比较,如下所示。

icmp[0:2]==0x0301

一个常用的场景是只捕获带有RST标志的TCP数据包。但是RST位对应的比特位对应tcp[13]这个字节的数值4所在的那个二进制位。所以过滤器看上去是这样的。

tcp[13]&4==4

如果希望所有被设置了PSH标志(比特位代表数字8)的数据包,我们的过滤器应该会将其相应位置替换成这样。

tcp[13]&8==8 (8)包含有 DATA 的 IPv4 数据包 ip[2:2] - ((ip[0]&0xf)2) != 0

IPv4 数据包总长度 - IPv4 数据包首部长度 - TCP 数据包首部长度 != 0,意味着 IPv4 数据包含有 DATA 

(9)TCP 端口范围在 1501-1540 的数据包 (tcp[0:2] > 1500 and tcp[0:2] < 1550) or (tcp[2:2] > 1500 and tcp[2:2] < 1550) tcp portrange 1501-1549 (10)Welchia worm icmp[icmptype] == icmp-echo and ip[2:2] == 92 and icmp[8:4] == 0xAAAAAAAA (11)HTTP GET requests 数据包 port 80 and tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420

'G', 'E', 'T', ' ' (16 进制值分别对应为 47, 45, 54, 20;tcp[12] & 0xf0) >> 2 为数据偏移位,取 4 字节即为 GET 。 0x504f5354 POST

(12)Heartbleed Exploit 数据包 tcp src port 443 and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4] = 0x18) and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 1] = 0x03) and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 2] < 0x04) and ((ip[2:2] - 4 * (ip[0] & 0x0F)  - 4 * ((tcp[12] & 0xF0) >> 4) > 69))   

tcp[((tcp[12] & 0xF0) >> 4 ) * 4] = 0x18 和 tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 1] = 0x03  TCP 数据偏移位,可简写为 tcp[((tcp[12] & 0xf0) >> 2):2] = 0x1803,18 为 heartbeat 报文,03 为 TLS 主版本号; tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 2] < 0x04,TLS 子版本号,等同于 tcp[((tcp[12] & 0xf0) >> 2) + 2] < 0x04; ip[2:2] - 4 * (ip[0] & 0x0F)  - 4 * ((tcp[12] & 0xF0) >> 4) > 69,TCP 数据包负载大于 69

(13)运算符实例 ① To select all IPv4 HTTP packets to and from port 80, i.e. print only packets that contain data, not, for example, SYN and FIN packets and ACK-only packets. tcp port 80 and (((ip[2:2] - ((ip[0] & 0xf)2)) != 0) All IPv4 HTTP packets to and from port 80 tcp port 80

表示过滤选择 tcp 80 端口的进出数据包 

Packets that contain data

包含有数据字段的 TCP 数据包,即要求 TCP payload 不为 0。

ip[2:2] 代表 IPv4 数据包总长度,单位为字节。

(ip[0] & 0xf)2 得到的是 TCP 数据包首部实际长度,单位为字节。

至此数值单位一致后,最终表达式

((ip[2:2] - ((ip[0] & 0xf)2)) != 0

IPv4 数据包总长度 - IPv4 数据包首部长度 - TCP 数据包首部长度 != 0,意味着 IPv4 数据包含有 DATA,即 TCP payload 不为 0。

② HTTP GET requests 数据包 port 80 and tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420 HTTP 数据包 port 80

代表运行在端口 80 上的 HTTP 数据包。 

GET 请求

tcp[12] & 0xf0) >> 2 ,在此为数据偏移位,也即 TCP 数据包首部长度。 4,代表感兴趣的字节长度为 4 。  

tcp[((tcp[12] & 0xf0) >> 2):4]

最终代表的是 TCP 数据包首部往后 4 个字节。

而 'G', 'E', 'T', ' ' ,16 进制值分别对应为 47, 45, 54, 20;取 4 字节即为 GET 。 

同理 0x504f5354 为 POST



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3