优酷番剧主页:抓取源 ip 为 14.17.92.74 的数据包
src host 14.17.92.74
抓取关于本机 Mac 地址的数据包:因为我的台式机连的是 WiFi 所以选中「WLAN」,如果是网线连接,则直接选择 「本地连接」媒体未断开连接的接口
ipconfig /all
ether src host 8C-...-8C-89
优酷番剧主页:抓取源 ip 为 183.158.198.19 的数据包,并指定端口为 4483
你所创建的大多数过滤器都会关注与一个或一些特定的网络设备。根据这个情况,可以根据设备的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
不仅仅可以基于主机过滤,你还可以对基于每个数据包的端口进行过滤。端口过滤通常被用来过滤使用已知端口的服务和应用。举例来说,下面是一个只对8080端口进行流量捕获的简单过滤器的例子。
port 8080
如果想要捕获除8080端口外的所有流量,如下所示。
!port 8080
端口过滤器可以和传输方向限定符一起使用。举例来说,如果希望只捕获前往监听标准HTTP80端口的Web服务器的流量,使用dst限定符。
dst port 80
协议过滤器可以让你基于特定协议进行数据包过滤。这通常被用于那些不是应用层的不能简单地使用特定端口进行定义的协议。所以如果你只想看看ICMP流量,可以使用下面这个过滤器。
icmp
如果你想看除了IPv6之外的所有流量,下面这个过滤器能够满足要求。
!ip6
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
ip[2:2] - ((ip[0]&0xf)<<2) - ((tcp[12]&0xf0)>>2) != 0
IPv4 数据包总长度 - IPv4 数据包首部长度 - TCP 数据包首部长度 != 0,意味着 IPv4 数据包含有 DATA
(tcp[0:2] > 1500 and tcp[0:2] < 1550) or (tcp[2:2] > 1500 and tcp[2:2] < 1550)
tcp portrange 1501-1549
icmp[icmptype] == icmp-echo and ip[2:2] == 92 and icmp[8:4] == 0xAAAAAAAA
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
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
tcp port 80 and (((ip[2:2] - ((ip[0] & 0xf)<<2)) - ((tcp[12] & 0xf0)>>2)) != 0)
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。
port 80 and tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420
port 80
代表运行在端口 80 上的 HTTP 数据包。
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