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

顾三殇 2024-06-19 17:37:01 阅读 94

目录

一、应用场景

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

(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、port
Dir 指明传输方向时前往还是来自名字或数字 src、dst
Proto 限定所要匹配的协议 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)运算符

<expr> relop <expr>

relop :>,<,>=,<=,=,!=

expr :一个算术表达式,由整型常量、二进制运算符[+、-、*、/、%、&、|、^、<<、>>]、长度运算符和特定数据包数据引用运算符组成。

proto [ expr : size ]

proto:ether, wlan, ppp, ip, arp, rarp, tcp, udp, icmp, ip6,指明该引用操作所对应的协议。expr:给出指定协议层的字节偏移量。size:可选,表示感兴趣字段中的字节数;它可以是 1、2 或 4 ,默认值是 1 。


(4)特殊原语关键字

特殊原语关键字:gateway, broadcast, less, greater 和算术表达式等。

[x] , x 为可选

x|y , 选 x 或 y

<x>,x 为必选

xyz , xyz 为关键字,必需

and(&&)、or(||)、not(!), 代表与、或、非


(5)语法解析

<Protocol> <Direction> <Host> <Value> <Logical Operation> <other expression>

Protocol (协议) :该选项用来指定协议

可使用的值有:ether、fddi、 wlan、 ip、arprarp、decnet、 lat、 sca、 moproc、 mopdl、 tcp 、udp如果没指明协议类型,则默认为捕捉所有支持的协议

Direction (方向) :该选项用来指定来源或目的地

可使用的值有:src、dst、 sre and dst 、src or dst如果没指明方向,则默认使用  src or dst  作为关键字

Host(s):指定主机地址

可能使用的值有:net、port、 host 、portrange如果没有指定,默认使用 host 关键字src 10.1.1.1 与 src host 10.1.1.1 等价

Logical Operations (逻辑运算):该选项用来指定逻辑运算符

可能使用的值有:not 、and 、 or否(“not”) 具有最高的优先级或(“or”) 和 与(“and”) 具有相同的优先级运算时从左至右进行

Other expression (其他表达式) :使用其他表达式捕获过滤器 


(6)过滤类型

①  基于类型过滤

基于类型过滤:Wireshark 可以基于类型进行捕获过滤。

其中可能使用的类型有:主机 host,网段net,端口port,端口范围 portrange 和 特殊类型

主机 host

语法格式: host host

解析:第一个 host 表示过滤器类型为 host:第二个 host 表示主机地址,可以是 ipv4 或 Ipv6 地址。

示例:捕获主机192.168.1.10 的数据

语法:host 192.168.1.10

网段 net

net 用来指定捕获那个网段的数据包,其中网络类型的过滤器有三种形式。分别是:

net net net mask net CIDR

net net
net 192.168.1.0 //对应掩码 255.255.255.255

net 192.168.1 //对应掩码 255.255.255.0

net 192.168 //对应掩码 255.255.0.0

net 192 //对应掩码255.0.0.0

net mask
net 192.168.1.0 mask 255.255.255.0
net CIDR
net 192.168.1.0/24

端口 port 

语法格式: port port

示例:port 80

端口范围

语法格式:portrange port1-port2

示例:portrange 1-100 

特殊类型

gateway host 


② 基于传输方向的过滤

源 src

src host host //仅捕获地址为指定主机的数据包

src net net //仅捕获源地址为指定网段的数据包

src port port //仅捕获源端口为指定端口的数据包

src portrange port1-port2 //仅捕获端口范围为指定端口范围的数据包

目标 dst 

dst host host //仅捕获地址为指定主机的数据包

dst net net //仅捕获源地址为指定网段的数据包

dst port port //仅捕获源端口为指定端口的数据包

dst portrange port1-port2 //仅捕获端口范围为指定端口范围的数据包 

源或者目标

src or dst host

src or dst net

src or dst port

src or dst portrange port1-port2 

源和目标

src and dst host

src and dst net

src and dst port

src and dst portrange port1-port2 

特殊方向

除了上述还有两种特殊方向捕获过滤器,分别是:

广播:broadcast

多播:multicast

ether broadcast //捕获以太网广播流量

ip broadcast //捕获ip广播流量

ether multicast //捕获哦以太网多播流量

广播和多播的区别

https://link.zhihu.com/?target=https%3A//zhidao.baidu.com/question/48206411.html


③ 基于协议过滤 

支持的协议过滤器

协议 含义

这些可以搭配前面所讲的过滤方式达到更加巧妙的过滤方式

例子:过滤源主机为192.168.1.100并且为tcp协议端口80的数据

⒈ether

格式

ether proto <proto>或ip|ip6|arp 可以是  数字(以太网协议编号 ,包括 IP 0x0800、IPv6 0x86dd、ARP 0x0806 等),也可以是  名字(包括 ip、ip6、arp、rarp、stp 等),名字需加  转义符 \,譬如 ether proto \ip 。

⒉ip|ip6

格式

[ip|ip6] proto <proto>[ip|ip6] protochain <proto>或tcp|udp|icmp|icmp6

示例

proto <proto>、ip proto <proto>、ip6 proto <proto>... 可以是  数字(包括1、6、17等),也可以是  名字(包括 icmp, icmp6, igmp, igrp, pim, ah, esp, vrrp, udp, 或 tcp),名字需加  转义符 \,譬如 ip proto \tcp;

wireshark 下 protochain 与 proto 使用基本无区别;在 tcpdump 下区别在于输出显示,protochain 会把数据包中协议头链中所有协议头内容打印显示出来。

⒊mpls

格式

mpls [label_num]

示例

mpls、mpls [label_num]、mpls [label_num1] and mpls [label_num2]、mpls and mpls [label_num]... mpls 标签号

mpls 表达式可以使用不止一次,以过滤 mpls 层次结构,每次使用该表达式都会使过滤器偏移量增加 4 ;

内部标签 num2,外部标签 num1;

内部标签 num 封装在任意外部标签中。


④ 基于数据过滤 

长度过滤

可以使用 less ,greater 关键字:

less 12 也可写成 len <=12

greater 12 也可写成 len>=12

基于内容过滤

语法格式: proto[expr:size] relop express

参数解析:

proto:支持的协议,有ether,fddi,tr,wlan,ppp,slip,link,ip,arp,rarp,tcp,udp,icmp,ip6或radioexpr :指定协议的偏移地址size:指定数据长度其中,单位bitrelop:指定使用的运算符,关系运算符有,>,<,>=,<=.=,!=,二进制运算符有,+,-,*,/,%,&,|,^,<<,>>

例如:捕获所有ipv4地址包

ip[0] & 0xf !=5

⑤ 使用多个捕获过滤器 

通过结合逻辑运算符可以同时使用多个捕获过滤器。

有: not (!) ,and(&&),or(||) ,

例如:捕获主机192.168.1.100,而且tcp端口为80的数据包

host 192.168.1.100 and tcp port 80

注意: not(!) 具有最高优先级,and(&&)和 or(||)优先级相等。


⑥ 使用预置表达式 

预先将常用的表达式设置好,方便直接使用 

下拉框选中点击:管理捕获过滤器


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


① 只捕获某主机的HTTP流量

host 192.168.5.231 and port 80 and http #只捕获主机192.168.5.231 的http流量。注意如果你的HTTP端口为8080,把80 改为8080。port 80 and http #捕获所有经过该接口的http流量。注意如果你的HTTP端口为8080,把80 改为8080。host 192.168.5.231 and not port 80 # 捕获主机192.168.5.231除 http 之外的其他所有流量,注意如果你的HTTP端口为8080,把80 改为8080。not port 80 # 捕获除 http 之外的其他所有流量,注意如果你的HTTP端口为8080,把80 改为8080。not port 80 and !http # 捕获除 http 之外的其他所有流量,注意如果你的HTTP端口为8080,把80 改为8080。

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

host 192.168.5.231 #捕获源目主机均为192.168.5.231dst 192.168.5.231 #捕获目的主机均为192.168.5.231src 192.168.5.231 #捕获来源主机均为192.168.5.231net 192.168.5.0/24 #捕获网段为d192.168.5的所有主机的所有流量

③ 只捕获某主机的DNS流量

host 192.168.5.231 and port 53 # 只捕获主机192.168.5.231 的dns流量。src 192.168.5.231 and port 53 #只捕获主机192.168.5.231 对外的dns 的流量。dst 192.168.5.231 and port 53 #只捕获dns服务器相应主机192.168.5.231的dns流量。port 53 #捕获接口中的所有主机的dns流量

④ 只(不)捕获APR流量

host 192.168.5.231 and arp#只捕获主机192.168.5.231 的arp流量。host 192.168.5.231 and !arp #只捕获主机192.168.5.231 除arp外的所有流量。arp #捕获接口中的所有arp请求!arp #捕获接口中所有非arpq请求。

⑤ 只捕获特定端口的流量

tcp portrange 8000-9000 an port 80 #捕获端口8000-9000之间和80端口的流量port 5060 #捕获sip流量,因为sip的默认端口是5060。举一反三:port 22 #捕获ssh流量

⑥ 捕获电子邮件的流量

host 192.168.5.231 and port 25 # 捕获主机192.168.5.231 的POP3协议的流量。port 25 and portrange 110-143 #因为电子邮件的协议:SMTP、POP3、IMAP4,所以捕获端口的流量。

⑦ 捕获 vlan 的流量

vlan #捕获所有vlan 的流量vlan and (host 192.168.5.0 and port 80) #捕获vlan 中主机192.168.5.0 ,前提是有vlan,在wifi中不一定可以捕获到相应的流量,局域网(公司,学校里面的网络应该有vlan)

⑧ 捕获 PPPoE 流量

pppoes #捕获所有的pppoes流量pppoes and (host 192.168.5.231 and port 80) #捕获主机如果要捕获某种协议的流量,可以尝试捕获该端口的流量,请查看端口常识:端口常识

https://svn.nmap.org/nmap/nmap-services


(8)过滤层次

① 二层过滤

⒈ehost

格式

ether [src|dst] host <ehost>

示例

ether host <ehost>、ether src <ehost>、ether src host <ehost>ether dst <ehost>、ether dst host <ehost> mac 地址支持多种写法:"xx:xx:xx:xx:xx:xx", "xx.xx.xx.xx.xx.xx", "xx-xx-xx-xx-xx-xx", "xxxx.xxxx.xxxx", "xxxxxxxxxxxx"

⒉broadcast|multicast

格式

[ether] broadcast|multicast

示例

broadcast、multicast、ether broadcast、ether multicast IPv4 多播流量,其目的 MAC 地址必以  01:00:5e 开头;

IPv6 多播流量,其目的 MAC 地址必以  33:33 开头。

⒊vlan

格式

vlan <vlan>

示例

vlan <vlan>vlan <vlan 1> and vlan <vlan 2>vlan and vlan <vlan 1> vlan 编号

vlan 表达式可以使用不止一次,以过滤 vlan 层次结构,每次使用该表达式都会使过滤器偏移量增加 4 ;

vlan2 封装在 vlan1 中;

vlan1 封装在任意 vlan 中。

⒋len

格式

less|greater <length>

示例

less <length>、greater <length> frame 长度

等同于 len <= length、len >= length 。


② 三层过滤

⒈host

格式

[ip|ip6|arp|rarp] [src|dst] host <host>

示例

host <host>、src host <host>、dst host <host>、ip host <host>、ip src host <host>、arp host <host>、arp dst host <host>...

⒉net

格式

[src|dst] net <net> [{mask <mask>}|{/<len>}]

示例

net <net>、src net <net>、dst net <net>、net <net> mask <mask>、src net <net> mask <mask>、net <net>/<len>、net <net> /<len>...

⒊broadcast|multicast

格式 & 示例

ip broadcast|multicastip6 multicast

⒋gateway

格式

gateway <host>匹配以太网地址是 host ,但 IP 地址不是 host 的数据包等同于 ether host <ehost> and not host <host>

示例

gateway test host 必须为  名字 ;

必须同时在  主机名-IP地址 (host name file, DNS 等) 和  主机名-以太网地址( /etc/ethers 等)文件中找到相对应的解析;

Tcpdump 支持,但很少用( wireshark 不支持)。


③ 四层过滤

⒈port

格式

[tcp|udp] [src|dst] port|portrange <port>

示例

port <port>、src port <port>、dst port <port>、portrange <port1-port2>、src portrange <port1-port2>、dst portrange <port1-port2>、tcp port <port>、tcp dst port <port>、tcp portrange <port1-port2>、tcp dst portrange <port1-port2>...


(9)复合型过滤

① 与、或、非

格式

and、or、not或&&、||、!

示例

tcp port <port> and host <host>、ip && host <>、tcp port <port> or udp port <port>、host <host> || host <host>、not arp and host <host>、! tcp and port <port>...


(10)特殊过滤

① 语法

<expr> relop <expr>

relop :>,<,>=,<=,=,!= expr :一个算术表达式,由整型常量、二进制运算符[+、-、*、/、%、&、|、^、<<、>>]、长度运算符和特定数据包数据引用运算符组成。

&(and) 两者都为 1 则为 1 ,否则为 0 ;

|(or) 两者都为 0 为 0 ,否则为 1 。proto [ expr : size ]

proto:ether, wlan, ppp, ip, arp, rarp, tcp, udp, icmp, ip6,指明该引用操作所对应的协议。

expr:给出指定协议层的字节偏移量。

size:可选,表示感兴趣字段中的字节数;它可以是 1、2 或 4 ,默认值是 1 。长度运算符 (关键字 len 表示) 给出数据包的长度。


② ether

ether[0]

Destination 目的 mac(字节偏移量 0,长度 6 字节)

示例

ether[0] & 1 != 0 所有组播广播流量,第一个字节最低位为 1,反之 = 0 ,所有单播流量ether[4:2] = 0x12ab 过滤目的 mac 后两位字节为 12ab 的数据包 字节偏移量 0,意味着 size 1、2 或 4,选择范围均为目的 mac(6字节)内。

ether[6]

Source 源 mac(字节偏移量 6 ,长度 6 字节)

示例

ether[10:2] = 0x34cd 过滤源 mac 后两位字节为 34cd 的数据包 字节偏移量 6,意味着 size 1、2 或 4,选择范围均为源 mac(6字节)内。

ether[12]

Type(字节偏移量 12,长度 2 字节)

示例

ether[12:2] = 0x0800 IPv4 数据包ether[12:2] = 0x0806 ARP 数据包 等同于  ip|arp


③ len

frame长度

示例

len <= 60 长度小于等于 60 的 framelen >= 1500 长度大于等于 1500 的 frame 等同于  less|greater


④ arp

arp[0]

Hardware type(字节偏移量 0 ,长度 2 字节)

示例

arp[0:2] = 1 Ethernet

arp[2]

Protocol type(字节偏移量 2 ,长度 2 字节)

示例

arp[2:2] = 0x0800 IPv4

arp[4]

Hardware address length(字节偏移量 4 ,长度 1 字节)

示例

arp[4] = 6 硬件地址长度 6

arp[5]

Protocol address length(字节偏移量 5 ,长度 1 字节)

示例

arp[5] = 4 协议地址长度 4

arp[6]

Opcode(字节偏移量 6 ,长度 2 字节)

示例

arp[6:2] = 1 requestarp[6:2] = 2 reply

arp[8]

Source hardware address(字节偏移量 8 ,长度 n bytes,n 值为 Hardware address length)

示例

arp[12:2] = 0xb192 源 mac 地址后两位字节为 b192 的数据包 可变长度

n=6,则为 6 bytes(48 bit),即源 mac 地址

arp[8+n]

Source protocol address(字节偏移量 8+n,长度 m bytes,m 值为 Protocol address length)

示例

arp[14:4] = 0x0a000001 源IP为 10.0.0.1 的 ARP 数据包 可变长度

m=4,则为 4 bytes(32 bit),即源 IP 地址

arp[8+n+m]

Destination hardware address(字节偏移量 8+n+m,长度 n bytes,n 值为 Hardware address length)

示例

arp[22:2] = 0xb192 目的 mac 地址后两位字节为 b192 的数据包 可变长度

n=6,则为 6 bytes(48 bit),即目的 mac 地址

arp request 中目的 MAC 地址为全 0

arp[8+2n+m]

Destination protocol address(字节偏移量 8+2n+m,长度 m bytes,m 值为 Protocol address length)

示例

arp[24:4] = 0xac100001 目的IP为 172.16.0.1 的 ARP 数据包 可变长度

m=4,则为 4 bytes(32 bit),即目的 IP 地址


⑤ ip

ip[0]

version(4bit)+ Header Length(4bit)(字节偏移量 0 ,长度 1 字节)

示例

ip[0] & 0x40 = 0x40 ip[0] & 64 = 64 ip[0] & 0xf0 = 64 IPv4 数据包ip[0] & 0xf = 5 ip[0] & 5 = 5 IPv4 数据包首部长度 20 字节,即不含有可选字段最小值为 5,最大值为 15 number * 32-bitip[0] & 0xf != 5 IPv4 数据包首部中含有可选字段

ip[1]

Differentiated Services Field:Differentiated Services Codepoint(6bit)+ Explicit Congestion Notification(2bit)(字节偏移量 1 ,长度 1 字节)

ip[2]

Total Length(字节偏移量 2 ,长度 2 字节)

示例

ip[2:2] = 60 ip[2:2] >=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 TCPip[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)requesticmp[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] == <identifier>

示例

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] == <identifier>

示例

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 URGtcp[13] & 16 != 0、tcp[13] & 16 = 16 ACKtcp[13] & 8 != 0、tcp[13] & 8 = 8 PSHtcp[13] & 4 != 0、tcp[13] & 4 = 4 RSTtcp[13] & 2 != 0、tcp[13] & 2 = 2 SYNtcp[13] & 1 != 0、tcp[13] & 1 = 1 FIN 匹配的标志位有值设置(1),其他标志位不确定。譬如 tcp[13] & 2 != 0 抓取的有 SYN ,也有 SYN+ACK

tcp[13] = 32 URGtcp[13] = 16 ACKtcp[13] = 8 PSHtcp[13] = 4 RSTtcp[13] = 2 SYNtcp[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 也置 1tcp[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-urgtcp[tcpflags] & tcp-ack != 0、tcp[tcpflags] & tcp-ack = tcp-acktcp[tcpflags] & tcp-push != 0、tcp[tcpflags] & tcp-push = tcp-pushtcp[tcpflags] & tcp-rst != 0、tcp[tcpflags] & tcp-rst = tcp-rsttcp[tcpflags] & tcp-syn != 0、tcp[tcpflags] & tcp-syn = tcp-syntcp[tcpflags] & tcp-fin != 0、tcp[tcpflags] & tcp-fin = tcp-fintcp[tcpflags] = tcp-urgtcp[tcpflags] = tcp-acktcp[tcpflags] = tcp-pushtcp[tcpflags] = tcp-rsttcp[tcpflags] = tcp-syntcp[tcpflags] = tcp-fintcp[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) - ((tcp[12]&0xf0)>>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)) - ((tcp[12] & 0xf0)>>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

ip[0] & 0xf,等同于ip[0] & 0x0f,代表 IPv4 首部长度,单位为 4 字节,例如 00000101 值为 5。

<<2,代表左移2位,在原值的基础上 *4 ,例如 00000101 值为 5 ,左移2位后变为 00010100,值为 20。

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

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

tcp[12] & 0xf0,代表 TCP 首部长度,单位为 1/4 字节。

>>2,代表右移2位,在原值的基础上 /4 ,例如 01010000 值为 80 ,右移2位后变为 00010100,值为 20。

最终 (tcp[12] & 0xf0)>>2 得到的是 TCP 数据包首部实际长度,单位为字节。

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

((ip[2:2] - ((ip[0] & 0xf)<<2)) - ((tcp[12] & 0xf0)>>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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。