首页 > theory > network > > 正文

wireshark使用教程及过滤语法总结——血泪史的汇聚

发布人:zhoulujun@live.cn    点击:

这篇文章详细讲解了,wireshark抓包的使用,过滤规则的使用,说明,常用规则集合。看了这边文章,网络抓包分析,还不会,我就懒得说你了……

wireshark介绍

wireshark的官方下载网站: http://www.wireshark.org/

wireshark是非常流行的网络封包分析软件,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。

wireshark是开源软件,可以放心使用。

Wireshark是一款高效免费的网络抓包分析工具。它可以捕获并描述网线当中的数据,如同使用万用表测量电压一样直观地显示出来。在网络分析软件领域,大多数软件要么晦涩难懂要么价格昂贵,Wireshark改变了这样的局面,它的最大特点就是免费、开源和多平台支持。

Wireshark几乎可以运行于所有流行的操作平台,如MS Windows、Mac OS、Linux、FreeBSD、HP-UX、NetBSD、Solaris/i386、Solaris/sparc等等。尽管Wireshark可以在很多操作平台使用,但它支持的传输媒介主要是Ethernet。只有Linux平台下Wireshark支持802.11及Token Ring、FDDI和ATM。

Wireshark能够对大部分局域网协议进行解析,具有界面简单、操作方便、实时显示捕获数据的优点。但Wireshark并不具有分析功能,当一个网络发生异常的时候,Wireshark只会记录数据,它仅仅是一个测量工具,并不能操作网络,不发送数据包或者做其它的主动动作。

使用wireshark的人必须了解网络协议,否则就看不懂wireshark了。

Wireshark不能做的 

为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。


什么人会用到wireshark

1. 网络管理员会使用wireshark来检查网络问题

2. 软件测试工程师使用wireshark抓包,来分析自己测试的软件

3. 从事socket编程的工程师会用wireshark来调试

4. 听说,华为,中兴的大部分工程师都会用到wireshark。

 

总之跟网络相关的东西,都可能会用到wireshark.

wireshark 开始抓包

wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。

点击Caputre->Interfaces.. 出现下面对话框,选择正确的网卡。然后点击"Start"按钮, 开始抓包

wireshark过滤语法总结



wireshark过滤语法总结

 

Wireshark 窗口介绍


Wireshark 窗口介绍

WireShark 主要分为这几个界面

1. Display Filter(显示过滤器),  用于过滤

2. Packet List Pane(封包列表), 显示捕获到的封包, 有源地址和目标地址,端口号。 颜色不同,代表

3. Packet Details Pane(封包详细信息), 显示封包中的字段

4. Dissector Pane(16进制数据)

5. Miscellanous(地址栏,杂项)

Wireshark 显示过滤


Wireshark 显示过滤

使用过滤是非常重要的, 初学者使用wireshark时,将会得到大量的冗余信息,在几千甚至几万条记录中,以至于很难找到自己需要的部分。搞得晕头转向。

过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。

过滤器有两种,

一种是显示过滤器,就是主界面上那个,用来在捕获的记录中找到所需要的记录

一种是捕获过滤器,用来过滤捕获的封包,以免捕获太多的记录。 在Capture -> Capture Filters 中设置

保存过滤

在Filter栏上,填好Filter的表达式后,点击Save按钮, 取个名字。比如"Filter 102",


Filter栏上就多了个"Filter 102" 的按钮。

过滤器的区别

捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中。需要在开始捕捉前设置。

显示过滤器(DisplayFilters):在捕捉结果中进行详细查找。他们可以在得到捕捉结果后随意修改。

那么我应该使用哪一种过滤器呢?

两种过滤器的目的是不同的。

捕捉过滤器是数据经过的第一层过滤器,它用于控制捕捉数据的数量,以避免产生过大的日志文件。

显示过滤器是一种更为强大(复杂)的过滤器。它允许您在日志文件中迅速准确地找到所需要的记录。

两种过滤器使用的语法是完全不同的。

捕捉过滤器

语法:ProtocolDirectionHost(s)ValueLogical OperationsOther expression
例子:tcpdst10.1.1.180andtcp dst 10.2.2.2 3128

Protocol(协议):

可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.

如果没有特别指明是什么协议,则默认使用所有支持的协议。

Direction(方向):

可能的值: src, dst, src and dst, src or dst

如果没有特别指明来源或目的地,则默认使用 “src or dst” 作为关键字。

例如,”host 10.2.2.2″与”src or dst host 10.2.2.2″是一样的。

Host(s):

可能的值: net, port, host, portrange.

如果没有指定此值,则默认使用”host”关键字。

例如,”src 10.1.1.1″与”src host 10.1.1.1″相同。

Logical Operations(逻辑运算):

可能的值:not, and, or.

否(“not”)具有最高的优先级。或(“or”)和与(“and”)具有相同的优先级,运算时从左至右进行。

例如,

“not tcp port 3128 and tcp port 23″与”(not tcp port 3128) and tcp port 23″相同。

“not tcp port 3128 and tcp port 23″与”not (tcp port 3128 and tcp port 23)”不同。

过滤表达式的规则

表达式规则

 1. 协议过滤

比如TCP,只显示TCP协议。

2. IP 过滤

比如 ip.src ==192.168.1.102 显示源地址为192.168.1.102,

ip.dst==192.168.1.102, 目标地址为192.168.1.102

3. 端口过滤

tcp.port ==80,  端口为80的

tcp.srcport == 80,  只显示TCP协议的愿端口为80的。

4. Http模式过滤

http.request.method=="GET",   只显示HTTP GET方法的。

5. 逻辑运算符为 AND/ OR

常用的过滤表达式

过滤表达式用途
http只查看HTTP协议的记录
ip.src ==192.168.1.102 or ip.dst==192.168.1.102源地址或者目标地址是192.168.1.102
eth.addr== 00:11:22:33:44:55//过滤目标或源地址是00:11:22:33:44:55的数据包
tcp dst port 3128显示目的TCP端口为3128的封包。
ip src host 10.1.1.1显示来源IP地址为10.1.1.1的封包。


host 10.1.2.

显示目的或来源IP地址为10.1.2.3的封包。
src portrange 2000-2500显示来源为UDP或TCP,并且端口号在2000至2500范围内的封包。


src host 10.7.2.12 and not dst net 10.200.0.0/16

显示来源IP地址为10.7.2.12,但目的地不是10.200.0.0/16的封包。
(src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8显示来源IP为10.4.1.12或者来源网络为10.6.0.0/16,目的地TCP端口号在200至10000之间,并且目的位于网络 10.0.0.0/8内的所有封包。

src net 192.168.0.0/24

src net 192.168.0.0 mask 255.255.255.0

显示来源IP地址为10.1.1.1的封包。

注意事项:

当使用关键字作为值时,需使用反斜杠“/”。

“ether proto /ip” (与关键字”ip”相同).

这样写将会以IP协议作为目标。

“ip proto /icmp” (与关键字”icmp”相同).

这样写将会以ping工具常用的icmp作为目标。

可以在”ip”或”ether”后面使用”multicast”及”broadcast”关键字。

当您想排除广播请求时,”no broadcast”就会非常有用。

Protocol(协议):

您可以使用大量位于OSI模型第2至7层的协议。点击”Expression…”按钮后,您可以看到它们。

比如:IP,TCP,DNS,SSH

String1, String2 (可选项):

协议的子类。

点击相关父类旁的”+”号,然后选择其子类。

Comparison operators (比较运算符):

可以使用6种比较运算符:

英文写法:C语言写法:含义:
eq==等于
ne!=不等于
gt>大于
lt<小于
ge>=大于等于
le<=小于等于

Logical expressions(逻辑运算符):

英文写法:C语言写法:含义:
and&&逻辑与
or||逻辑或
xor^^逻辑异或
not!逻辑非

显示过滤器

语法:Protocol.String 1.String 2Comparison
operator
ValueLogical
Operations
Other
expression
例子:ftp
passive
ip==10.2.3.4xoricmp.type

例子:

snmp || dns || icmp显示SNMP或DNS或ICMP封包。
ip.addr == 10.1.1.1

显示来源或目的IP地址为10.1.1.1的封包。

ip.src != 10.1.2.3 or ip.dst != 10.4.5.6

显示来源不为10.1.2.3或者目的不为10.4.5.6的封包。
换句话说,显示的封包将会为:
来源IP:除了10.1.2.3以外任意;目的IP:任意
以及
来源IP:任意;目的IP:除了10.4.5.6以外任意

ip.src != 10.1.2.3 and ip.dst != 10.4.5.6

显示来源不为10.1.2.3并且目的IP不为10.4.5.6的封包。
换句话说,显示的封包将会为:
来源IP:除了10.1.2.3以外任意;同时须满足,目的IP:除了10.4.5.6以外任意

tcp.port == 25显示来源或目的TCP端口号为25的封包。
tcp.dstport == 25显示目的TCP端口号为25的封包。
tcp.flags显示包含TCP标志的封包。
tcp.flags.syn == 0×02显示包含TCP SYN标志的封包。

如果过滤器的语法是正确的,表达式的背景呈绿色。如果呈红色,说明表达式有误。


 wireshark过滤匹配表达式实例


匹配过滤HTTP的请求URI中含有".gif"字符串,并且以.gif结尾(4个字节)的http请求数据包($是正则表达式中的结尾表示符)

http.request.uri matches ".gif$" 

注意区别:http.request.uri contains ".gif$" 与此不同,contains是包含字符串".gif$"(5个字节)。匹配过滤HTTP的请求URI中含有".gif$"字符串的http请求数据包(这里$是字符,不是结尾符)

搜索过滤MAC地址前3个字节是0x001e4f的数据包。

eth.addr[0:3]==00:1e:4f 

搜索按条件过滤udp的数据段payload(数字8是表示udp头部有8个字节,数据部分从第9个字节开始udp[8:])

udp[8]==14        (14是十六进制0x14)匹配payload第一个字节0x14的UDP数据包

udp[8:2]==14:05 可以udp[8:2]==1405,且只支持2个字节连续,三个以上须使用冒号:分隔表示十六进制。 (相当于 udp[8]==14 and udp[9]==05,1405是0x1405)

udp[8:3]==22:00:f7 但是不可以udp[8:3]==2200f7

udp[8:4]==00:04:00:2a,匹配payload的前4个字节0x0004002a

而udp contains 7c:7c:7d:7d 匹配payload中含有0x7c7c7d7d的UDP数据包,不一定是从第一字节匹配。

udp[8:4] matches "\\x14\\x05\\x07\\x18"

udp[8:] matches "^\\x14\\x05\\x07\\x18\\x14"


搜索按条件过滤tcp的数据段payload(数字20是表示tcp头部有20个字节,数据部分从第21个字节开始tcp[20:])

tcp[20:] matches "^GET [ -~]*HTTP/1.1\\x0d\\x0a"

等同http matches "^GET [ -~]*HTTP/1.1\\x0d\\x0a"


tcp[20:] matches "^GET (.*?)HTTP/1.1\\x0d\\x0a"

tcp[20:] matches "^GET (.*?)HTTP/1.1\\x0d\\x0a[\\x00-\\xff]*Host: (.*?)pplive(.*?)\\x0d\\x0a"

tcp[20:] matches "^GET (.*?)HTTP/1.1\\x0d\\x0a[\\x00-\\xff]*Host: "

tcp[20:] matches "^POST / HTTP/1.1\\x0d\\x0a[\\x00-\\xff]*\\x0d\\x0aConnection: Keep-Alive\\x0d\\x0a\\x0d\\x0a"


检测SMB头的smb标记,指明smb标记从tcp头部第24byte的位置开始匹配。

tcp[24:4] == ff:53:4d:42


检测SMB头的smb标记,tcp的数据包含十六进制ff:53:4d:42,从tcp头部开始搜索此数据。

tcp contains ff:53:4d:42

tcp matches "\\xff\\x53\\x4d\\x42"


检测tcp含有十六进制01:bd,从tcp头部开始搜索此数据。

tcp matches "\\x01\\xbd"


检测MS08067的RPC请求路径

tcp[179:13] == 00:5c:00:2e:00:2e:00:5c:00:2e:00:2e:00

                  \      .     .     \     .     .

封包列表(Packet List Pane) 

封包列表的面板中显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。 你可以看到不同的协议用了不同的颜色显示。

你也可以修改这些显示颜色的规则,  View ->Coloring Rules.


 封包列表(Packet List Pane)


封包详细信息 (Packet Details Pane)

这个面板是我们最重要的,用来查看协议中的每一个字段。

各行信息分别为

Frame:   物理层的数据帧概况

Ethernet II: 数据链路层以太网帧头部信息

Internet Protocol Version 4: 互联网层IP包头部信息

Transmission Control Protocol:  传输层T的数据段头部信息,此处是TCP

Hypertext Transfer Protocol:  应用层的信息,此处是HTTP协议


wireshark与对应的OSI七层模型

TCP包的具体内容

 从下图可以看到wireshark捕获到的TCP包中的每个字段。

TCP包的具体内容

实例分析TCP三次握手过程

看到这, 基本上对wireshak有了初步了解, 现在我们看一个TCP三次握手的实例


TCP三次握手 wireshark

这图我都看过很多遍了, 这次我们用wireshark实际分析下三次握手的过程。

打开wireshark, 打开浏览器输入 http://www.cnblogs.com/tankxiao

在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击"Follow TCP Stream",

这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图

TCP三次握手 wireshark

图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。

 

第一次握手数据包

客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图

TCP三次握手 wireshark

第二次握手的数据包

服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图

TCP三次握手 wireshark

第三次握手的数据包

客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:

TCP三次握手 wireshark

 就这样通过了TCP三次握手,建立了连接