Wireshark是⼀个⾮常好⽤的抓包⼯具,当我们遇到⼀些和⽹络相关的问题时,可以通过这个⼯具进⾏分析,不过要说明的是,这只是⼀个⼯具,⽤法是⾮常灵活的,所以今天讲述的内容可能⽆法直接帮你解决问题,但是只要你有解决问题的思路,学习⽤这个软件就⾮常有⽤了。
Wireshark官⽅下载地址:
如果记不住,可以在百度中输⼊Wir就可以看到百度智能匹配的关键词了,选择第⼀个地址进去下载即可。
简单介绍下这个软件的⼀些常⽤按钮,因为本⼈也是接触这个软件不久,所以就简单的说下最常⽤的按钮好了,打开软件后,下⾯红框中的按钮从左到右依次是:
-列表显⽰所有⽹卡的⽹络包情况,⼀般⽤的很少;-显⽰抓包选项,⼀般都是点这个按钮开始抓包;-开始新的抓包,⼀般⽤的也很少;
-停⽌抓包,当你抓完包之后,就是点这个停⽌了;
-清空当前已经抓到的数据包,可以防⽌抓包时间过长机器变卡;
⽽实际上,⼀般我们只要知道上⾯加粗部分的按钮功能,就可以完成抓包了,剩下的就是如何抓你想要的数据包,如何分析的问题了。接下来说下抓包选项界⾯,也就是点第⼆个按钮出来的界⾯,同样,这⾥也只介绍最常⽤的⼏个功能,⾸先下图中最上⾯的红框是选择需要抓的⽹卡,选择好⽹卡后会在下⾯显⽰这个⽹卡的IP地址。
然后Capture Filter中就是要写抓包规则的地⽅,也叫做“过滤规则”,我们下⾯要说的很多规则都是要写到这个框⾥的,规则写好后,点下⾯的Start就开始抓包了。
当抓包结束之后,如果你需要把抓到的数据包找其他⼈分析,那么可以点菜单上的file,然后点Save As保存抓到的数据包,如下图:ok,到这⾥,基础的使⽤⽅法说完了,接下来步⼊很关键的内容。
使⽤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,SSHString1, 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标志的封包。
如果过滤器的语法是正确的,表达式的背景呈绿⾊。如果呈红⾊,说明表达式有误。更为详细的说明请见:
以上只是抓包和简单的过滤,那么其实如果你要想达到能够分析这些⽹络包的要求时,还需要了解下⼀些数据包的标记,⽐如我们常说的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包。当你发现这些不正常的包时,肯定有⼈对你的⽹络不怀好意。
UDP (⽤户数据包协议User Datagram Protocol)
TCP是⾯向连接的,⽽UDP是⾮连接的协议。UDP没有对接受进⾏确认的标记和确认机制。对丢包的处理是在应⽤层来完成的。(oraccidental arrival).
此处需要重点注意的事情是:在正常情况下,当UDP包到达⼀个关闭的端⼝时,会返回⼀个UDP复位包。由于UDP是⾮⾯向连接的, 因此没有任何确认信息来确认包是否正确到达⽬的地。因此如果你的防⽕墙丢弃UDP包,它会开放所有的UDP端⼝(?)。
由于Internet上正常情况下⼀些包将被丢弃,甚⾄某些发往已关闭端⼝(⾮防⽕墙的)的UDP包将不会到达⽬的,它们将返回⼀个复位UDP包。
因为这个原因,UDP端⼝扫描总是不精确、不可靠的。
看起来⼤UDP包的碎⽚是常见的DOS (Denial of Service)攻击的常见形式 (这⾥有个DOS攻击的例⼦, ).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.) 。
你可以在 中找到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 whichpacket 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标记的数据包是代表要断开连接的意思,⽽接着客户机⼜回给服务器⼀个确认断 开链接包。当看到这个抓包数据时,就意识到,⼤家说的在⽹维⼤师系统虚拟盘上梦幻爱掉线的问题,并⾮普通的⽹络问题,因为通过数据包的信息来看,是梦幻服 务器主动要求断开链接,产⽣这个情况⽆⾮是以下⼏个原因:1、服务器发现客户端⾮法,⽐如有外挂什么的,踢掉了客户机;2、服务器压⼒⼤,踢掉了客户机;3、总之不是客户端问题导致的掉线;
那 么既然结论是如此,为什么会有在⽹维⼤师系统虚拟盘上容易出现梦幻掉线问题呢?原因是由于⽹维⼤师系统虚拟盘是模拟真实硬盘⽅式来实现的,⽽在模拟过程 中,将硬盘的序列号设置为固定过的OSDIY888了,⽽梦幻西游刚好后识别客户机硬盘信息,发现⼤量客户端的硬盘序列号都是⼀样的,就认为是作弊或者使 ⽤挂机外挂了,结果就导致随机被服务器踢下线的情况发⽣,后来我们将硬盘序列号设置为空,则没再出现该问题。这个问题在未来的新版本中会解决掉。
说这个案例的⽬的并不是为了说明抓包多有⽤,⽽是想说明⼀些解决问题的思路和⽅法,有些⼈是有思路,但是缺⽅法,⽐如不会⽤⼯具,⽽有些⼈收集了很多⼯具 却不会⽤,⽽我其实就属于后者,⼏年前就收集了n多⼯具,但是⽤到的没⼏个。慢慢的学会⽤这些⼯具后,发现思维+⼯具,解决问题是效率暴增,接下来的⼏天 ⾥,会陆续介绍写⼩⼯具给⼤家,也希望⼤家有空学习下,有问题先百度,再⾃⼰摸索,⽽不是⼀味的求助,毕竟求⼈不如求⼰!⾃⼰能直接搞定,是皆⼤欢喜的事 情~
注意:由于某些系统为了防⽌ARP攻击,都免疫掉了⼀个Npptools.dll⽂件,这会导致该软件⽆法正常安装,打下这个补丁就可以了。 转⾃:
因篇幅问题不能全部显示,请点此查看更多更全内容