简介
Wireshark是一款开源的网络协议分析工具,是遵循GPL协议发布的自由软件,因为以上原因,人们可以很容易在Wireshark上添加新的协议,或者将其作为插件整合到您的程序里,Wireshark支持Linux、Windows、MacOS等多个操作系统。
Wireshark在支持协议的数量方面是出类拔萃的—已经支持数千种协议,这些协议包括从最基础的IP协议和DHCP协议到高级的专门应用协议比如AppleTalk和BitTorrent等。由于Wireshark在开源模式下开发,每次更新都会增加一些对新协议的支持。
wireshark架构
参见下图从功能上,wireshark可以被划分为四个主要模块:Capture Core,WireTap, Protocol Interpreter and Dissector和GUIintrerface。其中Capture Core使用pcap(windows下为winpcap,linux下为libpcap)抓取网络数据包,获取数据包后,WireTap把它保存为二进制文件,interpreter and dissector就是把二进制文件展现成用户容易理解的文本形式,其中dissector又分为build-in和plug-in两种,build-in很好理解,plug-in在1.3节会详细介绍一下;GUIinterface,顾名思义就是用户界面了。
Wireshark的安装
在Windows系统中安装很简单。
第一步:到Wireshark的官方网站http://www.wireshark.org/ 上找到download页面,并选择一个镜像点下载需要的版本。
第二步:下载好exe安装包后,直接安装,一路next,当弹出是否需要安装WinPcap对话框时,务必要勾选install WinPcap选项。
使用Wireshark捕获数据包。
从主下拉菜单中选择Capture的Interfaces菜单项,弹出的窗口显示出所有可以的网卡,选择你想要使用的网卡,点击工具栏的start按钮开始捕获数据,点击工具栏的stop按钮停止捕获。这时Wireshark主窗口中就呈现了相应的数据。
Wireshark主窗口如下图
Packet Lists(数据包列表):显示了当前捕获文件中的所有数据包,包括数据包序号、数据包被捕获的相对时间,源地址、目标地址、协议、概况信息。
Packet Details(数据包详情):分层次的显示了一个数据包中的内容,并且可以展开或是收缩来显示这个数据包中所捕获到的全部内容。
Packet Bytes(数据包字节):同时以十六进制和ASCII码的方式列出报文内容。
。
抓包过滤器的配置
抓包过滤器配置于抓包之前,一经配置,Wireshark将只抓取经过抓包过滤器过滤的数据。抓包过滤器配置派生自libpcap/WinPcap库中tcpdump的语法(可以从
http://wiki.wireshark.org/CaptureFilters找到捕捉过滤范例)。
抓包过滤器的配置步骤:选择Capture | Options,弹出Capture Options窗口。双击选定的网卡,弹出EditInterface Settints窗口。
下图显示了Edit Interface Settings窗口,这里可以设置抓包过滤条件。如果你确知抓包过滤条件的语法,直接在Capture Filter区域输入。在输入错误时,Wireshark通过红色背景区域表明无法处理过滤条件。最有可能的情况是,过滤条件中含有输入错误,或是使用了 display filter的语法。点击Capture Filter按钮查看并选择已保存的抓包过滤条件。
小贴士:
Wireshark包含了一些默认的抓包过滤条件。点击主工具栏的Edit Capture Filters,跳转到已保存抓包过滤列表。你会发现一些常见抓包过滤的示例。
配置Ethernet过滤器
Ethernet过滤器即为第二层(OSI模型的第二层)过滤器,即根据MAC地址来行使过滤功能的抓包过滤器。抓包原理:Ethernet抓包引擎会先拿用户事先指定的源/或目的主机MAC地址,与抓取的以太网流量的源/或目的主机MAC地址相比较,再筛选出源/或目的主机MAC地址相匹配的流量。
- ether host <Ethernet host > 让Wireshark只抓取源于或发往由标识符Ethernethost所指定的以太网主机的以太网帧
例如:ether host00:24:d6:ab:98:b6
- ether dst <Ethernet host > 让Wireshark只抓取发往由标识符Ethernethost所指定的以太网主机的以太网帧
例如:ether dst00:24:d6:ab:98:b6
- ether src<Ethernet host > 让Wireshark只抓取由标识符Ethernethost所指定的以太网主机发出的以太网帧
例如:ether src 00:24:d6:ab:98:b6
- ether broadcast 让Wireshark只抓取所有以太网广播流量
例如:ether broadcast
- ether multicast 让Wireshark只抓取所有以太网多播流量
例如:ether multicast
- ether proto <protocol>所抓以太网流量的以太网协议类型编号,与标识符protocol所定义的以太网协议类型编号匹配
例如:ether proto 0800
- vlan <vlan_id>让Wireshark只抓取由标识符vlan_id所指定的VLAN的流量
例如:vlan 9999
要想让抓包过滤器中的字符串起反作用,需在原词之前添加关键字not或符号“!”
配置主机或网络过滤器
主机或网络过滤器是基于IP地址的第三层过滤器。原理:若根据主机名进行过滤,则wireshark会把用户输入的主机名转换为iP地址,并抓取与这一IP地址相对于的流量。
- host <host> 让Wireshark只抓取源于或发往由标识符host所指定的主机名或IP地址的IP流量。
例如:host 101.10.10.2 host funshion.game.com
- dst host <host> 让Wireshark只抓取发往由标识符host所指定的主机名或IP地址的IP流量。
例如:dst host 101.10.10.2
- src host <host> 让Wireshark只抓取源于由标识符host所指定的主机名或IP地址的IP流量。
例如:src host 101.10.10.2
- net <net > 让Wireshark只抓取源于或发往由标识符net所标识的IPv4/IPv6网络号的流量
例如:net 192.168.1.0/24
- dst <net > 让Wireshark只抓取发往由标识符net所标识的IPv4/IPv6网络号的流量
- src <net > 让Wireshark只抓取源于由标识符net所标识的IPv4/IPv6网络号的流量
- broadcast 让Wireshark只抓取IP广播包
- multicast 让Wireshark只抓取IP多播包
- ip proto <protocol code> 让Wireshark只抓取IP包头的协议类型字段值等于特定值的数据包(比如TCP数据包为6,UDP数据包为17,ICMP数据包为1)
例如:ip proto 1
- icmp [icmptype] == <identifier> 让Wireshark只抓取特定类型[icmptype]的ICMP数据包
例如:icmp [icmptype] ==icmp-echo 或icmp [icmptype] ==8
- ip[2:2] == <number> 用来抓取特定长度的数据包
配置TCP/UDT及端口过滤器
根据第四层协议TCP/UDT的端口号来进行过滤,原理:第四次协议(主要指TCP/UPD)互连末端应用程序的协议,对于TCP和UPD而言,端口号就是用来标识应用程序的代号。
- port <port>Wireshark所抓数据包的源或目的端口号将匹配标识符port所指明的端口号
例如:port 5080
- dst port <port> Wireshark所抓数据包的目的端口号将匹配标识符port所指明的端口号
例如:dst port 80 或 dst port http
- src port <port> Wireshark所抓数据包的源端口号将匹配标识符port所指明的端口号
- tcp portrange <p1>-<p2> 或 udp portrange <p1>-<p2> 用来抓取源或目的端口号介于p1和p2之间的TCP活UDP数据包
例如:tcpportrange 2000-2500
- tcp src portrange <p1>-<p2> 或 udp src portrange <p1>-<p2> 用来抓取源端口号介于p1和p2之间的TCP活UDP数据包
- tcp dst portrange <p1>-<p2> 或 udp dst portrange <p1>-<p2> 用来抓取目的端口号介于p1和p2之间的TCP活UDP数据包
- less <length> 让Wireshark只抓取不长于标识符length所指定长度的数据包,等同于len <=<length>
- greater <length> 让Wireshark只抓取不短于标识符length所指定长度的数据包,等同于len >=<length>
- 复合型过滤器
举例1:让Wireshark只抓取TCP连接中用来发起连接或终止连接的数据包
tcp [tcpflags]& (tcp-syn | tcp-fin)!=0
举例2:让Wireshark抓取来源于game.funshion.com的http流量
hostgame.funshion.com and port 80
配置字节偏移或净载匹配型过滤器
就过滤功能而言,字节偏移或净载匹配型过滤器要更加灵活,可以配置自定义型抓包过滤器。
格式:proto <Offset : bytes> 根据TCP、UDP、IP 等协议头部中的某些字段值来实施过滤
- ip <Offset : bytes> 针对ip层实施过滤
- tcp <Offset : bytes> 针对TCP头部中的某些字段值实施过滤
- udp <Offset : bytes>针对UDP头部中的某些字段值实施过滤
例如:让Wireshark抓取目的端口范围为50~100的TCP数据包
tcp[2:2] >50 and tcp[2:2]<100 (第一个数字2指明从tcp头部的第二个字节起开始检查,第二个数据2指明了检查范围为2个字节)
显示过滤器的配置
显示过滤器配置于抓包之后,一经配置,Wireshark将只显示经过显示过滤器过滤的数据(可以在WiresharkWiki Display页找到发现大量的显示过滤范例。http://wiki.wireshark.org/DisplayFilters)。
与捕捉过滤器使用的语法不同,显示过滤器使用的是Wireshark特定的格式。
显示过滤器比较运算符
1.==或eq
例如:ip.src == 10.2.2.2显示所有源地址为10.2.2.2的IPv4数据流
2. !=或ne
例如:tcp.srcport != 80显示源端口除了80以外的所有TCP数据流
3. >或gt
例如:frame.time_relative > 1显示距前一个报文到达时间相差1秒的报文
4. <或lt
例如:tcp.window_size < 1460显示当TCP接收窗口小于1460字节时的报文
5. >=或ge
例如:dns.count.answers >= 10显示包含10个以上answer的DNS响应报文
6. <=或le
例如:ip.ttl <= 10显示IP报文中Time to Live字段小于等于10的报文
7. Contains
例如:http contains “GET”显示所有HTTP客户端发送给HTTP服务器的GET请求
配置显示过滤器的方法:
1、借助于显示过滤器的窗口,点击过滤器工具条上的Extensions…按钮,弹出Filter Expression窗口,如下图,该窗口由5个重要区域组成
FieldName(协议头部中的字段名称)区域,在该区域,可利用Wireshark预定义的协议模板来配置显示过滤器所含各参数。点最左边的“+”号,即可浏览到相关协议的各个属性(或协议头部中个字段的名称)
Relation(关系)区域,可从该区域选择条件操作符
Value(值)区域,可在该区域的输入栏内输入事先从Field Name区域中选择的协议头部字段的熟悉值
Predefinedvalues(预定义值),该区域的值取决于Field Name设定的协议类型和协议属性
Range(offset:length)(范围(偏移:长度))区域,构造字节偏移型过滤器
2、在显示过滤器工具条的Filter输入栏内直接输入显示过滤语句,可借助于自动补齐特性,来完成过滤器的构造。比如,若在Filter输入栏内输入tcp.f时,自动补齐特性将会生效,会使Wireshark在输入栏下自动列出所有以tcp.f打头的显示过滤器参数。
小贴士:
如何获取显示过滤器所包含的参数:在Wireshark抓包主窗口的数据包结构区域中,只要选中了任意一种协议头部的某个字段,与该字段相对应的显示过滤参数将会出现在抓包主窗口底部状态栏的左侧。
配置Ethernet、ARP、主机和网络过滤器
配置Ethernet(OSI模型的第二层)显示过滤器的目的,让wireshark只显示相关的第二层以太网帧,依据的是MAC地址或Ethernet帧的某些熟悉。
- 常用的Ethernet显示过滤器:
eth.addr==<MACAddress>让wireshark只显示具有指定MAC地址的数据帧
例如:eth.addr==00:24:d6:ab:98:b6 让wireshark只显示具有指定MAC地址00:24:d6:ab:98:b6的数据帧
eth.src==<MAC Address> 让wireshark只显示具有指定源MAC地址的数据帧
例如:eth.src== 00:24:d6:ab:98:b6 让wireshark只显示源于MAC地址为00:24:d6:ab:98:b6的数据帧
eth.dst==<MAC Address>6 让wireshark只显示具有指定目的MAC地址数据帧
例如:eth.dst== 00:24:d6:ab:98:b6 让wireshark只显示目的MAC地址为00:24:d6:ab:98:b6的数据帧
eth.dst== ffff.ffff.ffff 让wireshark只显示以太网广播帧
常用的ARP过滤器
arp.opcode==<value>让wireshark只显示指定类型的ARP帧,例如:
arp.opcode== 1 让wireshark只显示ARP请求帧
arp.opcode== 2 让wireshark只显示ARP应答帧
arp.src.hw_mac==<MAC Address> 让wireshark只显示由指定MAC地址的主机发出的ARP帧
配置ip(OSI模型的第三层)显示过滤器的目的,让wireshark只显示必要的第三层数据包,依据的是IP地址或IP数据包的的某些熟悉
常用的IP和ICMP过滤器
ip.addr== <IP Address>让Wireshark只显示源于或发往设有指定IP地址的主机的数据包
例如:ip.addr==200.1.1.1 and ip.addr ==192.168.1.1
ip.src== <IP Address>让wireshark只显示由设定ip地址发出的数据包
ip.src== 101.10.10.2
ip.dst== <IP Address>让wireshark只显示发往设定ip地址的主机的数据包
ip.ttl==<value>让wireshark只显示IP包头中TTL字段值为指定值的数据包
ip.len==<value>让wireshark只显示指定长度的IP数据包
ip.version==<value>让wireshark只显示指定版本号的IP数据包
!Ip.src== 101.10.10.2让wireshark显示除了设定ip地址之外的所有发出的数据包
配置TCP、UDP主机和网络过滤器
- tcp.port == <value> 或udp.port == <value>让Wireshark在显示数据包时,根据指定的TCP/UDP源、目的端口号来筛选。
例如:tcp.port == 80
tcp.dstport== <value> 或udp.dstport== <value>让Wireshark在显示数据包时,根据指定的TCP/UDP目的端口号来筛选。
例如:tcp.dstport ==80
- tcp.srcport == <value> 或udp.srcport == <value>让Wireshark在显示数据包时,根据指定的TCP/UDP源端口号来筛选。
例如:tcp.srcport ==80
- tcp.flags:Wireshark检查数据包TCP头部中个标记位的置位情况
例如:tcp.flags.syn == 1:让Wireshark显示SYN标记位置1的TCP数据包
tcp.flags.reset ==1:让Wireshark显示RST标记位置1的TCP数据包
tcp.flags.fin== 1:让Wireshark显示FIN标记位置1的TCP数据包
要想让抓包过滤器中的字符串起反作用,需在原词之前添加关键字not或符号“!”
配置应用层协议的显示过滤器
常用的HTTP显示过滤器
http.host== <”hostname”> :让Wireshark只显示访问某指定主机名的HTTP协议数据包
http.request.method== ”GET”: 让Wireshark只显示包含HTTP GET方法的HTTP协议数据包
http.request.uri== <”Full request URI”>让Wireshark只显示HTTP客户端发起的包含指定URI请求的HTTP协议数据包。
http.request.uricontens “URI String” 让Wireshark只显示HTTP客户端发起的包含指定字符串的URI请求的HTTP协议数据包。
http.cookie:让Wireshark只显示网络中传播的所有包含cookie请求的HTTP协议数据包
http.set_cookie:让Wireshark只显示所有包含由HTTP服务器发送给HTTP客户端的cookie set命令的HTTP协议数据包。
(http.set_cookie)&& (http contens”google”):让Wireshark只显示所有由google HTTP服务器发送给HTTP客户端,且包含cookie set命令的HTTP协议数据包
httpmatches “\.zip” && http.request.method == “GET”:让Wireshark只显示包含ZIP文件的HTTP数据包。
常见的DNS显示过滤器
让Wireshark只显示DNS查询和DNS响应数据包
dns.flags.response== 0 (DNS 查询)
dns.flags.response== 1(DNS 响应)
让Wireshark只显示所有anser count字段值大于或等于4的DNS响应数据包
dns.count.answers>=4
配置字节偏移型过滤器
通用格式为:protocols[x:y] == <value> 先通过x来定位到数据包协议头部中的某个字段,并检查接下来y个字节的值是否等于value,Wireshark根据检查结果来显示抓包文件中的相关数据。这种过滤器的应用场合非常广泛,只要熟知各种协议头部的格式,对其中各字段的位置及长度了然于胸,就能使用它在抓包文件中筛选出自己想看的数据包。
例如:eth.dst[0:3] == 01:00:5e,让Wireshark只显示IPV4多播数据包