WireShark抓包工具使用

WireShark是一款网络封包分析软件,它抓取网络封包,并尽可能显示出最详细的封包资料。

wireshark的准备工作

安装wireshark

sudo apt-get install wireshark

在non-root下使用wireshark

由于sudo下使用wireshark太过aggressive,所有需要解决wireshark普通权限下访问网卡的问题。

1.添加wireshark用户组

sudo groupadd wireshark

2.将dumpcap更改为wireshark用户组

sudo chgrp wireshark /usr/bin/dumpcap

3.让wireshark用户组有root权限使用dumpcap

sudo chmod 4755 /usr/bin/dumpcap

4.将需要使用的用户名yourname加入wireshark用户组

sudo gpasswd -a yourname wireshark

参考资料:http://www.cnblogs.com/ddtpower/archive/2012/12/20/ubuntu_wireshark_dumpcap.html

开始抓包

打开wireshark软件:

wireshark &

image

过滤器设置

wireshark过滤语法总结:http://blog.csdn.net/cumirror/article/details/7054496

wireshark有两种顾虑器,捕捉过滤器(Capture Filters)和显示过滤器(Dispaly Filters)。

配置带抓取网络接口,Capture Filter设置为只抓取主机和10.41.71.8之间的网络封包:

host 10.41.70.8
等价于src or dst host 10.41.70.8

image

显示过滤器设置:

image

分析抓取的网封包

参考资料:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html,感谢TankXiao。

从上到下依次是:

1. Main Toolbar(工具栏),一系列工具按钮。

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

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

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

5. Dissector Pane(16进制数据)

6. Miscellanous(地址栏,杂项)

image

封包详细信息与OSI对应

TCP三次握手

TCP包和协议中TCP报文格式对应:

TCP三次握手:

打开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三次握手,建立了连接。

彩蛋

如果协议使用的端口号不规范,比如https使用34128怎么办?

参考文档:《协议的分用以及wireshark对协议的识别

在TCP/IP详解一书中谈到了协议的分用,书中的图1-8如上。图1-8可以很好地解释在互联网的分层结构中,底层的协议头是如何承载上层的不同的协议的。对于链路层而言,以太网首部中有不同帧类型用于表示以太网帧内的数据。在IP数据包的首部,也有专门的8位协议类型,用于表示IP包中的上层协议类型,网址http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml中给出了IETF规定的详细的协议类型号,其中TCP是6,UDP是17,ICMP是1。不过在传输层的两个常用协议TCP和UDP首部中,并没有协议类型的字段,TCP和UDP包内的应用程协议的类型依靠的是TCP和UDP包首部的端口号来进行区分。对于一些常用的应用层协议IETF都规定了相应的熟知端口号,在网址http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml中有一份详细的列表。TCP和UDP报头的16比特端口号给应用层协议的设计提供了足够的设计空间(65535个)和足够的灵活度。

查询网址可知https的端口号对应:

image

理解了协议的分用之后,就比较容易理解wireshark是如何将数据包识别和展示出来的了。wireshark的工作原理的简单介绍可以参见http://gaia.cs.umass.edu/wireshark-labs/Wireshark_Intro_v6.0.pdf。概括地说,就是wireshark是一款建立在已有的包捕捉工具上的一款数据包分析软件。常见的抓包的库有libpcap、jpcap、winpcap等等,这些抓包工具将主机的网卡设置为混杂模式,从而可以捕捉到目的MAC不是主机网卡的数据包。而wireshark基于这些库捕捉到的包进行识别和分析,将包中内容按照协议类型和层次展示出来。

  不过对于那些不采用熟知端口传输的应用层协议而言,wireshark就有可能出现无法识别的情况,这也是我最近遇到的一个场景。我在抓包的时候遇见了wireshark protocol一栏显示enttec,Info 一栏显示 unknown的情况。经过一段时间的分析,可以确定wireshark显示enttec和unknown的原因是TCP采用了非熟知端口发送HTTP报文。不过wireshark在设计中已经考虑到这样一种情况的出现,可以针对非熟知端口的已知应用层协议设置相应的解码方式。具体的方法是:选中无法识别的报文->右键单击->Decode As->选择相应的应用层协议。

WireShark识别应用层协议的依据是端口号!!!

背景:使用20001端口进行https握手和传输。

抓包后看到的结果是这样的,显示的都是TCP。这种应该就是没有找到对应的应用层协议。但是下面的明明应该是https握手和传输。可以看出此时进行传输的端口号是34128.

image

在34124端口数据上右击,选择Decode As…->Transport,将34128<->80之间的TCP传输当成SSL协议。

image

再看看wireshark显示,可以看到相关的TLSv1.2的握手和传输都已经正确显示了。

image

 

 

参考资料

Wireshark基本介绍和学习TCP三次握手:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html

Fiddler-http检测调试工具:http://www.cnblogs.com/dasn/p/3716726.html

WEB/HTTP 调试利器 Fiddler 的一些技巧分享:http://www.open-open.com/lib/view/open1375954572906.html

Http调试工具-Fiddler使用指引:https://my.oschina.net/u/1388024/blog/186886

用Wireshark简单分析HTTPS传输过程-抓包过程:http://www.myhack58.com/Article/60/63/2014/51156.htm

利用Fiddler对Android https请求进行监测:http://www.linuxidc.com/Linux/2014-02/97024.htm

为什么Wireshark无法解密HTTPS数据:https://www.centos.bz/2015/12/why-wireshark-can-not-decrypt-https-data/

原文地址:https://www.cnblogs.com/arnoldlu/p/6372214.html