Python 一键扫描子域名
兄弟们,子域名扫描是信息收集的必修课。今天给个纯Python方案,不用第三方工具,一行命令搞定。

核心代码
import requests
import concurrent.futures
def scan_subdomain(domain, sub):
url = f"http://{sub}.{domain}"
try:
r = requests.get(url, timeout=2)
if r.status_code < 400:
return url
except:
pass
return None
def main():
domain = input("输入目标域名(如 example.com): ")
subs = open("subdomains.txt").read().splitlines()
with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:
futures = [executor.submit(scan_subdomain, domain, sub) for sub in subs]
for f in concurrent.futures.as_completed(futures):
if result := f.result():
print(f"[+] 发现: {result}")
if __name__ == "__main__":
main()
用法
- 准备字典文件
subdomains.txt,每行一个子域名
# 常用子域名列表(搞安全的都懂)
www
mail
admin
api
dev
test
blog
shop
- 直接运行
python3 subscan.py
- 想快点?调大线程数,但别太狠,小心被封
# 改第15行
with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
进阶玩法
加个进度条
pip3 install tqdm
from tqdm import tqdm
# 改main函数
for sub in tqdm(subs, desc="扫描中"):
result = scan_subdomain(domain, sub)
if result:
print(f"[+] 发现: {result}")
支持HTTPS
def scan_subdomain(domain, sub):
for proto in ['http', 'https']:
url = f"{proto}://{sub}.{domain}"
try:
r = requests.get(url, timeout=2, verify=False)
if r.status_code < 400:
return url
except:
pass
return None
输出到文件
python3 subscan.py | tee result.txt
字典去哪找
- SecLists:
https://github.com/danielmiessler/SecLists - 常用2万条:
https://raw.githubusercontent.com/rbsec/dnscan/master/subdomains.txt
注意事项
- 别扫描未经授权的目标,这是基本职业操守
- 线程数别设太大,50-100够用,太多容易被ban
- 如果目标有CDN,部分子域名可能返回200但实际是CDN节点
- 建议配合DNS解析验证,避免误报
快速验证
# 先试几个手动验证
curl -I http://admin.example.com 2>/dev/null | head -n 1
这脚本虽然简单,但配合好字典,效率不比商业工具差。遇到CDN之类的特殊情况,自己改改逻辑就行。
有需要的兄弟直接复制,记得改字典路径。
💻 安全运维 / Linux运维 / 渗透测试 技术支持
业务需求可联系博客作者
