wireshark过滤语法
运算符
比较运算符
| 操作符 | 别名 | 类C风格 | 描述 | 示例 |
|---|---|---|---|---|
| eq | any_eq | == | 等于 | ip.src == 10.0.0.5 |
| ne | all_ne | != | 不等于 | ip.src != 10.0.0.5 |
| all_eq | === | 全等 | ip.src === 10.0.0.5 | |
| any_ne | !== | 不全等 | ip.src !== 10.0.0.5 | |
| gt | > | 大于 | frame.len > 10 | |
| lt | < | 小于 | frame.len < 128 | |
| ge | >= | 大于或等于 | frame.len ge 0x100 | |
| le | <= | 小于或等于 | frame.len <= 0x20 | |
| contains | 协议、字段或切片包含某个值 | sip.To contains “a1762” | ||
| matches | ~ | 右侧的正则表达式将被用来匹配左侧的字符串 | http.host matches “acme.(org|com|net)” |
等于(==)和全等(===)的区别:
== 是一种宽松的比较,只要有一个值匹配即可(any if more than one)
=== 是一种严格的比较,所有可能的值都必须匹配(all if more than one)
同一个包,使用等于(==)可以过滤出源或目的端口为80报文,使用全等(===)则会匹配源目的端口都为80的报文
ip.addr == 10.0.0.0/8 等价于 ip.src==10.0.0.0/8 || ip.dst==10.0.0.0/8
ip.addr === 10.0.0.0/8 等价于 ip.src==10.0.0.0/8 && ip.dst==10.0.0.0/8
逻辑运算符
| 操作符 | 类C风格 | 描述 | 示例 |
|---|---|---|---|
| and | && | 逻辑与 | ip.src == 10.0.0.5 and tcp.flags.fin == 1 |
| or | || | 逻辑或 | ip.src == 10.0.0.5 or ip.src == 192.1.1.1 |
| xor | ^^ | 逻辑异或,能且只能满足其中一个 | tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29 |
| not | ! | 逻辑非 | ! udp |
| […] | 不涉及 | [a:b]:从第a个字符开始取b个字符 | http.request.method**[0:3]**==“GET” |
| in | 不涉及 | 匹配集合内的元素,代替== | http.request.method in {“HEAD”, “GET”} |
函数
| 函数 | 描述 |
|---|---|
| upper | 将字符串字段转换为大写 |
| lower | 将字符串字段转换为小写 |
| len | 返回字符串字段或字节字段的字节长度 |
| count | 返回帧中字段的出现次数 |
| string | 将非字符串字段转换为字符串 |
| vals | 将字段值转换为其值字符串(如果有) |
| dec | 将无符号整数字段转换为十进制字符串 |
| hex | 将无符号整数字段转换为十六进制字符串 |
| max | 返回参数的最大值 |
| min | 返回参数的最小值 |
| abs | 返回参数的绝对值 |
upper()、lower()
可以使用这两个函数,将字符串转化为大小写,再进行正则匹配,做到不区分大小写的功能
lower(http.server) ~ "apache" //过滤HTTP响应头的server字段为apache的
upper(http.request.method) ~ "post|get" //过滤http请求方法为POST或GET
len()
len()函数将返回字段的字节大小,因此可以和比较操作符配合使用,过滤某个报文字段符合大小要求的报文
len(http.request.uri) >= 10 //过滤http头部的URI字段,大于等于10字节的报文
len(http.host) >= 20 //过滤HTTP主机名大于等于20字节的报文
string()
当字段为非字符串类型,而又想转换为字符串字段再进行正则匹配时,很方便
string(ip.addr) ~ "^10|^11" //过滤IP为10网段开头或者23网段开头的IP
string(ip.dst) matches r"^172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.255" //匹配目的IP中以255结尾的IP地址(172.16到172.31)
max()、min()
max()和min()接受相同类型的任意数量的参数,并分别返回集合中最大/最小的参数
max(tcp.srcport,tcp.dstport) <= 1024 //过滤tcp源端口、目的端口,最大不能超过1024的报文
min(tcp.srcport+tcp.dstport) >= 1024 //过滤tcp源端口+目的端口大于等于1024的报文
过滤IP
1)源地址为192.168.0.1的包
ip.src == 192.168.0.1
2)目的地址为192.168.0.1的包
ip.dst == 192.168.0.1
3)源地址或目的地址是192.168.0.1的包
ip.addr == 192.168.0.1
要原地址和目标地址一样就用===
4)排除上述包
!(表达式)
过滤协议
1)仅捕获某种协议的包
直接写协议名即可,如http(区分大小写)
2)捕获多种协议的包
使用逻辑或
http or telent
3)排除某种协议的包
使用逻辑非
not http
! http
过滤端口(需要指明协议)
1)捕获某一端口的包
tcp.port == 80
2)捕获多端口的包
可以用and来表示多端口并列
tcp.port == 80 and 8080
也可以用比较运算符
udp.port >= 2048
过滤长度、内容
1)长度(数据段的长度)
udp.length >= 30 //udp的payload长度
http.content_length <= 20 //http消息体长度
2)数据包内容
使用matches/contains
过滤时间
frame.time >= "Apr 16, 2021 06:00:00.0" && frame.time <= "Apr 16, 2021 06:59:00.0"
frame.time > "2024-04-11 11:00:00" and frame.time < "2024-04-11 11:01:00"
注意:时间是字符串,要用双引号括起来
tshark基本命令
-r – 从一个已有的捕获文件读取数据包进行分析
**-r 111.pcap:**从名为 111.pcap 的文件中读取数据包并简略打印出来
eg:
1.837951 192.168.1.12 ->192.168.1.5 TCP 72 8080 -> 45940 [FIN, ACK] Seq=1 ...
时间戳 原IP 目标IP 协议 数据包长度 源端口 目标端口 报文标头信息
-n/-N – 禁止反向解析
-n – 禁用域名解析,不对 IP 地址和端口号进行名称解析
默认情况下,tshark 会尝试将捕获到的 IP 地址解析为主机名(192.168.1.1->exaple.com),同时也会将端口号转换为服务名称(如 80 变成 http,443 变成 https 等)
通过使用 -n 参数,可以避免这些解析,直接显示原始的 IP 地址和端口号
eg:
tshark -r file.pcap //直接输出
192.168.1.1 -> example.com 80
tshark -n -r file.pcap //-n输出
192.168.1.1 -> 93.184.216.34 80
-N – 精准控制解析哪些层级
格式:-N <反向解析flag1> -N <反向解析flag2>…
| flag取值 | 含义 |
|---|---|
| d | 对于DNS包启用解析 |
| m | 启用MAC地址解析 |
| n | 启用网络地址解析 |
| N | 使用外部解析器(例如DNS)进行网络地址解析,n需要被同时启用才有效果 |
| t | 启用传输层端口解析 |
| v | 启用VLAN ID的名称解析 |
eg:
tshark -r file.pcap //直接输出
1.837951 192.168.1.12 -> 192.168.1.5 TCP 72 45940 -> 80 [FIN, ACK] Seq=1 Ack=2 ...
tshark -N t -r file.pcap //-N t(解析传输层端口)输出
1.837951 192.168.1.12 -> 192.168.1.5 TCP 72 45940 ->(http)80 [FIN, ACK] Seq=1 Ack=2 ...
↑
-T – 指定输出格式
**-T fields:**仅输出指定的字段(需配合 -e 使用)
**-T text:**以普通文本格式输出(默认)
**-T json:**以 JSON 格式输出
**-T jsonraw:**以 JSON(包含原始数据)格式输出
**-T ek:**以 ElasticSearch 格式输出
-e – 指定显示数据包中的特定字段
格式:-e “字段1” -e “字段2”…
**ip.src:**显示源 IP 地址
**ip.dst:**显示目标 IP 地址
**http.host:**显示 HTTP 请求中的主机名
**http.request.uri:**显示 HTTP 请求中的 URI(即请求的 URL 路径)
**usbhid.data:**只提取USB HID 设备数据
**frame.number:**显示数据包的报文帧数
**frame.time:**显示数据包捕获的时间戳
**frame.len:**显示数据包的长度
eg:
tshark -n -r file.pcap -e "frame.number" -e "ip.addr" -e "tcp.port" -e tcp -T fields
//输出报文帧数、ip地址、端口、tcp协议的字段
1 192.168.1.12,192.168.1.8 37546,80 Transmission Control Protocol,SrcPort: ...
报文帧数 ip地址 端口 tcp协议的字段
-Y – 筛选过滤报文
格式:-Y “过滤条件”
用来过滤分析符合过滤表达式的报文,相当于wireshark最上面的过滤筛选栏功能
eg:
tshark -n -r <filename> -Y "http.host == "web-server1"" //通过http.host过滤
tshark -n -r http-keep-alive.pcap -Y "tcp.flags.syn==1&&tcp.flags.ack==0" //过滤第一次握手的请求
-E – 设置输出的控制字段
通过-T参数来输出特定格式时,可以配合-E参数来设置一些选项
| 参数选项 | 默认 | 含义 |
|---|---|---|
| bom=y|n | n | 在输出前加上UTF-8字节顺序标记(十六进制ef、bb、bf) |
| header=y|n | n | 打印一个使用-e作为输出第一行的字段名称头部 |
| separator=/t|/s|<character> | /t | 设置字段分隔符,默认为/t,可以指定/s,即单个空格,或者自定义的其它字符 |
| occurrence=f|l|a | a | 打印每个字段的第一次(f)/最后一次(l)/或所有出现的内容(a) |
| aggregator=,|/s|<character> | , | 设置用于每个字段内的分割字符 |
| quote=d|s|n | n | 设置用于环绕字段的引号字符 |
n是null,无设置
eg:
tshark -n -r file.pcap -E header=y -E occurrence=l -Y 'icmp.seq==21' -e 'icmp.seq' ... -T fields |column -t
// -E occurrence=l:包通过IPIP封装,occurrence=l指定输出外层IP
// -Y 'icmp.seq==21':指定icmp.seq等于21的ICMP包
// | column -t:将输出通过管道传输给 column 命令,使结果以表格的形式对齐
icmp.seq ip.src ip.dst ip
21 114.132.116.32 113.145.123.23 Internet Protocol Version 4,Src:,Dst:
-2 – 二次依赖分析
没有2以外的参数
tshark会根据上下文报文的依赖关系(tshark称之为two-pass,即进行两次分析),来显示相关报文关联信息,如:response in frame #、reply in frame、TCP Port numbers reused
-i – 指定要捕获数据的网络接口
**-i eth0:**表示从 eth0 网络接口捕获数据包
**-i wlan0:**表示从无线网卡 wlan0 捕获数据包
**-i any:**表示捕获所有接口的流量
**-:**表示从标准输入(stdin)捕获数据流
-f – 应用捕获过滤器,只捕获特定的流量
**-f "tcp":**只捕获 TCP 流量
**-f "port 80":**只捕获端口为 80(HTTP)的流量
**-f "src host 192.168.1.1":**只捕获源地址为 192.168.1.1 的流量
-w – 将捕获的数据包写入到文件中
**-w output.pcap:**将捕获的数据包保存到 output.pcap 文件
**-:**将捕获的内容输出到标准输出(stdout)
options – 其他可选参数
**-V:**显示详细的包信息
**-c <count>:**捕获指定数量的包后停止
**-n:**禁止域名解析,使用 IP 地址而不是主机名显示
<filter> 指定显示过滤器
如果要用过滤器,一定要放到最后
**ip.addr == 192.168.1.1:**仅显示源或目标地址为 192.168.1.1 的包。
**tcp.port == 443:**仅显示端口为 443 的 TCP 数据包(通常用于 HTTPS 流量)。
**http:**仅显示 HTTP 协议的数据包