简介:FofaViewer(俗称“佛法”)是一款面向网络安全研究人员与渗透测试人员的批量搜索爬虫工具,基于FOFA网络资产搜索引擎接口,帮助用户快速定位和分析互联网公开资产。资源包共2个文件,包含1个jar可执行程序与1个properties配置文件,压缩包约32.69MB,前者为工具主程序,后者用于设置API Key、搜索限制与输出参数,便于个性化调整。工具支持按关键字、域名、IP范围等条件批量检索,结果可导出为CSV或Excel,并提供图形界面降低上手门槛,同时支持定时任务持续监控资产变化。目前已有2015人学习下载,适合需要高效收集网络资产数据、开展安全评估与风险防范的安全从业者参考使用。
1. 从一次应急响应说起:FofaViewer 到底解决了什么痛点
上个月帮朋友处理一起外网暴露面排查,对方丢过来一个 IP 段,要求两小时内给出所有对外开放的 Web 资产清单。手工在 FOFA 网页上一页页翻、一条条复制,别说两小时,半天都搞不定。当时我翻出硬盘里躺了很久的FofaViewer_1.1.11_JDK8.zip,解压、填 Key、批量跑,四十分钟交差。这就是 FofaViewer 这类工具存在的意义——它把 FOFA 搜索引擎的查询能力从浏览器里拽出来,变成可批量、可导出、可定时跑的本地客户端。
FofaViewer 在圈子里被叫成“佛法”,本质是一个基于 Java 的 FOFA 批量搜索爬虫工具。它通过 FOFA 的 API 接口拉取资产数据,支持关键字、域名、IP 段、协议、端口等多维度组合查询,结果能直接导出 CSV 或 Excel。适合谁用?做资产测绘、渗透测试前期信息收集、SRC 漏洞挖掘、企业外网暴露面梳理的安全从业者。如果你只是偶尔查一两个域名,网页版够用;但一旦涉及成百上千条查询语句的批量作业,FofaViewer 的批量模式和定时任务就是刚需。这一版压缩包里三个核心文件:fofaviewer.jar是主程序,config.properties是配置文件,JDK8 是运行环境要求。下面从环境搭建到批量实战,把踩过的坑一个个摊开讲。
2. 环境准备与首次启动:JDK8 不是随便说说的
2.1 为什么偏偏锁死 JDK8
FofaViewer 1.1.11 编译时用的就是 JDK8 的 target,这不是作者偷懒,而是 JavaFX 在 JDK11 之后被剥离出标准库,导致 GUI 启动直接报NoClassDefFoundError: javafx/application/Application。我试过用本机的 JDK17 去跑,双击 jar 毫无反应,命令行启动才看到这个异常。所以别想着“高版本兼容低版本”,Java 的向下兼容在 GUI 库这块经常翻车。
确认本机 Java 版本:
java -version如果输出里带1.8.0_xxx就对了。如果显示 11、17、21,需要单独装一个 JDK8 并切换JAVA_HOME。Windows 下可以在环境变量里把 JDK8 的路径提到最前面,Linux/macOS 用update-alternatives或直接指定绝对路径启动。
2.2 解压后的目录结构与启动方式
解压FofaViewer_1.1.11_JDK8.zip后,正常会看到:
| 文件/目录 | 作用 |
|---|---|
fofaviewer.jar | 主程序,GUI 入口 |
config.properties | API Key、查询限制、导出路径等配置 |
lib/(部分版本) | 依赖库,若为 fat jar 则无此目录 |
README | 简要说明,版本不同内容有差异 |
启动方式两种。双击 jar 最省事,但出问题时看不到日志。我一般用命令行启动,方便观察异常:
java -jar fofaviewer.jar如果报Unable to access jarfile,检查当前目录是否在 jar 所在路径,或者用绝对路径。启动成功后会出现一个 Swing/JavaFX 窗口,左侧是查询条件区,右侧是结果表格区,底部有导出按钮和状态栏。
提示:首次启动如果窗口一闪而过,九成是 JDK 版本不对。别急着重下压缩包,先看命令行报什么错。
3. config.properties 配置详解与 API Key 接入
3.1 配置文件里到底有哪些参数
config.properties是纯文本键值对文件,用记事本或 VS Code 都能改。不同版本字段略有增减,但核心就几个:
# FOFA API Key,必填 fofa.key=your_api_key_here # 单次查询返回的最大记录数,免费账号通常限制 100 fofa.maxSize=100 # 查询超时时间,单位秒 fofa.timeout=30 # 导出文件默认保存目录 export.path=./output # 是否开启去重,按 host 维度 dedup.enabled=truefofa.key是唯一必须改的。fofa.maxSize要根据你 FOFA 账号的权限来设,免费账号设成 1000 会直接返回权限错误。fofa.timeout在网络抖动时可以适当调大,但别超过 60,否则界面会假死。export.path建议改成绝对路径,相对路径在不同启动方式下解析结果不一样,我遇到过双击启动时导出到了C:\Windows\System32的尴尬情况。
3.2 获取并填入 API Key 的正确姿势
登录 FOFA 官网,进个人中心,找到 API Key 管理页面。免费账号每月有额度限制,具体数值以官网当前公示为准。复制 Key 之后粘贴到config.properties的fofa.key=后面,注意不要留空格,不要加引号。
改完配置后重启 FofaViewer 才生效。有些版本支持界面内修改配置,但 1.1.11 我实测下来还是改文件最稳。重启后在界面底部状态栏如果看到“已连接”或类似提示,说明 Key 生效了。如果提示“认证失败”,先检查 Key 有没有复制全,再检查账号是否欠费或额度耗尽。
# 改完配置后可以用这条命令快速验证 Key 是否被正确读取 grep "fofa.key" config.properties输出应该是一行完整的键值对,如果显示fofa.key=后面为空,说明没保存成功。这个检查习惯帮我省过好几次“为什么搜不出结果”的排查时间。
4. 批量搜索实战:从单条查询到定时监控
4.1 查询语法与批量模式的操作逻辑
FofaViewer 的查询语法完全继承 FOFA 网页版,比如domain="example.com"、ip="192.168.1.0/24"、port="6379" && protocol="redis"。区别在于它支持把多条查询语句放进一个文本文件,逐条执行并合并结果。
我一般会建一个queries.txt,每行一条查询语句:
domain="target.com" ip="203.0.113.0/24" title="后台管理" && country="CN" body="Shiro" && port="8080"然后在 FofaViewer 界面选择“批量查询”模式,导入这个文件。工具会按顺序执行,每条查询之间自动加延迟,避免触发 FOFA 的频率限制。延迟时间在部分版本里可以在配置文件中调整,字段名类似query.interval,默认 1 到 2 秒。
注意:批量模式下如果某条语句语法错误,工具通常会跳过并继续执行后续语句,但错误日志不一定弹窗提示。跑完后务必检查结果条数是否和预期一致,少了就去日志文件里翻。
4.2 结果导出与字段说明
搜索结果表格里常见字段包括:host、ip、port、protocol、title、domain、server、country、header。导出 CSV 时默认全字段输出,如果只需要特定列,可以在导出对话框里勾选。
# 导出后的 CSV 用命令行快速统计资产数量 wc -l result.csv # 按端口分组统计 awk -F',' 'NR>1{print $3}' result.csv | sort | uniq -c | sort -rn | head -20上面这段awk假设端口在第三列,实际列序以导出文件为准。这个统计能快速告诉你目标资产里哪些端口最集中,比如 80、443、8080 排前三,那后续渗透测试的优先级就清楚了。
4.3 定时任务的配置与验证
FofaViewer 支持定时执行查询,适合做资产变化监控。配置方式一般是在界面里设置间隔时间(比如每 6 小时),然后指定要监控的查询语句文件。工具会在后台按周期跑,结果追加到带时间戳的文件里。
验证定时任务是否生效,最直接的方法是看输出目录里有没有新文件生成,文件名通常带日期时间。如果过了周期还没动静,检查三点:程序是否还在运行、系统时间是否准确、输出目录是否有写权限。我习惯在定时任务跑完第一轮后手动去目录里确认一次,确认没问题再让它长期跑。
5. 避坑与排查:那些让我加班到凌晨的坑
5.1 启动报 JavaFX 缺失
现象:双击 jar 无反应,命令行报NoClassDefFoundError: javafx/application/Application。原因:当前JAVA_HOME指向 JDK11 及以上版本,JavaFX 不在标准库中。解决:切换到 JDK8 启动,或者手动下载 JavaFX SDK 并加--module-path参数。最省事的还是装个 JDK8。
5.2 API Key 正确但查询返回空
现象:状态栏显示已连接,但任何查询都返回 0 条结果。原因:FOFA 免费账号对部分查询语法有限制,比如body=全文检索需要高级权限;或者查询语句里的引号用了中文引号。解决:先用最简单的domain="baidu.com"测试,如果能出结果说明 Key 没问题,再逐步加条件定位是哪条语法被限制。中文引号问题肉眼难辨,建议在编辑器里开启显示不可见字符。
5.3 批量查询中途卡死
现象:批量执行到第 N 条时界面无响应,进度条不动。原因:某条查询返回数据量过大,或者网络超时后工具没有正确处理异常。解决:在config.properties里把fofa.timeout调小到 15 秒,让超时快速失败而不是一直等。同时把大批量查询拆成多个小文件,每个文件不超过 20 条语句,分批跑。
5.4 导出 CSV 中文乱码
现象:Excel 打开导出的 CSV,中文标题变成乱码。原因:工具默认用 UTF-8 编码写文件,而 Excel 在中文 Windows 下默认用 GBK 解析 CSV。解决:用记事本打开 CSV 后另存为 ANSI 编码,或者用 Excel 的“数据→从文本导入”功能手动指定 UTF-8。我后来干脆用 Python 的 pandas 读,没再纠结 Excel 的编码问题。
5.5 定时任务跑着跑着停了
现象:定时监控运行几天后不再生成新文件。原因:FOFA API 额度耗尽,或者程序所在机器休眠/锁屏导致 Java 进程被挂起。解决:定期检查 FOFA 账号剩余额度;把程序跑在一台不休眠的机器上,或者用nohup在 Linux 下后台运行。Windows 下可以在电源设置里把休眠关掉。
6. 进阶技巧:用 Python 把导出结果接进自动化流程
FofaViewer 的导出功能解决了“拿到数据”的问题,但后续的资产分类、存活探测、指纹识别如果全靠手工,效率还是上不去。我一般会把导出的 CSV 直接喂给 Python 脚本做二次处理。
import pandas as pd import requests # 读取 FofaViewer 导出的 CSV df = pd.read_csv("result.csv", encoding="utf-8") # 按端口去重,保留每个 host 的第一条记录 df_dedup = df.drop_duplicates(subset=["host"], keep="first") # 提取所有 URL,构造存活探测列表 urls = [] for _, row in df_dedup.iterrows(): protocol = str(row.get("protocol", "http")).lower() host = str(row["host"]) port = str(row["port"]) if protocol in ("http", "https"): urls.append(f"{protocol}://{host}:{port}") else: urls.append(f"http://{host}:{port}") # 批量探测 HTTP 状态码,超时设 5 秒 alive = [] for url in urls: try: r = requests.get(url, timeout=5, verify=False) alive.append((url, r.status_code, len(r.content))) except Exception: alive.append((url, "dead", 0)) # 输出存活结果 result = pd.DataFrame(alive, columns=["url", "status", "size"]) result.to_csv("alive.csv", index=False) print(f"总资产 {len(urls)} 条,存活 {len(result[result['status'] != 'dead'])} 条")这段脚本的逻辑很直白:先去重,再把不同协议的资产统一成可请求的 URL,然后逐个发 HTTP 请求看状态码。verify=False是为了跳过自签名证书报错,在内网资产探测场景下可以接受。timeout=5是经验值,超过 5 秒没响应的资产大概率不值得继续跟。输出alive.csv里保留了状态码和响应大小,后续可以用状态码筛出 200、302、401 这些有进一步测试价值的资产。
参数调整方面,如果目标资产量很大(上万条),单线程requests会非常慢,可以把探测部分改成concurrent.futures.ThreadPoolExecutor并发跑,线程数控制在 20 到 50 之间,再高容易把目标打挂或者被 WAF 封 IP。另外drop_duplicates的subset参数可以根据实际需求改成["ip", "port"]或["domain"],取决于你关心的是主机维度还是域名维度。
还有一个我常用的技巧:把 FofaViewer 的定时任务输出目录直接设成 Python 脚本的输入目录,脚本用watchdog库监听文件变化,一有新 CSV 生成就自动跑一遍存活探测和指纹识别,结果推送到内部资产管理系统。这样从 FOFA 查询到资产入库基本不需要人工介入。
从那以后我每次配好 FofaViewer 的定时任务,都会先手动跑一轮完整流程——导出、Python 处理、结果核对——确认整条链路通了再让它自动跑。这个习惯帮我避免过好几次“定时任务跑了三天,结果因为导出路径写错一条数据都没存下来”的事故。希望帮到你。
本文还有配套的精品资源,点击获取