实验简介
最近在学习《计算机网络系统与方法》这本书,课程布置了一个网络攻击的作业 SYN Flooding Attack ,本文就本次实验做一个完整的实验报告及总结。
SEED简介
SEED:计算机安全教育的教学实验平台,纽约雪城大学 杜文亮 (Du, Wenliang) 教授设计和实现,从2002年开始得到NSF 1.2M$的资助。
官方地址:http://www.cis.syr.edu/~wedu/seed/
SEED 内容包含一下几类:
本次实验为 Network Security Labs
中的 TCP/IP Attack Lab
。
配置环境
- 操作系统:
Windows10
- 虚拟机操作系统:
SEEDUbuntu 16.04
- 虚拟机工具:
VirtualBox 5.2.22
- 网络平台:
GNS3 2.1.0
- 机器配置(共两个虚拟机,如下):
机器名:lab1;内存大小;1024M;处理器数量:1个;显存大小:16M
机器名:lab2;内存大小:1024M;处理器数量:1个;显存大小:16M
- 本机计算机配置:
内存:4G;CPU:Intel Core i5-5200U 2.20GHz
实验目的
- 掌握
SEEDUbuntu
操作系统的网络配置以及基本使用方法; - 掌握使用
WireShark
对流量进行抓包分析; - 掌握
GNS3
网络平台的基本使用及建模方法; - 实践
SYN flood
攻击,理解其表现形式和产生的影响; - 深入观察理解
linux
内核tcp syn cookie
机制,理解其在SYN flood
攻击中的作用。
实验环境的安装与配置
安装VirtualBox 5.2.22
官网下载地址:https://www.virtualbox.org/
下载安装 Windows
版本,下载好安装文件,直接点击下一步,默认设置安装。
下载Ubuntu操作系统
SEEDUbuntu官网地址:http://www.cis.syr.edu/~wedu/seed/lab_env.html,进入官网界面如下:
点击上面红框连接,给出的是适用于 VirtualBox
的 Ubuntu
镜像文件,因此下载后用 VirtualBox
导入即可。
新建虚拟机并安装操作系统
新建虚拟机,并选择选择 Linux
操作系统的 Ubuntu
版本,名字可以随便取,如下图:
选择虚拟机内存大小,建议2048M,我的电脑由于内存不够这里选的是1024,如下图:
选择使用已有的虚拟硬盘文件,然后找到上一步下载的镜像解压后的文件夹中的 SEEDUbuntu12.04.vmdk
文件,点击创建:
至此,虚拟机配置操作完成。
登录虚拟机
通过普通用户登录,有特权操作在通过 su
命令
- 超级用户,user ID : root,assword : seedubuntu
- 普通用户,user ID : seed,Password : dees
进入登陆界面,如下图:
打开终端,在命令行输入ifconfig
查看网卡配置情况,如下:
网卡名字不是从 eth0
开始,则执行下列命令 rm /etc/udev/rules.d/70‐persistent‐net.rules
,然后重新启动。
克隆一个新的虚拟机,在原虚拟机(需要保持关闭状态,否则无法复制)上右键复制即可,完成后如下图:
此时,虚拟机准备工作完成,点击开启两台虚拟机。
这需要注意,如果采用复制的方式,lab2
的网卡 eth0
的物理地址会和 lab1
的网卡物理地址一样,这样会有冲突造成后面两台虚拟机无法连接,所以采用克隆的方式一直要重新配置一下网卡。
GNS3网络平台的配置
GNS3相关设置
GNS3官网:https://www.gns3.com/
安装好 GNS3
后,打开 GNS3
,选择菜单栏中的 “Edit”->“Perferences”->“Server”
,将 Host Binding 改为 127.168.56.1
(该IP地址与网络中 VirtualBox Host-Only Network
的 IPV4 的地址一致,可打开网络连接查看),其他不变,如下图:
然后点击 GNS3 上述配置页面右下角的 Apply
,继续找到左边的 VirtualBox VMs
,点击后在右边 New
-> 添加 VirtualBox
中第1步创建好的两个虚拟机 lab1
和 lab2
,如下图所示:
GNS3中工程的创建
“File”->“New blank project”->设置好位置和名字后点击“OK”
,即创建了一个工程。
在GNS3工程中建模
点击 “View”->“Docks”->“All devices”
,调出设备框,选用虚拟机 lab1
和 lab2
两台服务器,将其拖入右侧空白处,如下图:
然后点击左侧的倒数第一个连线按钮,在两个机器的 eth0
网卡上连线,如下图所示:
此时出现一个问题,发现两台虚拟机均无法连接,系统提示错误信息 VirtualBox VM not powered off
(是由于虚拟机已经开启所致),关闭 GNS3
重新启动也会提示如下错误:
按照错误提示登录网站 https://www.vmware.com/support/developer/vix-api/. 下载 VIX API
,如下图所示,点击 SDK 1.15
:
然后重新启动电脑,打开虚拟机,登录 GNS3
,完美解决问题,如下图:
两台虚拟机的网络配置
点击 GNS3
上方绿色三角形启动两台虚拟机(若虚拟机已经启动无需执行此步骤),然后进入虚拟机,在乌班图界面右上角有个扇形图标,点击后选择 edit connections
,如下图:
将 lab1
的 IP
地址配置为 192.168.1.100
,如下图:
将 lab2
的 IP
地址配置为 192.168.1.101
,如下图:
点击 save
,保存配置,当然也可以通过命令行的方式修改网卡的配置文件,这种方式可以永久保存配置信息。
IP
地址配置完成之后,发现 GNS3
上连接线变绿,表示互相连通,如下图:
到此,实验所需环境配置完成,下面开始实验内容步骤。
SYN flood攻击实验
我们将 lab1
设置为攻击者,lab2
设置为被攻击目标。
lab2 上启动 telnet 服务
root
用户下输入命令:service openbsd-inetd start
,如下图:
验证一下,在 lab1
上用 telnet
登录 lab2
,在命令行中输入 telnet 192.168.1.101
,如下图说明成功:
登录后,在 lab2
上用命令 netstat -n –tcp
查看连接:
此即表示 TCP(telnet)
连接建立。
进行SYN flood攻击
Lab1
上执行命令:netwox 76 -i 192.168.1.101 --dst-port 23
,该命令需要root权限,root用户操作或者命令前面加 sudo
,然后打开 WireShark
,查看攻击的报文,如下图:
可见,lab1
向 lab2
发送了大量的 TCP
报文。在 lab2
上查看连接建立情况:
此时查看 lab1
是否能与 lab2
建立 TCP
连接,即用 telnet
登录 lab2
:
telnet
登录成功,通过 netstat -n --tcp|grep 192.168.1.100
查看 TCP
连接,如下图:
可见默认情况下,Target
机器遭受 SYN flood
攻击后,其它机器仍然可以与其建立 TCP
连接。
观察linux 内核 tcp syn cookie 机制
在 lab2 机器上执行命令 cat /proc/sys/net/ipv4/tcp_syncookies
:
可见默认为1
,表示 lab2
的 Linux
内核默认开启了 TCP SYN Cookie
保护,可以防止一个套接字在有过多试图连接到达时引起过载。
执行命令 echo 0 > /proc/sys/net/ipv4/tcp_syncookies
,将其改为0
,即关闭内核 TCP SYN Cookie
保护:
Linux
内核中,net.ipv4.tcp_max_syn_backlog
表示 SYN
队列的长度,默认为512
,即容纳等待连接的网络连接数,输入命令 sysctl -a | grep net.ipv4.tcp_max_syn_back_log
查看,如下图:
为了快速看到关闭内核 TCP SYN Cookie
保护的效果,将net.ipv4.tcp_max_syn_backlog
改为5
,输入命令 sysctl -w net.ipv4.tcp_max_syn_back_log=5
,如下图:
Linux
内核中 net.ipv4.tcp_syncookies
表示是否开启 SYN Cookies
,即当出现 SYN
等待队列溢出时,启用 cookies
来处理,可防范少量 SYN
攻击,0
表示关闭,1
表示开启,如下图:
至此,将 Linux
内核的 TCP SYN Cookie
保护机制关闭,将 SYN Cookies
关闭,同时将 SYN
队列长度调小,以便迅速观察到实验结果。
在次进行 SYN flood 攻击
在 lab1 的命令行输入 netwox 76 -i 192.168.1.101 --dst-port 23
,然后打开 WireShark
,查看攻击的报文,如下图:
此时在 lab1
上用 telnet
登录 lab2
,如下图:
可见无法登录,即 SYN flood
攻击成功。
在 lab2
上查看 TCP
连接,如下图:
即只有5
个 TCP
连接,与上面的内核相关参数的设置相对应。
致此全部实验过程结束。
实验结果分析
SYN Flood攻击
SYN Flood
是一种非常危险而常见的 Dos
攻击方式,而 SYN Cookie
是能够有效防范 SYN Flood
攻击的手段。
SYN Flood
攻击是一种典型的拒绝服务 (Denial of Service)
攻击。所谓的拒绝服务攻击就是通过进行攻击,使受害主机或网络不能提供良好的服务,从而间接达到攻击的目的。
SYN Flood
攻击利用的是 IPv4
中 TCP
协议的三次握手 (Three-Way Handshake)
过程进行的攻击。TCP
服务器收到 TCP SYN request
包时,在发送 TCP SYN + ACK
包回客户机前,TCP
服务器要先分配好一个数据区专门服务于这个即将形成的 TCP
连接。一般把收到 SYN
包而还未收到 ACK
包时的连接状态称为半打开连接 (Half-open Connection)
。在最常见的 SYN Flood
攻击中,攻击者在短时间内发送大量的 TCP SYN
包给受害者。受害者(服务器)为每个 TCP SYN
包分配一个特定的数据区,只要这些 SYN
包具有不同的源地址(攻击者很容易伪造)。这将给 TCP
服务器造成很大的系统负担,最终导致系统不能正常工作。
SYN Cookie机制
SYN Cookie
原理由 D.J. Bernstain 和 Eric Schenk 提出。
SYN Cookie
是对 TCP
服务器端的三次握手做一些修改,专门用来防范 SYN Flood
攻击的一种手段。它的原理是,在 TCP
服务器接收到 TCP SYN
包并返回 TCP SYN+ACK
包时,不分配一个专门的数据区,而是根据这个 SYN
包计算出一个 cookie
值。这个 cookie
作为将要返回的 SYN ACK
包的初始序列号。当客户端返回一个 ACK
包时,根据包头信息计算 cookie
,与返回的确认序列号(初始序列号 + 1)进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。
SYN Cookie
机制的实现关键在于 cookie
的计算,cookie
的计算应该包含本次连接的状态信息,使攻击者不能伪造。cookie
的计算过程如下:
- 服务器收到一个SYN包,计算一个消息摘要mac。mac = MAC(A, k)。MAC是密码学中的一个消息认证码函数,也就是满足某种安全性质的带密钥的hash函数,它能够提供cookie计算中需要的安全性。在Linux实现中,MAC函数为SHA1。
- 上述公式中,
A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND
,k
为服务器独有的密钥,实际上是一组随机数。t
为系统启动时间,每60秒加1。MSSIND 为MSS
对应的索引。
实验结果分析
当内核开启了 SYN Cookie
保护机制时,在 Target
机器 (lab2)
遭受 SYN Flood
攻击后,源机器 (lab1)
用 telnet
登录 Target
机器时,仍然可以建立 TCP
连接,相应可以收到 ACK
报文,用 WireShark
抓包结果如下图所示:
可见 TCP
三次握手过程完成,建立了 TCP
连接并且开始了 telnet
服务。具体打开其中 ACK
报文的 TCP
协议内容,如下图所示:
而当内核关闭 SYN Cookie
机制时,Target
机器遭受攻击后,源机器 telnet
登录 Target
机器,无法建立 TCP
连接,抓包如下图所示:
由此可见只有一个 TCP
发送报文,无 ACK
应答。TCP
三次握手无法完成,无法建立 TCP
连接。