捕获过滤
「捕获过滤」(capture filter),一句话解释就是抓包过滤,需要抓取哪些特定的数据包。
可能简单来说的一个原因就是考虑性能,如果明确知道需要或不需要分析某个主机或某些协议类型的流量,那么就可以使用捕获过滤器进行过滤,从而节省处理器资源。因此当网卡传输大量数据流量的时候,通过捕获过滤器进行过滤是很有用处的。但如果性能满足或者你对交互协议不那么清楚的情况下,建议还是抓全包,原因是很有可能过滤掉某些有用的数据包,会导致无法分析到产生问题的真正原因。
其中 Wireshark 捕获过滤器是用 libpcap 过滤语言所编写。该语法概述可见官方 User’s Guide,完整文档可详见:pcap-filter man page 。Wireshark 捕获过滤器与 tcpdump、WinDump、Analyzer 等使用 libpcap/WinPcap 库的任何其他程序使用相同的语法。
语法表达式
<expr> relop <expr>?
-
relop :>,<,>=,<=,=,!= -
expr :一个算术表达式,由整型常量、二进制运算符[+、-、*、/、%、&、|、^、<<、>>]、长度运算符和特定数据包数据引用运算符组成。 -
proto [ expr : size ] proto:ether, wlan, ppp, ip, arp, rarp, tcp, udp, icmp, ip6,指明该引用操作所对应的协议。 expr:给出指定协议层的字节偏移量。 size:可选,表示感兴趣字段中的字节数;它可以是 1、2 或 4 ,默认值是 1 。
简略列举本文案例所需的知识点,详细内容详见官方文档。
实例
诚如以上标题及正文所说,对于捕获过滤,个人建议仍是按需使用,以下实例简析其中二进制运算符 << 和 >> 的使用方式。
网络实例,感谢前人栽树~
- 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
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
总结
概括来说,二进制运算符 << 和 >> ,表示按位左或右移,n 位就是乘以或除以 2 的 n 次方。 在捕获过滤使用时,可以用来统一报文中不同字段的值,考虑的因素有协议字节偏移量、字段单位等等。
|