SYN flood 攻击及 SYN cookie 原理分析

实验简介

00_Book

最近在学习《计算机网络系统与方法》这本书,课程布置了一个网络攻击的作业 SYN Flooding Attack ,本文件就本次实验做一个完整的实验报告及总结。

SEED简介

SEED:计算机安全教育的教学实验平台,纽约雪城大学 杜文亮 (Du, Wenliang) 教授设计和实现,从2002年开始得到NSF 1.2M$的资助。

官方地址:http://www.cis.syr.edu/~wedu/seed/

SEED内容包含一下几类:

01_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

实验目的

  1. 掌握SEEDUbuntu操作系统的网络配置以及基本使用方法;
  2. 掌握使用WireShark对流量进行抓包分析;
  3. 掌握GNS3网络平台的基本使用及建模方法;
  4. 实践SYN flood攻击,理解其表现形式和产生的影响;
  5. 深入观察理解linux内核tcp syn cookie机制,理解其在SYN flood攻击中的作用。

实验环境的安装与配置

安装VirtualBox 5.2.22

官网下载地址:https://www.virtualbox.org/

02_VirtualBox_5.2.22

下载安装 Windows 版本,下载好安装文件,直接点击下一步,默认设置安装。

下载Ubuntu操作系统

SEEDUbuntu官网地址:http://www.cis.syr.edu/~wedu/seed/lab_env.html,进入官网界面如下:

03_SEEDUbuntu

点击上面红框连接,给出的是适用于 VirtualBoxUbuntu 镜像文件,因此下载后用 VirtualBox 导入即可。

新建虚拟机并安装操作系统

新建虚拟机,并选择选择 Linux 操作系统的 Ubuntu 版本,名字可以随便取,如下图:

04_Create_VirtualBox

选择虚拟机内存大小,建议2048M,我的电脑由于内存不够这里选的是1024,如下图:

05_Internal_Storage

选择使用已有的虚拟硬盘文件,然后找到上一步下载的镜像解压后的文件夹中的 SEEDUbuntu12.04.vmdk 文件,点击创建:

06_SEEDUbuntu

至此,虚拟机配置操作完成。

登录虚拟机

通过普通用户登录,有特权操作在通过 su 命令

  • 超级用户,user ID : root,assword : seedubuntu
  • 普通用户,user ID : seed,Password : dees

进入登陆界面,如下图:

07_Ubuntu_Desktop

打开终端,在命令行输入ifconfig 查看网卡配置情况,如下:

08_ifconfig

网卡名字不是从 eth0 开始,则执行下列命令 rm /etc/udev/rules.d/70‐persistent‐net.rules,然后重新启动。

克隆一个新的虚拟机,在原虚拟机(需要保持关闭状态,否则无法复制)上右键复制即可,完成后如下图:

09_Two_lab

此时,虚拟机准备工作完成,点击开启两台虚拟机。

这需要注意,如果采用复制的方式,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 的地址一致,可打开网络连接查看),其他不变,如下图:

10_Server

然后点击 GNS3 上述配置页面右下角的 Apply ,继续找到左边的 VirtualBox VMs,点击后在右边 New -> 添加 VirtualBox 中第1步创建好的两个虚拟机 lab1lab2 ,如下图所示:

11_VirtualBox_VMs

GNS3中工程的创建

“File”->“New blank project”->设置好位置和名字后点击“OK”,即创建了一个工程。

在GNS3工程中建模

点击 “View”->“Docks”->“All devices”,调出设备框,选用虚拟机 lab1lab2 两台服务器,将其拖入右侧空白处,如下图:

12_Creste_Project

然后点击左侧的倒数第一个连线按钮,在两个机器的 eth0 网卡上连线,如下图所示:

13_Connect

此时出现一个问题,发现两台虚拟机均无法连接,系统提示错误信息 VirtualBox VM not powered off(是由于虚拟机已经开启所致),关闭 GNS3 重新启动也会提示如下错误:

14_Error

按照错误提示登录网站 https://www.vmware.com/support/developer/vix-api/. 下载 VIX API,如下图所示,点击 SDK 1.15:

15_download_SDK

然后重新启动电脑,打开虚拟机,登录 GNS3,完美解决问题,如下图:

16_After_Connect

两台虚拟机的网络配置

点击 GNS3 上方绿色三角形启动两台虚拟机(若虚拟机已经启动无需执行此步骤),然后进入虚拟机,在乌班图界面右上角有个扇形图标,点击后选择 edit connections,如下图:

17_Edit_Connections

lab1IP 地址配置为 192.168.1.100,如下图:

18_lab1_ip

lab2IP 地址配置为 192.168.1.101,如下图:

19_lab2_ip

点击 save,保存配置,当然也可以通过命令行的方式修改网卡的配置文件,这种方式可以永久保存配置信息。

IP 地址配置完成之后,发现 GNS3 上连接线变绿,表示互相连通,如下图:

20_Connet_green

到此,实验所需环境配置完成,下面开始实验内容步骤。

SYN flood攻击实验

我们将 lab1 设置为攻击者,lab2设置为被攻击目标。

lab2 上启动 telnet 服务

root 用户下输入命令:service openbsd-inetd start,如下图:

21_telnet_start

验证一下,在 lab1 上用 telnet 登录 lab2,在命令行中输入 telnet 192.168.1.101,如下图说明成功:

22_telnet

登录后,在 lab2 上用命令 netstat -n –tcp 查看连接:

23_netstat

此即表示 TCP(telnet)连接建立。

进行SYN flood攻击

Lab1 上执行命令:netwox 76 -i 192.168.1.101 --dst-port 23,该命令需要root权限,root用户操作或者命令前面加 sudo,然后打开 WireShark,查看攻击的报文,如下图:

24_WireShark

可见,lab1lab2 发送了大量的 TCP 报文。在 lab2 上查看连接建立情况:

25_lab2_netstat

此时查看 lab1 是否能与 lab2 建立 TCP 连接,即用 telnet 登录 lab2

26_lab1_telnet_lab2

telnet 登录成功,通过 netstat -n --tcp|grep 192.168.1.100 查看 TCP 连接,如下图:

27_lab2_netstat

可见默认情况下,Target 机器遭受 SYN flood 攻击后,其它机器仍然可以与其建立 TCP 连接。

在 lab2 机器上执行命令 cat /proc/sys/net/ipv4/tcp_syncookies

28_cookies

可见默认为1,表示 lab2Linux 内核默认开启了 TCP SYN Cookie 保护,可以防止一个套接字在有过多试图连接到达时引起过载。

执行命令 echo 0 > /proc/sys/net/ipv4/tcp_syncookies,将其改为0,即关闭内核 TCP SYN Cookie 保护:

29_modify_cokkies

Linux 内核中,net.ipv4.tcp_max_syn_backlog 表示 SYN 队列的长度,默认为512,即容纳等待连接的网络连接数,输入命令 sysctl -a | grep net.ipv4.tcp_max_syn_back_log 查看,如下图:

30_sysctl_a

为了快速看到关闭内核 TCP SYN Cookie 保护的效果,将net.ipv4.tcp_max_syn_backlog 改为5,输入命令 sysctl -w net.ipv4.tcp_max_syn_back_log=5 ,如下图:

31_sysctl_w

Linux 内核中 net.ipv4.tcp_syncookies 表示是否开启 SYN Cookies,即当出现 SYN 等待队列溢出时,启用 cookies 来处理,可防范少量 SYN 攻击,0表示关闭,1表示开启,如下图:

32_sysctl_a

至此,将 Linux 内核的 TCP SYN Cookie保护机制关闭,将 SYN Cookies 关闭,同时将 SYN队列长度调小,以便迅速观察到实验结果。

在次进行 SYN flood 攻击

在 lab1 的命令行输入 netwox 76 -i 192.168.1.101 --dst-port 23,然后打开 WireShark,查看攻击的报文,如下图:

33_WireShark

此时在 lab1 上用 telnet 登录 lab2,如下图:

34_telnet_lab2

可见无法登录,即 SYN flood 攻击成功。

lab2 上查看 TCP 连接,如下图:

35_lab2_netstat

即只有5TCP 连接,与上面的内核相关参数的设置相对应。

致此全部实验过程结束。

实验结果分析

SYN Flood攻击

SYN Flood 是一种非常危险而常见的 Dos 攻击方式,而 SYN Cookie 是能够有效防范 SYN Flood 攻击的手段。

SYN Flood 攻击是一种典型的拒绝服务 (Denial of Service) 攻击。所谓的拒绝服务攻击就是通过进行攻击,使受害主机或网络不能提供良好的服务,从而间接达到攻击的目的。

SYN Flood 攻击利用的是 IPv4TCP 协议的三次握手 (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. BernstainEric 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 的计算过程如下:

  1. 服务器收到一个SYN包,计算一个消息摘要mac。mac = MAC(A, k)。MAC是密码学中的一个消息认证码函数,也就是满足某种安全性质的带密钥的hash函数,它能够提供cookie计算中需要的安全性。在Linux实现中,MAC函数为SHA1。
  2. 上述公式中,A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSINDk 为服务器独有的密钥,实际上是一组随机数。t 为系统启动时间,每60秒加1。MSSINDMSS对应的索引。

实验结果分析

当内核开启了 SYN Cookie 保护机制时,在 Target 机器 (lab2) 遭受 SYN Flood 攻击后,源机器 (lab1)telnet 登录 Target 机器时,仍然可以建立 TCP 连接,相应可以收到 ACK 报文,用 WireShark 抓包结果如下图所示:

36_WireShark

可见 TCP 三次握手过程完成,建立了 TCP 连接并且开始了 telnet 服务。具体打开其中 ACK 报文的 TCP 协议内容,如下图所示:

37_ACK_TCP

而当内核关闭 SYN Cookie 机制时,Target 机器遭受攻击后,源机器 telnet 登录 Target 机器,无法建立 TCP 连接,抓包如下图所示:

38_ACK_TCP

39_ACK_TCP

由此可见只有一个 TCP 发送报文,无 ACK 应答。TCP 三次握手无法完成,无法建立 TCP 连接。