网络攻防技术-TCP攻击实验(TCP/IP Attack Lab)
1 作业题目
本实验的学习目标是让学生获得有关漏洞以及针对这些漏洞的攻击的第一手经验。聪明人从错误中学习。在安全教育中,我们研究导致软件漏洞的错误。研究过去的错误不仅有助于学生理解为什么系统容易受到攻击,为什么“看似良性”的错误会变成灾难,以及为什么需要许多安全机制。更重要的是,它还帮助学生了解漏洞的常见模式,从而避免将来犯类似的错误。此外,使用漏洞作为案例研究,学生可以学习安全设计、安全编程和安全测试的原则。
TCP/IP协议中的漏洞代表了协议设计和实现中的一种特殊类型的漏洞;它们提供了一个宝贵的教训,说明了为什么安全性应该从一开始就设计好,而不是事后才加上。此外,研究这些漏洞有助于学生了解网络安全的挑战以及为什么需要许多网络安全措施。在本实验中,学生将对TCP进行几个攻击。本实验涵盖以下主题:
l TCP协议
l TCP SYN洪水攻击和SYN cookie
l TCP重置攻击
l TCP会话劫持攻击
l 反向Shell
2 实验步骤及结果
构造并启动docker容器后,创建的网络拓扑结构如下所示:

Task 1: SYN Flooding Attack
SYN泛洪攻击利用了TCP三次握手过程中的设计缺陷,在正常的TCP连接建立过程中,客户端发送一个带有SYN(同步)标志的TCP段给服务器,服务器收到后回复一个带有SYN和ACK(确认)标志的TCP段,最后客户端回复一个带有ACK标志的TCP段,完成连接建立。然而,SYN洪水攻击中,攻击者发送大量伪造的具有SYN标志的TCP段给目标服务器,但并不回复服务器的SYN-ACK段来完成三次握手,从而导致服务器上堆积大量未完成的连接请求,这些半开放连接会一直保持在服务器上等待,消耗服务器的资源,其结果就是目标服务器的连接队列被填满,无法处理新的合法连接请求。服务器资源如CPU、内存和网络带宽等也会被消耗殆尽,导致服务不可用。

net.ipv4.tcp_max_syn_backlog 是一个Linux内核参数,用于设置TCP三次握手过程中的半连接队列的最大长度,即可以同时等待完成三次握手的连接数。半连接队列存储了服务器正在等待完成三次握手的连接请求。
查看当前的 net.ipv4.tcp_max_syn_backlog 参数值,为256.

攻击之前,在Victim主机查看网络连接的状态:

尝试使用User主机(10.9.0.6)访问Victim(10.9.0.5)主机的Telnet服务:

Task 1.1: Launching the Attack Using Python
通过netstat -nat我们可以看到受害者主机对外仅开启了23端口的监听,所以只能对其23端口进行洪泛攻击。代码如下:
#!/bin/env python3 from scapy.all import IP, TCP, send from ipaddress import IPv4Address from random import getrandbits ip = IP(dst="10.9.0.5") tcp = TCP(dport=23, flags='S') pkt = ip/tcp while True: pkt[IP].src = str(IPv4Address(getrandbits(32))) # source iP pkt[TCP].sport = getrandbits(16) # source port pkt[TCP].seq = getrandbits(32) # sequence number send(pkt, verbose = 0)
在攻击机中启动攻击脚本:

在Victim主机上再次使用netstat -nat命令,可以看到受害者收到许多SYN_RECV:

在User2主机上访问Victim(10.9.0.5)的Telnet服务:

刚开始以为访问超时,但是经过一段时间之后还是建立了连接。多次尝试,均不成功。
通过上网查阅资料可知,这个过程是不太可能成功的。因为该过程中Victim发送的SYN+ACK包被网关收到后会发送RST包给Victim,之后Victim会清除队列里的对应项。所以这就导致只有脚本发送数据包的速度足够快该实验才能成功。C语言的速度足够快,是可以成功的,但是Python脚本发送数据包的速度太慢了,所以不足以成功。
Task 1.2: Launch the Attack Using C
不同于Python,C编译的代码拥有更高的速度,不会受到TCP缓存设置的影响,几乎不用考虑会话建立抢不过其他正常用户。
编译给定程序synflood.c后,在Attacker主机上使用该程序进行攻击,在Victim主机上使用netstat -nat命令查看网络连接状态发现大量SYN_RECV连接:

在User2主机(10.9.0.7)上访问Victim(10.9.0.5)的Telnet服务,telnet连接超时,目标主机无法处理该连接请求:

Task 1.3: Enable the SYN Cookie Countermeasure
启用syncookie保护,将docker-compose.yaml文件中的对应项进行修改,如下所示:

重启容器后,重复Task1.2的操作,对Victim主机使用synflood程序进行攻击:

 在User2主机(10.9.0.7)上访问Victim(10.9.0.5)的Telnet服务,发现在攻击期间,即使使用ip tcp_metrics flush命令清空记忆,User2也可以建立连接:

Task 2: TCP RST Attacks on telnet Connections
Launching the attack manually
开启wireshark监听网卡,然后在User2(10.9.0.7)上发起对Victim(10.9.0.5)的telnet连接。在wireshark抓包寻找已经建立好的会话,并尝试中断。针对最新的报文制定适合的攻击代码:

运行代码,实现了连接的中断:

Launching the attack automatically
执行自动化之后刚尝试登录即被强制下线:

代码(由于是同向的,所以seq必须要比上一个报文的seq大):

Task 3: TCP Session Hijacking
Launching the attack manually
在用户机上telnet Victim:

wireshark监听查看srcport、seq、ack,并填写攻击脚本:

Attacker开始攻击:

在Victim(10.9.0.5)上查看效果,发现入侵痕迹:

Launching the attack automatically
实现结果:

由于这里不再执行更多指令,所以直接要求劫持程序退出了。与此同时,由于需要用户权限,所以必须等待用户完成登录之后再进行劫持。这里并未体现完成登录后自动劫持,有一种思路:“正则匹配服务器返回信息,出现‘Welcome’单词则表示登录成功,可以进行劫持”。代码:

在attacker上运行代码即可:

Task 4: Creating Reverse Shell using TCP Session Hijacking
编写代码:

在Attacker上打开监听:

Telnet 10.9.0.5:

运行程序:

拿到victim的shell:

值得注意的是,本次选取的过滤方式是从服务器向受害者发送的,因为服务器会定时向用户求活,比较稳定;而从用户方则不然,必须等待用户发送消息时才能进行劫持,同时也不便探查服务器发送的报文的seq与ack,不利于生成合法报文。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号