WireShark 捕获过滤器的超全使用教程——数据包抓取实战-灵析社区

熊Sir

(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

(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

阅读量:2048

点赞量:0

收藏量:2