ENScan_GO+OneForAll 懒人脚本 - 信息收集 1
字数 975 2025-08-11 00:55:07
ENScan_GO与OneForAll联合信息收集教程
工具概述
本教程介绍如何使用ENScan_GO和OneForAll两款工具进行企业信息收集,从公司名开始,逐步收集备案信息、公众号、小程序以及子域名信息。
第一部分:ENScan_GO使用
功能简介
ENScan_GO是一款根据公司名获取以下信息的工具:
- 企业备案信息
- 微信公众号信息
- 小程序信息
基本使用方法
- 准备目标公司列表文件
targets.txt,每行一个公司名 - 使用以下批处理脚本进行批量扫描:
chcp 65001
@echo off
for /F %%i in (targets.txt) do (
enscan.exe -n %%i
)
pause
输出结果
ENScan_GO扫描结果将包含企业的二级域名信息,这些信息将作为OneForAll的输入。
第二部分:OneForAll使用
功能简介
OneForAll是一款强大的子域名收集工具,能够:
- 通过DNS查询发现子域名
- 使用暴力破解方式枚举子域名
- 通过HTTP请求验证子域名有效性
高级批量扫描脚本
由于OneForAll原生不支持并发扫描多个目标,我们使用Python API实现多线程批量扫描:
import threading
import sys
import os
from oneforall import OneForAll
from config.log import logger
from datetime import datetime
class MyThread(threading.Thread):
def __init__(self, targets: list, outputPath: str):
self.targets = targets
self.outputPath = outputPath
threading.Thread.__init__(self)
def oneforall(self, domain):
global fileLock
# 关闭控制台输出避免干扰
sys.stdout = open(os.devnull, 'w')
sys.stderr = open(os.devnull, 'w')
logger.remove(handler_id=None)
# 配置并运行OneForAll扫描
test = OneForAll(target=domain)
test.dns = True # 启用DNS查询
test.brute = True # 启用暴力破解
test.req = True # 启用HTTP请求验证
test.run()
datas = test.datas
# 保存扫描结果
fileLock.acquire()
with open(self.outputPath, "a+") as f:
tmp = set()
f.write(f"# {domain} 子域名收集结果: \n")
for data in datas:
subdomain = data.get('subdomain')
if data.get('alive'): # 只记录存活的子域名
if subdomain not in tmp:
tmp.add(subdomain)
f.write(subdomain+'\n')
fileLock.release()
# 恢复控制台输出
sys.stdout = sys.__stdout__
sys.stdout = sys.__stderr__
def run(self):
global targetsLock
while self.targets:
print(f"剩余 {len(self.targets)} 个未扫描域名")
target = None
targetsLock.acquire()
if self.targets:
target = self.targets.pop()
targetsLock.release()
if target:
self.oneforall(target)
if __name__ == "__main__":
targetsLock = threading.Lock()
fileLock = threading.Lock()
ThreadList = []
Targets = None
# 可配置参数
ThreadNum = 16 # 线程数
targetsPath = "targets.txt" # 目标域名列表文件
outputPath = "results.txt" # 结果输出文件
startTime = datetime.now()
try:
# 读取目标列表
with open(targetsPath, "r") as fp:
Targets = fp.read().split('\n')
# 创建并启动线程
for i in range(ThreadNum):
t = MyThread(Targets, outputPath)
ThreadList.append(t)
for t in ThreadList:
t.start()
for t in ThreadList:
t.join()
except Exception:
pass
finally:
sys.stdout = sys.__stdout__
sys.stdout = sys.__stderr__
print(f"运行时间 {(datetime.now()-startTime).seconds} 秒")
脚本关键点说明
-
多线程控制:
- 使用
threading.Lock()确保线程安全 - 可配置线程数量(默认16)
- 动态任务分配机制
- 使用
-
输出控制:
- 临时关闭OneForAll的控制台输出避免干扰
- 扫描完成后恢复输出
-
结果处理:
- 只记录存活的子域名(
data.get('alive')) - 使用集合去重
- 按域名分组输出结果
- 只记录存活的子域名(
-
性能监控:
- 记录并显示总运行时间
- 显示剩余待扫描域名数量
工作流程总结
- 准备
targets.txt文件,包含待调查的公司名称 - 使用ENScan_GO获取公司备案信息和二级域名
- 将获得的二级域名作为OneForAll的输入
- 使用多线程脚本批量扫描所有二级域名的子域名
- 结果保存在
results.txt中
注意事项
- 扫描前确保已正确安装ENScan_GO和OneForAll及其依赖
- 根据机器性能调整线程数量
- 大规模扫描可能触发目标防护机制,建议控制扫描频率
- 所有信息收集行为应符合法律法规和道德规范
优化建议
- 可添加异常处理和重试机制
- 可增加进度条显示
- 可考虑将结果存入数据库便于后续分析
- 可添加邮件或通知功能,扫描完成后自动提醒
通过这套工具组合,可以高效地从公司名开始,逐步收集到详细的网络资产信息,为安全评估提供坚实基础。