1. 实验环境
Windows 10 | 主机 | WIFI |
---|---|---|
Ubuntu64 | 虚拟机 | 桥接 |
Ubuntu64 | 虚拟机 | 桥接 |
安装wireshark:sudo apt-get install wireshark
安装netwox:sudo apt-get install netwox
2. Tasks
2.1 ARP cache poisoning
ARP协议:地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。在局域网中,网络中实际传输的是数据帧,帧里面是有目标主机的MAC地址的。在以太网中,一个主机和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。ARP协议解析过程如图:
ARP协议中不同主机对广播包的正常响应如下图所示:
攻击原理: 地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存。由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。攻击过程可简单如下图所示:
攻击结果:受害者电脑ARP缓存表配置无效,所有流量需要先经过攻击者的网关,攻击者就可以嗅探受害者所有流量。如果攻击者未开启流量转发,受害者将无法上网,导致断网攻击。如果攻击者进行双向欺骗,攻击者能够监听和修改受害者所有流量。如下图所示:
常见的应用还有: 网络限速、域名劫持等。
实验过程:
网关 | 192.168.1.1 | 5c:09:79:6b:e2:cf | 网关 |
---|---|---|---|
win10 | 192.168.1.13 | c8:3d:d4:ae:8f:e1 | 观察者 |
ubuntu1 | 192.168.1.33 | 00:0c:29:fa:a1:fd | 攻击者 |
ubuntu2 | 192.168.1.34 | 00:0c:29:68:bb:8e | 受害者 |
受害者查看当前ARP缓存表:
攻击者使用netwox工具进行ARP攻击:
指令: sudo netwox 80 -e “00:0C:29:FA:A1:FD” -i “192.168.1.1” -I “192.168.1.34” -E “00:0c:29:68:bb:8e”
该指令会向受害者发送伪造的ARP响应包,将网关的IP映射为攻击者自身的MAC。
查看受害者ARP缓存表,可以发现网关对于MAC地址已经跟攻击者MAC一致且无法正常上网:
此时受害者上网请求都会先经过攻击者的机器,可以直接用wireshark嗅探到受害者上网所有数据。如果攻击者开启流量转发,攻击者便可以悄无声息的嗅探到受害者的流量信息。所以告诫我们关注公共WiFi的网络安全性以及加密传输的重要性,当然如果攻击者开启了双向欺骗(类似中间人攻击),加密的流量也可以被解析。
2.2 ICMP Redirect Attack
ICMP重定向信息是路由器向主机提供实时的路由信息,当一个主机收到ICMP重定向信息时,它就会根据这个信息来更新自己的路由表。由于缺乏必要的合法性检查,如果一个黑客想要被攻击的主机修改它的路由表,黑客就会发送ICMP重定向信息给被攻击的主机,让该主机按照黑客的要求来修改路由表。
造成结果与ARP欺骗类似,攻击者可以嗅探到受害者上网流量信息。
实验过程:
网关 | 192.168.1.1 | 5c:09:79:6b:e2:cf | 网关 |
---|---|---|---|
win10 | 192.168.1.13 | c8:3d:d4:ae:8f:e1 | 观察者 |
ubuntu1 | 192.168.1.33 | 00:0c:29:fa:a1:fd | 攻击者 |
ubuntu2 | 192.168.1.34 | 00:0c:29:68:bb:8e | 受害者 |
攻击者向受害者发送伪造的ICMP重定向包,将受害者路由表网关修改为攻击者IP,同时攻击者开启流量转发,嗅探受害者上网数据。
安装traceroute:sudo apt-get install traceroute
受害者当前路由情况:
攻击者开启流量转发: sudo sysctl net.ipv4.ip_forward=1
需要注意的的是:ubuntu默认关闭了发送和接收ICMP重定向包的功能,需要修改配置文件/etc/sysctl.conf进行修改,使用/sbin/sysctl -p指令刷新:
使用netwox 86号指令进行实验:
指令: sudo netwox 86 -d “ens33” -g “192.168.1.33” -i “192.168.1.1” -f “host 192.168.1.34”
-d 指定网卡 -g 新网关 -i 伪造来源IP -f 针对主机
将192.168.1.34的网关修改为192.168.1.33(攻击者ip)
受害者路由情况:
可见,受害者的流量先经过攻击者网卡再转发到真正的网关进行上网。可见ICMP重定向攻击依旧能达到嗅探流量与断网的目的。
2.3 SYN Flooding Attack
SYN泛洪一直是互联网上最常见也是最经典的DDoS攻击方式。这种攻击通过向服务器发送大量tcp请求连接报文,服务器为每一条连接分配资源最终导致内存耗尽而无法为后续的合法请求建立连接和服务。问题出在TCP三次握手流程上,在第二次握手中,当服务器发送了syn+ack报文后,若该连接的定时器超过超时重传时间(出现超时的原因可能是syn+ack报文丢失、客户ack报文丢失、RTT时间过长、甚至可能客户是在进行synflood攻击),服务器就会对报文进行重传,当重传次数超过阈值服务器认为TCP连接超时,而后才会销毁该请求套接口释放TCB。如果攻击者用快于服务器TCP连接超时的速度,连续对目标服务器开放的端口发送SYN报文,服务器的所有资源都将被消耗,以至于不能再接受其他客户的正常连接请求。
实验过程:
网关 | 192.168.1.1 | 5c:09:79:6b:e2:cf | 网关 |
---|---|---|---|
win10 | 192.168.1.13 | c8:3d:d4:ae:8f:e1 | 观察者 |
ubuntu1 | 192.168.1.33 | 00:0c:29:fa:a1:fd | 攻击者 |
ubuntu2 | 192.168.1.34 | 00:0c:29:68:bb:8e | 受害者 |
安装Telnet服务: sudo apt-get install telnetd -y
开启Telnet服务: sudo /etc/init.d/openbsd-inetd restart
关闭SYNcookie机制:sudo sysctl -w net.ipv4.tcp_syncookies=0
客户端(win 10)尝试telnet连接:
使用netwox 76号命令进行syn flood攻击:
指令: sudo netwox 76 -i “192.168.1.34” -p 23
受害机端口连接情况:
Wireshark捕捉到大量syn连接:
此时客户端已经连接不上telnet:
2.4 TCP RST Attacks on telnet and ssh Connections
A和服务器B之间建立了TCP连接,如果此时C伪造了一个TCP包发给B,使B异常的断开了与A之间的TCP连接,就是RST攻击。与四次握手的正常TCP连接关闭发送FIN包不同,RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。
实验过程:
网关 | 192.168.1.1 | 5c:09:79:6b:e2:cf | 网关 |
---|---|---|---|
win10 | 192.168.1.13 | c8:3d:d4:ae:8f:e1 | 观察者 |
ubuntu1 | 192.168.1.33 | 00:0c:29:fa:a1:fd | 攻击者 |
ubuntu2 | 192.168.1.34 | 00:0c:29:68:bb:8e | 受害者 |
客户端(win 10)首先连接上telnet:
使用netwox 78号工具进行攻击:
指令: sudo netwox 78 -i “192.168.1.13”
进行攻击后,win 10与服务端的telnet被关闭
Win 10再次进行连接,连接失败。
甚至无法进行正常上网,实现断网攻击:
使用wireshark抓包,发现只有主机发起连接后才会收到RST包,那么问题来了。Netwox如何知道目标主机建立连接的端口号呢?根据RST重置攻击的定义,至少需要把源IP、源端口、目标IP、目标端口都填对,对于A与B连接来说,对于其中一方来说端口和IP都是很难确定的。
除此之外还有TCP序列号问题,如果序列号的值不在A之前向B发送时B的滑动窗口内,B会主动丢弃该包,达不到重置的效果。当然序列号也可以通过暴力解决的,一个sequence长度是32位,取值范围0-4294967296,如果窗口大小为65535的话,只需要相除,就知道最多只需要发65537(4294967296/65535=65537)个包就能有一个序列号落到滑动窗口内。RST包是很小的,IP头+TCP头也才40字节,算算我们的带宽就知道这实在只需要几秒钟就能搞定。但是对于目标来说,想知道其与谁通信,使用的哪个端口是很困难的。
所以对于netwox 78号工具来说,其实是对本地网卡进行本地阻断。而正好我们搭建的虚拟机似乎共享的一个虚拟网卡,导致能够进行阻断。所以TCP RST复位攻击理论上是可以实现的,不过实现条件较为苛刻。
使用python scapy RST复位脚本如下:
脚本验证过程:
win10 | 192.168.1.13 | c8:3d:d4:ae:8f:e1 | 攻击者 |
---|---|---|---|
ubuntu1 | 192.168.1.33 | 00:0c:29:fa:a1:fd | 受害者 |
ubuntu2 | 192.168.1.34 | 00:0c:29:68:bb:8e | 服务端 |
首先客户端(ubuntu1)与服务端(ubuntu2)建立telnet连接…
手动获取连接信息:
运行脚本:
由于暴力破解效果太差,直接指定seq:
运行后telnet客户端与服务端TCP连接被断开:
2.5 TCP RST Attacks on Video Streaming Applications
该task与上一个task攻击原理是一样的,只不过针对web应用不同,该task主要针对的是web 视频应用。同样,对于该实验,我们先用netwox 78号工具进行本地截断。
Netwox 78本地截断:
win10 | 192.168.1.13 | c8:3d:d4:ae:8f:e1 | 受害者 |
---|---|---|---|
ubuntu1 | 192.168.1.33 | 00:0c:29:fa:a1:fd | 攻击者 |
ubuntu2 | 192.168.1.34 | 00:0c:29:68:bb:8e | 观察者 |
Win 10随意观看视频:
Ubuntu使用netwox 78: sudo netwox 78 -i “192.168.1.13”
视频无法正常观看:
2.6 ICMP Blind Connection-Reset and Source-Quench Attacks
ICMP信息同样可以被用于达成连接重置攻击。为了达到这个目的,攻击者发送一条显示“硬错误”的ICMP的错误信息给TCP连接两端的任意一方。连接将会被立即中断,因为在RFC1122中主机在接收到这样一个ICMP错误包时,应当立即中断相关的连接。RFC1122定义“硬错误”为一个目的不可达且协议无效、端口无效、标志位缺失和DF位设置的ICMP错误信息。ICMP源端关闭信息被拥塞路由器用于告知TCP发送者减缓发送包的速度。攻击者可以制定这样的信息来实施对TCP发送者的拒绝服务攻击。
实验环境:
win10 | 192.168.1.13 | c8:3d:d4:ae:8f:e1 | 受害者 |
---|---|---|---|
ubuntu1 | 192.168.1.33 | 00:0c:29:fa:a1:fd | 攻击者 |
ubuntu2 | 192.168.1.34 | 00:0c:29:68:bb:8e | 服务端 |
ICMP Blind Connection-Reset Attack:
Win 10 使用telnet连接Ubuntu2:
Ubuntu1使用netwox 82号工具:
指令: sudo netwox 82 -d “ens33” -f “host 192.168.1.13 and tcp port 61128” -i “192.168.1.34”
客户端与服务端telnet连接被断开
这一次对服务端进行攻击,客户端重新连接:
(这里发现服务端上前两次tcp显示仍为已建立连接,猜测我们冒充服务端对客户端进行中断并且客户端没有向服务端返回任何信息,所以服务端仍认为客户端还在进行连接)
指令: sudo netwox 82 -d “ens33” -f “host 192.168.1.34 and port 23” -i “192.168.1.13”
连接未断开,依旧正常连接,猜测是Ubuntu有相关防御机制,而windows10没有相关防御机制。
Source-Quench Attack:
Win 10与服务端建立连接:
使用netwox 85号工具:
指令:sudo netwox 85 -d “ens33” -i “192.168.1.13”
连接被关闭…
2.7 TCP Session Hijacking
一个基本的TCP协议设计是传输的数据的每一个字节必须要有一个序列号码。这个序列号用来保持跟踪数据和提供可靠性。最初的序列号码是在TCP协议握手的第一步生成的。目的地系统使用这个值确认发出的字节。这个序列号字段长度有32个字节。这就意味着可能有大约4,294,967,295个序列号。一旦这个序列号一致,这个账户就会随着数据的每一个字节逐步增加。一旦确定了序列号,攻击者就能够把合法的用户断开。这个技术包括拒绝服务、源路由或者向用户发送一个重置命令。无论使用哪一种技术,这个目的都是要让用户离开通讯路径并且让服务器相信攻击者就是合法的客户机。
如果这些步骤取得成功,攻击者现在就可以控制这个会话。只要这个会话能够保持下去,攻击者就能够通过身份验证进行访问。这种访问能够用来在本地执行命令以便进一步利用攻击者的地位。
该实验与TCP 连接重置攻击原理相同,都是伪造TCP包数据,不同的只是其应用。可以发RST使连接重置,也可以伪装成正常的TCP包劫持会话。Netwox 40工具可以达到这样的目的,不过为了方便起见,我们使用了shijack工具。需要注意的是,这里依旧演示本地劫持。
实验环境:
win10 | 192.168.1.13 | c8:3d:d4:ae:8f:e1 | 受害者 |
---|---|---|---|
ubuntu1 | 192.168.1.33 | 00:0c:29:fa:a1:fd | 攻击者 |
ubuntu2 | 192.168.1.34 | 00:0c:29:68:bb:8e | 服务端 |
这里我们要劫持win 10与ubuntu2的会话,伪装成telnet客户端向服务端发送恶意代码。首先win 10与服务端建立telnet连接:
指令: sudo ./shijack-lnx ens33 192.168.1.13 64673 192.168.1.34 23
查看流量可以发现我们劫持会话成功,成功伪装成客户端向服务端发送指令(当然我们也收不到指令,只能执行指令~~)。
服务端查看文件,指令执行成功,并且会话存在。
真正客户端会话终止:
3. 总结
这一次实验是常见的关于TCP/IP协议漏洞的攻击方式。比较常用的是ARP欺骗和SYN flood DDoS攻击。关于ICMP重定向和ICMP RST等攻击则由于系统防护的进步,实施起来效果不佳。而TCP RST和会话劫持攻击则由于实现条件困难,而难以在真实的渗透中出现。
TCP协议相关攻击困难条件主要有三点:ISN(初始序列号),端口号,IP。我们很难知道我们想要攻击的主机在和谁通信,这也是我们攻击的目的。同样的,即使我们知道了通信对象IP,其端口号也是难以确定的,客户端和服务端总有一个难以确定。除此之外,我们还需要考虑TCP序列号的问题,如果我们伪造的TCP序列号不在窗口内,将会被直接丢弃。而要劫持会话,要求更加苛刻,需要seq和ack。这个序列号字段长度有32个字节,意味着可能有大约4,294,967,295个序列号,是很难确定的。通过该实验,我们对常用的TCP/IP协议漏洞有所了解,更加明白通信加密的重要性。