dns泛解析及代码测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dns泛解析及代码测试相关的知识,希望对你有一定的参考价值。

0x00 前言


在自己的扫描器开发过程中,扫描器当中自然包括了子域名收集功能,但在遇到泛解析的网站时,也增加了扫描器很多不必要的检测,导致效率和资源的浪费。本文中主要针对扫描器遇到的问题进行解决并优化。

泛域名解析介绍 https://baike.baidu.com/item/%E6%B3%9B%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90/9845966?fr=aladdin

0x01 问题产生


泛解析的功能为厂商提供了便利,但为自动化扫描带来了麻烦,什么麻烦呢?这里以一个使用了泛解析的厂商作为演示
技术分享图片
由于该网站使用了泛解析,导致原本不存在的子域名也会成功被解析,那么其实访问这个域名,会重定向到主页

技术分享图片

那么在自动化扫描中,通常我们会使用到一个字典组合域名的方式,然后进行dns解析,如果成功解析说明子域名存在,利用这种方式来进行子域名穷举,但使用泛解析的话,则会导致所有的域名都能成功解析,使得子域名穷举变得不精准。

技术分享图片

ps:只是一个泛解析测试

0x02 解决方法


那么怎么去判断域名使用了泛解析和如何解决扫描器中遇到这种情况呢?

  • 泛解析的域名会自动匹配所有*.域名的解析,利用这点我们可以故意去解析一个根本不可能存在的域名,如果能成功解析代表使用泛解析,否之未采用
    技术分享图片

    技术分享图片

  • 扫描器解决思路也同上点,附上演示过程,(具体代码最后贴)
    技术分享图片
    技术分享图片
    上图中可以看到,如果能成功解析不存在的域名则使用泛解析,那么socket.getaddrinfo也不会抛出异常
    那么改进后的检测代码为
import socket
import sys
def dns_resolve(domain):
    url = ‘abc1q2w3e4r5t.‘ + domain
    flag = False
    #抛出异常说明使用了泛解析
    try:
        socket.getaddrinfo(url, None)
        flag = True
    except:
        pass
    if not flag:
        print(‘[+] %s 未采用泛解析‘%domain)
    else:
        print(‘[-] %s 采用泛解析‘%domain)

if __name__ == ‘__main__‘:

    if len(sys.argv) < 2:
        print(‘python3 %s <domain>‘%sys.argv[0])
        exit(1)

    dns_resolve(sys.argv[1])

技术分享图片

0x03 tips


  1. 当域名使用了泛解析,那么放弃穷举的方式来获取子域名,可通过其他途径,类似爬虫或者搜索引擎来获取
  2. 如有错误,请斧正

以上是关于dns泛解析及代码测试的主要内容,如果未能解决你的问题,请参考以下文章

搭建DNS服务-----正向解析反向解析泛域名解析。

谢烟客---------Linux之DNS请求流程及资源记录定义

DNS正向域名解析,别名域名解析,泛域名域名解析,邮件域名解析和web服务网站搭建

如何用hosts与dns实现局域网泛域名解析?

linux -DNS的域名正向解析,搭建wed,别名泛名与邮件名解析

0037-如何在Windows Server2008搭建DNS服务并配置泛域名解析