【抓包工具】实战:WireShark 捕获过滤器的超全使用教程
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
一、应用场景
在开始捕捉前设置用于提前过滤不同类型接口的流量数据大流量网络环境故障检测当进行数据包捕获时只有满足给定的包含 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 namesResolve 网络名称
- Resolve transport names Resolve 传输名称
Stop capture automatical1y after…… ……后自动停止捕获
Directory for temporary files 临时文件目录
三、捕获过滤表达式
1语法说明
捕获过滤器采用的是 BPFBerkeley 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 ]
- protoether, 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
多播multicastether 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
格式
可以是 数字以太网协议编号 包括 IP 0x0800、IPv6 0x86dd、ARP 0x0806 等也可以是 名字包括 ip、ip6、arp、rarp、stp 等名字需加 转义符 \譬如 ether proto \ip 。ether proto <proto> 或 ip|ip6|arp
⒉ip|ip6
格式
[ip|ip6] proto <proto> [ip|ip6] protochain <proto> 或 tcp|udp|icmp|icmp6
示例
可以是 数字包括1、6、17等也可以是 名字包括 icmp, icmp6, igmp, igrp, pim, ah, esp, vrrp, udp, 或 tcp名字需加 转义符 \譬如 ip proto \tcpproto <proto>、ip proto <proto>、ip6 proto <proto> ...
wireshark 下 protochain 与 proto 使用基本无区别在 tcpdump 下区别在于输出显示protochain 会把数据包中协议头链中所有协议头内容打印显示出来。
⒊mpls
格式
mpls [label_num]
示例
mpls 标签号mpls、mpls [label_num]、 mpls [label_num1] and mpls [label_num2]、 mpls and mpls [label_num] ...
mpls 表达式可以使用不止一次以过滤 mpls 层次结构每次使用该表达式都会使过滤器偏移量增加 4
内部标签 num2外部标签 num1
内部标签 num 封装在任意外部标签中。
④ 基于数据过滤
⒈长度过滤
可以使用 less greater 关键字
less 12 也可写成 len <=12
greater 12 也可写成 len>=12
⒉基于内容过滤
语法格式 proto[expr:size] relop express
参数解析
- proto支持的协议有etherfddi,tr,wlan,ppp,slip,link,ip,arp,rarp,tcp,udp,icmp,ip6或radio
- expr :指定协议的偏移地址
- size指定数据长度其中单位bit
- relop指定使用的运算符关系运算符有>,<,>=,<=.=,!=二进制运算符有+-*/%&|^,<<,>>
例如捕获所有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.231
- dst 192.168.5.231 #捕获目的主机均为192.168.5.231
- src 192.168.5.231 #捕获来源主机均为192.168.5.231
- net 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>
示例
mac 地址支持多种写法"xx:xx:xx:xx:xx:xx", "xx.xx.xx.xx.xx.xx", "xx-xx-xx-xx-xx-xx", "xxxx.xxxx.xxxx", "xxxxxxxxxxxx"ether host <ehost>、 ether src <ehost>、ether src host <ehost> ether dst <ehost>、ether dst host <ehost>
⒉broadcast|multicast
格式
[ether] broadcast|multicast
示例
IPv4 多播流量其目的 MAC 地址必以 01:00:5e 开头broadcast、multicast、 ether broadcast、ether multicast
IPv6 多播流量其目的 MAC 地址必以 33:33 开头。
⒊vlan
格式
vlan <vlan>
示例
vlan 编号vlan <vlan> vlan <vlan 1> and vlan <vlan 2> vlan and vlan <vlan 1>
vlan 表达式可以使用不止一次以过滤 vlan 层次结构每次使用该表达式都会使过滤器偏移量增加 4
vlan2 封装在 vlan1 中
vlan1 封装在任意 vlan 中。
⒋len
格式
less|greater <length>
示例
frame 长度less <length>、greater <length>
等同于 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|multicast ip6 multicast
⒋gateway
格式
gateway <host> 匹配以太网地址是 host 但 IP 地址不是 host 的数据包 等同于 ether host <ehost> and not host <host>
示例
host 必须为 名字gateway test
必须同时在 主机名-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 ]
protoether, wlan, ppp, ip, arp, rarp, tcp, udp, icmp, ip6指明该引用操作所对应的协议。
expr给出指定协议层的字节偏移量。
size可选表示感兴趣字段中的字节数它可以是 1、2 或 4 默认值是 1 。- 长度运算符 (关键字 len 表示) 给出数据包的长度。
② ether
ether[0]
Destination 目的 mac字节偏移量 0长度 6 字节
示例
字节偏移量 0意味着 size 1、2 或 4选择范围均为目的 mac6字节内。ether[0] & 1 != 0 所有组播广播流量第一个字节最低位为 1反之 = 0 所有单播流量 ether[4:2] = 0x12ab 过滤目的 mac 后两位字节为 12ab 的数据包
ether[6]
Source 源 mac字节偏移量 6 长度 6 字节
示例
字节偏移量 6意味着 size 1、2 或 4选择范围均为源 mac6字节内。ether[10:2] = 0x34cd 过滤源 mac 后两位字节为 34cd 的数据包
ether[12]
Type字节偏移量 12长度 2 字节
示例
等同于 ip|arpether[12:2] = 0x0800 IPv4 数据包 ether[12:2] = 0x0806 ARP 数据包
③ len
frame长度
示例
等同于 less|greaterlen <= 60 长度小于等于 60 的 frame len >= 1500 长度大于等于 1500 的 frame
④ 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 request arp[6:2] = 2 reply
arp[8]
Source hardware address字节偏移量 8 长度 n bytesn 值为 Hardware address length
示例
可变长度arp[12:2] = 0xb192 源 mac 地址后两位字节为 b192 的数据包
n=6则为 6 bytes48 bit即源 mac 地址
arp[8+n]
Source protocol address字节偏移量 8+n长度 m bytesm 值为 Protocol address length
示例
可变长度arp[14:4] = 0x0a000001 源IP为 10.0.0.1 的 ARP 数据包
m=4则为 4 bytes32 bit即源 IP 地址
arp[8+n+m]
Destination hardware address字节偏移量 8+n+m长度 n bytesn 值为 Hardware address length
示例
可变长度arp[22:2] = 0xb192 目的 mac 地址后两位字节为 b192 的数据包
n=6则为 6 bytes48 bit即目的 mac 地址
arp request 中目的 MAC 地址为全 0
arp[8+2n+m]
Destination protocol address字节偏移量 8+2n+m长度 m bytesm 值为 Protocol address length
示例
可变长度arp[24:4] = 0xac100001 目的IP为 172.16.0.1 的 ARP 数据包
m=4则为 4 bytes32 bit即目的 IP 地址
⑤ ip
ip[0]
version4bit+ Header Length4bit字节偏移量 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-bit ip[0] & 0xf != 5 IPv4 数据包首部中含有可选字段
ip[1]
Differentiated Services FieldDifferentiated Services Codepoint6bit+ Explicit Congestion Notification2bit字节偏移量 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]
Flags3bit + Fragment offset13bit字节偏移量 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]
TTLTime to live8bit字节偏移量 8 长度 1 字节
示例
ip[8] = 0x80 TTL 128
ip[9]
Protocol8bit字节偏移量 9 长度 1 字节
示例
ip[9] = 6 TCP ip[9] = 17 ip[9] = 0x11 UDP
ip[10]
Header checksum16bit字节偏移量 10 长度 2 字节
示例
首部检验和字段是根据 IP 首部计算的检验和码它不对首部后面的数据进行计算ip[10:2] = 0x0000
首部中每 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]
Type8bit字节偏移量 0 长度 1 字节
示例
icmp[0] = 8 Echopingrequest icmp[0] = 0 Echopingreply
icmp[1]
Code8bit字节偏移量 1 长度 1 字节
示例
icmp[0] = 0
icmp[2]
Checksum16bit字节偏移量 2 长度 2 字节
示例
ICMP 校验和覆盖整个报文 ICMP 报头 + ICMP 数据icmp[2:2] = 0x4cf4
icmp[4]
IdentifierBE字节偏移量 4 长度 2 字节 IdentifierLE字节偏移量 4 长度 2 字节
icmp[6]
Sequence numberBE字节偏移量 6长度 2 字节 Sequence numberLE字节偏移量 6长度 2 字节
icmp[8]
Datan bytes
Windows 默认 32 字节填充 16 进制数据为 61626364......( ASCII 码与 16 进制转换61 为 a62 为 b 等等)
⑦ icmptype (icmp 类型字段)
icmp[icmptype] == <identifier>
示例
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。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 数据包
⑧ icmpcode (icmp 代码字段)
icmp[icmpcode] == <identifier>
示例
icmp[icmpcode] = 0
⑨ icmp6type (icmpv6 类型字段)
⑩ icmp6code (icmpv6 代码字段)
⑪ tcp
tcp[0]
Source Port16bit字节偏移量 0 长度 2 字节
示例
等同于 tcp src porttcp[0:2] = 0xc871
tcp[2]
Destination Port16bit字节偏移量 2 长度 2 字节
示例
等同于 tcp dst porttcp[2:2] = 80
tcp[4]
Sequence number32bit字节偏移量 4 长度 4 字节
示例
此段中第一个数据字节的序列号tcp[4:4] = 0x88cf222a
tcp[8]
Acknowledgment number32bit字节偏移量 8 长度 4 字节
示例
一旦连接建立则总是发送。tcp[8:4] = 0x424ade50
tcp[12]
Data Offset4bit字节偏移量 12 长度 4 bit即 Header Length
示例
number * 32-bittcp[12] & 0xf0 = 80 TCP 头部长度 20 字节
tcp[13]
Reserved3bit必须为 0
ECNExplicit Congestion Notification3bit包括 Nonce、Congestion Window Reduced(CWR)、ECN-Echo 各 1bit
Control Bits6bit包括 Urgent、Acknowledgment、Push、Reset、Syn、Fin 各 1bit。
示例
匹配的标志位有值设置1其他标志位不确定。譬如 tcp[13] & 2 != 0 抓取的有 SYN 也有 SYN+ACKtcp[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 只匹配 SYNtcp[13] = 32 URG tcp[13] = 16 ACK tcp[13] = 8 PSH tcp[13] = 4 RST tcp[13] = 2 SYN tcp[13] = 1 FIN
&and 两者都为 1 则为 1否则为 0 |or 两者都为 0 为 0 否则为 1tcp[13] & 17 = 17 FIN+ACK 同时置 1其他不确定 tcp[13] & 17 = 16 FIN 置 0ACK 置 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 置 0ACK 置 1其他不确定 tcp[13] = 17 FIN+ACK 同时置 1其他无设置 tcp[13] = 1|16 FIN+ACK 同时置 1其他无设置
tcp[14]
Window size value16bit字节偏移量 14 长度 2 字节
示例
tcp[14:2] = 0x0200
tcp[16]
Checksum16bit字节偏移量 16 长度 2 字节
示例
tcp[16:2] = 0x2020
TCP伪首部
TCP 首部校验和计算三部分TCP 首部+ TCP 数据+ TCP 伪首部
- 伪首部共有 12 字节包含 IP 首部的一些字段有如下信息32 位源 IP 地址、32 位目的 IP 地址、8 位保留字节(置 0 )、8 位 IP 协议号( TCP 是 6 )、16 位报文总长度(首部+数据)。
- 伪首部是为了增加校验和的检错能力通过伪首部的目的IP地址来检查 TCP 报文是否收错了、通过伪首部的 IP 协议号来检查传输层协议是否选对了。
如果总长度为奇数个字节则在最后增添一个位都为 0 的字节
TCP 的检验和是必需的。
tcp[18]
Urgent Pointer16bit字节偏移量 18 长度 2 字节
示例
tcp[18:2] = 0
tcp[20]
Options0 到 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 Port16bit字节偏移量 0 长度 2 字节
示例
等同于 udp src portudp[0:2] = 0x104c
udp[2]
Destination Port16bit字节偏移量 2 长度 2 字节
示例
等同于 udp dst portudp[2:2] = 0x6722
udp[4]
Length16bit字节偏移量 4 长度 2 字节
示例
udp[4:2] = 0x00cc
udp[6]
Checksum16bit字节偏移量 6 长度 2 字节
示例
udp[6:2] = 0x459e
UDP伪首部
UDP 首部校验和计算三部分UDP 首部+ UDP 数据+ UDP 伪首部
- 伪首部共有 12 字节包含IP首部的一些字段有如下信息32 位源 IP 地址、32 位目的 IP 地址、8 位保留字节(置 0 )、8 位 IP 协议号( UDP 是 17 )、16 位报文总长度(首部+数据)。
- 伪首部是为了增加校验和的检错能力通过伪首部的目的IP地址来检查 UDP 报文是否收错了、通过伪首部的 IP 协议号来检查传输层协议是否选对了。
如果总长度为奇数个字节则在最后增添一个位都为 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
9TCP 端口范围在 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
10Welchia worm
icmp[icmptype] == icmp-echo and ip[2:2] == 92 and icmp[8:4] == 0xAAAAAAAA
11HTTP GET requests 数据包
port 80 and tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420
'G', 'E', 'T', ' ' (16 进制值分别对应为 47, 45, 54, 20tcp[12] & 0xf0) >> 2 为数据偏移位取 4 字节即为 GET 。
0x504f5354 POST
12Heartbleed 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] = 0x180318 为 heartbeat 报文03 为 TLS 主版本号;
tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 2] < 0x04TLS 子版本号等同于 tcp[((tcp[12] & 0xf0) >> 2) + 2] < 0x04
ip[2:2] - 4 * (ip[0] & 0x0F) - 4 * ((tcp[12] & 0xF0) >> 4) > 69TCP 数据包负载大于 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