一、前言
capinfos是Wireshark默认配套安装的命令行工具之一,从其命名来看也能顾名思义,主要用于显示抓包文件的信息,如文件格式、数据包数量、时间范围(首尾包)、数据包类型等。
使用场景大致为以下几种:
- 检查抓包文件的基本信息:前面说过,用于查看抓包文件的格式、数据包数量、时间范围、数据包类型等基本信息,便于了解抓包文件的内容和特征;
- 检查抓包文件的完整性:检查抓包文件是否完整,是否存在数据丢失或损坏的情况;
- 检查抓包文件的时间范围:查看抓包文件中数据包的时间范围,以便于了解抓包文件中数据包的时间分布情况,利于快速判断抓包文件时间范围是否已经覆盖故障出现时间;
- 检查抓包文件的数据包类型:查看抓包文件中数据包的类型,了解抓包文件中数据包的协议分布情况;
- 检查抓包文件的过滤器:检查抓包文件中是否存在过滤器,了解抓包文件中数据包的过滤情况。
本文将详细介绍capinfos的用法案例。
二、安装
Linux
发行版 | 安装命令 |
---|---|
Archlinux | pacman -Sy wireshark-cli |
CentOS/Redhat | yum install -y wireshark |
Debian/Ubuntu | apt install -y wireshark |
Gentoo | emerge --ask wireshark |
Windows
安装wireshark后,capinfos默认在wireshark安装路径:
其它配套命令也都在这个路径下:
添加路径到环境变量还是直接在路径下使用,可自行选择。
MacOS
前提:需要安装homebrew
使用homebrew安装wireshark,默认也会将capinfos安装上去:
代码语言:bash复制brew install wireshark
brew install wireshark-chmodbpf
三、用法案例分析
0.输出所有信息
不接任何参数的情况下默认会引用-A参数,输出所有信息字段。
代码语言:bash复制capinfos <文件名>
这些信息在Wireshark的统计(Statistics) --> 捕获文件属性(Capture File Properties)也有同样的输出:
每个字段代表什么含义实际已经写的很清晰了,没有精准过滤的需求其实已经满足你的需求了,需要更精细化控制和更多拓展用法,则继续阅读下文。
1.通用选项
1)显示文件类型(-t)
-t显示抓包文件的格式类型,文件后缀不一定和实际保存时的文件格式类型完全一致,后缀是可以通过修改文件名后缀来任意进行修改的,-t参数则分析实际的文件注入格式,而不是通过分析文件后缀:
代码语言:bash复制capinfos -t <文件名>
比如上面这个示例,文件http-1.txt以txt结尾的后缀,实际文件格式为pcapng,file命令也能查看文件存储使用的格式;同时,使用通配符*则匹配当前目录下的所有文件,其中sum.pcap、sum.pcapng两个文件多出了一行:Packet size limit: inferred: 60bytes,这一行是包文件中数据帧的推断长度(inferred),这两个文件实际是通过mergecap -s 60来截断后合并保存的。
2)显示数据链路层协议封装类型(-E)
此参数将显示数据链路层使用的封装协议,通常情况下都是以太网(Ethernet),也可能会出现Linux cooked-mode capture,至于Linux cooked-mode capture是什么,可以参考笔者写的这篇文章。简单来讲,它是虚拟协议,在Linux抓包时指定抓包设备为所有时(-i any)可能会出现的情况。
比如下面的案例:
代码语言:bash复制capinfos -E <文件名>
1.pcap、2.pcap的链路层协议均为以太网,且包文件中数据帧的推断长度(inferred)大小为192字节,http-2.pcap的链路层协议为Linux cooked-mode capture,因为这个包是通过tcpdump -i any
来捕获保存的。
3)显示包文件接口信息、链路层协议(-I)
-I选项可以帮助了解抓包文件中的数据包来源,譬如网络接口、链路层协议等:
代码语言:bash复制capinfos -I <文件名>
同时还显示了总包量、时间精度、捕获长度等详细信息。
4)显示包文件的附加信息(-F)
这个选项会尽可能显示能识别到的抓包文件的额外信息,比如时间精度、包文件中每个数据帧的推断长度(inferred)、抓包时使用的抓包程序版本、使用的操作系统:
代码语言:bash复制capinfos -F <文件名>
5)显示文件的SHA256、RIPEMD160和SHA1散列(-H)
这个参数相当于把sha256sum、sha1sum、ripemd160等用来计算文件hash值的工具合并输出了,有利于校验文件一致性,避免抓包文件被篡改的情况:
代码语言:bash复制capinfos -H <包文件>
2.文件大小选项
1)显示包量(-c)
此选项用于打印包文件里的帧数量:
代码语言:bash复制capinfos -c <文件名>
对应在wireshark页面的 统计(Statistics) --> 捕获文件属性(Capture File Properties),也有这部分信息:
2)显示捕获文件的大小(-s)
以字节为单位,统计包文件大小:
代码语言:bash复制capinfos -s <文件名>
如图,File size即为文件大小字段,如果文件过大会自动进行单位转换。
3)显示所有数据包的总长度(-d)
统计包文件中所有包的Length总大小:
代码语言:bash复制capinfos -d <文件名>
以http-2.pcap为例,统计的大小为726字节,我们通过tshark把每个包的frame.len字段值输出出来,并且用awk做一个累加,刚好为726字节:
代码语言:bash复制tshark -n -r <文件名> -T fields -E header=y -e 'ip.src' -e 'ip.dst' -e 'frame.len'|column -t|awk 'NR>1{sum =$NF}END{print sum}'
4)显示数据包大小限制(-l)
此选项会显示包文件抓包时的限制大小(file hdr)和包文件中数据帧的推断长度(inferred):
代码语言:bash复制capinfos -l <文件名>
输出含义如下:
代码语言:bash复制File name: 1.pcap
Packet size limit: file hdr: 2048 bytes #抓包设置的每个帧最大抓包Length
Packet size limit: inferred: 192 bytes #根据包文件里的帧推断的Length
File name: 2.pcap
Packet size limit: file hdr: 2048 bytes #抓包设置的每个帧最大抓包Length
Packet size limit: inferred: 192 bytes #根据包文件里的帧推断的Length
File name: http-2.pcap
Packet size limit: file hdr: (not set) #没有设限
3.时间信息选项
1)统计捕获持续时间(-u)
以秒为单位,显示统计抓包时的持续时间:
代码语言:bash复制capinfos -u <文件名>
以1.pcap为例,如上图,-u统计的时间间隔为2466.796133秒,我们先通过-I选项拿到包文件的总包量:
代码语言:bash复制capinfos -I <文件名>
包量为1911713,也就是说最后一帧的帧序号为1911713;此时通过tshark,来看最后一帧相对于第一帧的时间间隔:
代码语言:bash复制tshark -n -r <文件名> -t r -Y 'frame.number==xxx'
输出结果为2466.796133秒,符合预期。所以可以清晰知道,-u统计方法实际就是尾包减去首包的时间差。
2)显示抓包的开始时间日期(-a)
此参数不用做过多介绍:
代码语言:bash复制capinfos -a <文件名>
还有很多种方式可以查看抓包开始时间,比如通过tshark输出第一帧的时间:
代码语言:bash复制tshark -n -r <文件名> -t ud -Y 'frame.number==1'
-t ud统计的是UTC时间,需要在此基础上 8才是北京时间。
在Wireshark的捕获文件属性里,也能看到首尾包时间:
3)显示抓包的结束时间日期(-e)
与开始(-a)相对的则为-e显示抓包结束时间,实际就是统计尾包的时间日期:
代码语言:bash复制capinfos -e <包文件>
如图,通过tshark统计尾包的UTC时间再 8,也能得到相同的结果。
-a和-e可以同时使用,既显示开始时间又显示结束时间:
代码语言:bash复制capinfos -a -e <包文件>
4)显示抓包文件的时间顺序真假(-o)
当数据帧的顺序没有严格按照时间顺序进行排列时,则会判定为False,反之判定为True:
代码语言:bash复制capinfos -o <文件名>
以下面这个例子为例:
sum-desc.pcap的包序,没有严格按照绝对时间进行排序,-o选项识别为False:
而反观sum.pcap的包序,已经严格按照绝对时间排序,识别为True:
路径下还有1.pcap、2.pcap识别为False:
通过时间戳也可以判断,tshark时间格式设定为-t d(delta时间,相对于上一个frame的时间间隔),如果出现负值,则说明包序不对(即:明明更早就收到了,但排序在后面):
所以-o判定为False。
4.统计分析选项
1)统计数据传输平均速率(-y/-i)
输出单位为字节每秒( Bytes/sec):
代码语言:bash复制capinfos -y <文件名>
Data byte rate字段即为数据传输的平均速率。
输出单位以比特每秒(bit/sec),则为-i选项:
代码语言:bash复制capinfos -i <文件名>
2)统计每个帧的平均大小(-z)
默认以字节为单位:
代码语言:bash复制capinfos -z <文件名>
Average packet size字段即为每个帧的平均大小。
3)统计平均收发包速率(-x)
单位为包量每秒:
代码语言:bash复制capinfos -x <文件名>
统计逻辑也很简单,平均包速率 = 总包量 / 总时间,比如sum.pcap:
5.输出格式选项
选项 | 含义 |
---|---|
-L | 生成长报告,默认行为 |
-T | 以表格形式生成 |
-M | 在长报告中显示机器可读的值 |
值得一讲的是-T参数,-T参数下面还包含一系列子选项:
选项 | 含义 |
---|---|
-R | 生成头记录,默认行为 |
-r | 不生成头记录 |
-B | 使用TAB字符分隔字段,默认行为 |
-m | 使用逗号(,)分隔字段 |
-b | 使用空格分隔字段 |
-N | 不要引用信息,默认行为 |
-q | 使用单引号引用信息 |
-Q | 使用双引号引用信息 |
-T后面接什么按需调整,如果一次性需要读取包信息的内容比较多,可以考虑把输出内容重定向到Excel文件,比如:
代码语言:bash复制capinfos -T <文件名> > output.xlsx
用Excel打开的效果:
输出的字段包含所有信息,因为没有接任何其他选项,默认采用-A,即输出所有信息:
结合前面所讲的参数,你可以任意搭配使用,比如显示包量、文件类型、hash值、抓包持续时间、传输平均速率,可以是:
代码语言:bash复制capinfos -c -t -H -u -y -T <文件名> > output.xlsx
此时输出的字段则为我们想要的内容:
四、总结
本文介绍了capinfos的使用方法及其在实际应用中的案例,也包含了所有重要参数的用法分析,如果没有特殊需求,不加任何参数是最快最高效率的方式。同时,capinfos是Wireshark套件中一个实用的命令行工具,方便快速查看抓包文件(包括但不限于pcap、pcapng等)的元数据信息,包括文件类型、数据链路层类型、数据包数量、文件大小、捕获持续时间等,利于快速定位抓包文件是否覆盖到异常时间点。
附带PDF版本: