千家信息网

用python实现域名资产监控的步骤是什么

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,本篇文章给大家分享的是有关用python实现域名资产监控的步骤是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。应用场景域名资产监控,
千家信息网最后更新 2025年11月11日用python实现域名资产监控的步骤是什么

本篇文章给大家分享的是有关用python实现域名资产监控的步骤是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

应用场景

域名资产监控,通过输入一个主域名,找到该域名对应的ip地址所在的服务器的端口开闭情况。通过定期做这样的监控,有助于让自己知道自己的资产的整体暴露面情况。

所需要具备的前缀技能

python的简单使用

linux操作系统的简单使用

DNS的原理

工具

pycharm 专业版

xshell 用于部署脚本

步骤

通过域名得到对应的ip地址

首先,我们知道对于一个域名来说,可以设置很多类型的记录值,比如A记录、AAAA记录、SOA记录、TXT记录等等。安全领域常见的记录值和其含义对应关系如下:


代码描述
AIPv4地址记录
AAAAIPv6地址记录
CNAME规范名称记录,一个主机名字的别名:
域名系统将会继续尝试查找新的名字
MX电邮交互记录
NS名称服务器记录
PTR最常用来运行反向DNS查找
SOA权威记录的起始
TXT文本记录

而我们要用到的就是A记录(目前IPv6用得不广泛)。

通过A记录,获取到一个域名对应的IP地址,用python实现的方法如下:

def dns_a(domain: str):    dns_servers = '114.114.114.114,114.114.115.115,223.5.5.5,223.6.6.6,180.76.76.76,119.29.29.29,119.29.29.29,1.2.4.8,210.2.4.8,117.50.11.11,52.80.66.66,101.226.4.6,218.30.118.6,123.125.81.6,140.207.198.6,8.8.8.8,8.8.4.4,9.9.9.9,208.67.222.222,208.67.220.220'.split(        ',')    loop = asyncio.new_event_loop()    resolver = aiodns.DNSResolver(loop=loop)    resolver.nameservers = dns_servers    try:        record_a = loop.run_until_complete(resolver.query(domain, 'A'))        return record_a    except:        pass    return []

在代码中,为每一次查询随机指定了一个dns_server,也就是dns查询服务器,由于收敛的关系,不同的查询服务器结果可能不相同。所以可以考虑做得完善一些,这里只查询了一次,也可以换多个dns服务器查询多次,取并集(并集是不放过所有可能情况,交集是精确但可能漏)。最终该方法就可以实现获取域名对应的ip地址。

这个方法中使用到了asyncio和aiodns两个包,安装方法如下:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn asyncio,aiodns

下面我们以www.mengwa.store为例,看看结果如何:

可以发现ip地址有了,不过,还需要从结果中进行提取。方法如下:

record_a = dns_a(domain)ips = []if type(record_a) == list:ips = sorted([answer.host for answer in record_a])

这个ips中存储的就是排序后的解析记录ip列表。

对ip地址进行端口扫描

通过上面的步骤找到了ip地址,下一步就是对ip地址进行端口扫描。可在扫描之前,我们还有一个步骤需要做,需要判断当前ip所在的机器是否存活。

可能你立马就想到了ping方法,可是在安全领域,有很多公司都要求服务器将ICMP协议给阻止掉,也就是说,ping方法可能返回超时,但是机器并不一定没有开启,只是主动给你把请求拦截掉了。

这里我们使用nmap的-sPn参数进行扫描,以www.mengwa.store对应的ip地址47.119.137.0为例:

然后我们通过代码来实现这一逻辑,我们使用python-nmap包,安装步骤如下:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn python-nmap

代码如下:

def check_ip_reachable(ip: str):    nm = nmap.PortScanner()    xx = nm.scan(hosts=ip, arguments='-sP') # -sPn也可以    if 'scan' in xx:        i = xx.__getitem__('scan')        if ip in i:            j = i.__getitem__(ip)            if 'status' in j:                status = j['status']                if 'state' in status:                    state = status['state']                    print(ip, state)                    return state    print(ip, 'down')    return 'down'

做这一步的前提是,你本机安装了nmap。

通过这里做判断,如果ip所在机器是开启状态,那么我们就可以对其进行端口扫描了。

代码如下:

# 实现对端口进行扫描,并且返回结果。使用nmap实现def port_scan(ip: str):    second = check_ip_reachable(ip)    if second is not None and second == 'up':        nm = nmap.PortScanner()        xx = nm.scan(ip)        print(nm.command_line())        ans = []        if 'scan' in xx:            i = xx.__getitem__('scan')            if ip in i:                j = i.__getitem__(ip)                if 'tcp' in j:                    tcp = j['tcp']                    for port in tcp:                        ans.append(port)        ans = sorted(ans)        return ans    else:        write_to_file('output/' + time_now + '/ips.txt', ip + ' 不可达\n')    return []

nm.command_line()方法可以打印出当前执行的命令行。(本质上这个包就是一个命令行调用包,然后做解析)

以47.119.137.0为例,结果如下:

这里的方法,使用的是nmap默认扫描的常见端口,如果有需要,也可以通过给Scan方法,加入Ports参数,自定义要扫描的端口,甚至于全端口。

串联起来,实现通过域名到端口监控

def handle_ip(ip: str):    if not task_ip_set.__contains__(ip):        try:            print('ip:' + ip, '开始端口扫描')            port_result = port_scan(ip)            val = ''            print('ip:', ip, '发现端口', port_result)            for i in port_result:                val = val + '\n' + ip + "----" + i.__str__()            write_to_file('output/' + time_now + '/ip_ports.txt', val)            task_ip_set.add(ip)        except Exception as e:            print(e)            def handle_domain(domain: str):    if not task_domain_set.__contains__(domain):        print('domain:' + domain)        record_a = dns_a(domain)        ips = []        if type(record_a) == list:            ips = sorted([answer.host for answer in record_a])        val = ''        for i in ips:            val = val + '\n' + domain + "----" + i.__str__()        write_to_file('output/' + time_now + '/domain_ips.txt', val)        print(ips)        for i in ips:            handle_ip(i)

这里使用了task_domain_set和task_ip_set用于对作用目标进行去重。

那么,到这里我们的任务完成了吗?

没有

子域名发现

如果我的主域名资产有很多二级域名,而我自己又对自己有哪些子域名不清楚,那么这个时候就需要做子域名发现。然后对每一个子域名调用前面的方法,找到其对应的ip开放的端口。

子域名发现一般来说有三种方法:

第一种通过对主域名所在网站进行爬取,从内容中解析出子域名;

第二种通过外部的查询网站获取结果,比如crt、virustotal、fofa等;

第三种通过字典爆破获取结果,通过不断的轮询dns服务器,查询其是否有A记录的值,如果有,则表明该子域名存在,如果没有则暂时认为该子域名不存在。

第一种方法,需要实现一个爬虫,拿到网站的内容后利用正则表达式提取里面的子域名,提取的方法如下:

def get_subdomains(value: str, domain: str):    x = f'(?P[a-zA-Z0-9.]+{domain})'    pattern = re.compile(x)    y = pattern.findall(value)    ans = set()    for i in y:        ans.add(i)    print(ans)    return ans

第二种方法,利用接口调用,参见相关的API接口即可。

第三种方法,子域名爆破。核心代码如下

answers = await self.resolvers[j].query(cur_domain, 'A') # 查找A记录# 如果A记录有值且没有报错,则说明该子域名存在

当你完成上面的步骤,并且去重之后,就可以将这些子域名作为前面步骤的输入。这样,对于用户需要监控的某个主域名而言,监控到的范围就提升了很多。

请勿用于非已有域名的监控,造成的损失与本人无关。以上测试数据均为本人已有域名和ip。

以上就是用python实现域名资产监控的步骤是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

域名 方法 端口 子域 地址 步骤 监控 服务器 结果 服务 查询 代码 资产 就是 所在 情况 机器 网站 安全 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 浦东新区什么是网络技术服务材料 linux外部连接数据库 山东省移动套餐总显示服务器错误 蜀山区参考网络技术服务介绍 公司服务器文件打开速度慢怎么办 百度网络安全图片 珠海金丽信软件开发有限公司 幼儿园网络安全活动简报 网络安全诱捕 绿园区网络技术服务推荐咨询 接口安装后数据库失败 遵化服务器最近的口是哪里 非关系型数据库 关联关系 性价比较高的服务器 oracle制作数据库账号 sql文件导入mysql数据库 高淳区网络技术服务排名靠前 阿里云服务器怎么登陆 江苏先进网络技术特点 天堂2服务器叫什么名字 表盘市场的服务器异常打不开 亳州公交车app服务器异常 损害服务器 嘉定区正规软件开发哪家好 软件开发大一要带电脑吗 数据库信息的四种检索技术 什么叫数据库 微信一直显示服务器正在运行 数据库的逻辑设计实验报告 编辑发布服务器
0