知识输出之DNS安全(持续更新)

shellder 发布于 2025-10-26 85 次阅读


就在昨天,我参加了虾皮的web安全工程师的面试,本来以为自己经常性的从一些平台,如tryhackme,hack the box进行网络安全知识的学习对于这些都是手到擒来,结果面试官的一些关于DNS解析和CSP等方面的知识完全给我整蒙了,想了想自己平时的学习很多都是从外界获取知识,没有知识的输出过程,于是打算在个人博客进行网络安全知识的输出和靶场的复盘了,这将是第一篇文章,2025年10月26日。

首先,什么是DNS?
DNS的英文为domain name system,是一种将对于人类好记的域名解析成ip地址的协议。它是一种应用层协议,通常是基于UDP端口53端口进行查询的,而查询量过大或需要可靠传输时可能会使用tcp端口53。现代加密变种DNS over TLS(DoT)通常走端口TCP/853,DNS over HTTPS(DoH)同常走HTTPS/443端口。而DNS over QUIC则是运行在QUIC上。

DNS解析流程:
首先浏览器会检查自身缓存是否存在解析结果,其次查询本地缓存或者hosts文件,之后想本地DNS解析器进行请求,如果未找到则会接着访问根据名服务器,再访问顶级域名服务器,在访问权威域名服务器。

域名分类:
举例admin.test.com,其中.com为顶级域名即TLD,TLD有两类,即通用顶级域名(generic TLD)和国家代码顶级域名(country code TLD)。通用顶级域名用于指示域名用途,如.com用于商业,.edu用于教育,.org用于组织机构,.gov用于政府机构。而cctld则用于地理位置,如.ca为加拿大,.co.uk表示位于英国。test则为二级域名,二级域名最大长度为63字节,由0-9,a-z以及连字符组成,但不可以用连字符开头,结尾,并且也不允许有连续的连字符。admin则是子域名,子域名长度与二级域名相同,限制为63个字节,同样由0-9,a-z以及连字符组成,但不可以用连字符开头,结尾,并且也不允许有连续的连字符。其中可以使用多个子域名来增加域名的长度,但是域名的长度必须小于253字节

DNS记录类型
DNS有多种记录类型,如A记录,AAAA记录,CNAME记录,NS记录,MX记录,TXT记录,PTR记录,SOA记录,CAA记录

A记录:将域名解析为IPv4地址。

AAAA记录:将域名解析为IPv6地址。

CNAME记录:会解析到另一个域名,如用户访问一个域名时,如test1.com,而DNS服务器发现它配置有CNAME记录,test2.com,DNS服务器则会向test2.com发出DNS查询,test2.com则会解析为A记录即ipv4地址。同时CNAME记录配置后不可以再有A记录和MX记录等记录(上述记录中只有PTR记录可以与CNAME共存)

MX记录:MX记录是用来查询邮箱服务器的,比如test@outlook.com则会对outlook.com发起DNS查询,查询MX记录,其中类似于:nslookup -type= mx outlook.com,会受到返回如:outlook.com MX preference = 5, mail exchanger = outlook-com.olc.protection.outlook.com的返回。其中5为优先级,优先级数字越小越优先,之后会再去解析outlook-com.olc.protection.outlook.com的A记录获取到实际的IP地址。(注意,MX必须指向A记录与AAAA记录,不可指向CNAME记录
关于上述中的优先级,当有人给 example.com 发邮件时:邮件服务器会先尝试连接优先级最低数字的服务器(这里是 5 → mail1.example.com);如果这个服务器不可用,就会再尝试优先级 10 的 mail2.example.com;这样就实现了主备(冗余)机制,保证邮件不会丢。

TXT记录:TXT记录是DNS系统中一种用来储存文本信息的,TXT 记录的内容必须用引号括起来,且长度不能超过 255 个字符(可用多条拼接),结构如下:<主机名> IN TXT "<文本内容>"。TXT记录的最常见用途是SPF(Sender Policy Framework),用来声明哪些服务器可以代表该域名发送邮件。如:example.com. TXT "v=spf1 include:_spf.google.com ~all" 意味着只有 Google 的邮件服务器可以代表 example.com 发邮件。再者TXT记录还可以用来进行邮件签名(DKIM,DomainKeys Identified Mail),如:selector1._domainkey.example.com. TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9…"其中p后面的为邮箱的公钥,而在邮件发送时会对邮件内容使用私钥进行加密,收件方可以利用公钥来判断邮件的真实性。除此之外还有DMARC(domain-based message authentication,report&conformance),它会基于SPF和DKIM的结果来判断如何处理邮件,如:_dmarc.example.com. TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com"其中p如果设置为none则表示只监控,不拦截;设置为quarantine则是将被伪造的邮件放入垃圾箱;reject则是拒收该邮件。最后,TXT记录还可以用来进行域名所有人的验证,如在DNS中加入example.com. TXT "google-site-verification=abcd1234xyz",如Google要验证你拥有该域名则会让你加入上述的内容,如果查询到该字符则证明验证成功。

NS(name server)记录:指向你的权威DNS服务器,即当有人访问你的域名时,应该去哪个服务器查找解析结果。如:example.com. NS ns1.cloudflare.com.意味着example.com 的 DNS 由 Cloudflare 管理,当有人试图访问 example.com 时,会先问 Cloudflare 的 NS 服务器,得到 A、MX、TXT 等解析信息。每个域名都必须有NS记录。

PTR(pointer record)记录:由ip反向解析域名。应用:邮件服务器反垃圾:很多接收邮件的服务器会检查发件 IP 的 PTR 记录,确保这个 IP 确实有合法的域名。PTR 是在 IP 所属网络提供商那里设置的,不在你自己 DNS 里。

SOA记录(start of authority record):描述一个DNS区域的基础信息,如哪台是主 DNS 服务器,管理员邮箱,序列号,缓存时间,备份刷新率。

CAA记录(certification authority authorization):CAA 是用来防止SSL 证书被未授权机构签发的安全机制,如:example.com. CAA 0 issue "letsencrypt.org"意味着只有 letsencrypt.org 这个 CA 可以给 example.com 签发 SSL 证书。

SRV记录(service record):指定服务由哪台服务器哪个端口提供。如:_sip._tcp.example.com. SRV 10 60 5060 sipserver.example.com.意味着sip服务,tcp连接,优先级为10,权重为60(用于负载均衡),在5060端口由sipserver.example.com提供。

子域名获取:
子域名枚举的方法主要有三种:暴力破解(Brute Force)、 OSINT (开源情报Open-Source Intelligence)和虚拟主机(Virtual Host)。

OSINT:首先关于OSINT,我们可以从CA证书入手,当CA((Certificate Authority)机构为域名创建SSL/TLS(Secure Sockets Layer/Transport Layer Security)证书时, CA 会参与所谓的“证书透明度 (CT,Certificate Transparency) 日志”。这些日志记录了为域名创建的每个 SSL/ TLS 证书,可供公开访问。证书透明度日志的目的是阻止恶意和意外生成的证书被使用。https://crt.sh等网站可以用于证书的搜索查询。
除此之外,还可以使用Google语法进行子域名查询,如:site:*.test.com -site:www.test.com,意思为test.com的子域名查询并除去www.test.com。为了节省时间,我们可以使用开源工具来帮助我们获取OSINT:https://www.kali.org/tools/sublist3r/

VHOST:某些子域名并不总是托管在可公开访问的 DNS 结果中,例如 Web 应用程序或管理门户的开发版本。DNS 记录可以保存在私有 DNS 服务器上,或者记录在开发人员计算机上的 /etc/hosts 文件(Windows 用户则为 c:\windows\system32\drivers\etc\hosts 文件)中,该文件将域名映射到 IP 地址。其中VHOST的核心在于Web服务器可以区分共享同一IP的不同网站,这是通过HTTP Host头实现的,该标头存在于每个http请求中。Web 服务器可以在客户端请求网站时,通过一台服务器托管多个网站,因此服务器可以通过 Host 头信息了解客户端想要访问哪个网站。
VHOST分为三类:Name-Based Virtual Hosting,IP-Based Virtual Hosting,Port-Based Virtual Hosting。

Name-Based Virtual Hosting:这种方法依赖于HTTP Host header来区分网站,属于最常见最灵活的方法,它不需要多个IP地址,经济实惠,易于设置,支持现在大部分的web服务器,但是它要求web服务器支持基于名称的virtual-hosting,对某些协议可能存在限制如SSL/TLS

IP-Based Virtual Hosting:该类型主机为服务器上每一个托管的网站分配一个ip地址,不依赖于host header,可以与任何协议一起使用,并且可以很好的隔离网站。
与子域名的区别:IP-Based Virutal Hosting是服务器层,而子域名是DNS层,子域名不一定对应一个网站也不一定对应一个ip,多个子域名可以解析到一个ip,而子域名的能否访问取决于DNS服务是否解析以及服务器上是否有对应服务。而IP-Based Virutal Hosting不管访问时域名是什么,只要ip不同就可以区分出不同网站,每个站点需要一个ip

Port-Based Virtual Hosting:不同网站与同一ip上的端口相关联,如一个网站通过80端口访问,另一个通过8080端口访问。

针对Name-Based Virtual Hosting暴力破解:对于我们可以利用这个 Host 头信息,对其进行修改,并监控响应,看看是否发现了新的网站。可以使用自动化工具fuff进行测试:ffuf -w /usr/share/wordlists/SecLists/Discovery/DNS/namelist.txt -H "Host: FUZZ.test.com" -u http://MACHINE_IP -fs {size} 其中-fs意味着忽略大小为size的结果。

子域名暴力破解dnsenum --enum test.com -f /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -r其中-r为启用递归子域名暴力破解,如果找到一个子域名,会继续尝试找子域名的子域名。

安全工具使用:主要介绍WHOIS和DIG。

WHOIS:旨在访问存储已注册互联网资源信息的数据库。WHOIS 主要与域名相关,还可以提供有关 IP 地址块和自治系统的详细信息。
其中WHOIS的返回内容主要包含以下几部分:
DomainName:即域名本身。
Register:即域名的注册公司。
Registrant:注册域名的个人或组织,即域名的实际拥有者或名义拥有者。
Administrative Contact:负责管理域名的人员。
Technical Contact:负责管理域名的技术人员。
Creation And Expiration Dates:域名注册时间和到期时间。
Name Servers:将域名转化为IP地址的服务器。
WHOIS在网络侦查中的作用:WHOIS一般会泄露域名管理人员的姓名,电话和电子邮箱,可能会被用来进行网络钓鱼和社会工程学攻击。而域名服务器和IP地址等可以为渗透测试人员提供关于网站基础设施的线索,帮助识别网站入口和错误配置。

Zone:域名命名空间的独立管理单元,由特定组织或管理员进行维护,可以理解为域名与其子域名的容器。如:假设你拥有一个域名test.com,那么它的子域名shellder.test.com和shellder1.test.com同样回归你管理,这些域名和子域名结合在一起构成了一个DNS zone。
Zone file:Zone file是驻留在DNS服务器上的一个文本文件,其定义了该服务器的所有资源记录(如A记录,AAAA记录,CNAME记录等),这些记录将告诉DNS服务器如何将域名解析为IP地址。
如:
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2025102701 ; Serial
3600 ; Refresh
1800 ; Retry
1209600 ; Expire
86400 ) ; Minimum TTL
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
@ IN A 192.0.2.1
www IN A 192.0.2.1
mail IN A 192.0.2.2
@ IN MX 10 mail.example.com.

区域传送(Zone Transfer)
区域传送本质上是将一个区域(域名及其子域名)的DNS记录从一个域名服务器复制到另一个域名服务器,该行为对维护DNS服务器之间的数据的一致性至关重要,但是如果安全措施不足,未经授权人有可能会获取到整个区域文件,从而泄露子域名的完整列表,其关联的IP地址以及其他的DNS敏感数据等。
Zone Transfer Request(AXFR):辅助DNS服务器向主DNS服务器发出区域传送请求来启动该过程。
SOA Record Transfer:主服务器收到来自辅助DNS服务器的AXFR请求后,可能会先验证辅助DNS服务器的身份,然后会发送SOA记录传输,其中包含了序列号,区域的主服务器信息,刷新间隔等,而辅助服务器则会对比序列号与本地缓存。如果序列号一致则不需要进行传输,如果不一致则需要发起传输。
DNS Records Transmission:按照顺序把所有DNS记录打包发给辅助DNS服务器,其中包含A记录,AAAA,CNAME,TXT,NS等,即zone file的全部内容
Zone Transfer Complete:传输完成信号,在主DNS服务器传输完成后会发送给辅助DNS服务器,意味着传输结束。
Acknowledge:辅助服务器在接收到区域传输后会向主服务器发送一个ACK确认消息。
使用dig进行区域传输dig axfr @nsztm1.digi.ninja zonetransfer.me,用 dig 向 nsztm1.digi.ninja 这台 DNS 服务器请求 zonetransfer.me 这个域的整个 DNS 区域记录。

DNS在网络侦察中的作用:
发现资产(uncovering assets):DNS可以揭露大量信息,如子域名,邮件服务器等。而如果指向过时服务器的CNAME记录则有可能会导致漏洞的发生。举个例子:dev.example.com CNAME oldserver.example.com而如果公司未清理这条DNS记录,且oldserver.example.com域名已经不在公司的掌控下,那么黑客就有可能注册该域名,访问dev.example.com的用户会被重定向到oldserver.example.com域名,从而造成员工信息与凭证泄露,会话劫持。
映射网络基础设施(mapping the network infrastructure):识别域名的NS记录可以揭示该公司所使用的托管服务提供商,从而获取到更广泛的攻击面(第三方控制台,API keys管理,misconfiguration);而A记录,AAAA记录,load balancer的记录会暴露负载均衡服务器,从而识别流量入口;MX记录和则会暴露所使用的邮件网关和第三方邮件服务,这些一般为社会工程学的入口;除此之外,DNS 往往能显示哪些子域属于同一业务线、哪些服务托管在同一子网或同一云账户(例如多个 CNAME 指向同个外部主机名)。
监控变化(monitoring for changes):持续监控DNS服务则会揭示目标基础设施随时间的变化,如突然出现一个新的子域名,则意味着新的网络入口点;而TXT记录中有可能存在如1Password,则意味着企业可能使用1Password密码管理器,从而利用其进行钓鱼和社会工程学攻击。

言归正传,下面介绍dig工具,在面试中我提到了dig工具,但自己对它其实也只是一知半解,结果被面试官追问,自己给自己挖了个大坑。我曾在hack the box的CPTS路径中学到,现在悔恨自己当时看的太草率了,觉得平时在靶场中没怎么见到dig使用,认为其不重要,在这里下定决心一定要将基础打牢。
dig是一款功能强大的 DNS 查询工具,默认使用UDP端口53,也可以使用+tcp强制使用TCP,dig能够对 A、AAAA、CNAME、PTR 等多种 DNS 记录类型进行查询。当然类似的DNS查询工具还有很多,如nslookup,host,dnsenum等等,这里着重介绍dig。
下面是dig的一些常见命令以及命令的含义:
dig domain.com :对域进行默认的A记录查询
dig domain.com A:对域进行A记录查询
dig domain.com AAAA:对域进行AAAA记录查询(查询IPv6地址)
dig domain.com MX:查询该域对应的邮件服务器
dig domain.com NS:标识域的权威域名服务器
dig domain.com TXT:查找域的TXT记录
dig domain.com SOA:查找域的SOA记录
dig @1.1.1.1 domain.com:向1.1.1.1域名服务器查找domain.com的解析结果
dig +trace domain.com:显示DNS解析的完整路径,即从根域名服务器开始,一步一步解析域名,直到得到最终的ip地址。使用用于DNS排除,判断DNS解析失败的原因。
dig -x 192.168.1.1:对IP地址进行反向解析将 IP 地址转换成域名(PTR 记录)。如果这个 IP 地址有设置 PTR 记录,就能查到关联主机名
dig +short domain.com:只显示核心结果,不包含详细信息
dig +noall +answer domain.com:只显示answer部分,当使用dig查询时会有类似的返回:
;; QUESTION SECTION:
;domain.com. IN A
;; ANSWER SECTION:
domain.com. 300 IN A 93.184.216.34
;; AUTHORITY SECTION:
example.com. 172800 IN NS ns1.example.com.
;; ADDITIONAL SECTION:
ns1.example.com. 172800 IN A 192.0.2.1

其中QUESTION SECTION为向DNS服务器的查询请求内容,ANSWER SECTION为DNS服务器返回的答案,AUTHORITY SECTION为该域名的权威服务器的信息,ADDTIONAL SECTION为额外信息。
dig domain.com ANY:请求全部的可用记录查询。
dig axfr @nsztm1.digi.ninja zonetransfer.me :用 dig 向 nsztm1.digi.ninja 这台 DNS 服务器请求 zonetransfer.me 这个域的整个 DNS 区域记录。

此作者没有提供个人介绍。
最后更新于 2025-10-27