正文
你是不是也遇到过这种情况:
做信息收集时,手动一个一个猜子域名,比如admin.xxx.com、api.xxx.com……猜了半天,大部分打不开,效率低到想砸键盘。
其实,这种重复劳动完全可以用代码自动化。
今天我就带你写一个极简但实用的子域名收集工具。
全程只需要30行Python代码,学完你就能:
自动枚举出目标域名下的所有子域名
过滤出哪些子域名是存活的
为后续的漏洞挖掘打下基础
别怕,代码我会逐行解释,新手也能跟上。
一、原理:子域名收集到底在干什么?
简单说:
准备一个常见子域名字典(如www、mail、admin、api、test……)
对每个字典项,拼接成完整域名,比如admin.example.com
尝试解析这个域名的IP地址,如果能解析出来,说明这个子域名存在
你可能会问:为什么不直接用ping?
因为有些服务器禁ping,但DNS解析更可靠。
二、环境准备(30秒搞定)
三、直接上代码(复制就能跑)
创建一个文件 subdomain_scanner.py,输入以下代码:
python
import socket# 你也可以自己扩充这个字典common_subdomains =["www","mail","ftp","localhost","webmail","smtp","pop","ns1","webdisk","ns2","cpanel","whm","autodiscover","autoconfig","admin","test","dev","api","blog","shop","forum","support","status","cdn","static","img"]defresolve(subdomain, target):"""尝试解析子域名,成功返回True,失败返回False""" full_domain =f"{subdomain}.{target}"try: ip = socket.gethostbyname(full_domain)print(f"[+] 发现存活子域名: {full_domain} -> {ip}")returnTrueexcept socket.gaierror:# 解析失败,子域名不存在returnFalsedefscan(target):print(f"\n开始扫描目标: {target}\n") found =[]for sub in common_subdomains:if resolve(sub, target): found.append(sub)print(f"\n扫描完成,共发现 {len(found)} 个存活子域名")return foundif __name__ =="__main__": target =input("请输入目标域名(如 example.com): ").strip() scan(target)使用方法:
运行脚本:python subdomain_scanner.py
输入你要查的域名,比如 baidu.com
等待几秒,就会输出所有能解析出来的子域名
四、逐行解释(新手友好)
socket.gethostbyname(域名):这是核心,它向DNS服务器询问这个域名的IP。如果能拿到IP,说明域名存在。
try...except:如果解析失败,会抛出gaierror异常,我们就认为子域名不存在。
字典里我预设了20多个常见子域名前缀,你可以随时增加,比如加上"oa"、"erp"、"vpn"等。
你可以拿自己的博客或者baidu.com试试,绝对不会违法,因为这是公开的DNS解析。
五、升级一下:加入多线程(装逼必备)
上面的代码是一个一个查,如果字典很大(几千条),会有点慢。
加上多线程,速度直接起飞:
python
import socketimport threadingcommon_subdomains =["www","mail","admin","api","test","dev","blog"]# 可以继续加defscan_subdomain(sub, target): full =f"{sub}.{target}"try: ip = socket.gethostbyname(full)print(f"[+] 发现: {full} -> {ip}")except:passdefmain(): target =input("目标域名: ") threads =[]for sub in common_subdomains: t = threading.Thread(target=scan_subdomain, args=(sub, target)) t.start() threads.append(t)for t in threads: t.join()print("扫描结束")if __name__ =="__main__": main()多线程代码稍微进阶一点,但抄下来就能用,你可以感受一下“秒出结果”的快感。
六、你现在已经学会了一个真实的信息收集技能
别小看这个脚本:
这就是“白帽黑客”的正规工作内容之一:用技术发现问题,帮助修复,而不是搞破坏。
七、接下来学什么?
有了子域名,下一步可以:
对每个子域名扫描开放端口(用我们之前文章里的端口扫描器)
对开放Web服务的子域名,检测常见漏洞(SQL注入、XSS等)
这些我后续都会手把手教。
八、免费送你一份《网安新手武器库》
为了让你学得更快,我整理了:
✅ 50个常用子域名字典(比文章里的丰富10倍)
✅ 《Python安全编程速查表》
✅ 5个合法练手的靶场网址(随便测,不犯法)
领取方式:
关注本公众号,后台回复关键词:「学习」
唯一要求:
所有技术只用于你自有系统或获得授权的目标,守住底线,才能走得远。
点个“在看”,把这篇文章分享给想学真本事的朋友。
下期预告:《用Python写一个目录爆破工具,找出隐藏的后台》