loading...
Featured image of post wireshark&tshark简易指北

wireshark&tshark简易指北

原来网络捕获器是这样找东西的

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 frameTCP 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 协议的数据包

最后更新于 2025-08-24
距离小站第一行代码被置下已经过去
使用 Hugo 构建
主题 StackJimmy 设计
...当然还有kakahuote🤓👆