环境(详细说明实验运行的操作系统,网络平台,机器的配置)
操作系统:Windows 10 64bit Pro 1909
处理器:Intel® Xeon® CPU E3-1505M v6 \@ 3.00GHz
内存:DDR4 2666MHZ 24GB ECC
网络平台:GNS3 2.2.3
虚拟机软件:Oracle VM VirtualBox 6.0.14
虚拟机:Ubuntu 16.04 32bit
实验目的学会利用GNS3网络平台搭建网络拓扑结构并配置主机的IP和路由。
掌握SYN flood攻击的基本原理,利用虚拟机实现SYN flood攻击。
掌握SYN cookie的原理,并通过实验证明SYN cookie机制的有效性。
了解Linux内核TCP SYN Cookie机制,掌握查看与修改方法。
实验步骤(包括主要流程和说明)
搭建实验环境
(2)在VirtualBox中新建虚拟机,名称为SEEDUbuntu,类型为Linux,版本选择Ubuntu(32-bit),其他使用默认配置,虚拟硬盘使用下载下来的“SEEDUbuntu-16.04-32bit.vmdk”,
点击创建进行虚拟机的创建,如下图所示。
图1:新建SEED虚拟机
(3)采用完全复制的方式复制上一步创建的虚拟机,并将其命名为SEEDUbuntuTarget,复制完成后结果如下。
图2:复制虚拟机副本SEEDUbuntuTarget
(4)打开GNS3,新建一个名为lab02的工程。通过Edit->Preferences->VirtualBox
VMs,将上一步创建的两个虚拟机新建为VM
templates,并通过Edit按钮修改网卡(网卡驱动需设置为通用驱动)数量为3,勾选“Allow
GNS3 to use any configured VirtualBox
adapter”选框,这样就创建好了两个虚拟机模板。
图3:新建虚拟机模板
(5)将两台虚拟机连成如下拓扑结构。
图4:网络和拓扑结构
(6)分别启动两台虚拟机(注意要在GNS3中启动,在VirtualBox中启动的无法连接上),重设两台虚拟机的网卡名称,并设置IP地址和路由。详细步骤如下:重设虚拟机网卡名称
sudo vim /etc/default/grub
找到GRUB_CMDLINE_LINUX=””
改为GRUB_CMDLINE_LINUX=”net.ifnames=0 biosdevname=0”
之后在terminal中键入sudo grub-mkconfig -o /boot/grub/grub.cfg
重启后,网卡名称变成了eth0。
图5:修改网卡名称设置ip地址以及默认路由:
将攻击机的eth0 ipv4更改为192.168.1.1 ip address add 192.168.1.1/24 dev eth0
设置路由ip route add 192.168.1.0/24 dev eth0
设置默认路由ip route add default via 192.168.1.1
将靶机的eth0 ipv4更改为192.168.1.2 ip address add 192.168.1.2/24 dev eth0
并设置默认路由ip route add 192.168.1.0/24 dev eth0
设置默认路由ip route add default via 192.168.1.2
图6:设置IP地址和默认路由
(7)检查SEEDUbuntu和SEEDUbuntuTarget能否互相ping通。
图7:检查能否ping通
(8)在SEEDUbuntuTarget上启动telnet服务。
图8:启动telnet服务并查看服务状态
(9)SEEDUbuntu连接SEEDUbuntuTarget,在SEEDUbuntuTarget上用wireshark观察建立连接的过程。
图9:telnet建立连接
图10:wireshark观察连接过程
(10)在SEEDUbuntuTarget上执行“netstat -n
–tcp”查看TCP连接状态,连接建立成功则已经配置好了SYN
Flooding攻击实验的实验环境,下面可以进行实验。
图11:查看TCP连接状态
SYN Flooding Attack实验
(1)首先通过“cat /proc/sys/net/ipv4/tcp_syncookies”和“cat
/proc/sys/net/tcp_syn_max_backlog”命令查看当前SEEDUbuntuTarget的tcp_syncookies和tcp_max_syn_backlog的状态。
(2)设置SEEDUbuntuTarget的“tcp_syncookies=0”和“tcp_max_syn_backlog=10”,即关闭tcp
syn cookies参数和设置保存在队列中的最大连接数为10。
图12:配置内核参数
(3)在SEEDUbuntu上使用命令“netwox 76 -i 192.168.1.2 –dst-port
23”,对SEEDUbuntuTarget进行SYN
Flood攻击,同时观察SEEDUbuntuTarget的连接状态和wireshark获取的流量包。
可以看出SEEDUbuntuTarget收到了大量的建立TCP连接的包,并向多个IP地址发出了响应包,这些IP地址并非SEEDUbuntu,都是虚假的。
图13:wireshark捕获的包
观察SEEDUbuntuTarget的连接状态,可以看到当前队列已满共有10个连接,且都为SYN_RECV状态。
图14:SEEDUbuntuTarget连接状态
(4)在SEEDUbuntu上使用“telnet
192.168.1.2”命令尝试建立telnet连接,发现连接超时,无法建立连接。
图15:建立Telnet连接失败
(5)设置SeedUbuntuTarget的tcp_syn_cookies参数为1,开启tcp_cookies,此时再尝试用SEEDUbuntu进行Telnet连接,发现连接成功。
图16:Telnet连接成功
此时再观察SEEDUbuntuTarget的TCP连接状态,可以看到在众多的SYN_RECV状态中有一个ESTABLISHED状态,来自192.168.1.1的52074端口。
图17:SEEDUbuntuTarget的TCP连接状态关闭SYN Flooding攻击,结束本次实验。
实验结果和分析
实验结果
本次实验使用Virtualbox虚拟平台,配合GNS建立网络拓扑,使用Wiresdhark观察网络中数据包传输情况
,成功对靶机实施了SYN Flood攻击。
本次实验中需要的是需要设置靶机的默认路由。否则在被攻击时,因为靶机路由表中没有这些伪造地址的路由,所以靶机不会回复TCP连接请求,也不会为其预留资源,在这种情况下,即使攻击成功也会被telnet成功连接。
实验中,主要改变了SYN cookies和tcp_max_syn_backlog的值,在均使用攻击机进行SYN
flood攻击模拟的情况下,见表4.1。
表4.1 SYN Cookies ValueSYN Cookies Value描述0即关闭了SYN cookies防范机制,此时表现为靶机无法防范SYN flood攻击,在被攻击时无法被其他机器通过telnet登陆。且TCP连接队列大小固定为backlog的值,虽然队列内在不断刷新,本可以给新来的telnet连接以机会,但是攻击报文快速涌入,导致telnet连接的三次握手无法完成,最终使靶机表现为无法连接。
1即开启了SYN cookies防范机制,此时表现为靶机可以防范SYN flood攻击,在被攻击时可以被其他机器通过telnet登陆。但TCP连接队列大小不固定为backlog的值,推测此时连接队列的大小受到多个参数的制约。
结果分析
SYN flood与TCP三次握手
SYN
flood攻击的原理是利用了TCP协议中的三次握手过程。对于三次握手过程,TCP协议中规定,当一台主机A想向另一台主机B发起TCP连接时,A需要先发送TCP
SYN 包给B,B收到后发送一个TCP SYN+ACK包回复至A,A此时再发送TCP
ACK包回给B,此时三次握手才结束,连接建立成功,对于B,连接的过程有“SYN_RECV”-“TIME_WAIT”-“ESTABLISHED”。
其中B在“SYN_RECV”状态,即半开连接状态下,在等待TCP
SYN+ACK包发送回来前,系统要先分配好一个数据区专门服务于这个即将形成的TCP连接。
SYN
flood攻击则是利用在短时间内伪造大量的源地址,向被攻击主机发送大量的SYN包,以让靶机为每一个SYN包分配一个数据区,以建立预期的TCP连接,这样就会导致大量资源消耗,系统也不能对后面正常的TCP连接进行响应。
SYN cookie抵御SYN Flood攻击的原理
SYN cookies是对TCP服务器端的三次握手做一些修改,专门用来防范SYN
Flood攻击的一种手段。它的原理是,在TCP服务器接收到TCP SYN包并返回TCP SYN +
ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。这个cookie作为将要返回的SYN
ACK包的初始序列号。当客户端返回一个ACK包时,根据包头信息计算cookie,与返回的确认序列号(初始序列号
+
1)进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。这样就不需要等待客户的响应,防止其占用资源。
实现的关键在于cookie的计算,cookie的计算应该包含本次连接的状态信息,使攻击者不能伪造。cookie的计算过程为,服务器收到一个SYN包,计算一个消息摘要mac
= MAC(A,
k);其中MAC是密码学中的一个消息认证码函数,也就是满足某种安全性质的带密钥的hash函数,它能够提供cookie计算中需要的安全性。在Linux中,MAC函数为SHA1。A的计算方式如下:
A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND
k为服务器独有的密钥,实际上是一组随机数。t为系统启动时间,每60秒加1,MSSIND为MSS对应的索引。
通过计算并验证cookie,SEEDUbuntu避免了守候半开放连接,从而能够有足够的资源响应SEEDUbuntu的SYN连接请求,因此当开启syn_cookies时,能够正常建立连接。
被攻击端不开启SYN Cookie,当遭受SYN
Flood攻击时,正常的TCP连接无法进行连接到被攻击。
SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN
Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP
SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP
ACK包时,TCP服务器在根据那个cookie值检查这个TCP
ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。
开启和不开启SYN Cookie的连接步骤如下图所示。
可以很容易的知道开启SYN Cookie 时可以很好的防范SYN Flood 攻击。
配置参数
SYN cookie
SYN Cookie的原理是靶机在收到TCP
SYN包后,保持在半开连接状态下时,不再为每一个SYN包分配一个专门的数据区,而是根据加密算法计算出一个cookie值,并与TCP
SYN+ACK包一同发送。在后面收到返回的TCP
ACK包时再进行校验,根据返回的cookie值来检查这个TCP
ACK包的合法性。如果合法,再分配专门的数据区以建立未来的TCP连接,此时即有效地防范了SYN
flood攻击。
tcp_max_syn_backlog
tcp_max_syn_backlog的值应可以简单理解为TCP连接队列的大小,实验中,在SYN
cookie设置关闭时,主机的TCP连接队列的最大值即严格按照backlog的值;而在SYN
cookie设置打开时,变化backlog的值对TCP连接队列的最大值并无明显影响,推测是由于此时连接队列的最大值受到多个参数的制约。而不论SYN
cookie是否打开,在接受攻击时主机的TCP连接队列都在不断刷新,即应会在连接数增加到最大值时关闭旧连接。由此推测在SYN
cookie关闭时,调小backlog的值可以减少系统在等待TCP连接完成时的资源的消耗,但新连接很有可能在完成三次握手之前就被关闭;相反,如果增大backlog的值,有机会会使新连接在被攻击报文淹没之前完成三次握手,但相对会增大系统的资源消耗。
因而,相对来说不开启SYN cookie机制,调节backlog的值会可能会对SYN
flood攻击有一些效果,但相对于开启SYN cookie机制仍不够有效。