1,分析数据包
- Wireshark允许你对符合一定条件的数据包进行标记,或者打印数据包以供参考。
1.1,保存和导出捕获文件
-
如果想找到符合特定条件的数据包,可以使用Ctrl+F快捷键打开Wireshark的搜索框,提供了三种搜索方式。
- 显示过滤器(Display filter)
- 允许你通过输入表达式进行筛选,只找出满足该表达式的数据包。
- 十六进制值(Hex Value)
- 使用你输入的十六进制数,对数据包进行搜索。
- 字符串(String)
- 使用你所输入的字符串,对数据包进行搜索。可以在搜索上设置是否区分大小写和其他的格式。
- 显示过滤器(Display filter)
1.2,标记数据包
-
在找到符合搜索条件的数据包之后,可以根据需要进行标记。被标记的数据包会以黑底白字显示。
-
如果想标记一个数据包可以使用快捷键Ctrl+M,如果想取消标记再按一次Ctrl+M组合键。
-
在一次捕获中,你想标记多少个数据包都可以;如果想要在标记的数据包之间前后切换,那么分别按Shift+Ctrl+N和Shift+Ctrl+B组合键即可。
2,设定时间显示格式和相对参考
2.1,时间显示格式
-
Wireshark所捕获的每一个数据包都会由操作系统给予一个时间戳。Wireshark可以显示这个数据被捕获时的绝对时间戳,也可以是与上一个被捕获的数据包或是捕获开始及结束相关的相对时间戳。
-
时间相关的选项可以在视图菜单中找到,可以让你根据你的需要设置时间的精度。
-
时间表示格式选项可以让你根据时间显示方式调整不同的设置。包含了日期和时间,UTC日期和时间,自UNIX纪元起的秒数,自第一个包起的秒数(默认),自上一个包起的秒数等。
-
格式选项允许你选择不同的格式,而精度选项允许你将精度设定为自动或者手动,比如秒,毫秒,微秒等。
-
从多个设备之间比较包数据,一定要确保这些设备之间的时间是同步的。特别是当你做取证分析和检查问题时,可以使用网络时间协议(NTP)来确保网络设备的时间是同步的。
2.2,数据包的相对时间参考
-
数据包的相对时间参考,允许你以一个数据包作为基准,而之后的数据包都以此计算相对时间戳。当检查在捕获文件之外的某个点触发的一系列连续事件时,这个功能会十分有用。
-
如果希望将某个数据包设定为时间参考,可以点击作为相对参考的数据包,使用快捷键Ctrl+T。(取消设置再次使用Ctrl+T快捷键)设置完成后数据包的Time列会显示为REF。
-
只有当捕获的时间格式设定为与捕获开始相对的时间时,设定数据包时间参考才有用处。使用其他设定都不会生成有用的结果。
2.3,时间偏移
- 有时可能会遇到来自不同源的包数据,它们之间的时间是不同步的。Wireshark提供了一项时间偏移的功能,通过把包的时间戳整体偏移调整,来减轻在分析中可能遇到的麻烦。
- 要对一个或多个包的时间戳进行偏移调整,可以使用快捷键Ctrl+Shift+T,打开偏移窗口,可以设定一个时间区间,来对所有包的时间进行调整,或对一个包设置时间戳。
3,设定捕获选项
- Wireshark在捕获(Capture)->选项(Options)中提供了三个标签页:输入,输出和选项。
3.1,输入标签页
- 主要目的就是显示所有可以抓包的硬件接口和有关这些接口的基本信息。
- 在输入标签页区域,可以直接双击来修改接口的大多数设置。
3.2,输出标签页
-
输出标签页允许你把所抓的流量包存成一个文件。可以使管理捕获流量包的存储方式更具灵活性。可以选择把流量包都存成一个文件,文件集或使用环状缓冲来控制创建文件的个数。使用此功能,可以在文件文本框内输入一个完整的绝对路径和名字,也可以通过浏览(Browse)按钮来选择一个目录并给文件起名。
-
当捕获大流量或进行长时间转包时,可以使用文件集合,文件集合就是按照特定的条件组成的多个文件的分组。要保存成文件集合,需要单击**Create a new file automatically…**选项。
-
Wireshark使用多个不同的基于时间或文件大小的触发器,来管理保存为文件集合。要开启其中的一个触发器,可以选中该触发器,用小箭头按钮调节比率大小并选择单位。
-
使用ring buffer(环状缓冲)允许你指定一个特定的文件数量,一旦超过此数量,Wireshark就会用新数据覆盖最老的数据。(一旦最后的文件被写满了,则第一个文件就会被覆盖。先进先出,FIFO)。
3.3,选项标签页
1,显示选项
- Display部分用来控制捕获的数据包如何进行显示。
- Update list of packets in real-time(实时更新数据包列表)。
- Automatically scroll during live capture(在当前捕获中进行自动滚动)。
- Show capture information during live capture(实时捕获期间显示捕获信息)。
2,名称解析选项
- 允许你在捕获中,启用自动的数据链路层,网络层和传输层的名称解析。
3,停止捕获选项
- 允许你在满足一定的触发条件时停止正在进行的捕获。
- 可以使用文件大小,时间间隔或数据包的数目作为触发条件。
4,过滤器
- Wireshark提供了两种主要的过滤器。
- 捕获过滤器:
- 当进行数据包捕获时,只有那些满足给定的包含/排除表达式的数据包会被捕获。
- 显示过滤器:
- 该过滤器根据指定的表达式用于一个已捕获的数据包集合,它将隐藏不想显示的数据包,或者只显示那些需要的数据包。
- 捕获过滤器:
4.1,捕获过滤器
- 捕获过滤器用于进行数据包捕获的实际场合,使用它的主要原因是性能。如果你并不需要分析某个类型的流量,则可以简单地使用捕获过滤器过滤掉它,从而节省那些会被用来捕获这些数据包的处理器资源。
- 当处理大量数据时,创建自定义的捕获过滤器是相当好用的,它可以让你专注于那些与你手头事情有关的数据包,从而加速分析过程。
- 假设你正在解决一个运行于xxx端口网络服务的问题,如果你正在分析的那台机器在许多端口运行了各种不同的网络服务,那么找到并分析只运行于xxx端口的流量本身可能就具有一定的工作量。那么你可以通过捕获对话框达到目的,步骤如下:
-
选择捕获(Capture)->选项(Options)按钮打开捕获接口对话框。
-
选择你想进行数据包捕获的设备,然后在最右列选中捕获过滤器。
-
单击该列以输入一个表达式来应用捕获过滤器。如我希望过滤器只显示出8894端口的出站和入站流量。如图。
-
当设置好过滤器之后,单击Start开始捕获。
-
当收集到足够多的样本之后,你应该只能看见端口8894的流量。
-
1,捕获过滤器的BPF语法
-
捕获过滤器应用于libpcap/WinPcap,并使用Berkeley Packet Filter(BPF)语法。主要因为大部分数据包嗅探软件都依赖于使用BPF的libpcap/Winpcap库。
-
使用BPF语法创建的过滤器被称为expression(表达式),并且每个表达式包含一个或多个primitices(原语)。每个原语包含一个或多个qualifiers(限定词),然后跟着一个ID名字或数字。如下表(BPF限定词)。
-
限定词 说明 例子 Type 指出名字或数字所代表的意义 host,net,port Dir 指明传输方向是前往还是来自名字或数字 src,dst Proto 限定所要匹配的协议 Ether,ip,tcp,udp,http,ftp
-
-
可以使用3种逻辑运算符,对原语进行组合,从而创建更高级的表达式:
- 连接运算符 与 (&&)
- 选择运算符 或 (||)
- 否定运算符 非 (!)
-
如下面表达式只对源地址是192.168.0.10和源端口或目标端口是80的流量进行捕获。
-
src host 192.168.0.10 && port 80
-
2,主机名和地址过滤器
-
可以根据设备的MAC地址,IPv4地址,IPv6地址或DNS主机名配置过滤规则。
-
创建使用host限定词的过滤器,捕获IPv4地址相关的流量。如下:
-
host 192.168.0.11
-
-
创建使用host限定词的过滤器,捕获IPv6地址相关的流量。如下:
-
host 2001:db8:85a3:8a2e:370:7334
-
-
创建使用host限定词的过滤器,捕获基于设备主机名相关的流量。如下:
-
host ym-pc
-
-
考虑到设备的IP地址可能会发生变化,则可以通过加入ether协议限定词,对它的MAC地址进行过滤。如下:
-
ether host 00-1a-a0-52-e2-a0
-
-
传输方向限定词通常会和上面的例子演示的过滤器一起使用,来捕获流向或者流出某台主机的流量。如想捕获来自某台主机的流量则可以加入src限定词。
-
src host 192.168.0.11
-
-
如果只想捕获发往192.168.0.11的流量,则可以使用dst限定词。
-
dst host 192.168.0.11
-
-
如果在一个原语中没有指定一种类型限定符(host,net或port),host限定词将作为默认选择,及就是。
-
dst host 192.168.0.11 等价于 dst 192.168.0.11
-
3,端口过滤器
-
基于每个数据包的端口进行过滤,端口过滤通常被用来过滤使用已知端口的服务和应用。
-
如只对8080端口进行流量捕获。
-
port 8080
-
-
如想捕获除8080端口外的所有端口的流量。
-
!port 8080
-
-
端口过滤器可以和传输方向限定符一起使用。如希望只捕获访问标准HTTP80端口的Web服务器,则可以使用dst限定符。
-
dst port 80
-
4,协议过滤器
-
协议过滤器允许你基于特定协议进行数据包过滤。这通常被用于那些非应用层的不能简单地使用特定端口进行定义的协议。如果你只想看一看ICMP流量,则可以使用如下过滤器。
-
icmp
-
-
如果你想看除了IPv6之外的所有流量,则可使用如下过滤器。
-
!ip6
-
5,协议域过滤器
-
BPF语法提供了一项强大的功能,就是可以通过检查协议头中的每一个字节来创建基于那些数据的特殊过滤器。
-
举例,假设我们想要基于ICMP过滤器的类型域进行过滤,而类型域位于数据包的最开头也就是偏移量为0的位置,那么我们可以通过在协议限定符后输入由方括号括起的字节偏移量,在这个例子中就是icmp[0],来指定我们想在一个数据包内进行检查的位置。这样将返回一个1字节的整型值用于比较。如果只想要得到代表目标不可达(类型3)信息的ICMP数据包,则我们可在过滤器表达式中令其等于3,如下
-
icmp[0]==3
-
-
如果只想要检查代表echo请求(类型8)或echo回复(类型0)的ICMP数据包,则可以使用带OR运算符的两个原语:
-
icmp[0]==8||icmp[0]==0
-
-
上面的过滤器虽然很好用,但是它们只能基于数据包头部的1个字节进行过滤。当然,也可以在方括号中偏移值的后面以冒号分割加上一个字节长度,来指定你希望返回给过滤器表达式的数据长度。
-
如,假设我们要创建一个过滤器,该过滤器捕获所有ICMP目标——不可访问,主机不可达的数据包(类型3,代码1).这些是1字节的字段,它们与偏移量为0的数据包头部相邻。为此,我们创建了一个过滤器,它检查从数据包头部的偏移量0处开始的2字节数据,并于十六进制值0301(类型3,代码1)进行比较,如下。
-
icmp[0:2]==0x0301
-
6,捕获过滤器表达式样例
- 常见捕获过滤器
过滤器 | 说明 |
---|---|
tcp[13]&32==32 | 设置了URG位的TCP数据包 |
tcp[13]&16==16 | 设置了ACK位的TCP数据包 |
tcp[13]&8==8 | 设置了PSH位的TCP数据包 |
tcp[13]&4==4 | 设置了RST位的TCP数据包 |
tcp[13]&2==2 | 设置了SYN位的TCP数据包 |
tcp[13]&1==1 | 设置了FIN位的TCP数据包 |
tcp[13]==18 | TCP SYN-ACK数据包 |
ether host 00:00:00:00:00:00 (替换为你的MAC) | 流入或流出你MAC地址的流量 |
!ether host 00:00:00:00:00:00 (替换为你的MAC) | 不流入或流出你MAC地址的流量 |
broadcast | 仅广播流量 |
icmp | ICMP流量 |
icmp[0:2] | ICMP目标不可达,主机不可达 |
ip | 仅IPv4流量 |
ip6 | 仅IPv6流量 |
udp | 仅UDP流量 |
4.2,显示过滤器
-
显示过滤器应用于捕获文件,用来告诉Wireshark只显示那些符合过滤条件的数据包。
-
显示过滤器比捕获过滤器更加常用,因为它可以让你对数据包进行过滤,却并不省略掉捕获文件中的其他数据。
-
有时,你可能会需要使用显示过滤器,来清理过滤文件中不相关的广播流量,但是那些ARP广播之后可能会有用,所以最好是将它们暂时过滤掉,而不是删除它们。
-
如果想过滤掉捕获窗口中所有的ARP数据包,将鼠标移动到Packet List面板上方的Filter文本框中,然后输入**!arp**,就可以从Packet List面板中去掉ARP数据包了,如下图,如果想要删除过滤器,可点击X按钮;如果想要保存过滤器,则可单击**+**按钮。
-
应用过滤器有两种方法,一种是向上面的例子一样直接输入合适的语法表达式;另一种是使用显示过滤器对话框(简单方法)来选择构建。
1,过滤器表达式对话框(简单方法)
-
如果想打开这个对话框,则可以先在分析对话框中单击Display Filter Expression按钮。
- 单击一个协议前面的**>**符号,展开所有与这个协议有关可作为条件的域,找到你要在过滤器中使用的那一项,单击选中。或使用搜索。如ip.src。
- 选择一个你想要在选中条件域和条件值之间建立的关系,如等于,大于和小于等。
- 通过一个和你选中条件域相关的条件值来创建过滤器表达式。你可以自己定义一个值,也可以从Wireshark预定义的值中选择一个。
- 当你完成所有上述步骤时,单击ok就可以看到你的过滤器表达式的文本表示。
2,过滤器表达式语法结构(高级方法)
-
过滤器表达式的比较操作符
操作符 说明 == 等于 != 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于 -
过滤器表达式的逻辑操作符
操作符 说明 and 两个条件需同时满足 or 其中一个条件被满足 xor 有且仅有一个条件被满足 not 没有条件被满足 -
如,创建一个只显示192.168.0.1这个IP地址相关数据包的过滤器。
-
ip.addr == 192.168.0.1
-
-
如,只显示192.168.0.1和192.168.0.2的数据包。
-
ip.addr = 192.168.0.1 or 192.168.0.2
-
3,显示过滤器表达式实例
过滤器 | 说明 |
---|---|
!tcp.port ==3389 | 排除RDP流量 |
tcp.flags.syn==1 | 具有SYN标识位的TCP数据包 |
tcp.flags.rst==1 | 具有RST标识位的TCP数据包 |
!arp | 排除ARP流量 |
http | 所有HTTP流量 |
tcp.port23||tcp.port21 | 文本管理流量(Telnet或FTP) |
smtp||pop||imap | 文本email流量(SMTP,POP或IMAP) |
4.3,保存过滤器规则
-
想要保存一个自定义的捕获过滤器规则,可以按照如下步骤进行。
- 选择捕获(Capture)->捕获过滤器(Capture Filters)->打开捕获过滤器窗口。
- 在对话框的左边单击(+)按钮,创建一个新的过滤器。
- 在Filter Name框中给你的过滤器起一个名字。
- 在Filter Expression框中输入实际的过滤器表达式。
- 单击ok按钮。
-
保存自定义的显示过滤器规则。
- 在主窗口的过滤条栏里输入你的过滤表达式,然后点击左侧按钮,单击保存此过滤器选项。
- 弹出一个有着之前保存过的所有显示过滤器列表的对话框。最后点击ok。