DNS 域传送漏洞:原理、危害及防御
关于 DNS 的原理,这里不在做说明,你只需要知道他是 53 UDP 端口即可,以及 Wireshark 走的协议是什么样的
What?
那么什么是 DNS 域传送?我们都知道 DNS 服务器分为 DNS 主服务器、备份服务器、缓存服务器,一般情况下 DNS 域传送是 DNS 主服务器(Primary Server)向从服务器(Secondary Server)同步区域文件(Zone File)的机制,确保所有 DNS 服务器数据一致,区域文件包含域名下所有记录(如 A 记录、MX 记录、CNAME 等)主要的协议类型有
- AXFR(全量传输):同步整个区域文件
- IXFR(增量传输):仅同步变更部分(需DNS服务器支持)
默认情况下,域传送应仅允许可信的从服务器发起请求,若配置不当(这里指的是服务器只要收到 AXFR 的请求就进行域传送),攻击者可利用此功能获取敏感信息,这里在放一下 DNS 所有解析记录类型
When a DNS server receives an AXFR request, it issues all data that it knows for the requested domain. It’s mean that such a request will come from the DNS server that is trying to perform the zone transfer (replicate). But if the DNS server is configured incorrectly, any user can have access to this data.
代码 | 号码 | 定义的 RFC | 描述 | 功能 |
---|---|---|---|---|
A | 1 | RFC 1035 | IPv4地址记录 | 传回一个32位的IPv4地址,最常用于映射主机名称到IP地址,但也用于DNSBL(RFC 1101)等。 |
AAAA | 28 | RFC 3596 | IPv6地址记录 | 传回一个128位的IPv6地址,最常用于映射主机名称到IP地址。 |
AFSDB | 18 | RFC 1183 | AFS文件系统 | (Andrew File System)数据库核心的位置,于域名以外的 AFS 客户端常用来联系 AFS 核心。这个记录的子类型是被过时的的 DCE/DFS(DCE Distributed File System)所使用。 |
APL | 42 | RFC 3123 | 地址前缀列表 | 指定地址栏表的范围,例如:CIDR 格式为各个类型的地址(试验性)。 |
CAA | 257 | RFC 6844 | 权威认证授权 | DNS认证机构授权,限制主机/域的可接受的CA |
CDNSKEY | 60 | RFC 7344 | 子关键记录 | 关键记录记录的子版本,用于转移到父级 |
CDS | 59 | RFC 7344 | 子委托签发者 | 委托签发者记录的子版本,用于转移到父级 |
CERT | 37 | RFC 4398 | 证书记录 | 存储 PKIX、SPKI、PGP等。 |
CNAME | 5 | RFC 1035 | 规范名称记录 | 一个主机名字的别名:域名系统将会继续尝试查找新的名字。 |
DHCID | 49 | RFC 4701 | DHCP(动态主机设置协议)标识符 | 用于将 FQDN 选项结合至 DHCP。 |
DLV | 32769 | RFC 4431 | DNSSEC(域名系统安全扩展)来源验证记录 | 为不在DNS委托者内发布DNSSEC的信任锚点,与 DS 记录使用相同的格式,RFC 5074 介绍了如何使用这些记录。 |
DNAME | 39 | RFC 2672 | 代表名称 | DNAME 会为名称和其子名称产生别名,与 CNAME 不同,在其标签别名不会重复。但与 CNAME 记录相同的是,DNS将会继续尝试查找新的名字。 |
DNSKEY | 48 | RFC 4034 | DNSSEC所用公钥记录 | 于DNSSEC内使用的公钥,与 KEY 使用相同格式。 |
DS | 43 | RFC 4034 | 委托签发者 | 包含DNSKEY的散列值,此记录用于鉴定DNSSEC已授权区域的签名密钥。 |
HIP | 55 | RFC 5205 | 主机鉴定协议 | 将端点标识符及IP 地址定位的分开的方法。 |
HTTPS | 65 | RFC 9460 | 绑定HTTPS | 与建立HTTPS连接相关的记录。详见DNSOP工作组和阿卡迈科技发布的草案。 |
IPSECKEY | 45 | RFC 4025 | IPSEC 密钥 | 与 IPSEC 同时使用的密钥记录。 |
KEY | 25 | RFC 2535[1]RFC 2930[2] | 密钥记录 | 只用于 SIG(0)(RFC 2931)及 TKEY(RFC 2930)。[3]RFC 3455 否定其作为应用程序键及限制DNSSEC的使用。[4]RFC 3755 指定了 DNSKEY 作为DNSSEC的代替。[5] |
LOC记录(LOC record) | 29 | RFC 1876 | 位置记录 | 将一个域名指定地理位置。 |
MX记录(MX record) | 15 | RFC 1035 | 电邮交互记录 | 引导域名到该域名的邮件传输代理(MTA, Message Transfer Agents)列表。 |
NAPTR记录(NAPTR record) | 35 | RFC 3403 | 命名管理指针 | 允许基于正则表达式的域名重写使其能够作为 URI、进一步域名查找等。 |
NS | 2 | RFC 1035 | 名称服务器记录 | 委托DNS区域(DNS zone)使用已提供的权威域名服务器。 |
NSEC | 47 | RFC 4034 | 下一个安全记录 | DNSSEC 的一部分 — 用来表示特定域名的记录并不存在,使用与 NXT(已过时)记录的格式。 |
NSEC3 | 50 | RFC 5155 | 下一个安全记录第三版 | DNSSEC 的一部分 — 用来表示特定域名的记录并不存在。 |
NSEC3PARAM | 51 | RFC 5155 | NSEC3 参数 | 与 NSEC3 同时使用的参数记录。 |
OPENPGPKEY | 61 | RFC 7929 | OpenPGP公钥记录 | 基于DNS的域名实体认证方法,用于使用OPENPGPKEY DNS资源记录在特定电子邮件地址的DNS中发布和定位OpenPGP公钥。 |
PTR | 12 | RFC 1035 | 指针记录 | 引导至一个规范名称(Canonical Name)。与 CNAME 记录不同,DNS“不会”进行进程,只会传回名称。最常用来执行反向DNS查找,其他用途包括引作 DNS-SD。 |
RRSIG | 46 | RFC 4034 | DNSSEC 证书 | 用于DNSSEC,存放某记录的签名,与 SIG 记录使用相同的格式。 |
RP | 17 | RFC 1183 | 负责人 | 有关域名负责人的信息,电邮地址的 @ 通常写为 a。 |
SIG | 24 | RFC 2535 | 证书 | SIG(0)(RFC 2931)及 TKEY(RFC 2930)使用的证书。[5]RFC 3755 designated RRSIG as the replacement for SIG for use within DNSSEC.[5] |
SOA | 6 | RFC 1035 | 权威记录的起始 | 指定有关DNS区域的权威性信息,包含主要名称服务器、域名管理员的电邮地址、域名的流水式编号、和几个有关刷新区域的定时器。 |
SPF | 99 | RFC 4408 | SPF 记录 | 作为 SPF 协议的一部分,优先作为先前在 TXT 存储 SPF 数据的临时做法,使用与先前在 TXT 存储的格式。 |
SRV记录(SRV record) | 33 | RFC 2782 | 服务定位器 | 广义为服务定位记录,被新式协议使用而避免产生特定协议的记录,例如:MX 记录。 |
SSHFP | 44 | RFC 4255 | SSH 公共密钥指纹 | DNS 系统用来发布 SSH 公共密钥指纹的资源记录,以用作辅助验证服务器的真实性。 |
TA | 32768 | 无 | DNSSEC 可信权威 | DNSSEC 一部分无签订 DNS 根目录的部署提案,使用与 DS 记录相同的格式[6][7]。 |
TKEY记录(TKEY record) | 249 | RFC 2930 | 秘密密钥记录 | 为TSIG提供密钥材料的其中一类方法,that is 在公共密钥下加密的 accompanying KEY RR。[8] |
TSIG | 250 | RFC 2845 | 交易证书 | 用以认证动态更新(Dynamic DNS)是来自合法的客户端,或与 DNSSEC 一样是验证回应是否来自合法的递归名称服务器。[9] |
TXT | 16 | RFC 1035 | 文本记录 | 最初是为任意可读的文本 DNS 记录。自1990年起,些记录更经常地带有机读数据,以 RFC 1464 指定:机会性加密(opportunistic encryption)、Sender Policy Framework(虽然这个临时使用的 TXT 记录在 SPF 记录推出后不被推荐)、DomainKeys、DNS-SD等。 |
URI | 256 | RFC 7553 | 统一资源标识符 | 可用于发布从主机名到URI的映射。 |
Where?
当DNS服务器错误配置为允许任意IP地址发起AXFR请求时,攻击者可通过伪造请求获取域内所有记录。
攻击步骤:
- 识别目标域名的DNS服务器(如
ns1.iloli.moe
) - 向该服务器发送AXFR请求
- 若未限制IP,服务器返回完整的区域文件
How?
要检测的话很简单,使用 dig 来扫描域传送是否开放:
1 | dig @ns.example.com example.com AXFR |
若返回所有DNS记录,则存在漏洞,当然你也可以用 nslookup
1 | nslookup |
使用 nmap 也是可以的
1 | nmap --script dns-zone-transfer -p 53 ns.example.com |
这里用 P 神的 Vulhub 来做测试
1 | cd vulhub/dns/dns-zone-transfer/ |
首先停止一下 systemctl stop systemd-resolved
,如果你有 DNSlog,也一并停止避免出问题,然后我们查询一下 www.vulhub.org
的 A 记录
1 | dig @ip www.vulhub.org |
接着发送 AXFR 传输命令
1 | dig axfr @ip www.vulhub.org |
这里我们就可以获取到所有有关 volhub.org
这个域名的子域名了,除此之外也可以直接用 dnsenum 这个工具来枚举,出的更快
顺便分享一下一道 DNS 题目,出自 Nullcon Goa HackIM 2025 CTF#ZoneyE
Problem Description
1 | Are you zoney.eno out or can you find the flag? |
首秀扫描端口,只扫到了一个 53 端口,结合题目意思就是让我们打 DNS,不过这里不存在 AXFR,看不了子域名,那么既然看不了了,还有什么切入点呢?简单枚举一下记录,得到下面内容
1 | $ dig @52.59.124.14 -p 5007 ZONEy.eno MX |
这里跑了一下 DNSSEC,DNSSEC 使用 DNSKEY 记录存储公钥,用于验证 RRSIG 签名,此处获取的密钥可能与后续签名验证有关
1 | hiJzEdgu+CHLJYd7YwVj1XGDZ1yXpb/hwAQZw6bfZi8QewchSQiqQHID Jr2g6kHPk279x1ornIEXfsFRMZK7xA== |
一番枚举得到主要解析记录有
1 | A NS SOA MX RRSIG NSEC DNSKEY |
这里继续枚举 RRSIG 记录
1 | $ dig @52.59.124.14 -p 5007 ZONEy.eno RRSIG |
然后试了下子域名 flag.zoney.eno
1 | $ dig @52.59.124.14 -p 5007 ANY flag.zoney.eno +dnssec |
这里发现新大陆了,最后得到 flag 的域名为 hereisthe1337flag
,查询一下就可以看见 flag 了
1 | $ dig @52.59.124.14 -p 5007 TXT hereisthe1337flag.zoney.eno. |
非常有趣
Prevent
- 限制域传送 IP 范围,仅允许从服务器 IP 发起 AXFR 请求,Linux 配置如下
1 | # bind |
Windows 没搭环境,网上搜了下说是在DNS管理控制台中,右键区域 -> 属性 -> 区域传送 -> 仅允许到以下服务器,另外如果没有从服务器那直接关掉也是可以的吧
1 | allow-transfer { none; }; |
或者通过 TSIG 进行认证,通过事务签名(TSIG)加密验证主从服务器身份,防止未授权传输
1 | # bind |
至于上面那到 DNS 题,我觉得就是一道简单的 DNS Zone walk 所以没啥防御的点,实在不行可以把 NSEC 升级到 NSEC3
1 | # BIND |
感谢前辈开源
Reference
DNS 域传送漏洞:原理、危害及防御