ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FofaViewer实战:FOFA资产批量搜索与CSV导出全指南

FofaViewer实战:FOFA资产批量搜索与CSV导出全指南 简介FofaViewer佛法是一款面向网络安全研究人员与渗透测试人员的批量搜索爬虫工具依托 FOFA 搜索引擎的海量资产库帮助快速定位公网 IP、域名、端口与服务信息适用于资产盘点、漏洞挖掘与风险评估等场景。资源压缩包共2个文件包含可运行的 fofaviewer.jar 主程序及 config.properties 配置文件包体约 32.69MB结构精简便于直接配置与启动。页面已有 2015 人学习下载。借助该工具可批量检索指定关键字的互联网资产将结果导出为 CSV/Excel 以便后续分析并通过自定义 API Key、搜索限制等参数适配个人工作流同时支持定时任务可持续监控资产变化。对于需要高效收集目标信息的安全从业者这份资源提供了开箱即用的 FofaViewer 程序与基础配置可大大缩短环境搭建时间快速投入实际检测工作。1. FofaViewer为什么「佛法」比手写爬虫更值得用做资产梳理的人多少都有过这种经历临时写个 Python 脚本去拉 FOFA 网页版的数据翻页、登录、验证码、解析 HTML折腾一晚上最后导出一份结构混乱的 CSV还得再花半小时清洗。FofaViewer 这个工具解决的就是这件事——它不生产数据它把 FOFA 的查询能力封装成了一个带界面的桌面客户端。你只需要在配置里填好 API Key输入搜索语句点一下搜索结果自动分页拉取、去重、排序最终导出成 CSV 或 Excel。对做漏洞挖掘、红蓝对抗、资产盘点的从业者来说这比维护一套自研爬虫脚本划算得多。它适合两类人一类是刚接触 FOFA、不想写代码的入门者另一类是已经重度使用 FOFA、希望把「搜索-导出-分析」链路固定下来的效率党。后面我会从引擎原理、配置文件、实战批量搜索、常见踩坑一路讲到底最后给一个进阶用法。全文涉及的所有命令、参数都以 1.1.11 这个 JDK8 版本为准。2. 先搞清楚 FOFA 的认证与查询语法配置文件里的门道2.1 FOFA 查询语法与 API 的认证方式FOFA 本质上是一个被动资产搜索引擎它靠主动探测和公开数据持续更新自己的资产库里面存的是 IP、域名、端口、协议、指纹、证书这类实体及关系。FofaViewer 做的不是爬虫抓网页而是调用 FOFA 官方 API 做结构化查询。这两者的差别很关键爬虫要对抗的是反爬和页面改版而 FofaViewer 面对的是 API 的限流和查询额度。使用 API 前需要先理解认证。FOFA API 支持两种认证方式一种是邮箱加 API Key另一种是仅用 API Key。FofaViewer 的 config.properties 里对应的配置项是 fofa_email 和 fofa_key如果你只填 key工具会尝试走 key-only 的认证路径。需要留意的是配额消耗方式查询返回的每一条数据都会计入账号的积分额度同一个查询语句反复执行会重复扣量这点在跑大批量任务前务必确认。FOFA 的查询语法是组合式的常见字段包括 title页面标题、body页面正文、domain、host、ip、port、protocol、banner、cert证书、icon_hash 等。多个条件用 拼接比如 title后台管理系统 countryCN。FofaViewer 的搜索框直接透传这套语法不加额外转义。这意味着你平时在 FOFA 网页版里调试好的语句可以直接粘进工具里用不需要改格式。2.2 config.properties 拆解每一项参数都影响什么解压 FofaViewer_1.1.11_JDK8.zip 后你会看到两个核心文件fofaviewer.jar 和 config.properties。后者是工具能不能正常工作的关键里面配置项不多但每一项都直接影响后续操作。常见做法是先打开配置文件把 API Key 填进去再启动界面。如果你已经按上面的方式填好 key配置就完成了第一步。除了认证参数config.properties 里还有几个值得关注的配置项。页面大小控制单次 API 请求返回的记录数FOFA 接口允许在 1 到 100 之间调整超时时间决定连接不上 API 时等待多久才报错导出路径是结果文件的默认存储位置。这些参数在界面上也能改但改配置文件更直观尤其是批量部署到多台机器时直接分发一份改好的 properties 文件比逐台点击界面高效得多。这里要提醒一个隐蔽的问题config.properties 的编码格式。如果文件里有中文字符比如导出路径里带了中文目录名请务必用 UTF-8 编码保存否则在 Windows 下启动时会出现乱码导致路径解析失败。很多用户反映「工具启动后搜索正常但是导出一直失败」排查到最后就是配置文件或者 CSV 的编码问题。3. 启动与界面操作从 jar 包到第一次完整搜索3.1 JDK8 环境要求与启动命令FofaViewer 基于 Java 开发1.1.11 这个版本明确要求 JDK 8。不建议用更高版本的 JDK 直接跑因为某些 Swing 相关的渲染行为和资源加载方式在 JDK 11 以上会有所不同可能出现界面控件显示不完整的问题。先确认 Java 版本如果没装 JDK 8 或者版本不对后续所有操作都会卡在启动这步。在命令行里切到解压目录执行下面这条命令启动java -jar fofaviewer.jar如果双击 jar 包没反应最常见原因是 .jar 文件的默认打开方式被 PDF 阅读器或压缩软件占用了。这时候不要纠结图标对不对直接用命令行启动终端里会打出 Java 异常堆栈比盲点图标容易排查得多。如果启动时报 UnsupportedClassVersionError说明当前默认 Java 版本高于 8需要把 JDK 8 的路径加到 PATH 最前面或者用 JDK 8 的完整路径执行命令。对于内存占用默认配置足够应付日常搜索。但如果你一次开多个查询窗口或导出几万条结果建议给 JVM 一个明确的上限避免它吃掉整台机器的内存java -Xms256m -Xmx1g -jar fofaviewer.jar-Xms256m 表示启动时预留 256 兆堆内存-Xmx1g 表示堆内存上限 1G。设计导出大结果集时这两个参数能有效预防内存溢出导致的界面卡死。做渗透测试的机器通常还会同时跑 Burp、浏览器等工具限制一下 Java 堆内存对整体稳定性很有必要。3.2 界面区域划分搜索框、结果表、详情面板FofaViewer 的主界面不复杂但功能区分布有规律。最上方是搜索语句输入框和搜索按钮下方是结果表格右侧是当前选中资产的详情面板底部还有状态栏显示本次查询消耗的时长和返回条数。左侧通常会列出当前会话的历史查询记录方便回溯之前执行过的语句。搜索框支持直接输入 FOFA 语法如果你想限定端口或国家直接在语句里拼接即可。结果表格的列支持排序和筛选例如按端口列排序、按标题关键字筛选。右侧详情面板展示的是当前选中行的完整 HTTP 响应头、页面标题、证书信息等做指纹确认时非常方便不用再手动对每个 IP 发一次请求。第一次执行搜索时如果结果栏一直转圈而没有数据返回先看底部状态栏有没有错误提示。常见的有认证失败key 没填对、查询语法错误某个字段名拼写不对、授权过期会员等级到期。这些错误在界面上不会弹窗容易让人误以为工具卡住了。我的习惯是搜索后第一时间瞥一眼状态栏而不是盯着结果表格等。3.3 导出 CSV 与 Excel字段映射与注意事项搜索结果在表格里直观但要进一步分析导出是绕不开的一步。FofaViewer 支持把当前查询结果导出为 CSV 或 Excel。点击导出按钮后会要求选择保存路径和文件名选定后工具会把表格中的 IP、端口、域名、标题、协议等字段按预设列头写入文件。导出格式的选择有一点讲究几千条以内的数据Excel 和 CSV 差别不大超过一两万条Excel 的写入速度明显变慢而且文件体积增大。此时导出 CSV 更稳妥后续用 Python 的 pandas 或 Excel 的数据导入功能处理。对于超大结果集十万条以上我一般建议在 FOFA 网页版直接生成报告下载或者在 FofaViewer 里先缩小查询范围再导出避免一次拉全量数据导致超时。还有一个细节值得注意导出后的文件如果要用 Python 进一步清洗读取时建议指定 UTF-8 编码避免 Windows 下 Excel 打开中文乱码的问题。下面这段代码是处理导出的 CSV 时的常见姿势import pandas as pd df pd.read_csv(fofa_export.csv, encodingutf-8) print(df.columns.tolist())这段代码用 pandas 读取导出的 CSV并打印列名方便你确认导出内容里到底包含哪些字段。实际分析时经常发现导出的列顺序和 FOFA 网页端展示的不完全一样先打印列名再写后续逻辑可以减少返工。4. 批量搜索实战多语句轮转、结果合并与去重4.1 多条搜索语句的执行策略实际工作中很少只跑一条 FOFA 查询语句就能完成资产梳理。比如摸清某个公司的互联网资产往往需要同时跑几类语句根域名关联的证书查询、特定端口范围内的服务查询、标题包含某些关键字的系统查询。手动一条一条跑不是不行但效率低而且大量重复操作容易漏掉语句。FofaViewer 支持顺序执行多条查询语句每条语句的结果会作为独立表格展示。执行完所有语句后你需要手动把多个结果合并到一份里。这一步听起来简单实际做起来有不少细节不同语句查出来的资产会有重叠比如证书查询找到的 IP 和端口查询找到的 IP 是同一个这时需要按 IP 去重如果两条语句分别匹配到同一 IP 的不同端口是否要合并也取决于你的分析目标。我自己处理这类场景的做法是把每条语句的导出文件集中放到一个目录里然后通过脚本统一读取、合并、去重。规则很简单——以 IP 为主键去重同 IP 的端口用逗号拼接域名列取第一个非空值。import pandas as pd import glob frames [] for f in glob.glob(fofa_results/*.csv): df pd.read_csv(f, encodingutf-8) df[source_query] f.split(\\)[-1].replace(.csv, ) frames.append(df) merged pd.concat(frames, ignore_indexTrue) merged[ip] merged[ip].astype(str).str.strip() deduped merged.groupby(ip).agg({ port: lambda x: ,.join(sorted(set(map(str, x)))), domain: first, title: first, protocol: lambda x: ,.join(set(x)) }).reset_index()这段代码的核心逻辑是批量读取文件夹内所有导出文件按 IP 分组合并端口去重排序后用逗号拼接。其中 source_query 字段用来标记每条数据来自哪条搜索语句方便后续追溯。如果你要的是「哪些资产是查出来的但没在预期范围里」保留下这个来源字段就会非常有用。4.2 API 查询的合规边界与频控意识FofaViewer 再怎么方便底层的 API 频控和查询额度是绕不开的。FOFA 对 API 请求的频率有限制不同等级账号的每分钟请求数上限不一样。在工具里连续点搜索按钮、几秒内发起大量查询很容易触发临时性的请求拒绝表现就是某条语句一直加载不出来过一会儿又恢复正常。批量执行多语句时我建议在两条语句之间至少间隔 2 到 3 秒。人工点击不需要刻意掐表自然停顿即可但如果你写脚本去调用 FOFA API就必须自己实现一个简单的速率控制逻辑。下面这段代码展示如何控制请求频率import time import requests queries [app致远OA, title后台管理系统, protocolssh] for q in queries: params { qbase64: base64_encode(q), key: your_fofa_key, fields: ip,port,domain,title, size: 100, page: 1 } resp requests.get(https://fofa.info/api/v1/search/all, paramsparams, timeout30) print(q, resp.status_code) time.sleep(3)每执行完一条查询就 sleep 3 秒这是一个相对保守的频率能有效降低触发限流的概率。qbase64 参数需要先对查询语句做 base64 编码这是 FOFA API 的固定要求fields 和 size 分别控制返回字段和单页条数。对脚本批量抓取有兴趣的读者可以在这个基础上扩展翻页逻辑但要先确认自己账号的 API 配额。4.3 结果整理从原始 CSV 到可用的资产清单合并去重之后的表格距离「能直接交给同事或写进报告」还有一段距离。常见操作包括按端口归类确认哪些是 Web 服务、哪些是数据库服务按标题过滤明显无关的资产对域名列做后缀统计反推哪些域名是重点业务。这一步不需要编程Excel 的数据透视表就能完成。如果你更喜欢脚本处理pandas 是最顺手的工具。比如统计端口分布找出暴露最广的服务from collections import Counter ports [] for p in deduped[port].astype(str): if , in p: ports.extend(p.split(,)) else: ports.append(p) port_counter Counter(ports) print(port_counter.most_common(20))这段代码把合并后表格里的端口列展开并统计出现次数输出排名前 20 的端口。通过这些端口分布你能直观看到目标资产里 SSH、MySQL、HTTP/HTTPS 各占多少为后续风险评估提供基线。对熟手来说这个步骤通常会在命令行里直接完成而不是打开 Excel 点鼠标。5. 常见问题排查与避坑六个必须记住的教训5.1 启动卡在「正在加载配置」或界面空白现象双击 fofaviewer.jar 后界面一直停留在加载状态或者主窗口空白没有内容。原因多数情况下是当前系统默认 Java 版本不是 JDK 8界面渲染组件初始化失败少数情况是 config.properties 文件损坏或编码不对工具在读取配置时抛异常被吞掉。解决不要在桌面直接双击 jar打开命令行用java -version确认版本切到 JDK 8 后重新执行java -jar fofaviewer.jar同时用文本编辑器检查配置文件确认没有出现乱码字符。5.2 API Key 正确但搜索报「认证失败」现象config.properties 里已填入 key启动不报错但一执行搜索就提示认证失败。原因FOFA 的 API Key 分两种用途一种是网页版个人中心的 key另一种是 API 专用 key两者不通用。部分用户会把网页端显示的一长串 key 复制进配置文件而实际 API 认证要求的是 API 页签独立生成的 key。解决登录 FOFA 官网进入账号管理的 API 页面重新生成一个 API key替换配置文件里的值重启工具再试。5.3 导出 CSV 后用 Excel 打开中文乱码现象导出的文件用 Excel 打开中文内容变成乱码但用记事本打开是正常的。原因CSV 文件被以 UTF-8 编码写入而 Windows 版 Excel 打开无 BOM 的 UTF-8 文件时默认按 GBK 解码于是中文显示异常。解决在 FofaViewer 的导出设置里确认是否支持带 BOM 的格式如果导出选项不可控用 Python 对文件做一次转码读取后重新以utf-8-sig编码保存。with open(fofa_export.csv, r, encodingutf-8) as f: content f.read() with open(fofa_export_bom.csv, w, encodingutf-8-sig) as f: f.write(content)这段脚本把无 BOM 的 UTF-8 文件转成带 BOM 的 UTF-8 文件之后再用 Excel 打开就不会乱码了。utf-8-sig 编码会在文件开头写入标识字节Excel 能据此识别编码。如果你不想额外跑脚本也可以用 WPS 或 LibreOffice 打开原始文件它们对编码的兼容性比 Excel 更宽松。5.4 查询结果数量与网页端不一致现象同一条查询语句在 FOFA 网页端显示有几千条结果但在 FofaViewer 里只拉回几百条。原因API 与网页端的会员等级权限存在差异部分字段或数据量级受账号等级限制也可能是 FofaViewer 的页面大小设置为 100而你没有翻页只获取了第一页数据。解决确认账号的 API 权限理解限制是账号层面的检查工具的分页参数把页面大小调到 100并在导出时确认拉取的是全部页还是一页数据。5.5 搜索超时或频繁报「请求过于频繁」现象连续执行多条查询后某些请求返回超时或者提示请求频率过高。原因FOFA API 对单账号的并发请求数有限制连续高频查询会触发限流。解决不要手动快速连点搜索按钮复制多条语句时每条之间至少隔 2 到 3 秒再执行。如果你通过脚本调用 API实现请求间固定睡眠并增加失败重试逻辑遇到限流时退避等待。5.6 搜索结果导出后在 Python 中读取为空现象CSV 文件用 Excel 能正常打开但 pandas 读取后 DataFrame 是空的。原因部分情况下工具导出的文件带有特殊分隔符如制表符或分号而 pandas 默认按逗号分隔导致解析结果异常。解决读取时显式指定分隔符和编码df pd.read_csv(fofa_export.csv, sep\t, encodingutf-8-sig)如果还不行先打开文件看一眼分隔符到底是什么再回来改参数。这是一个很像玄学的问题但本质就是分隔符与解析假设不匹配花一分钟确认比改十行代码更有效。6. 资产监控进阶把 FofaViewer 的查询链路固定成自动化流程手动执行搜索适合一次性任务但资产监控需要的是持续关注变化。FOFA 擅长发现资产而 FofaViewer 能给这些资产做快照两者的结合点在于每天用相同的查询语句跑一遍对比昨天和今天的差异就能定位到新增的开放端口、新上线的系统和下线的服务。我一般会把三件事固定下来每天定时执行一组 FOFA 查询导出 CSV 存到指定目录用脚本对比最近两天的结果输出差异行把差异清单写进一份简单的报告中。第一步可以靠 FofaViewer 的界面手动完成但更好的做法是直接用 Python 调用 FOFA API把整条链路脚本化。下面是一段差异对比脚本的骨架import pandas as pd df_old pd.read_csv(assets_20250101.csv, encodingutf-8) df_new pd.read_csv(assets_20250102.csv, encodingutf-8) old_keys set(df_old[ip] : df_old[port].astype(str)) new_keys set(df_new[ip] : df_new[port].astype(str)) added new_keys - old_keys removed old_keys - new_keys changed old_keys new_keys print(f新增 {len(added)} 条) print(f关闭 {len(removed)} 条)这段脚本以 IP 加端口组合作为唯一键对比两个日期的资产快照输出新增和关闭的数量。实际使用时你还需要对比同一条资产上端口对应的协议或者服务指纹是否变化这就要把协议字段也纳入比较范围。脚本输出的差异行可以直接作为当天安全巡检的输入项不必再人工翻看几百行导出数据。这整套流程跑顺之后你会发现 FofaViewer 的最大价值不是替代 FOFA 网页版而是把「搜索-导出-分析」这条链路从手动操作变成了一条可重复执行的流水线。多语句轮转、定时快照、差异对比每一步都可以精益化每天花在资产监控上的时间能从一小时压到几分钟。回看我自己早期做资产梳理全是在网页端手动翻页漏掉资产变化是常有的事后来强制自己每天把脚本跑一遍再没漏过新增的高危端口。希望这个流程思路能帮到你少走我走过的弯路。本文还有配套的精品资源点击获取
返回列表