Kali渗透测试:网络数据的嗅探与欺骗
无论什么样的漏洞渗透模块,在网络中都是以数据包的形式传输的,因此如果我们能够对网络中的数据包进行分析,就可以掌握渗透的原理。 另外,很多网络攻击的方法也都是发送精心构造的数据包来完成的, 如常见的ARP欺骗。利用这种欺骗方式,黑客可以截获受害计算机与外部通信的全部数据,如受害者登录使用的用户名与密码、发送的邮件等。
“The quieter you are the more you are able to hear”(你越安静,你能听到的越多)。如使用HTTP、FTP或者Telnet等协议所传输等数据都是明文传输的, 一旦数据包被监听,里面的信息就会被泄漏。而这一切并不难做到,任何一个有经验的黑客都可以轻而易举地使用抓包工具来捕获这些信息,从而突破网络,窃取网络中的“秘密”。网络中最为著名的一种欺骗攻击被称为“中间人攻击”。这种攻击方式中,攻击者会同时欺骗计算机A和计算机B,攻击者会设法让计算机A误认为攻击者的计算是计算机B,同时还会设法让计算机B误认为攻击者的计算机是计算机A,从而计算机A和计算机B之间的通信都会经过攻击者的计算机。
? ?? 网络数据的嗅探:在Kali Linux中提供了很多可以用来实现网路数据嗅探的工具,其实这些工具都是基于相同的原理。所有通过你网卡的网络数据都是可以被读取的。这些网络数据按照各种各样不同的协议组织到一起,所以我们只要掌握了各种协议的格式,就可以分析出这些数据所表示的意义。当然,目前互联网所使用的协议数目众多,而且还在不断增长(或许将来会有你设计的)。
? ?? 网络数据的欺骗:在互联网创建之初,提供的服务和使用的人员都很少,也无需考虑安全方面的问题, 所以作为互联网协议基础的几个重要协议都没有使用安全措施。随着互联网的规模越来越大,使用者越来越多,有人开始利用互联网的缺陷或者漏洞篡改网络数据来实现自己的目的,可能出于炫耀或者恶作剧,
如果你想彻底了解一个网络,最好的办法就是对网络中的流量进行嗅探。
1.1 使用TcpDump分析网络数据
TcpDump是款“资深”网络工作人必备的工具,这款工具极为强大。在戴维·马兰(David J.Malan)主讲的哈佛大学公开课计算机科学CS50中,他就在上课时使用TcpDump捕获了教师中的网络流量。
在Kali中打开一个命令行输入tcpdump命令就可以启动TcpDump,如下图所示:
使用TcpDump来捕获网络中的数据,但是并不对这些数据进行存储,命令如下:
tcpdump -v -i eth0
这里的-i用来指定TcpDump进行监听所使用的网卡,-v表示以verbose mode显示。当我们按Enter键之后,TcpDump就会开始工作,所有 被捕获到的数据都会显示在屏幕上。当需要停止数据的捕获时,按Ctrl+C组合键 即可。
这种情况下,数据显示的速度非常快,如果是在一个大型网络中,我们根本无法看清楚屏幕上显示的内容。这时我们可以将这些捕获到的数据保存在一个文件中,命令如下:
┌──(kali?kali)-[~]
└─$ sudo tcpdump -v -i eth0 -w cap-2022521.pcap
1.2 使用Wireshark进行网络分析
Wireshark是一款优秀的网络抓包工具,同时也是一款流行的网络分析工具。在Kali中启动Wireshark方法有两种:一种是启动一个终端,然后在终端中输入如下命令:
┌──(kali?kali)-[~]
└─$ sudo wireshark
另一种方法在菜单中启动Wireshark,这个工具位于分类中的“09-Sniffing&Spoofing”,如下图所示:
Wireshark的启动界面如下图所示:
和普通的软件没什么区别,最上方是菜单栏,然后是工具栏。一般一台主机有多块网卡,这些网卡作为网络数据流量的出入口,我们可以指定其中的一块网卡,屏蔽其他网卡的进出流量。我们既可以在上图中所示的启动界面中选择网卡也可以通过菜单栏进行设置。方法为单击菜单栏上的“Capture”,在“Capture”的下拉菜单中选择“Options”,如下图所示:
接下来会弹出“Wireshark · Capture Interfaces”对话框,在这个对话框中我们选择需要使用的网卡,如这里选择最常用的eth0,如下图所示:
虽然Wireshark的工作界面看起来比较复杂,但使用起来比TcpDump还简单,指定网卡之后就可以工作了。Wireshark的工作界面如下图所示:
Wireshark的工作界面可以分成3个面板:1显示数据包列表 2 显示数据包详细信息 3显示数据包原始信息。这3个面板相互关,在数据包列表面板中选中一个数据包之后,在数据包详细信息面板处就可以查看这个数据包的详细信息,在数据包原始信息面板处就可以查看这个数据包的原始信息。
一般而言,数据包详细信息中包含的内容是我们最关心的。一个数据包通常需要使用多个协议,这些协议一层层将要传输的数据包装起来。下图所示为DHCP数据包的详细信息。
上图中所示的DHCP数据包一共分成了5层,依次为Frame、Ethernet、IP、UDP、DHCP,每一层前面有一个黑色的三角形图标,单击这个图标可以展开数据包这一层的详细信息。如我们来看一下DHCP数据包UDP层的详细信息,就可以单击其前面的三角形图标,如下图所示:
因为正常情况下,计算机会有大量的通信数据包产生,为了提高效率,Wireshark为使用者提供了两种过滤器,一个是显示过滤器,另一个是捕获过滤器。两种过滤器的语法不同,显示过滤器可以只显示符合条件的数据包,显示过滤器位于工具栏的下方,如下图所示:
显示过滤器可以基于协议、应用、地址等构造识别大小写,但通常使用小写。 我们先来构造一个只能显示ICMP数据包的显示过滤器,这很容易实现。首先我们在一个终端使用ping命令测试任意一个地址以产生ICMP数据包,如下图所示:
我们在文本框中输入“icmp”来设置这个显示过滤器的条件,然后按Enter键即可,如下图所示:
应用这个显示过滤器之后,其他类型的数据包就不会显示了。
下面我们简单介绍显示过滤器的构造语法 。首先来看如何构造基于协议的显示过滤器,如只显示ARP数据包,可以构造如下的显示过滤器:
arp
这个显示过滤器会屏蔽所有除了ARP请求和回复之外的数据包。
也可以使用各种比较运算符(如==、!=等)来扩展显示过滤器,如我们只显示所有源地址为192.168.68.242的数据包:
ip.src == 192.168.68.242
显示所有源端口不为80的数据包,可以构造如下的显示过滤器:
tcp.srcport != 80
我们还可以单击菜单栏上的“Analyze”,选择下拉菜单中的“Dispaly Filter Expression”来使用显示过滤器的构造窗口,如下图所示:
打开这个显示过滤器的构造窗口,如下图所示:
这个显示过滤器的构造窗口分成几个部分。左侧是“Field Name”,这部分主要是各种协议和协议的各个字段。右侧上方的“Relation”包含的是各种关系运算符。右侧中间的“Value”是空白,用来填写各种值。我们现在构造一个只显示来自192.168.68.242发出的数据包的显示过滤器,如下图所示:
首先在左侧的“Field Name”列表中找到IP,并展开找到ip.src字段,然后在“Relation”中找到“==”,并在“Value”中填写IP地址。填写完毕以后可以看到下方显示的构造好的过滤器,完成之后点击“OK”按钮即可。
1.3 Wireshark的部署方式
1.3.1 交换机环境下的流量捕获
如下图所示,一个包含4个端口的交换机,连接了A、B、C、D共4台计算机,其中的计算机A要将一条信息发送到计算机B,而交换机作为网络的中心对信息进行转发。只有计算机B才能接收到来自计算机A的信息,其他计算机是接受不到这个信息的。
这样就为我们捕获其他计算机上的数据包带来一些难度。
1.3.1.1 端口镜像
如果你拥有了交换机的控制权限,就可以检查这个交换机是否支持端口镜像。如果交换机支持端口镜像,就无须对网络进行任何线路上的改动。简单来说,端口镜像就是将交换机上一个或者几个端口的数据流量复制并转发到某个指定端口上,这个指定端口被称为镜像端口,如下图所示:
目前很多交换机都具备了端口镜像的功能。我们可以将其中的一个端口设置为镜像端口,然后把需要监视的流量转发到这个镜像端口,这样我们需要监控的计算机A连接到这个端口就可以对其进行监控了。我们构建一个包含3台设备的网络,设备间的连接方式如下表所示:
? 3台设备的IP地址以及与交换机连接的端口
设备 | IP地址 | 与交换机连接的端口 |
---|
客户端 | 192.168.68.242 | Ethernet0/0/1 | 监控端 | 192.168.68.125 | Ethernet0/0/2 | 服务端 | 192.168.68.129 | Ethernet0/0/3 |
在本例中,我们使用监控端来监听发往服务端的通信流量,这里需要将Ethernet0/0/2配置为观察端口,将Ethernet0/0/3配置为镜像端口。下面给出配置命令:
<Huawei>sys
[Huawei]observe-port 1 interface E0/0/2
[Huawei]
[Huawei]int E0/0/3
[Huawei-Ethernet0/0/3]port-mirroring to observe-port 1 outbound
[Huawei-Ethernet0/0/3]quit
[Huawei]
到此为止,凡是从Ethernet0/0/3端口发出的通信流量,都会被交换机复制一份到Ethernet0/0/2上。很多路由器也实现了端口镜像功能,这个功能在实际工作中也是十分便利的。
1.3.1.2 ARP欺骗
很多情况下,我们既不能更改网络物理线路,也不能使用交换机的端口镜像功能。这时可以使用ARPSpoof或者Cain之类的工具来实现中间人攻击。这种技术经常被黑客用来进行网络监听,所以也被看作一种入侵行为。
ARP欺骗无须对网络做出任何的改动,只需要在自己的计算机上运行欺骗工具即可,但是需要注意的是这种行为往往会被认定为入侵行为。ARP欺骗的原理如下所示。
? 1)如下图给出了正常情况下,计算机B通过网关和外部进行通信的过程
? 2)计算机A可以通过使用一些中间人攻击工具来欺骗计算机B,如下图所示:
? 3)计算机B将原来本发往网关的数据包都发给计算机A,如下图所示:
4)可使用同样的方法欺骗网关,让网关误以为计算机A就是计算机B,从而实现中间人攻击
1.3.1.3 网络分路器
在对其他计算机进行网络数据分析时,网络分路器也是一个非常不错的选择。简单的网络分路器,比方说一共有4个接口,两个Network接口用来连接被监听设备,两个Monitor接口用来连接监听设备。将问题主机和网络设备连接到网络分路器的Network接口,然后将网络分路器的另一个接口连接到我们安装有Wireshark的主机上,这样所有的数据都会实时地显示在Wireshark中。这样虽然使用方便,但是需要购买额外的网络分路器硬件,而且对网络分路器性能有一定的要求。
1.3.3 完成虚拟机流量的捕获
很多情况下,我们需要对虚拟机进行流量捕获。以VMware为例,当VMware安装后系统会默认安装3个虚拟机网卡VMnet0、VMnet1和VMnet8(如下图所示,注意图中并不显示VMnet0),这些虚拟机网卡除了没有实体卡之外,其余地方都是一模一样的。
-
桥接模式 我们需要考虑VMware(另一款虚拟机软件VirtualBox与此相同)的网络连接方式,在使用虚拟机进行网络通信的时候,我们需要在几种模式中做出选择,这些模式有各自适用的场合,也有各自不同的捕获数据的方式。如下图所示:
? 如果你的虚拟机采用桥接(Bridge)模式上网,那么意味着它将会和真实的计算机采用完全相同的联网方式。对应的虚拟机就被当作主机所在的以太网上的一个独立物理机,各虚拟机通过默认VMnet0网卡与主机以太网连接,虚拟机之间的虚拟网络为VMnet0。这时你的虚拟机就像局域网中的一个独立的物理机一样。桥接模式下会使用VMnet0作为网卡,但是这个虚拟网卡是看不到的,所以我们无法通过选择网卡的方式来捕获虚拟机的流量。
? 实际上,虚拟机此时上网使用的就是宿主机上网的那块网卡,因此我们只需要选择正常上网的那块网卡,然后使用“过滤器eth.addr==虚拟机的硬件地址”来过滤即可。
-
仅主机模式 处于仅主机(Host- only)模式的主机相互之间可以通信,也可以与物理宿主机进行通信,但是不能连接到除此以外的设备上。我们只需要在选择网卡的时候选择“VMware Network Adapter VMnet1”网卡就可以监听仅主机模下的所有通信流量。 -
NAT模式
? 我们只需要在选择网卡的时候选择“VMware Network Adapter VMnet8”网卡就可以监听NAT模式下的所有虚拟机的通信流量。
1.4 使用Ettercap进行网络嗅探
捕获在网络中传输的数据信息的行为称为网络嗅探。我们来介绍一个集成了ARP欺骗功能的工具—Ettercap。Kali中集成了Ettercap,启动方式也是两种,既可以在图形化操作界面中也可以在命令行中。启动Ettercap的命令如下:
┌──(kali?kali)-[~]
└─$ ettercap -G
启动之后的Ettercap图形化界面如下图所示:
Ettercap中有一个Bridged sniffing,默认是取消模式,表示 以中间人方式嗅探,这是比较常用的一种模式。Bridged sniffing表示在双网卡情况下,嗅探两块网卡之间的数据包,这种模式并不经常用。这里我们不选择Bridged sniffing,如下图所示:
点击下图红框中的“对号”, 接下来工作界面如下图所示:
首先我们要查看整个网络中可以进行欺骗的目标,这些目标可以使用菜单栏“Hosts”选项下拉菜单中的“scan for hosts”来查看,如下图所示:
执行Hosts list命令之后,就可以看到当前网络中的所有的活跃主机,如下图所示:
其中192.168.68.1是网关地址,192.168.68.141是目标主机的IP地址.我们将中两个地址添加微Target 。首先选中192.168.68.1,然后单击下面的“Add to Target1”,然后选中“192.168.68.141”,单击下面的“Add to Target2” ,这样就选择好了要欺骗的目标。如果想要查看设置好的目标,可以单击菜单栏上的“Targets”,如下图所:
选择好目标之后,我们需要对这个目标进行ARP欺骗,这样目标才会将发往网关的数据发到我们的主机上。现在菜单栏处单击“ARP poisioning”,如下图所示:
接下来会弹出一个中间人攻击选项,这里面一共有两个可选项,勾选“Sniff remote connections”即可,如下图所示:
一切设置完毕,就可以进行ARP欺骗了(即中间人攻击了)。单击窗口上的“OK”按钮。如下图所示:
现在从IP地址为192.168.68.141的iPad发出的数据都将发送到我们主机上。此时单击Ettercap菜单栏上的3个点选项,然后选中“Connections”可查看连接内容,如下图所示:
查看到的目标主机上连接情况如下图所示:
成功进行网络嗅探后,从目标主机发向网关的所有流量都将现经过你的计算机,而现在该目标主机与外界的所有通信都“摆在你眼前了“。
1.5 实现对HTTPS的中间人攻击
启动抓包工具Wireshark,就可以发现目标在浏览某个网站时实际产生的书包,如下图所示:
这里获取的数据包并不能看出用户具体在做什么,所有的通信的数据包的协议部分都显示为“TLSv1.2”。而且当我们选择其中一个数据包查看它的详细信息时,其通信内容被加密了,如下图所示:
其实上面显示的这部分数据包就是在用户浏览页面时产生的,但是为什么显示的不是直接可以看到的内容的HTTP呢?因为目前大部分网站已经不再是使用HTTP了,而是转而采用更加安全的HTTPS。
1.5.1 HTTPS与HTTP的区别
HTTP主要存在以下缺点
◆ 在通信的过程使用明文传输,一旦信息被截获,用户的隐私就会被泄漏
◆ 不对通信方的身份进行验证,因而通信双方可能会被黑客冒充
◆ 无法保证通信数据的完整性,黑客可能会篡改通信数据
安全套接字(Secure Sockets Layer, SSL)协议用以保障在Internet上数据传输的安全,利用数据加密技术,可确保数据在网络上的传输过程中不会被截取和窃听。SSL协议提供的安全通道有以下3个特性:
◆ 在通信的过程中使用密钥加密通信数据,即使信息被截获,用户的隐私也不会被泄漏
◆ 服务器和客户都会被认证,客户的认证时可选的
◆ SSL协议会对传送的数据进行完整性检查,黑客无法篡改通信数据
而HTTPS相当也HTTP+SSL协议。因为在原有的结构中多了SSL这一层,所以HTTP首先需要使用SSL来建立连接。HTTP与HTTPS的区别如下图所示:
相比HTTP,HTTPS的加密过程要复杂很多,这里一共分成8个步骤:
① 客户端首先向服务端发送请求,连接到服务端到443端口,发送到信息包括客户端支持的加密算法
? ② 服务端在接收信息之后,向客户端发送匹配好的协商加密算法(客户端提供算法的子集)
? ③ 服务端向客户端发送数字证书,可以时权威机构所颁发的,也可以是自己制作的。该证书中包含证书颁发机构、过期时间、服务器公钥、服务端域名信息等内容
④ 客户端对证书进行解析,并验证数字证书是否有效,如果发现异常,就会弹出一个警告框,提示该数字证书存在问题。如果该数字证书验证通过,客户端就会生成一个随机数R
? ⑤ 客户端使用数字证书中的公钥对随机数R进行加密,然后发送给服务端
? ⑥ 服务端使用私钥对传输数据进行解密,得到随机数R
? ⑦ 客户端使用随机数R和协商加密算法加密一条消息发送给服务端,验证服务端是否能正常接收自客户端的消息
? ⑧ 服务端也通过随机数R和协商加密算法加密一条消息发送给客户端,如果客户端能够正常接收来自服务端端消息,则表明SSL层连接已经成功建立。
1.5.2 数字证书颁发机构的工作原理
上面介绍的HTTPS的加密过程的8个步骤中,最关键的是第3个步骤中服务端发送的数字证书。这个数字证书有两种来源:一种是由服务端自行生成的,这种情况下并不能保证通信的安全(因为数字证书很容被调包); 另一种是由权威的证书颁发机构(Certificate Authority CA)所颁发的,这种情形下安全性才得到了真正的提示。
服务端如果想要获得数字证书,就需要向证书颁发机构申请。证书颁发机构生成一对公钥和私钥、一个服务端端数字证书,并使用私钥对数字证书进行加密,该私钥不是公开的。 证书颁发机构向服务器A颁发包含CA公钥的数字证书,并向客户端提供CA公钥。证书颁发机构的工作原理如下图所示:
这样一来,由于专门用来加密数字证书的私钥掌握在证书颁发机构手中,即使服务端向客户端发送的数字证书被黑客截获,他们也只能解读,无法篡改。因为篡改数字证书后, 用户就无法使用证书颁发机构提供的CA公钥对数字证书进行解密。黑客获得的数字证书中的CA公钥也只能用来加密,不能解密,这样他们也无法获悉服务端和客户端加密的信息。即使使用了数字证书机制,仍然可能会出现以下问题导致完全机制失效。
1.5.3 基于HTTPS的中间人攻击
1.5.3.1 mitmproxy的安装与启动
mitmproxy是一个可以实现中间人攻击的Python模块,这个模块同时也提供了可以执行的程序。它的实质是一个可以转发请求的代理,保障服务端与客户端的通信,可以查看、记录其截获的数据或篡改数据。
为了实现伪造数字证书的目的,mitmproxy建立一个证书颁发机构,该机构不在你的浏览器的“受信任的根证书颁发机构”中。一旦用户选择了对其信任,它就会动态生成用户要访问网站的数字证书,实际上相当于证书颁发机构已经被黑客控制。Kali 中预先安装了mitmproxy。通过mitmproxy、mitmdump、mitmweb都可以完成mitmproxy的启动。它们提供了不同的操作界面,但功能一致,且都可以加载自定义脚本。在命令行中使用sudo mitmweb命令,如下图所示::
可以打开mitmweb的工作界面(工作在8081端口),如下图所示:
1.5.3.2 使用mitmproxy解密本机流量
这种情形指的是使用mitmproxy来解密从本机发出的流量,也就是说将浏览器的代理设置为127.0.0.1:8080,通常应用程序的测试人员会采用这种手段。此外,当黑客控制了用户计算机之后,也会采用这种手段来解析那些加密的流量。
首先,我们需要为浏览器手动设置代理, 这里以Firefox为例,通过“选项”—>“网络设置”----->“设置”,然后添加这个代理,添加的方法如下图所示:
在命令行功中使用mitmweb命令启动mitmproxy。然后访问mitmproxy提供的证书颁发机构下载数字证书,如下图所示
数字证书下载完成以后就可以安装了。在Windows操作系统下安装这个证书很简单,双击mitmproxy-ca-cert.p12,一直单击“下一步”直到安装完成。
这时返回到mitmweb的工作界面,你可以看到所有的内容都是明文,如下图所示:
1.5.3.3 使用mitmproxy与中间人攻击协同工作
这种情形指的是使用mitmproxy来解密从其他设备发出的流量。黑客首先运行中间人攻击程序,将它的全部流量劫持到自己的设备上。
因为mitmproxy只能运行在8080端口,所以需要将劫持的流量转发到这个端口上。考虑到mitmproxy用来处理HTTP、HTTPS产生的流量,所以我们只需要将目标端口为80和443的流量过滤出来,然后转发到本机的8080端口。这一点在Linux操作系统中使用iptable可以很容易做到。下面给出转发的命令:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080
上面的命令要在root权限下执行。如果是在Windows操作系统下,由于没有iptables,实现这个操作会变得十分困难,如下图所示:
另外,我们还需要想办法在受到中间人攻击的设备上导入mitmproxy的数字证书,这样在访问的时候才不会出现数字证书错误的提示。
|