DNS 域传送漏洞:原理、危害及防御

admin 2025年3月18日22:36:06评论16 views字数 11238阅读37分27秒阅读模式

关于 DNS 的原理,这里不再做说明,你只需要知道他是 53 UDP 端口即可,以及 Wireshark 走的协议是什么样的

DNS 域传送漏洞:原理、危害及防御
image-20250305205438837

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地址,但也用于DNSBLRFC 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
证书记录
存储 PKIXSPKIPGP等。
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请求时,攻击者可通过伪造请求获取域内所有记录。攻击步骤

  1. 1. 识别目标域名的DNS服务器(如ns1.iloli.moe
  2. 2. 向该服务器发送AXFR请求
  3. 3. 若未限制IP,服务器返回完整的区域文件

How?

要检测的话很简单,使用 dig 来扫描域传送是否开放:

dig @ns.example.com example.com AXFR

若返回所有DNS记录,则存在漏洞,当然你也可以用 nslookup

nslookup> server ns.example.com> ls -d example.com

使用 nmap 也是可以的

nmap --script dns-zone-transfer -p 53 ns.example.com

这里用 P 神的 Vulhub 来做测试

cd vulhub/dns/dns-zone-transfer/docker-compose up# ordocker compose up

首先停止一下 systemctl stop systemd-resolved,如果你有 DNSlog,也一并停止避免出问题,然后我们查询一下 www.vulhub.org 的 A 记录

dig @ip www.vulhub.org
DNS 域传送漏洞:原理、危害及防御
image-20250305210645757

接着发送 AXFR 传输命令

dig axfr @ip www.vulhub.org 
DNS 域传送漏洞:原理、危害及防御
image-20250305211154628

这里我们就可以获取到所有有关 volhub.org 这个域名的子域名了,除此之外也可以直接用 dnsenum 这个工具来枚举,出的更快

顺便分享一下一道 DNS 题目,出自 Nullcon Goa HackIM 2025 CTF#ZoneyE

Problem Description

Are you zoney.eno out or can you find the flag?Author: @gehaxelt52.59.124.14:5007 (UDP)

首秀扫描端口,只扫到了一个 53 端口,结合题目意思就是让我们打 DNS,不过这里不存在 AXFR,看不了子域名,那么既然看不了了,还有什么切入点呢?简单枚举一下记录,得到下面内容

$ dig @52.59.124.14 -p 5007 ZONEy.eno MX; <<>> DiG 9.19.21-1-Debian <<>> @52.59.124.14 -p 5007 ZONEy.eno MX; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39708;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 4;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;ZONEy.eno.                     IN      MX;; ANSWER SECTION:ZONEy.eno.              7200    IN      MX      10 challenge.ZONEy.eno.;; AUTHORITY SECTION:ZONEy.eno.              7200    IN      NS      ns1.ZONEy.eno.ZONEy.eno.              7200    IN      NS      ns2.ZONEy.eno.;; ADDITIONAL SECTION:challenge.ZONEy.eno.    7200    IN      A       127.0.0.1ns1.ZONEy.eno.          7200    IN      A       127.0.0.1ns2.ZONEy.eno.          7200    IN      A       127.0.0.1;; Query time: 310 msec;; SERVER: 52.59.124.14#5007(52.59.124.14) (UDP);; WHEN: Sat Feb 01 20:25:12 CST 2025;; MSG SIZE  rcvd: 148;; AUTHORITY SECTION:ZONEy.eno.              7200    IN      SOA     ns1.ZONEy.eno. hostmaster.ZONEy.eno. 2016020202 7200 1800 1209600 86400

这里跑了一下 DNSSEC,DNSSEC 使用 DNSKEY 记录存储公钥,用于验证 RRSIG 签名,此处获取的密钥可能与后续签名验证有关

hiJzEdgu+CHLJYd7YwVj1XGDZ1yXpb/hwAQZw6bfZi8QewchSQiqQHID Jr2g6kHPk279x1ornIEXfsFRMZK7xA==$ dig @52.59.124.14 -p 5007 challenge.ZONEy.eno +noadditional +dnssec +multiline ; <<>> DiG 9.18.1-1ubuntu1.3-Ubuntu <<>> @52.59.124.14 -p 5007 challenge.ZONEy.eno +noadditional +dnssec +multiline; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43795;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:; EDNS: version: 0, flags: do; udp: 4096;; QUESTION SECTION:;challenge.ZONEy.eno.    IN A;; ANSWER SECTION:challenge.ZONEy.eno.    7200 IN    A 127.0.0.1challenge.ZONEy.eno.    7200 IN    RRSIG A 13 3 7200 (                20260205220210 20250109201156 53942 zoney.eno.                FkEg4bc+JAO5UHd0rPioYDIJoUePo2ppwcGD+DzJd5+Z                cE7yhnYUfrVoFZyRPxTVh68pQ1JM8hCP+i/I3SYhkg== );; AUTHORITY SECTION:ZONEy.eno.        7200 IN    NS ns1.ZONEy.eno.ZONEy.eno.        7200 IN    NS ns2.ZONEy.eno.ZONEy.eno.        7200 IN    RRSIG NS 13 2 7200 (                20260205220210 20250109201156 53942 zoney.eno.                Fk6iOlbARQe4PV3dxHPXF0fpm/Zy7wjhmtOo3RRPPPIC                bgshleYO+PTWml/7htLzHqIZ52sN+qtgMd236T9hEw== );; Query time: 268 msec;; SERVER: 52.59.124.14#5007(52.59.124.14) (UDP);; WHEN: Sat Feb 01 21:40:36 CST 2025;; MSG SIZE  rcvd: 552

一番枚举得到主要解析记录有

A NS SOA MX RRSIG NSEC DNSKEY

这里继续枚举 RRSIG 记录

$ dig @52.59.124.14 -p 5007 ZONEy.eno RRSIG; <<>> DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu <<>> @52.59.124.14 -p 5007 ZONEy.eno RRSIG; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1142;; flags: qr aa rd; QUERY: 1, ANSWER: 6, AUTHORITY: 2, ADDITIONAL: 3;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;ZONEy.eno.            IN    RRSIG;; ANSWER SECTION:ZONEy.eno.        7200    IN    RRSIG    SOA 13 2 7200 20260205220210 20250109201156 53942 zoney.eno. u+ngLs+oNxlRbc+FAcIA09Fc8qnDhe83lQQnq+WaHbjJgJ0sccE+bt4g uQVZwDdwvDcP3uxQvrUu/E47qLvTKg==ZONEy.eno.        7200    IN    RRSIG    A 13 2 7200 20260205220210 20250109201156 53942 zoney.eno. 0rDr9a1idCkZ0DwsVAspSHXdjrfxB7uGeIKfP7/CoKH0EvYQrUh77u3V cKA5xy/yecVDuUJVbEty7bAlnxtnyw==ZONEy.eno.        7200    IN    RRSIG    NS 13 2 7200 20260205220210 20250109201156 53942 zoney.eno. Fk6iOlbARQe4PV3dxHPXF0fpm/Zy7wjhmtOo3RRPPPICbgshleYO+PTW ml/7htLzHqIZ52sN+qtgMd236T9hEw==ZONEy.eno.        7200    IN    RRSIG    MX 13 2 7200 20260205220210 20250109201156 53942 zoney.eno. gmkyRfRKqYsFKcNpWVP34z8CjyebzTlQELDQXIDslHDC2nLCOWDt7vt/ xLo9YYyoTRIKI8W9H3BKfHQ96Ui3ug==ZONEy.eno.        7200    IN    RRSIG    DNSKEY 13 2 7200 20260205220210 20250109201156 53942 zoney.eno. ETl+05olcxRq7tOJHqNFgU2XBwi4xOFNSKASwRvolZs30tW2LfVERIG6 QPUPhslZAx/p+kBNNUk6FzfkQNH8Cw==ZONEy.eno.        86400    IN    RRSIG    NSEC 13 2 86400 20260205220210 20250109201156 53942 zoney.eno. XlNEQqCqeU2ZycJ+BvJ8wtuORr0cHCsBiTD59BPS2QaM2KDVgCd5c0FL zyZ9mP9OpKalRGUYgG7G3QhZwZFgxg==;; AUTHORITY SECTION:ZONEy.eno.        7200    IN    NS    ns1.ZONEy.eno.ZONEy.eno.        7200    IN    NS    ns2.ZONEy.eno.;; ADDITIONAL SECTION:ns1.ZONEy.eno.        7200    IN    A    127.0.0.1ns2.ZONEy.eno.        7200    IN    A    127.0.0.1;; Query time: 182 msec;; SERVER: 52.59.124.14#5007(52.59.124.14) (UDP);; WHEN: Sat Feb 01 21:42:17 HKT 2025;; MSG SIZE  rcvd: 736

然后试了下子域名 flag.zoney.eno

$ dig @52.59.124.14 -p 5007 ANY flag.zoney.eno +dnssec; <<>> DiG 9.10.6 <<>> @52.59.124.14 -p 5007 ANY flag.zoney.eno +dnssec; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 43618;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 6, ADDITIONAL: 1;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:; EDNS: version: 0, flags: do; udp: 4096;; QUESTION SECTION:;flag.zoney.eno.            IN    ANY;; AUTHORITY SECTION:challenge.zoney.eno.    86400    IN    NSEC    hereisthe1337flag.zoney.eno. A RRSIG NSECchallenge.zoney.eno.    86400    IN    RRSIG    NSEC 13 3 86400 20260205220210 20250109201156 53942 zoney.eno. Ibqmhh5vOMeCm5jiSju6//MjGRiTsVbcNB1hF6MFxc7DlYcZbZIh8Nnz aaSN1gucye6XwE64VnEsar73WsA6Ew==zoney.eno.        86400    IN    NSEC    challenge.zoney.eno. A NS SOA MX RRSIG NSEC DNSKEYzoney.eno.        86400    IN    RRSIG    NSEC 13 2 86400 20260205220210 20250109201156 53942 zoney.eno. XlNEQqCqeU2ZycJ+BvJ8wtuORr0cHCsBiTD59BPS2QaM2KDVgCd5c0FL zyZ9mP9OpKalRGUYgG7G3QhZwZFgxg==zoney.eno.        7200    IN    SOA    ns1.zoney.eno. hostmaster.zoney.eno. 2016020202 7200 1800 1209600 86400zoney.eno.        7200    IN    RRSIG    SOA 13 2 7200 20260205220210 20250109201156 53942 zoney.eno. u+ngLs+oNxlRbc+FAcIA09Fc8qnDhe83lQQnq+WaHbjJgJ0sccE+bt4g uQVZwDdwvDcP3uxQvrUu/E47qLvTKg==;; Query time: 214 msec;; SERVER: 52.59.124.14#5007(52.59.124.14);; WHEN: Sat Feb 01 21:45:19 CST 2025;; MSG SIZE  rcvd: 510

这里发现新大陆了,最后得到 flag 的域名为 hereisthe1337flag ,查询一下就可以看见 flag 了

$ dig @52.59.124.14 -p 5007 TXT hereisthe1337flag.zoney.eno.; <<>> DiG 9.10.6 <<>> @52.59.124.14 -p 5007 TXT hereisthe1337flag.zoney.eno.; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54343;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;hereisthe1337flag.zoney.eno.    IN    TXT;; ANSWER SECTION:hereisthe1337flag.zoney.eno. 7200 IN    TXT    "ENO{1337_Fl4G_NSeC_W4LK3R}";; AUTHORITY SECTION:zoney.eno.        7200    IN    NS    ns1.zoney.eno.zoney.eno.        7200    IN    NS    ns2.zoney.eno.;; ADDITIONAL SECTION:ns1.zoney.eno.        7200    IN    A    127.0.0.1ns2.zoney.eno.        7200    IN    A    127.0.0.1;; Query time: 215 msec;; SERVER: 52.59.124.14#5007(52.59.124.14);; WHEN: Sat Feb 01 21:43:38 CST 2025;; MSG SIZE  rcvd: 163

非常有趣

Prevent

  • • 限制域传送 IP 范围,仅允许从服务器 IP 发起 AXFR 请求,Linux 配置如下
# bindzone "example.com" {    type master;    file "example.com.zone";    allow-transfer { 114.5.1.4; }; // 仅允许从服务器IP};

Windows 没搭环境,网上搜了下说是在DNS管理控制台中,右键区域 -> 属性 -> 区域传送 -> 仅允许到以下服务器,另外如果没有从服务器那直接关掉也是可以的吧

allow-transfer { none; };

或者通过 TSIG 进行认证,通过事务签名(TSIG)加密验证主从服务器身份,防止未授权传输

# bindkey "tsig-key" {    algorithm hmac-sha256;    secret "Base64加密密钥";};zone "example.com" {    allow-transfer { key "tsig-key"; };};

至于上面那到 DNS 题,我觉得就是一道简单的 DNS Zone walk 所以没啥防御的点,实在不行可以把 NSEC 升级到 NSEC3

# BINDdnssec-policy "secure-zone" {    nsec3param iterations 10 salt-length 16 salt "a1b2c3d4e5f6";};

感谢前辈开源

Reference

  • • https://krevetk0.medium.com/dns-vulnerability-for-axfr-queries-58a51972fc4d
  • • https://beaglesecurity.com/blog/vulnerability/dns-zone-transfer.html
  • • https://tech-blog.cymetrics.io/posts/crystal/dns-hacking-zone-walk/

原文始发于微信公众号(Gh0xE9):DNS 域传送漏洞:原理、危害及防御

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月18日22:36:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DNS 域传送漏洞:原理、危害及防御https://cn-sec.com/archives/3815545.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息