WireShark进阶技巧
1.1 抓包文件处理
1.1.1 保存抓包文件
本文使用WireShark版本为1.11.0,其他版本在界面和功能上可能略有不同,读者请根据自己所使用的版本,自行类推。
有时候,我们需要将抓到的报文保存成文件,以便之后的分析和研究。点击Save As…或者使用快捷键组合“Shift Ctrl S”。
弹出另存为对话框,选择需要保存的文件格式。如果不选择的话,默认保存成pcap或者pcapng文件。
如果不需要保存所有的报文,只需要保存部分报文。则点击Export Specified Packets…
弹出对话框后,可以根据Packet Range来设置自己希望保存的报文。
- All packets:保存所有报文。
- Selected packet:保存选择的报文。
- Marked packets:保存标记的报文,与报文标记功能配合。
- First to last marked:保存第一标记到最后一个标记之间的所有报文。
- Range:保存对应序号的报文。
- Remove Ignored packet:删除已经被标记“忽略”的报文。
其他输出方式可参考以下选项,读者可选择自己希望输出的格式,在此不再赘述。
1.1.2 打开抓包文件
WireShark有两种方法可以打开抓包文件
- 可以直接将抓包文件拖拽到WireShark的主界面来打开它。
- 也可以在主界面使用Open命令来打开。
在你打开新文件时,如果你没有保存当前文件,Wireshark会提示你是否保存,以避免数据丢失,当然你可以在首选项禁止保存提示。
WireShark支持打开的文件格式如下图:
1.1.3 合并抓包文件
有时候你需要将多个抓包文件合并到一起。Wireshark上只能在同一个实体运行一个抓包进程,所以有的情况,可能需要同时开启多个Wireshark实体同时进行抓包,此时合并抓包文件的功能就很有用了。
有两种方法可以合并抓取文件:
- 使用拖放功能,将多个文件拖放到主窗口。Wireshark会创建一个临时文件尝试对拖放的文件按时间顺序进行合并。如果只拖放一个文件,Wireshark可能只是简单地替换已经打开的文件。
- 从"File"菜单使用,选择Merge…
打开的对话框,可以选择如何合并。
- Prepend packets to existing file:将选择文件内的包插入到当前已经载入文件之前
- Merge packets chronologically:将当前选择的文件和已载入的文件里的所有包按时间顺序合并
- Append packets to existing file:将选择文件的包插入到当前载入文件的末尾
1.2 Capture Option
前文我们已经提到过如何使用WireShark抓取一个网卡上的报文。接下来我们介绍一下Capture Option的配置,以便大家更加灵活的使用WireShark来应对各种抓包情况。
Capture Option从如下图菜单打开。
弹出Capture Option对话框。在Capture框里列出的所有本机可识别的网卡,在网卡前打勾即可选定。需要同时抓取多个网卡的报文,则在此选择多块网卡即可。
1.2.1 网卡抓包属性
双击网卡,弹出对话框,设置每块网卡的抓包属性。
- Interface:选择采集数据包的网卡
- IP address:选择的网卡所对应的IP地址
- Link-layer header type:数据链路层的协议,在以太网中一般是Ethernet II
- Buffer size:数据缓存大小设定,默认是2M字节
- Capture packets in promiscuous mode:设定在混杂模式下捕获数据,如果不选中,将只能捕获本机的数据通讯,默认情况下选中该项
- Limit each packet to:设定只捕获数据包的前若干个字节(从以太网头开始计算)。
- Capture Filter:设定当前的数据包采集过滤器
1.2.2 Capture Files
- File:设定数据包文件的保存位置和保存文件名,默认不保存
- User Pcap-ng format:使用pcapng的文件格式保存
- Use multiple files:启用多文件保存,默认不启用
- Next file every:设定每个数据包文件的大小(单位是M,默认1M),只有启用Use multiple files后此项才可用
- Next file every:设定每个数据包文件的大小(单位是分钟,默认1分钟),只有启用Use multiple files后此项才可用
- Ring buffer with:当保存多少个数据包文件后循环缓存,默认是2个文件,即保存2个数据包文件后丢弃缓存中的数据包,再添加新采集到的数据包
- Stop capture after:当保存多少个数据包文件后停止捕获,默认是1个文件
1.2.3 Stop Capture Automatically After…
- packets:捕获到多少个数据包后停止捕获,默认不启用,如启用,默认值是1
- mebibytes:捕获到多少M字节的数据包后停止捕获,默认不启用,如启用,默认值是1 。可以选择其他容量单位。
- minutes:捕获多少分钟后停止捕获,默认不启用,如启用,默认值是1 。可以选择其他时间单位。
1.2.4 Display Options
- Update list of packets in real time:实时更新捕获到的数据包列表信息
- Automatic scrolling in live capture:对捕获到的数据包信息进行自动滚屏显示
- Hide capture info dialog:隐藏捕获信息对话框
1.2.5 Name Resolution
- Enable MAC name resolution:把MAC地址前3位解析为相应的生产厂商
- Enable network name resolution:启用网络地址解析,解析IP,IPX地址对应的主机名
- Enable transport name resolution:启用端口名解析,解析端口号对应的端口名
1.3 Follow TCP Stream
在处理TCP协议时,如果想要查看TCP流中的应用层数据,例如查看telnet流中的密码或者HTTP交互的报文,这些都可以通过Wireshark的"Following TCP streams"功能来实现。
在包列表中选择一个你感兴趣的TCP包,然后选择Wireshark工具栏菜单的"Following TCP Streams"选项(或者使用包列表鼠标右键的上下文菜单)。
Wireshark会创建合适的显示过滤器,并弹出一个对话框显示TCP流的所有数据。
流的内容出现的顺序同他们在网络中出现的顺序一致。从A到B的通信标记为红色,从B到A的通信标记为蓝色。当然,可以在"Edit/Preferences"菜单项的"Colores"修改颜色。
在抓取过程中,TCP流不能实时更新。想得到最近的内容需要重新打开对话框。
你可以用以下格式浏览流数据:
- ASCII:在此视图下你可以以ASCII编码查看数据。此编码最适合基于ASCII的协议,例如HTTP.
- EBCDIC: EBCDIC 是IBM公司的字符二进制编码标准。
- HeX dump:使用16进制来显示原始数据流。
- C Arrays:允许你将流数据导入你自己的C语言程序。
- RAW:允许你载入原始数据到其他应用程序做进一步分析。显示方式与ASCII类似。但在“save As”时,将会保存为二进制文件。
1.4 时间戳
在抓包过程中,每个包在进入时都被加上时间戳,这个时间戳将会保存在抓包文件中,可以在以后分析和研究时使用。
那么,时间戳是从哪里来的呢?Wireshark从libpcap(WinPcap) libraray中获得时间戳。而libpcap(winpcap)又是从操作系统内核获得的时间。如果抓取数据是从文件载入的,很显然Wireshark从文件中获得时间戳数据。
抓取时,Wireshark使用libpcap(WinPcap)抓取库(支持纳秒精度)。除非你在专用的抓取硬件上进行抓取,一般这样的精度已经足够了。
1.4.1 时间格式
在View菜单下,选择Time Display Format下拉菜单,则可以选择合适的时间格式。
可用的预置格式:
- Date and Time of Day(1970-01-01 01:02:03.123456 ):包抓取的绝对日期和时间。
- Time of Day( 01:02:03.123456 ):包抓取的绝对时间。
- Seconds Since Beginning of Epoch(1234567890:123456 ):相对与1970-01-01 00:00:00.000000的包抓取时间。
- Seconds Since Beginning of Capture(123.123456):相对与文件开始抓取的时间或第一个时间参考包的到这个包之前的时间。
- Seconds Since Previous Captured Packet(1.123456):相对前一个抓取包的时间
- Seconds Since Previous Displayed Packet(1.123456):对前一个显示包的时间
- UTC Date and Time of Day(1970-01-01 01:02:03.123456):包抓取的绝对日期和时间(UTC)
- UTC Time of Day(01:02:03.123456):包抓取的绝对时间(UTC)
可用精度:
- Automatic 使用载入文件格式具有的时间戳精度。(默认选项)
- Seconds, Deciseconds, Centiseconds, Milliseconds, Microseconds or Nanoseconds:强制使用你指定的精度。如果实际精度比你指定的低,会在后面自动追加0.如果实际精度比你指定的高。数据会被截尾。
1.4.2 包参考时间
用户可以设置参考时间,以此作为后续包的起始时间。此方法用于查看特定包之间的时间间隔。
在期望作为起点的包上右键,选择Set Time Reference(toggle)。
可以看到包已经被设置为参考时间点,其后的包以此作为起始时间进行显示。
需要注意的是,参考时间是不能保存到包文件中的,关闭文件后就会丢失。而时间参考可能仅仅在时间格式为"Seconds Since Beginning of Capture"模式下有用,其他时间显示形式下可能无法显示。
1.4.3 准确性
Wireshark自身不会创建时间戳,最终是通过读取系统时间来获得。所以,准确性取决于实际的抓取系统,包括操作系统,物理机的性能等等。
通常USB网卡提供的精度会较差,内置的网卡精度较好。
1.5 名字解析
名字解析尝试将数字地址解析成适合人们阅读的格式。WireShark通过系统/网络服务(例如获取主机名)或指定的赋值文件来解析名称。
名字解析可以分协议层进行允许和禁止。
- Resolve Name:立即执行一次名字解析
- Manually Resolve Name:手工解析名字
- Enable for MAC Layer:使能二层解析
- Enable for Transport Layer:使能三层解析
- Enable for Network Layer:使能四层解析
- Use External Network Name Resolver:使用外部的网络名字解析器
1.5.1 以太网名字解析(数据链路层)
以太网地址解析尝试将MAC地址(e.g. 00:0f:e2:45:4f:48)解析为适合阅读的地址。
Wireshark会向操作系统ARP名字解析发出请求,将以太网地址转换为对应的IP地址(e.g. 00:0f:e2:45:4f:48->192.168.0.1)。
如果ARP解析错误,Wireshark会尝试将以太网地址解析为已知设备名。这种解析需要用户指定一个ethers文件为mac地址分配名称。(e.g. 00:0f:e2:45:4f:48 -> H3CSS).
如果ARP解析和ethers文件都无法成功解析,Wireshark会尝试转换mac地址的前三个字节为厂商名的缩写。mac地址的前三个字节是IEEE为各厂商分配的独立地址,通过前三个字节可以得出每个网络设备的供应商,当然这些也是可以修改的。(e.g. 00:0f:e2:45:4f:48 -> Hangzhou_45:4f:48).
1.5.2 IP地址解析(网络层)
IP地址解析将IP地址(e.g. 216.239.37.99)转换为适合阅读的地址。
Wireshark会向DNS请求,将IP地址转换为相关联的主机名(e.g. 216.239.37.99 -> www.google.com)。
如果DNS解析不成功,Wireshark会尝试使用用户提供的主机文件将IP地址转换为对应的主机名。(e.g. 216.239.37.99 -> www.google.com)。
1.5.3 TCP/UDP端口名解析(传输层)
端口名解析将TCP/UDP端口(e.g.80)转换为更加易读的方式。
Wireshark会向操作系统发出请求,转换TCP/UDP端口为已知名称(e.g. 80->http)。
1.6 数据统计
WireShark提供多种多样的统计功能。
1.6.1 Summary
文件摘要。
Comments Summary是以文字形式显示文件摘要。
1.6.2 Protocal Hierarchy
所抓取的所有报文的层次结构统计。
1.6.3 Conversations
不同地址的会话统计。
1.6.4 Endpoints
通讯终端地址统计
1.6.5 Packet Lengths.
包长分布统计。
可以使用display filter先进行包过滤。若是不填写filter,则默认是所抓取的所有报文。
1.6.6 IO Graphs
可以生成包数目随时间变化的曲线图。
- 首先输入filter,选择相应的过滤规则,此处为Display filter;
- 选择图形属性,缺省为线条
- 点击Graph*,即可形成图形
- 可自由调节(X,Y)坐标,来调整图像
1.6.7 其他
其他统计选项都与具体协议和功能有关,读者可自行尝试。
1.7 使WireShark支持更多协议
WireShark是一款开源软件,所以,如果需要让WireShark认出更多的协议报文,一来可以等待WireShark发布新版本,二来可以自行根据标准进行开发。其原理和开发文档读者可自行GOOGLE。
1.7.1 在Ubuntu版本的WireShark中,安装openflow插件
随着我司SDN解决方案的推出,其重要组件VCF Controller是安装在Ubuntu上的。所以有时候需要在Ubuntu下安装支持openflow协议的WireShark,以便后续抓取openflow报文进行研究和分析。
WireShark安装包及插件可以在FTP/测试资料专区中取到。
安装依赖包,将所有的依赖包都装上。再安装WireShark 1.6.7。
将openflow.so上传至 /usr/lib/wireshark/libwireshark1/plugins/
运行WireShark,可以抓到openflow的报文,并看到openflow协议的内容。