文章目录
000:wireshark 过滤器概念:
wireshark 过滤器可以让你找出你所希望进行分析的数据包。
简单来说,一个过滤器就是定义了一定条件,用来包含或者排除数据包的表达式。
如果你不希望看到一些数据包,你可以写一个过滤器来屏蔽它们。
如果你希望只看到某些数据包,你可以写一个只显示这些数据包的过滤器。
001:wireshark 过滤器分类:
- 捕获过滤器:当进行数据包捕获时,只有那些满足给定的包含/排除表达式的数据包会被捕获。
- 显示过滤器:该过滤器根据指定的表达式用于在一个已捕获的数据包集合中,隐藏不想显示的数据包,或者只显示那些需要的数据包。
002:捕获过滤器:
捕获过滤器应用于 Libpcap/WinPcap,并使用Berkeley Packet Filter(BPF)语法。
1:BPF简介
BPF 于 1992 年被设计出来,其设计目的主要是解决当时已存在的过滤机制效率低下的问题。BPF的工作步骤如下:当一个数据包到达网络接口时,数据链路层的驱动会把它向系统的协议栈传送。但如果 BPF 监听接口,驱动首先调用 BPF。BPF 首先进行过滤操作,然后把数据包存放在过滤器相关的缓冲区中,最后设备驱动再次获得控制。注意到BPF是先对数据包过滤再缓冲,避免了类似 sun 的 NIT 过滤机制先缓冲每个数据包直到用户读数据时再过滤所造成的效率问题。
BPF(Berkeley Packet Filter) 全称为伯克利包过滤,是一种功能非常强大的过滤语法。
BPF语法 被广泛用于多种数据包嗅探软件,主要因为大部分数据包嗅探软件都依赖于使用 BPF 的 Libpcap/WinPcap 库。诸如tcpdump,wireshark等等
掌握 BPF语法 对你在数据包层级更深入地探索网络来说,非常关键。
2:BPF语法
使用BPF语法创建的过滤器被称为表达式
并且每个表达式包含一个或多个原语
每个原语包含一个或多个限定词,然后跟着一个ID或者数字
BPF限定词:
限定词 | 说明 | 例子 |
---|---|---|
Host(主机) | 该选项用来指定主机地址 | host, net, port |
Direction (方向) | 该选项用来指定来源或目的地 | src, dst |
Protocol (协议) | 该选项用来指定协议 | ether, ip, tcp, udp, http, ftp |
表达式示例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S5LgavPa-1660573118324)(https://staight.github.io/2018/07/25/BPF%E8%BF%87%E6%BB%A4%E8%A7%84%E5%88%99/%E8%BF%87%E6%BB%A4%E5%99%A8%E7%A4%BA%E4%BE%8B.png)]
该表达式的含义是只捕获目的地址为192.168.0.10以及端口为80的tcp流量
可以使用以下3种逻辑运算符,对原语进行组合,从而创建出更高级的表达式
- &&:连接运算符 与
- || :选择运算符 或
- ! :否定运算符 非
3:主机名和地址过滤器
大多数过滤器都专注于一个特定的网络设备.这种情况下,可以根据设备的MAC地址,IPv4地址,IPv6地址或者DNS主机名配置过滤规则
host限定词用于捕获特定主机名或IP地址的流量:
host 192.168.10.1
host fe80::3c42:d5ff:fe22:1d63
host testserver
如果考虑到一台主机的IP地址会变化,可以加入ether限定词对MAC地址进行过滤:
ether host 3e:42:d5:22:1d:63
传输方向限定词可以用来捕获流入或流出某台主机的流量:
src host 192.168.10.1
当一个原语中没有指定一种类型限定符时,host限定词将作为默认选择:
src 192.168.10.1
4:端口和协议过滤器
不仅仅可以基于主机过滤,也可以基于端口进行过滤:
port 80
如果想要捕获非80端口的流量:
!port 80
端口限定符可以和传输方向限定符一起使用:
dst port 80
端口限定符也可以和某些基于端口之上的协议一起过滤:
tcp port 8080
另外一些协议并不能简单的使用端口定义:
icmp
!ip6
5:协议域过滤器
协议域过滤器是BPF语法的一个强大的功能,我们可以通过检查协议头的限定字节来创建基于某些数据的过滤器
代表目标不可达(类型3)信息的ICMP数据包:
icmp[0]==3 //icmp协议头的第一个字节是否等于3
代表echo请求(类型8)或echo回复(类型0)的ICMP数据包:
icmp[0]==8||icmp[0]==0
可以在偏移值的后面以冒号分隔加上一个数值,代表数据长度:
icmp[0:3]==0x030104
还有一种情况是一个字节中每一个比特位都是标志位,这样我们需要先引用相关的字节,再使用”位掩码”逐位地把我们需要检查的位分离出来:
tcp[13]&4==4
ip[0] & 0x0F > 0x05