实验环境:
Linux ubuntu 3.13.0-24-generic
#46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014
x86_64 x86_64 x86_64 GNU/Linux
参考:Ubuntu 下telnet服务安装配置
SYN攻击是一种DoS(Denial of Service)攻击,在这种攻击中黑客向被攻击者的TCP端口发送很多SYN请求,但是黑客并不是想完成三次握手协议,而是使用伪造的IP地址或者只进行三次握手协议中的第一次握手。因为SYN数据包用来打开一个TCP连接,所以受害者的机器会向伪造的地址发送一个SYN/ACK数据包作为回应,并等待预期的ACK响应。每个处于等待状态,半开的连接队列都将进入空间有限的待处理队列。由于伪造的源地址实际上并不存在,所以将那些等待队列中的记录删除并完成建立TCP连接所需的ACK响应用于不会到来,相反每个半开的连接一定会超时,这将花费一段比较长的时间。只要攻击者使用伪造的SYN数据包继续泛洪受害者的系统,受害者的待处理队列将一直处于满员,这使得真正的SYN数据包几乎不可能到达系统并打开有效的TCP连接。
Machine Index | HWAddr | IPAddr |
---|---|---|
1 | 00:1c:42:6f:5b:ee | 10.211.55.27 |
2 | 00:1c:42:cc:87:b6 | 10.211.55.29 |
3 | 00:1c:42:2e:73:dc | 10.211.55.28 |
我们用虚拟机#3作为客户端,虚拟机#2作为服务器端。在虚拟机#3上使用命令telnet 10.211.55.29
,然后输入用户名密码登陆。
注意:因为用户名相同,要使用ifconfig
查看ip地址来确定是否真正连接上了。
连接上之后,检查虚拟机#2的端口占用情况,在telnet服务器端机器(虚拟机#2)上使用命令:
netstat -an | grep 23 | grep tcp
这个命令能过滤出所有所有端口号为23的tcp连接,其中23是telnet的默认端口号。
由上图的结果可以看到,已经在23号端口上和10.211.55.28
建立了TCP连接,即和telnet客户端成功连接。
注意:为了进行下一步实验,要讲telnet客户端先退出,使用命令exit
。
在进行攻击之前,我们要确保作为telnet客户端的虚拟机#2的telnet端口–23号端口要空闲。一样是使用netstat -an | grep 23 | grep tcp
。
作为攻击者的虚拟机#1中使用SYN泛洪攻击命令:
sudo netwox 76 -i "10.211.55.29" -p "23"
使用了这个命令之后,作为被攻击的服务器端虚拟机#2已经卡的不行了,这个时候再进行查看虚拟机#2的端口可以看见SYN队列中塞满了数据包。
这个时候用虚拟机#3作为telnet客户端连接虚拟机#2,按理说会出现连接超时的现象,trying了半分钟,任何操作都没有办法进行,说明攻击成功,因为虚拟机#3的syn队列已经被堵塞了。
在telnet服务器端虚拟机#2上使用命令开启SYN Cookies:
sudo sysctl -w net.ipv4.tcp_syncookies=1
再进行同样的攻击,攻击无效,telnet连接能快速建立。
可见SYN cookies是一种防御泛洪攻击的手段。
有三个条件可以产生RST包:
1. 建立连接的SYN到达某端口,但是该端口上没有正在监听的服务
如:IP为192.168.1.33的主机上并没有开启WEB服务(端口号为0x50),这时我们通过IE去访问192.168.1.33,通过Wireshark抓包,可以看到,对此SYN包的回复为RST。说明此服务器(即IP192.168.1.33)是存在的,不过其上并没有运行WEB Server(如apache)的程序
2. TCP想取消一个已有连接
基于什么样的情况才会取消一个已有的连接?
3. TCP接收到了一个根本不存在的的连接上的分节
我们知道,TCP在数据传输前,要通过三路握手(three-way handshake)建立连接,即连接建立起后,服务器和客户端都有一个关于此连接的描述,具体形式表现为套接口对,如果收到的某TCP分节,根据源 IP,源tcp port number,及目的IP,目的tcp port number在本地(指服务器或客户端)找不到相应的套接口对,TCP则认为在一个不存在的连接上收到了分节,说明此连接已错,要求重新建立连接,于是发出了RST的TCP包!
Machine Index | HWAddr | IPAddr |
---|---|---|
1 | 00:1c:42:6f:5b:ee | 10.211.55.27 |
2 | 00:1c:42:cc:87:b6 | 10.211.55.29 |
3 | 00:1c:42:2e:73:dc | 10.211.55.28 |
1、建立telnet连接
虚拟机#3作为客户端和虚拟机#2作为服务器端建立telnet连接。虚拟机#3上键入命令:
sudo telnet 10.211.55.29
接着在虚拟机#2上查看连接情况。
由上图可以看到,telnet连接建立成功。
2、进行攻击
虚拟机#1作为攻击者,攻击虚拟机#2。攻击命令为:
netwox 78 -i "10.211.55.29"
这个命令是向虚拟机#2发送RST包。
3、检验攻击情况
使用了这个命令之后再观察虚拟机#2和虚拟机#3的telnet连接,发现断开。
虚拟机#3出现:
虚拟机#2检查端口:
可见,攻击成功。
和上一部分telnet连接一样的攻击方式和攻击原理。
1、建立ssh连接
ssh 10.211.55.29
2、攻击
3、检验攻击情况
可见,攻击成功。