基于 Python 的子域名收集与资产发现系统设计与实现(自用)

0 阅读2分钟

该项目是我闲来无事对照自己老师实训作业小组项目表来独自完成的项目,后续从易到难逐个完成,仅用作日常记录,无其他用途。

项目完成过程

首先从kali虚拟机的配置安装说起(已经安装完成跳转下一步)

kali官网:www.kali.org/get-kali/#k…

image.png 根据自己的需要下载相应的虚拟机压缩包进行解压

以VM为例:我们在解压后在VM里打开虚拟机后通过【账号:kali密码:kali】来登录自己的kali虚拟机(保持虚拟机设置里网络适配器选择NAT模式)

image.png

验证基础环境

  1. 检查Python3版本(Kali默认预装:python3 --version
  2. 检查pip3:pip3 --version
  3. 测试网络(用百度测试):ping www.baidu.com -c 3

image.png

编写并运行代码

创建代码文件

在终端输入gedit subdomain_scanner.py,打开图形化编辑器

image.png

粘贴完整代码

#!/usr/bin/env python3 
# 适配Kali Linux的子域名收集脚本 
import dns.resolver 
import requests 
import sys 
# 设置DNS解析器
resolver = dns.resolver.Resolver() 
resolver.nameservers = ['8.8.8.8', '114.114.114.114']
# 常用子域名字典 
subdomain_list = ["www", "api", "test", "admin", "mail", "ftp", "blog", "shop", "cdn"] 
def scan_subdomains(main_domain): 
    """核心扫描函数""" 
    valid_subdomains = [] 
    print(f"\n开始扫描主域名: {main_domain}") 
    print("-" * 50) 
    for sub in subdomain_list: 
        full_domain = f"{sub}.{main_domain}" 
        try: 
            # 1. DNS解析(A记录) 
            answers = resolver.resolve(full_domain, 'A') 
            ip_address = answers[0].address 
            # 2. 存活检测(HTTP/HTTPS) 
            status_code = "不可访问" 
            for proto in ['http', 'https']: 
                try: 
                    response = requests.get( 
                        f"{proto}://{full_domain}", 
                        timeout=3, 
                        verify=False, # 忽略SSL证书错误(Kali中常见) 
                        allow_redirects=False 
                    ) 
                    status_code = response.status_code 
                    break # 只要一个协议通就停止 
                except requests.exceptions.RequestException: 
                    continue 
            # 3. 保存有效结果 
            valid_subdomains.append({ 
                "子域名": full_domain, 
                "IP地址": ip_address, 
                "访问状态": status_code 
            }) 
            print(f"[+] {full_domain} -> {ip_address} | 状态: {status_code}") 
        except dns.resolver.NXDOMAIN: 
            # 子域名不存在,跳过 
            print(f"[-] {full_domain} -> 不存在") 
            continue 
        except Exception as e: 
            # 其他错误(如超时) 
            print(f"[!] {full_domain} -> 错误: {str(e)[:20]}") 
            continue 
    return valid_subdomains 
if __name__ == "__main__": 
    # 支持命令行传参,也可手动输入 
    if len(sys.argv) == 2: 
        target_domain = sys.argv[1] 
    else: 
        target_domain = input("请输入要扫描的主域名(如baidu.com): ") 
    results = scan_subdomains(target_domain) 
    # 输出最终结果 
    print("\n" + "=" * 50) 
    print(f"扫描完成!共发现 {len(results)} 个有效子域名:")
    for idx, res in enumerate(results, 1): 
        print(f"{idx}. {res['子域名']} ({res['IP地址']}) - 状态: {res['访问状态']}")

保存并运行

编辑器中按Ctrl+S保存,关闭编辑器

终端执行命令运行脚本:

赋予执行权限:chmod +x subdomain_scanner.py
运行脚本:python3 subdomain_scanner.py

image.png

最终结果(仍旧用baidu.com测试)

image.png

项目完成过程中的问题

kali验证基础环境时不能联网

如果kali的网络适配器是「桥接模式」却无法ping通网页,可能是笔记本的Wi-Fi驱动不支持桥接的混杂模式,导致虚拟机拿不到IP,建议改用NAT模式。

识别不到命令gedit

  1. 先更新软件源:sudo apt update
  2. 安装 gedit:sudo apt install gedit -y