fidder主要是针对http(s)协议进行抓包分析的,因此相似wireshark/tcpdump这种工做在tcp/ip层上的抓包工具不太同样,这种工具通常在chrome/firefox的开发者工具下都有集成。php
安装wireshare会推荐安装winpcap,winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力.html
wireshark的官方下载网站: http://www.wireshark.org/正则表达式
wireshark是很是流行的网络封包分析软件,功能十分强大。能够截取各类网络封包,显示网络封包的详细信息。chrome
wireshark是开源软件,能够放心使用。 能够运行在Windows和Mac OS上。编程
使用wireshark的人必须了解网络协议,不然就看不懂wireshark了。windows
为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。浏览器
Fiddler是在windows上运行的程序,专门用来捕获HTTP,HTTPS的。安全
wireshark能获取HTTP,也能获取HTTPS,可是不能解密HTTPS,因此wireshark看不懂HTTPS中的内容服务器
总结,若是是处理HTTP,HTTPS 仍是用Fiddler, 其余协议好比TCP,UDP 就用wireshark网络
微软的network monitor
sniffer
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时,将会获得大量的冗余信息,在几千甚至几万条记录中,以致于很难找到本身须要的部分。搞得晕头转向。
过滤器会帮助咱们在大量的数据中迅速找到咱们须要的信息。
过滤器有两种,
一种是显示过滤器,就是主界面上那个,用来在捕获的记录中找到所须要的记录
一种是捕获过滤器,用来过滤捕获的封包,以避免捕获太多的记录。 在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 | 只查看HTTP协议的记录 |
ip.src ==192.168.1.102 || ip.dst==192.168.1.102 | 源地址或者目标地址是192.168.1.102 |
搜索比较操做符
--------------------------------------------------------------
http模式过滤:
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"
封包列表的面板中显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。 你能够看到不一样的协议用了不一样的颜色显示。
这个面板是咱们最重要的,用来查看协议中的每个字段。
各行信息分别为
Frame: 物理层的数据帧概况
Ethernet II: 数据链路层以太网帧头部信息
Internet Protocol Version 4: 互联网层IP包头部信息
Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
从下图能够看到wireshark捕获到的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, 以下图:
第三次握手的数据包
客户端再次发送确认包(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流不能实时更新。想获得最近的内容须要从新打开对话框。
你能够在此对话框执行以下操做:
Save As 以当前选择格式保存流数据。
Print 以当前选择格式打印流数据。
Direction 选择流的显示方向("Entire conversation", "data from A to B only" or "data from B to A only").
Filter out this stream 应用一个显示过滤,在显示中排除当前选择的TCP流。
Close 关闭当前对话框。移除对当前显示过滤的影响。
你能够用如下格式浏览流数据。
AsCII。在此视图下你能够以ASCII凡是查看数据。固然最适合基于ASCII的协议用,例如HTTP.
EBCDIC。For the big-iron freaks out there.(不知道这句是什么意思, EBCDIC 是IBM公司的字符二进制编码标准。)
HEX Dump. 容许你查看全部数据,可能会占用大量屏幕空间。适合显示二进制协议。
C Arrays. 容许你将流数据导入你本身的C语言程序。
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 expressions(逻辑运算符):
、
显示过滤器
例子:
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包。当你发现这些不正常的包时,确定有人对你的网络不怀好意。