Wireshark

混杂模式与普通模式
- 混杂模式:混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包,即不验证 MAC 地址;
- 普通模式:普通模式下网卡只接收发给本机的包(包括广播包)传递给上层程序,其他的包一律丢弃;
一般来说,混杂模式不会影响网卡的正常工作,多在网络监听工具上使用。
在 Wireshark 中的 捕获 -> 选项 中可以开启/关闭混杂模式。

过滤器
Wireshark 主要提供了两种主要的过滤器:
捕获过滤器:当进行数据捕获时,只有那些满足给定的包含、排除表达式的数据包会被捕获;显示过滤器:该捕获器根据指定的表达式用于一个已捕获的数据包集合,它将隐藏不想显示的数据包,或者只显示那些需要的数据包;
捕获过滤器
BPF(Berkeley Pecket Filter)语法被广泛用于多种数据包嗅探软件。
使用 BPF 语法创建的过滤器被称为 expression(表达式),并且每个表达式包含一个或多个 primitives(原语)。每个原语包含一个或多个 qualifiers(限定词),然后跟着一个 ID 名字或者数字。

| 限定词 | 说明 | 例子 |
|---|---|---|
| Type | 指出名字或者数字代表的意义 | host、net、port |
| Dir | 指明传输方向是前往还是来自名字或者数字 | src、dst |
| Proto | 限定所要匹配的协议 | arp、ip、tcp、udp、http、ftp、icmp、ipv6 |
操作符分类:
&&连接运算符,与;||选择运算符,或;!否定运算符,非;
1. 查看 TCP 协议的数据包:
tcp
2. 查看 HTTP 协议的数据包:
http
Wireshark 支持很多协议的过滤,比如:ftp、dns、udp、arp、stun 等。
3. 只对原地址是 192.168.0.10 和源端口或目标端口是 80 的流量进行捕获:
src host 192.168.0.10 && port 80
4. 假设你对一个正在和你网络中某个服务器进行交互的主机所产生的流量感兴趣,则可以使用下面过滤器来捕获所有那台主机 IPv4 地址相关的流量:
host 172.16.16.149
如果你在使用一个 IPv6 的网络,则可以这样过滤:
host 2001:db8:85a3:8a2e:370:7334
5. 如果想捕获自来某台主机的流量,则可以加入 src 限定词:
src host 172.16.16.149
6. 如果只想捕获发往 172.16.16.149 服务器的流量,则可以使用 dst 限定词:
dst host 172.16.16.149
如果在一个原语中没有指定一种类型限定符(host、net、port),
host限定词将作为默认选择。所以上面的例子也可以写成dst 172.16.16.149
7. 只对 8080 端口进行流量捕获:
port 8080
8. 捕获除 8080 端口外的所有流量:
!iport 8080
9. 捕获 TCP SYN-ACK 数据包
这种数据包是 TCP 三次握手的第二步,SYN=1,ACK=1。


在数据包中对应的字节二进制值(位于第十四个字节中)为:00010010,转成十进制就是 18(16进制是 0x12)。
tcp[13] == 18


10. 设置了 FIN 位的 TCP 数据包
在 TCP 连接断开时会发送 FIN 标志位来终止这一方向的连接。

FIN 位于第8位,即 00000001,当 FIN 所在的字节 &1 == 1 时说明设置了 FIN 标志位。
tcp[13]&1 == 1
为什么要进行“与”运算呢?因为在一个 TCP 数据包里,多个标志位可能被同时设置,因此多个值可能代表标志位被设置。But,似乎也不用使用 & 运算🤔,如果只想看某个标志位被设置了,其他位都是0,值也是唯一性的。
此外,还可以创建带有取值范围的过滤器:icmp[0:2] == 0x0301 表示检查从数据包头部的偏移量 0 处开始的 2 字节数据,并与十六进制 0301 进行比较。
11. 想要得到代表目标不可达(类型3)信息的 ICMP 数据包:
icmp[0] == 3
ICMP(Internet Control Message Protocol)协议负责提供在 TCP/IP 网络上的设备、服务以及路由器可用性的信息。ICMP 因为
ping工具而广为人知。
可以使用 ping 命令检测一个访问不通的 IP 观察数据包格式:

显示过滤器
显示过滤器更加常用。
在 Wireshark 中有一个过滤器表达式对话框,使得初学者也能很简单的创建捕获和显示过滤器。

表达式操作符:
| 操作符 | 说明 |
|---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
逻辑操作符:
| 操作符 | 说明 |
|---|---|
and | 两个条件同时满足 |
or | 其中一个条件被满足 |
xor | 有且仅有一个条件被满足 |
not | 没有条件被满足 |
例如:
| 过滤器 | 说明 |
|---|---|
!arp | 排除arp协议数据包 |
| tcp.port == 23 || tcp.port == 21 | 过滤出 Telnet 或者 FTP 协议数据包 |
| smtp || pop || imap | 过滤出 SMTP、POP、IMAP 协议 |
ip.addr == 192.168.0.1 or ip.addr == 192.168.0.2 | 只显示出这两个IP地址的数据包 |
tcp.flags.syn == 1 | 具有 SYN 标志位的 TCP 数据包 |
tcp.flags.rst == 1 | 具有 RST 标志位的 TCP 数据包 |
http | 所有 HTTP 流量 |
ip.src == 39.156.66.10 | 捕获来自某个IP主机的流量 |
ip.dst == 39.156.66.10 | 捕获发往某个IP主机的流量 |
还可以保存过滤器规则(显示/捕获过滤器都可以保存),并起一个别名。
