Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
网络封包分析软件的功能可想像成 “电工技师使用电表来量测电流、电压、电阻” 的工作 - 只是将场景移植到网络上,并将电线替换成网络线。在过去,网络封包分析软件是非常昂贵的,或是专门属于盈利用的软件。Ethereal的出现改变了这一切。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal是目前全世界最广泛的网络封包分析软件之一。
(1)确定Wireshark的位置。如果没有一个正确的位置,启动Wireshark后会花费很长的时间捕获一些与自己无关的数据。
(2)选择捕获接口。一般都是选择连接到Internet网络的接口,这样才可以捕获到与网络相关的数据。否则,捕获到的其它数据对自己也没有任何帮助。
(3)使用捕获过滤器。通过设置捕获过滤器,可以避免产生过大的捕获文件。这样用户在分析数据时,也不会受其它数据干扰。而且,还可以为用户节约大量的时间。
(4)使用显示过滤器。通常使用捕获过滤器过滤后的数据,往往还是很复杂。为了使过滤的数据包再更细致,此时使用显示过滤器进行过滤。
(5)使用着色规则。通常使用显示过滤器过滤后的数据,都是有用的数据包。如果想更加突出的显示某个会话,可以使用着色规则高亮显示。
(6)构建图表。如果用户想要更明显的看出一个网络中数据的变化情况,使用图表的形式可以很方便的展现数据分布情况。
(7)重组数据。Wireshark的重组功能,可以重组一个会话中不同数据包的信息,或者是一个重组一个完整的图片或文件。由于传输的文件往往较大,所以信息分布在多个数据包中。为了能够查看到整个图片或文件,这时候就需要使用重组数据的方法来实现。
这个面板是我们最重要的,用来查看协议中的每一个字段。
各行信息分别为
Frame: 物理层的数据帧概况
Ethernet II: 数据链路层以太网帧头部信息
Internet Protocol Version 4: 互联网层IP包头部信息
Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
1.显示过滤器为了进行分析帮助,将不需要或者是已经排除的数据包进行显示屏蔽。
2.显示过滤器是在已经捕获的数据包中进行查找然后根据定义的表达式进行区别显示。
3. 显示过滤器是一种更为强大(复杂)的过滤器。
4.它允许您在日志文件中迅速准确地找到所需要的所有记录。通常经过捕捉过滤器过滤后的数据还是很复杂。此时您可以使用显示过滤器进行更加细致的查找。
5.它的功能比捕捉过滤器更为强大,而且在您想修改过滤器条件时,并不需要重新捕捉一次。
使用过滤是非常重要的, 初学者使用wireshark时,将会得到大量的冗余信息,在几千甚至几万条记录中,以至于很难找到自己需要的部分。搞得晕头转向。
过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。
过滤器有两种:
一种是显示过滤器:就是主界面上那个,用来在捕获的记录中找到所需要的记录;
一种是捕获过滤器:用来过滤捕获的封包,以免捕获太多的记录。 在Capture -> Capture Filters 中设置。
语法: | Protocol | Direction | Host(s) | Value | Logical Operations | Other expression |
---|---|---|---|---|---|---|
例子: | tcp | dst | 10.1.1.1 | 80 | and | tcp dst 10.2.2.2 3128 |
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 |
(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或者源IP位于网络10.6.0.0/16,目的IP的TCP端口号在200至10000之间,并且目的IP位于网络 10.0.0.0/8内的所有封包。
1、 搜索按条件过滤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数据包,不一定是从第一字节匹配。
2、搜索按条件过滤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
3、其他
http.request.uri matches ".gif$"
匹配过滤HTTP的请求URI中含有".gif"字符串,并且以.gif结尾(4个字节)的http请求数据包($是正则表达式中的结尾表示符)
注意区别:
http.request.uri contains ".gif$" 与此不同,contains是包含字符串".gif$"(5个字节)。
匹配过滤HTTP的请求URI中含有".gif$"字符串的http请求数据包(这里$是字符,不是结尾符)
eth.addr[0:3]==00:1e:4f
搜索过滤MAC地址前3个字节是0x001e4f的数据包。
看到这, 基本上对wireshak有了初步了解, 现在我们看一个TCP三次握手的实例
这图我都看过很多遍了, 这次我们用wireshark实际分析下三次握手的过程。
打开wireshark, 打开浏览器输入 http://www.cnblogs.com/tankxiao
在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击”Follow TCP Stream”,
这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图
图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。
客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图
服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:
就这样通过了TCP三次握手,建立了连接