Wireshark是世界上最流行的网络分析工具。这个强大的工具能够捕捉网络中的数据,并为用户提供关于网络和上层协议的各类信息。与不少其余网络工具同样,Wireshark也使用pcap network library来进行封包捕捉。可破解局域网内QQ、邮箱、msn、帐号等的密码!! php
wireshark的原名是Ethereal,新名字是2006年起用的。当时Ethereal的主要开发者决定离开他原来供职的公司,并继续开发这个软件。但因为Ethereal这个名称的使用权已经被原来那个公司注册,Wireshark这个新名字也就应运而生了。html
在成功运行Wireshark以后,咱们就能够进入下一步,更进一步了解这个强大的工具。
下面是一张地址为192.168.1.2的计算机正在访问“openmaniak.com”网站时的截图。
程序员
![]() |
1. MENUS(菜单) 2. SHORTCUTS(快捷方式) 3. DISPLAY FILTER(显示过滤器) 4. PACKET LIST PANE(封包列表) |
5. PACKET DETAILS PANE(封包详细信息) 6. DISSECTOR PANE(16进制数据) 7. MISCELLANOUS(杂项) |
![]() |
程序上方的8个菜单项用于对Wireshark进行配置:
express
- "File"(文件) - "Edit" (编辑) - "View"(查看) - "Go" (转到) - "Capture"(捕获) - "Analyze"(分析) - "Statistics" (统计) - "Help" (帮助) |
打开或保存捕获的信息。 查找或标记封包。进行全局设置。 设置Wireshark的视图。 跳转到捕获的数据。 设置捕捉过滤器并开始捕捉。 设置分析选项。 查看Wireshark的统计信息。 查看本地或者在线支持。 |
![]() |
在菜单下面,是一些经常使用的快捷按钮。
您能够将鼠标指针移动到某个图标上以得到其功能说明。网络
![]() |
显示过滤器用于查找捕捉记录中的内容。
请不要将捕捉过滤器和显示过滤器的概念相混淆。请参考Wireshark过滤器中的详细内容。
返回页面顶部
frontend
![]() |
![]() |
封包列表中显示全部已经捕获的封包。在这里您能够看到发送或接收方的MAC/IP地址,TCP/UDP端口号,协议或者封包的内容。
若是捕获的是一个OSI layer 2的封包,您在Source(来源)和Destination(目的地)列中看到的将是MAC地址,固然,此时Port(端口)列将会为空。
若是捕获的是一个OSI layer 3或者更高层的封包,您在Source(来源)和Destination(目的地)列中看到的将是IP地址。Port(端口)列仅会在这个封包属于第4或者更高层时才会显示。
您能够在这里添加/删除列或者改变各列的颜色:
Edit menu -> Preferences
5. PACKET DETAILS PANE(封包详细信息)
![]() |
这里显示的是在封包列表中被选中项目的详细信息。
信息按照不一样的OSI layer进行了分组,您能够展开每一个项目查看。下面截图中展开的是HTTP信息。
![]() |
![]() |
“解析器”在Wireshark中也被叫作“16进制数据查看面板”。这里显示的内容与“封包详细信息”中相同,只是改成以16进制的格式表述。
在上面的例子里,咱们在“封包详细信息”中选择查看TCP端口(80),其对应的16进制数据将自动显示在下面的面板中(0050)。
![]() |
在程序的最下端,您能够得到以下信息:
- - 正在进行捕捉的网络设备。
- 捕捉是否已经开始或已经中止。
- 捕捉结果的保存位置。
- 已捕捉的数据量。
- 已捕捉封包的数量。(P)
- 显示的封包数量。(D) (通过显示过滤器过滤后仍然显示的封包)
- 被标记的封包数量。(M)
正如您在Wireshark教程第一部分看到的同样,安装、运行Wireshark并开始分析网络是很是简单的。
使用Wireshark时最多见的问题,是当您使用默认设置时,会获得大量冗余信息,以致于很难找到本身须要的部分。
过犹不及。
这就是为何过滤器会如此重要。它们能够帮助咱们在庞杂的结果中迅速找到咱们须要的信息。
- - |
捕捉过滤器:用于决定将什么样的信息记录在捕捉结果中。须要在开始捕捉前设置。 显示过滤器:在捕捉结果中进行详细查找。他们能够在获得捕捉结果后随意修改。 |
那么我应该使用哪种过滤器呢?
过滤器的区别
捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中。须要在开始捕捉前设置。
显示过滤器(DisplayFilters):在捕捉结果中进行详细查找。他们能够在获得捕捉结果后随意修改。
那么我应该使用哪种过滤器呢?
两种过滤器的目的是不一样的。
捕捉过滤器是数据通过的第一层过滤器,它用于控制捕捉数据的数量,以免产生过大的日志文件。
显示过滤器是一种更为强大(复杂)的过滤器。它容许您在日志文件中迅速准确地找到所须要的记录。
两种过滤器使用的语法是彻底不一样的。
两种过滤器使用的语法是彻底不一样的。咱们将在接下来的几页中对它们进行介绍:
1. 捕捉过滤器
捕捉过滤器的语法与其它使用Lipcap(Linux)或者Winpcap(Windows)库开发的软件同样,好比著名的TCPdump。捕捉过滤器必须在开始捕捉前设置完毕,这一点跟显示过滤器是不一样的。
设置捕捉过滤器的步骤是:
- 选择 capture -> options。
- 填写"capture filter"栏或者点击"capture filter"按钮为您的过滤器起一个名字并保存,以便在从此的捕捉中继续使用这个过滤器。
- 点击开始(Start)进行捕捉。
语法: |
|
|
|
|
|
|
||||||
例子: |
|
|
|
|
|
|
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的封包。
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内的全部封包。
注意事项:
当使用关键字做为值时,需使用反斜杠“\”。
"ether proto \ip" (与关键字"ip"相同).
这样写将会以IP协议做为目标。
"ip proto \icmp" (与关键字"icmp"相同).
这样写将会以ping工具经常使用的icmp做为目标。
能够在"ip"或"ether"后面使用"multicast"及"broadcast"关键字。
当您想排除广播请求时,"no broadcast"就会很是有用。
查看 TCPdump的主页以得到更详细的捕捉过滤器语法说明。
在Wiki Wireshark website上能够找到更多捕捉过滤器的例子。
2. 显示过滤器:
一般通过捕捉过滤器过滤后的数据仍是很复杂。此时您可使用显示过滤器进行更加细致的查找。
它的功能比捕捉过滤器更为强大,并且在您想修改过滤器条件时,并不须要从新捕捉一次。
语法: | Protocol | . |
|
. |
|
operator |
|
Operations |
expression |
|||||
|
|
|
|
|
|
|
|
Protocol(协议):
您可使用大量位于OSI模型第2至7层的协议。点击"Expression..."按钮后,您能够看到它们。
好比:IP,TCP,DNS,SSH
您一样能够在以下所示位置找到所支持的协议:
Wireshark的网站提供了对各类 协议以及它们子类的说明。
String1, String2 (可选项):
协议的子类。
点击相关父类旁的"+"号,而后选择其子类。
Comparison operators (比较运算符):
可使用6种比较运算符:
英文写法: | C语言写法: | 含义: |
|
|
等于 |
|
|
不等于 |
|
|
大于 |
|
|
小于 |
|
|
大于等于 |
|
|
小于等于 |
Logical expressions(逻辑运算符):
英文写法: | C语言写法: | 含义: |
|
|
逻辑与 |
|
|
逻辑或 |
|
|
逻辑异或 |
|
|
逻辑非 |
被程序员们熟知的逻辑异或是一种排除性的或。当其被用在过滤器的两个条件之间时,只有当且仅当其中的一个条件知足时,这样的结果才会被显示在屏幕上。
让咱们举个例子:
"tcp.dstport 80 xor tcp.dstport 1025"
只有当目的TCP端口为80或者来源于端口1025(但又不能同时知足这两点)时,这样的封包才会被显示。
例子:
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 == 0x02 | 显示包含TCP SYN标志的封包。 |
若是过滤器的语法是正确的,表达式的背景呈绿色。若是呈红色,说明表达式有误。
![]() |
表达式正确 |
![]() |
表达式错误 |
使用Wireshark时最多见的问题,是当您使用默认设置时,会获得大量冗余信息,以致于很难找到本身须要的部分。这就是为何过滤器会如此重要。它们能够帮助咱们在庞杂的结果中迅速找到咱们须要的信息。
三次握手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包。当你发现这些不正常的包时,确定有人对你的网络不怀好意。
UDP (用户数据包协议User Datagram Protocol)
TCP是面向链接的,而UDP是非链接的协议。UDP没有对接受进行确认的标记和确认机制。对丢包的处理是在应用层来完成的。(or accidental arrival).
此处须要重点注意的事情是:在正常状况下,当UDP包到达一个关闭的端口时,会返回一个UDP复位包。因为UDP是非面向链接的, 所以没有任何确认信息来确认包是否正确到达目的地。所以若是你的防火墙丢弃UDP包,它会开放全部的UDP端口(?)。
因为Internet上正常状况下一些包将被丢弃,甚至某些发往已关闭端口(非防火墙的)的UDP包将不会到达目的,它们将返回一个复位UDP包。
由于这个缘由,UDP端口扫描老是不精确、不可靠的。
看起来大UDP包的碎片是常见的DOS (Denial of Service)攻击的常见形式 (这里有个DOS攻击的例子,http://grc.com/dos/grcdos.htm ).
ICMP (网间控制消息协议Internet Control Message Protocol)
如同名字同样, ICMP用来在主机/路由器之间传递控制信息的协议。 ICMP包能够包含诊断信息(ping, traceroute - 注意目前unix系统中的traceroute用UDP包而不是ICMP),错误信息(网络/主机/端口 不可达 network/host/port unreachable), 信息(时间戳timestamp, 地址掩码address mask request, etc.),或控制信息 (source quench, redirect, etc.) 。
你能够在http://www.iana.org/assignments/icmp-parameters 中找到ICMP包的类型。
尽管ICMP一般是无害的,仍是有些类型的ICMP信息须要丢弃。
Redirect (5), Alternate Host Address (6), Router Advertisement (9) 能用来转发通信。
Echo (8), Timestamp (13) and Address Mask Request (17) 能用来分别判断主机是否起来,本地时间 和地址掩码。注意它们是和返回的信息类别有关的。 它们本身自己是不能被利用的,但它们泄露出的信息对攻击者是有用的。
ICMP消息有时也被用来做为DOS攻击的一部分(例如:洪水ping flood ping,死 ping ?呵呵,有趣 ping of death)?/p>
包碎片注意A Note About Packet Fragmentation
若是一个包的大小超过了TCP的最大段长度MSS (Maximum Segment Size) 或MTU (Maximum Transmission Unit),可以把此包发往目的的惟一方法是把此包分片。因为包分片是正常的,它能够被利用来作恶意的攻击。
由于分片的包的第一个分片包含一个包头,若没有包分片的重组功能,包过滤器不可能检测附加的包分片。典型的攻击Typical attacks involve in overlapping the packet data in which packet header is 典型的攻击Typical attacks involve in overlapping the packet data in which packet header isnormal until is it overwritten with different destination IP (or port) thereby bypassing firewall rules。包分片能做为 DOS 攻击的一部分,它能够crash older IP stacks 或涨死CPU链接能力。
Netfilter/Iptables中的链接跟踪代码能自动作分片重组。它仍有弱点,可能受到饱和链接攻击,能够把CPU资源耗光。
OK,到此为止,关于Wireshark抓包工具的一些小教程已经写完了,而致使我想写这么一个纠结的教程的缘由是,前几天经过这个抓包解决了梦幻西游在网维大师无盘上容易掉线的问题,当时捕捉到梦幻西游掉线时的数据包是这样的。
注意下图中的红色数据,123.58.184.241是梦幻西游的服务器,而192.168.1.41是玩梦幻西游的客户机,在掉线时,发现是先有梦幻西 游的服务器向客户机发送一个[FIN,ACK]数据包,根据上面的解释,FIN标记的数据包是表明要断开链接的意思,而接着客户机又回给服务器一个确认断 开连接包。当看到这个抓包数据时,就意识到,你们说的在网维大师系统虚拟盘上梦幻爱掉线的问题,并不是普通的网络问题,由于经过数据包的信息来看,是梦幻服 务器主动要求断开连接,产生这个状况无非是如下几个缘由:
一、服务器发现客户端非法,好比有外挂什么的,踢掉了客户机;
二、服务器压力大,踢掉了客户机;
三、总之不是客户端问题致使的掉线;
那 么既然结论是如此,为何会有在网维大师系统虚拟盘上容易出现梦幻掉线问题呢?缘由是因为网维大师系统虚拟盘是模拟真实硬盘方式来实现的,而在模拟过程 中,将硬盘的序列号设置为固定过的OSDIY888了,而梦幻西游恰好后识别客户机硬盘信息,发现大量客户端的硬盘序列号都是同样的,就认为是做弊或者使 用挂机外挂了,结果就致使随机被服务器踢下线的状况发生,后来咱们将硬盘序列号设置为空,则没再出现该问题。这个问题在将来的新版本中会解决掉。
说这个案例的目的并非为了说明抓包多有用,而是想说明一些解决问题的思路和方法,有些人是有思路,可是缺方法,好比不会用工具,而有些人收集了不少工具 却不会用,而我其实就属于后者,几年前就收集了n多工具,可是用到的没几个。慢慢的学会用这些工具后,发现思惟+工具,解决问题是效率暴增,接下来的几天 里,会陆续介绍写小工具给你们,也但愿你们有空学习下,有问题先百度,再本身摸索,而不是一味的求助,毕竟求人不如求己!本身能直接搞定,是皆大欢喜的事 情~
注意:因为某些系统为了防止ARP攻击,都免疫掉了一个Npptools.dll文件,这会致使该软件没法正常安装,打下这个补丁就能够了。