注意:本文分享给安全从业人员、网站开发人员以及运维人员在日常工作防范恶意攻击,请勿恶意使用下面介绍技术进行非法攻击操作。。
[TOC]
0x00 前言介绍
描述:子域名接管漏洞通常被滥用于以下几个目的:恶意软件分发、网络钓鱼/鱼叉式网络钓鱼、XSS 、身份验证绕过等等。由于某些证书颁发机构仅需要域验证,因此也可以轻松生成SSL证书。
代码语言:javascript复制sub.expample.com(常规域名) 60 IN CNAME anotherdomain.com.(规范域名)
子域名接管是注册不存在的域名以获得对另一个域的控制权的过程常见的情况如下:
- 1.域名(例如sub.example.com)将CNAME记录用于另一个域(例如sub.example.com CNAME anotherdomain.com)。
- 2.在某个时间点,anotherdomain.com到期并可供任何人注册。
- 3.由于未从example.com DNS区域删除CNAME记录,因此注册anotherdomain.com的任何人都可以完全控制sub.example.com,直到删除DNS记录。
注意事项:
- 使用子域名接管,攻击者可以从合法域发送网络钓鱼电子邮件,执行跨站点脚本(XSS)或破坏与域关联的品牌声誉。
- 子域名接管不仅限于CNAME记录/NS记录/MX记录甚至A记录也会受到影响。
0x01 子域名接管原理
描述:我们在了解子域名接管的时候需要了解一哈DNS解析流程:
WeiyiGeek.
CNAME记录的域名的Web浏览器的行为流程:
WeiyiGeek.
子域名接管漏洞类型:
- CNAME子域名接管: CNAME子域接管的主要类型之一是叫做互联网常规域名的规范域
- NS子域名接管: 一个NS记录的规范域名的基本域可用于注册
- MX子域名接管
(1)CNAME子域名接管漏洞的成因:
- 因为域名(源域名)配置了CNAME,但是CNAME指向的域名并没有被注册。那么攻击者可以注册这个CNAME指向的域名,就可以控制了源域名。
- 危害:绕过HttpOnly和Secure Cookie的安全配置,盗取用户的cookie
- CNAME子域名接管的整个流程如下:
- 1.源域名(sub.example.com)设置了一个CNAME且指向了sub.weiyigeek.github.io记录
- 2.检查weiyigeek.github.io是否被注册,如果没有注册就可以注册创建恶意页面最终接管sub.example.com
(2)NS子域名接管漏洞的成因:
- 域名的NS记录中如果有一个域名没有被注册那么这个域名就可能被接管。(
查找类似SERVFAIL或的响应,REFUSED并根据其发出警报
) - 例如:sub.example.com有两个NS记录,分别是ns1.vuln.com, ns2.novuln.com,
- 如果攻击者注册了vuln.com这个域名,那么就有50%的几率受到攻击。
- 如果DNS解析选择了ns1.vuln.com,那么攻击者可以返回一个钓鱼页面,并非原来sub.example.com的页面,并且会缓存很长的时间,攻击者可以设置TTL的时长。
(3)MX子域名接管漏洞的成因:
- 由于MX记录仅用于接收电子邮件,因此在MX记录中获得对规范域名的控制仅允许攻击者接收发往源域名的电子邮件(邮件伪造)。
- 虽然影响不如CNAME或NS子域名接管那么重要,但MX子域名接管可能会在鱼叉式网络钓鱼攻击和知识产权窃取中发挥作用。
原理解析案例:
假如我拥有一个wolframe.eu用于测试目的的域名,通过更改dig谷歌DNS服务器@8.8.8.8此域的(权威)名称服务器,为四个AWS服务器之一来获得权威性答案:
代码语言:javascript复制dig ns wolframe.eu@8.8.8.8 nostats
WeiyiGeek.
实际DNS区域是由AWS管理的(更具体地说是AWS Route53),比如上面指定NS记录指向的DNS服务器是不权威的,则得到的结果是不权威的答案(非权威性意味着它不是由权威DNS服务器(在此示例中为四个AWS之一)返回的,相当于是一个中间人的形式;
您可以看见wolframe.eu本身只有一个A记录设置为1.1.1.1;所以一旦DNS请求*.wolframe.eu就会随机选择这上面这四个AWS名称服务器之一并返回A记录结果;
WeiyiGeek.
采用DNSPython模块自定义DNS解析器
代码语言:javascript复制import dns
import dns.rdatatype
for NAMESERVER_IP in NAMESERVER_IPS:
custom_resolver = dns.resolver.Resolver()
custom_resolver.nameservers = [NAMESERVER_IP]
q = custom_resolver.query(DOMAIN, dns.rdatatype.A)
总体而言,应通过以下过程扩展自动化:
WeiyiGeek.
注意事项:
- Web浏览器隐式地信任放在DNS解析器返回的任何内容上。这种信任意味着当攻击者获得对DNS记录的控制时,绕过所有Web浏览器安全策略(例如,同源策略)。带来相当大的安全威胁,因为子域名接管会破坏域名的真实性,攻击者可以通过多种方式利用域名的真实性
0x02 子域名接管检查
描述:子域名接管检查漏洞主要是看 CNAME,因此我们可以把收集到子域名的CNAME找出来(当然MX/A也可以但是出现这样的机率是非常少的); 漏洞检查工具: EdOverflow的can-i-take-over-xyz
代码语言:javascript复制#!/bin/bash
#!Coded by Suleman Malik
#!www.sulemanmalik.com
cont(){
rm /tmp/cnames
rm /tmp/cname-ln
rm /tmp/fn-py
}
bl(){
echo -e "