Wireshark抓包TCP详解

fidder主要是针对http(s)协议进行抓包分析的,所以类似wireshark/tcpdump这种工作在tcp/ip层上的抓包工具不太一样,这种工具一般在chrome/firefox的开发者工具下都有集成。

安装wireshare会推荐安装winpcap,winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力.

wireshark介绍

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

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

wireshark是开源软件,可以放心使用。可以运行在Windows和Mac OS上。

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

Wireshark不能做的

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

Wireshark VS Fiddler

Fiddler是在windows上运行的程序,专门用来捕获HTTP,HTTPS的。

wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容

总结,如果是处理HTTP,HTTPS 还是用Fiddler,  其他协议比如TCP,UDP 就用wireshark

同类的其他工具

微软的network monitor

sniffer

什么人会用到wireshark

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

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

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

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

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

sniffer:

1.安装sniffer后,运行时,找不到网卡,(sniffer在win 7下找不到网卡)
   解决方法:点击开始—找到sniffer的快捷方式—右键属性—把兼容模式改为“windows xp sp3”—确定—再次运行,就可以找到网卡了。。。
2.运行sniffer时,里面的仪表盘不动,并且顶部提示“channels A and B link faults”点击“开始抓包”时,电脑蓝屏重启…
  解决方法:出现这种问题的原因是你的sniffer版本低,识别不了自己的千兆网卡,把自己的sniffer升级到SNIFFER PORTABLE V4.7.5 SP5再运行,一切就OK,
3.sniffer可以用了,过一段时间就出现一个窗口,提示“脚本错误”,
  解决方法:这是因为电脑里面的Java的原因,安装完Java后,就可以了,如果安装完Java,还是有提示窗口,那就不用理他,对抓包没有什么影响。

安装后点击运行就蓝屏。

这种情况是本本或者台式机是千兆网卡~ 千兆网卡必须得用Sniffer的SP5版本才可以~ 只有SP5版本支持千兆网卡!下载SnifferPro_V4.7.5 SP5,

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

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

窗口:

WireShark 主要分为这几个界面

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

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

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

4. Dissector Pane(16进制数据)

5. Miscellanous(地址栏,杂项)

Wireshark 显示过滤

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

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

过滤器有两种,

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

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

过滤表达式的规则

表达式规则

 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. 逻辑运算符为&& ||

常用的过滤表达式

http.request.method == (“GET” / “POST”)
http.request.uri == ” *** “

 http.request.full_uri
http contains  ” ** “

另外还有一些操作符只能使用类英语简写,不能使用类c语言简写。
contains 判断一个协议,字段或者分片包含一个值
matches             判断一个协议或者字符串匹配一个给定的Perl表达式

“contains”操作符允许一个过滤器搜索一串字符,其形式为字符串,或者字节,或者字节组。例如在搜索一个HTTP URL地址,可以使用下面的过滤器:
http contains “http://www.wireshark.org”;
“contains”操作符不能被用于原子型的字段,比如数字和ip地址。

“matches ”操作符允许一个过滤器使用与Perl兼容的正则表达式(PCRE)。“matches” 操作符只能应用于协议或者字符串类型的协议字段。例如:搜索一个给定的wAP WSP User-Agent,你可以这样写过滤器:
wsp.user_agent matches “(?i)cldc”

封包列表(Packet List Pane)

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

封包详细信息 (Packet Details Pane)

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

各行信息分别为

Frame:   物理层的数据帧概况

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

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

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

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

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

实例分析TCP三次握手过程

看到这, 基本上对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, 如下图:

参考了:http://www.cnblogs.com/tankxiao/archive/2012/10/10/2711777.html

 (上图中的stream index是什么?

the stream index is an internal Wireshark mapping to: [IP address A, TCP port A, IP address B, TCP port B]

All the packets for the same tcp.stream value should have the same values for these fields (though the src/dest will be switched for A->B and B->A packets)

see the Statistics/Conversations/TCP tab in Wireshark to show a summary of these streams

http://stackoverflow.com/questions/6076897/follow-tcp-stream-where-does-field-stream-index-come-from

Statistics/Conversations/TCP
Statistics/Conversations/endpoints/tcp
可以看到这些索引号对应的数据流

)

“Follow TCP Stream”

如果你处理TCP协议,想要查看Tcp流中的应用层数据,”Following TCP streams”功能将会很有用。如果你项查看telnet流中的密码,或者你想尝试弄明白一个数据流。或者你仅仅只需要一个显示过滤来显示某个TCP流的包。这些都可以通过Wireshark的”Following TCP streams”功能来实现。

在包列表中选择一个你感兴趣的TCP包,然后选择Wireshark工具栏菜单的”Following TCP Streams”选项(或者使用包列表鼠标右键的上下文菜单)。然后,Wireshark就会创建合适的显示过滤器,并弹出一个对话框显示TCP流的所有数据

流的内容出现的顺序同他们在网络中出现的顺序一致。从A到B的通信标记为红色,从B到A的通信标记为蓝色。当然,如果你喜欢的话你可以从”Edit/Preferences”菜单项的”Colores”修改颜色。

非打印字符将会被显示为圆点。XXX – What about line wrapping (maximum line length) and CRNL conversions?

在捕捉过程中,TCP流不能实时更新。想得到最近的内容需要重新打开对话框。

你可以在此对话框执行如下操作:

  1. Save As 以当前选择格式保存流数据。

  2. Print 以当前选择格式打印流数据。

  3. Direction 选择流的显示方向(“Entire conversation”, “data from A to B only” or “data from B to A only”).

  4. Filter out this stream 应用一个显示过滤,在显示中排除当前选择的TCP流。

  5. Close 关闭当前对话框。移除对当前显示过滤的影响。

你可以用以下格式浏览流数据。

  1. AsCII。在此视图下你可以以ASCII凡是查看数据。当然最适合基于ASCII的协议用,例如HTTP.

  2. EBCDIC。For the big-iron freaks out there.(不知道这句是什么意思, EBCDIC 是IBM公司的字符二进制编码标准。)

  3. HEX Dump. 允许你查看所有数据,可能会占用大量屏幕空间。适合显示二进制协议。

  4. C Arrays. 允许你将流数据导入你自己的C语言程序。

  5. RAW。允许你载入原始数据到其他应用程序做进一步分析。显示类似与ASCII设置。但“save As”将会保存为二进制文件

参考:http://blog.itpub.net/14766028/viewspace-705060

更多:http://openmaniak.com/cn/wireshark_use.php

 wireshark抓包之前设置:

Interface:指定在哪个接口(网卡)上抓包(系统会自动选择一块网卡)。

Limit each packet:限制每个包的大小,缺省情况不限制。

Capture packets in promiscuous mode:是否打开混杂模式。如果打开,抓取所有的数据包。一般情况下只需要监听本机收到或者发出的包,因此应该关闭这个选项。

Filter:过滤器。只抓取满足过滤规则的包。

File:可输入文件名称将抓到的包写到指定的文件中。

Use ring buffer: 是否使用循环缓冲。缺省情况下不使用,即一直抓包。循环缓冲只有在写文件的时候才有效。如果使用了循环缓冲,还需要设置文件的数目,文件多大时回卷。

Update list of packets in real time:如果复选框被选中,可以使每个数据包在被截获时就实时显示出来,而不是在嗅探过程结束之后才显示所有截获的数据包。

单击“OK”按钮开始抓包,系统显示出接收的不同数据包的统计信息,单击“Stop”按钮停止抓包后,所抓包的分析结果显示在面板中,如下图所示:

验证网络字节序

网络上的数据流是字节流,对于一个多字节数值(比如十进制1014 = 0x03 f6),在进行网络传输的时候,先传递哪个字节,即先传递高位“03”还是先传递低位“f6”。 也就是说,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理。
下面通过截图具体说明:

最下面是物理媒体上传输的字节流的最终形式,都是16进制表示,发送时按顺序先发送00 23 54 c3 …00 03 f6 …接收时也按此顺序接收字节。

选中total length:1014, 它的十六进制表示是0x03f6, 从下面的蓝色选中区域可以看到,03在前面,f6在后面,即高字节数据在低地址,低字节数据在高地址(图中地址从上到下从左到右依次递增),所以可知,网络字节序采用的是大端模式。

 wireshark过滤器

过滤器的区别
捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中。需要在开始捕捉前设置。
显示过滤器(DisplayFilters):在捕捉结果中进行详细查找。他们可以在得到捕捉结果后随意修改。
那么我应该使用哪一种过滤器呢?

两种过滤器的目的是不同的。
捕捉过滤器是数据经过的第一层过滤器,它用于控制捕捉数据的数量,以避免产生过大的日志文件。
显示过滤器是一种更为强大(复杂)的过滤器。它允许您在日志文件中迅速准确地找到所需要的记录。

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

捕捉过滤器

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)”不同。

例子:

tcp dst port 3128  //捕捉目的TCP端口为3128的封包。
ip src host 10.1.1.1  //捕捉来源IP地址为10.1.1.1的封包。
host 10.1.2.3  //捕捉目的或来源IP地址为10.1.2.3的封包。
ether host e0-05-c5-44-b1-3c //捕捉目的或来源MAC地址为e0-05-c5-44-b1-3c的封包。如果你想抓本机与所有外网通讯的数据包时,可以将这里的mac地址换成路由的mac地址即可。
src portrange 2000-2500  //捕捉来源为UDP或TCP,并且端口号在2000至2500范围内的封包。
not imcp  //显示除了icmp以外的所有封包。(icmp通常被ping工具使用)
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  //捕捉源地址为192.168.0.0网络内的所有封包。

注意事项:

使用关键字作为值时,需使用反斜杠“/”
“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种比较运算符:

Logical e­xpressions(逻辑运算符):

显示过滤器

例子:
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标志的封包。
如果过滤器的语法是正确的,表达式的背景呈绿色。如果呈红色,说明表达式有误。
更为详细的说明请见:http://openmaniak.com/cn/wireshark_filters.php

以上只是抓包和简单的过滤,那么其实如果你要想达到能够分析这些网络包的要求时,还需要了解下一些数据包的标记,比如我们常说的TCP三次握手是怎么回事?

三次握手Three-way Handshake
一个虚拟连接的建立是通过三次握手来实现的
1. (Client) –> [SYN] –> (Server)
假如Client和Server通讯. 当Client要和Server通信时,Client首先向Server发一个SYN (Synchronize) 标记的包,告诉Server请求建立连接.
注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当Server收到Client发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不 能让外部任何主机主动建立连接。

2. (Client) <– [SYN/ACK] <–(Server)
接着,Server收到来自Client发来的SYN包后,会发一个对SYN包的确认包(SYN/ACK)给Client,表示对第一个SYN包的确认,并继续握手操作.
注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.

3. (Client) –> [ACK] –> (Server)
Client收到来自Server的SYN/ACK 包,Client会再向Server发一个确认包(ACK),通知Server连接已建立。至此,三次握手完成,一个TCP连接完成。
Note: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位。

这就是为何连接跟踪很重要的原因了. 没有连接跟踪,防火墙将无法判断收到的ACK包是否属于一个已经建立的连接.一般的包过滤(Ipchains)收到ACK包时,会让它通过(这绝对不是个 好主意). 而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包。

四次握手Four-way Handshake
四次握手用来关闭已建立的TCP连接

1. (Client) –> ACK/FIN –> (Server)
2. (Client) <– ACK <– (Server)
3. (Client) <– ACK/FIN <– (Server)
4. (Client) –> ACK –> (Server)

注意: 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上ACK标记. 没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的。

连接复位Resetting a connection

四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意在,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记

请注意RST包是可以不要收到方确认的?

无效的TCP标记Invalid TCP Flags

到目前为止,你已经看到了 SYN, ACK, FIN, 和RST 标记. 另外,还有PSH (Push) 和URG (Urgent)标记.

最常见的非法组合是SYN/FIN 包. 注意:由于 SYN包是用来初始化连接的, 它不可能和 FIN和RST标记一起出现. 这也是一个恶意攻击.

由于现在大多数防火墙已知 SYN/FIN 包, 别的一些组合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明显,当网络中出现这种包时,很你的网络肯定受到攻击了。

别的已知的非法包有FIN (无ACK标记)和”NULL”包。如同早先讨论的,由于ACK/FIN包的出现是为了关闭一个TCP连接,那么正常的FIN包总是带有 ACK 标记。”NULL”包就是没有任何TCP标记的包(URG,ACK,PSH,RST,SYN,FIN都为0)。

到目前为止,正常的网络活动下,TCP协议栈不可能产生带有上面提到的任何一种标记组合的TCP包。当你发现这些不正常的包时,肯定有人对你的网络不怀好意。

未经允许不得转载:大自然的搬运工 » Wireshark抓包TCP详解

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址