尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

FOFATOTO:突破FOFA批量查询与深度导出的实战指南

FOFATOTO:突破FOFA批量查询与深度导出的实战指南 1. 为什么FOFA的“官方能力”在实战中不够用1.1 从一次资产梳理说起先讲个我自己的真实经历。去年做一次授权范围内的资产盘点甲方给了大概四千多个IP段要求把其中开放了Web服务的资产全部找出来并且关联对应的域名、标题、指纹、中间件版本。我第一反应就是打开FOFA把IP段拆开一条条查。结果查了不到两个小时就放弃了——不是FOFA查不到而是Web端这个交互形态根本就不是为“大批量处理”设计的。单页最多显示几十条翻页翻到手指发酸每换一个IP段就要重新输入语法、重新筛选好不容易把结果存下来发现导出的时候还有条数上的硬限制想要把多个查询结果合并成一张表还得靠手工去重。整个过程里真正花在分析上的时间可能只有两成剩下八成全在重复劳动。这不是FOFA本身不好用而是它的产品定位决定了Web端优先解决的是“查得准”而不是“查得多”。批量场景天然需要一个中间层把查询、导出、筛选这些动作做成可编排、可复用、可断点续传的流水线。我当时就意识到如果想要舒服地把FOFA用好必须有个能站在FOFA肩膀上的工具层。1.2 官方API的条数限制与成本门槛很多人一提到批量查询就想直接调FOFA API这个思路没问题但实际操作会撞上几堵墙。第一堵墙是套餐额度。FOFA的API调用是按积分或者按条数计费的不同会员等级能拉取的总条数差得很远。一个普通账号可能分分钟就把额度耗尽而真正高质量的资产测绘往往需要几万条、几十万条的返回量。第二堵墙是单次查询的上限。API单次返回的记录数有上限超出部分并不是“一次查完”而是需要“翻页拉取”。翻页本身有频率限制如果拉得太快服务端会直接拒绝响应。这两堵墙叠加起来就出现了一个很尴尬的局面明明FOFA的数据库里躺着大量有价值的测绘数据但在批量场景下你一次能真正拿出来的只是很小一部分。市面上后来出现的各种“FOFA导出工具”本质上都是在解决同一个问题——怎么在合规、限速的前提下把尽量多的查询结果完整地落到本地。1.3 FOFATOTO这个工具解决的正是这一层需求FOFATOTO这个名字听起来像个玩具但其实是“FOFA Toolkit for Operation”的缩写拼出来的当初起名的时候我差点把它叫成“FOFA Helper”后来觉得太普通就用了TOTO这个小后缀。这个工具定位非常明确它是FOFA的增强层不是替代品。它不改变FOFA的查询语法也不替你做安全分析它只做三件事——深度导出、批量查询模式、查询结果的批量筛选。换句话说FOFA负责“搜出来”FOFATOTO负责“把搜出来的东西完整、高效、干净地整理好”。这篇内容我打算从原理到实操完整讲一遍包括它内部的导出策略是怎么设计的、批量查询的并发节奏怎么调、筛选模块是怎么处理脏数据的。我不会只贴几个命令就完事而是把每个设计背后的考量和踩过的坑都讲清楚。不管你是做攻防演练、日常巡检还是外部资产暴露面排查这套思路都能直接借鉴。2. 深度导出的核心逻辑翻页、断点续传与增量合并2.1 单页查询的边界与翻页机制的实现在深入FOFATOTO的导出模块之前先搞清楚一个基础问题FOFA的查询结果到底是怎么分页的。Web端和API端的逻辑一致每次查询都会返回一个总数然后是当前页的记录列表。如果你在Web端一页页点浏览器发出的就是带有页码参数的请求。FOFATOTO做的事情和手动翻页本质相同但最大的区别在于工具会动态解析返回结果里的total字段自动计算出总页数然后一次性把后续页面的请求任务挂进队列。这里有一个容易被忽略的陷阱如果查询条件在翻页过程中没有固定下来而是模板里有变量比如批量查询IP段时把IP作为变量嵌进去那么每一页请求的返回总量可能是不同的。实际开发中我见过不少人在写这类工具时直接用第一个请求的total去做循环结果数据量一大后面的页就出现重复或缺失。FOFATOTO的做法是每翻一页都重新读取一次当前查询条件下的返回结果校验当前累计条数是否和第一次拉取时的total一致不一致就自动调整页数。这种“实时校验”的逻辑在初期增加了不少代码量但换来了导出数据的完整性。2.2 断点续传批量任务中断之后不用从头再来深度导出的第二个痛点就是跑到一半断了。断的原因很多网络抖动、目标服务器限流、本地内存不够、甚至笔记本合盖休眠。如果每次中断都要重新开始那几千页的查询任务几乎不可能稳定跑完。FOFATOTO在任务编排上引入了一个类似“书签”的机制。每个查询任务在启动的时候会生成一个任务ID同时把任务状态写入本地数据库。每成功拉取一页就记录下当前页码、已获取条数、下一条游标位置。任务中断后重新启动工具会自动读取任务状态接着上次的位置继续拉取而不是从第1页重新开始。这个设计在长周期任务里特别重要。我自己排过一个大任务要拉取一个行业所有开放SSH服务的资产总量接近二十万条。中间因为网络问题断了五六次但因为有断点续传最终没有多花一次重复请求的代价。你可以算一笔账如果每次中断都从头再来浪费的不只是时间还有API额度。2.3 导出格式与字段选择的经验深度导出的最终出口是文件。很多初学工具的人觉得导出就是把结果打印成表格而已但一旦数据量达到几万条之后文件格式和字段选择就变成影响下游分析效率的关键因素。FOFATOTO默认支持JSON、CSV两种导出格式。JSON适合程序化的后续处理CSV适合直接打开Excel做筛选。但有两个细节是我建议所有使用者特别留意的第一字段不是越多越好。FOFA的返回字段里有ip、port、protocol、domain、title、cert、icp、fid等等全量导出会让文件体积暴涨。比如cert和icp这类长字段在CSV里还会引入换行符导致表格错位。更好的做法是先导出核心字段确认没有遗漏后再按需补齐扩展字段。第二建议固定一个“导出规范”第一列永远是IP第二列永远是端口第三列协议后面才是域名、标题、指纹等信息。这样无论导多少次合并起来都干净。FOFATOTO在导出模块里预置了几套字段模板但我也强烈建议你根据自己的业务场景自定义一套长期用下来省心得多。我个人的习惯是资产发现阶段只导核心字段确认目标范围后再跑一轮带指纹和证书信息的深度导出。这个节奏比一次性导全量要稳因为后期筛选时你会发现字段太多反而不容易聚焦。3. 批量查询模式不止是“把多个查询拼在一起”3.1 批量输入的几种常见形态批量查询听起来简单无非就是把多个查询语句循环发送。但在真实场景里输入源很少是同一形态FOFATOTO针对几个高频场景分别做了处理。第一种是IP段列表。用户提供一段段CIDR工具自动扩展成单IP再拼接到查询语句里。这里有个性能优化点FOFA支持CIDR形式的查询语法比如ip1.2.3.0/24完全没有必要把每个IP单独拆出来查一次直接保留CIDR可以让查询参数缩短一个量级返回速度也更快。第二种是URL/域名列表。批量核查自己资产库里的域名时会有一个和IP查询完全不同的语法组装方式。FOFA对域名可以做host或domain字段的精确匹配但“裸域名”和“带子域名的完整域名”使用的语法不同工具必须自动识别输入项的格式才能生成正确的查询表达式。第三种是“从已有导出文件反查”也就是把上一个任务的CSV结果读进来提取出符合条件的项作为下一次查询的输入。这个场景在做“一层资产到二层资产”的关联分析时非常有用。比如你从证书指纹里提取了一堆序列号然后拿这批序列号去反查IP工具只需要解析原始文件的某个列就能生成批量查询任务。3.2 任务编排中的并发节奏控制批量查询最大的坑不是语法写错而是请求频率失控。FOFA服务端对频率是有限制的一旦短时间内请求量过大不管你是Web端还是API端都会返回异常或者直接封禁一段时间。市面上很多批量工具被诟病“用一次就废”多半就是并发控制没做好。FOFATOTO在并发设计上走的是保守路线默认并发数只有3到5个线程每个线程执行完一次查询后会随机休息200到800毫秒。你可能觉得这太慢了但拉长到几万条数据的维度去看在稳定性和速度之间稳定永远排第一。更细一点的节奏控制是对“大查询”和“小查询”区别对待。查询返回总量大的任务比如几千页单次请求耗时本身就是秒级并发调高一两个问题不大而返回量小的任务一眨眼就查完了反而要在任务与任务之间加一个稍长的间隔避免连续快节奏请求触发限流。我自己的经验是宁可让一个一万条的任务跑二十分钟也不愿意被封掉三小时。做这类外部数据拉取第一原则永远是“慢就是快”。3.3 任务的可视化与失败重试批量任务的另一个隐藏需求是“看得见进度”。一个任务有几万条数据一个循环在后台跑着如果界面上一片死寂用户根本不敢安心离开电脑。FOFATOTO在任务列表里维护了清晰的状态机等待中、运行中、部分完成、已完成、失败、已取消。每个任务运行时会显示当前累计获取条数、总条数、剩余页数、平均请求耗时、最近一次成功时间。出现异常时工具会区分是“可重试的临时错误”还是“不可恢复的参数错误”。临时错误自动进入重试队列采用指数退避的策略第一次失败等2秒第二次4秒第三次8秒最多重试5次。而参数错误直接标记为失败同时把原始查询语句和错误信息一并展示让你能迅速定位是哪一条查询写错了。这个失败重试机制在长周期任务里起到了关键作用。有一次我在批量查询过程中遇到过目标服务端短暂抖动连续三个请求返回超时。如果没有重试机制这三个查询就会静默丢失最终导出的数据就是一个残缺集而你甚至不知道丢在哪里。4. 批量筛选从“查得到”到“筛得对”4.1 筛选操作的四个维度FOFA查询语法可以做很多前置过滤但有些筛选动作必须在拿到结果之后再做。原因有两个一是某些字段的正则提取在查询阶段做不到比如从title里提取特定版本号二是有些筛选依赖于多条结果合并之后才能判断比如跨IP去重。FOFATOTO把批量筛选拆成四个维度对应不同的使用场景内容维度基于返回字段的内容做过滤。比如标题中包含“登录”或“管理”的资产单独抽出来端口为443或8443的归为一组状态码如果存在为200/301/302的优先关注。正则维度用一个自定义正则去匹配文本字段匹配成功的留下不成功的剔除。这在提取特定类型的URL路径或从title中识别设备型号时非常实用。属性维度比如按IP是否属于内网段来区分资产或者按证书有效期判断是否即将过期。属性维度本质上是“对FOFA返回数据做二次分类”。去重维度对IP端口做精确去重对IP做单条保留或者对域名做主域名去重。四个维度可以叠加使用形成一条筛选流水线。实操中我最常用的是“内网误报剔除 IP去重 端口/协议聚合”的组合基本能覆盖大多数资产盘点的需求。4.2 去重逻辑与资产归属判定去重这件事比想象中复杂。FOFA同一台服务器如果开放多个端口会有多条记录同一IP对应多个域名也会有多条记录。如果只是简单地对“IP”这个字段去重会丢掉大量有效资产如果只对“IP端口”去重域名信息合并又需要额外处理。FOFATOTO内置了几种去重级别从粗到细分别是IP级别去重同一个IP只保留一条、IP端口级别去重同一个服务的多条记录合并、主域名级别去重多个子域名归并为一个主域名。按照实际使用频率排序IP端口级别去重用得最多因为它在“保留关键资产”和“减少重复”之间最平衡。主域名级别去重更多用在报告阶段用来向上层汇报“我们总共发现了多少个独立站点”。关于资产归属判定我的做法是会结合FOFA的domain字段和cert里的CN字段做一次交叉验证如果一条记录的domain为空但cert的CN字段里包含一个和已发现主域名相似的域名那大概率属于同一个组织的资产。这种“弱关联”逻辑虽然不能100%准确但在快速扩展资产范围时能帮上大忙。4.3 筛选结果集的标记与标签体系筛选如果只有“留下”“剔除”二选一很多场景就不够用。实际做安全测试时更需要的是“标记不同重要程度”而不是简单删掉某条数据。FOFATOTO的筛选模块支持自定义标签规则。比如你可以设定title包含“后台”或者“admin”的资产自动打上“后台管理”标签端口为22或3389的记录标记为“远程管理入口”标题包含“test”“dev”“demo”等关键词的资产标记为“疑似测试环境需人工确认”。这些标签会写进导出文件里作为单独的一列存在。整套标签体系相当于构建了一个简易的资产分类器。你不必在拿到导出数据后再去Excel里写VLOOKUP也不用到Burp或者Nuclei里再去筛选目标范围。查询结果落地的那一刻资产已经按照你的规则分好了类。这一点在时间紧迫的攻防任务里价值极高。5. 一次完整实战从批量查询到清洗入库的标准流程5.1 任务设计与语法拆解空讲功能太抽象我拿一个典型需求串一遍整个流程甲方给了一个“某支付行业”的关键词列表要求梳理出所有疑似相关并且暴露在公网的Web资产。第一步把关键词列表扩展成FOFA查询语句。关键词可以是“支付”“结算”“清分”“收单”等每条语句用title或body字段匹配同时加一层|或的关系。FOFATOTO的批量任务界面允许每一行一条独立查询也支持把多行查询组合成一个任务组。我用的是“每行一条独立查询、全部输出后统一合并”的方式。第二步为每个查询设定返回条数上限。默认不设上限但考虑到整体任务量我会先把每个关键词的上限定在5000条跑完看数据分布后再决定是否扩量。第三步配置导出字段。这轮阶段我只要ip、port、protocol、host、title、domain六个字段不做证书和指纹采集因为第一步只是想快速圈定范围。5.2 清洗、合并与最终的字段归一化批量查询跑完会得到若干份结果文件。这里面重复情况非常严重同一套系统可能被多个关键词同时命中。这时候就需要进入FOFATOTO的批量筛选模块做数据清洗。清洗步骤我一般固定走四步剔除状态码异常的资产记录401、403这类先保留但打上标签。对IP端口做精确去重把重复项合并保留所有命中的关键词。对标题和域名做一次正则过滤剔除明显的广告、验证码、CDN拦截页面。对最终结果做主域名归类输出一份按主域名维度统计的概览表。字段归一化是最后一步。来自多条查询语句的数据可能有的字段值为空、有的带空格、有的换行符混入全部清洗成统一格式后再入库。放进数据库后我习惯建一个“原始记录表”和一个“有效资产表”“有效资产表”里的行才作为后续渗透测试或安全检查的目标集合。5.3 验证结果质量的两个小方法数据清洗完别急着用先花五分钟验证质量。第一个方法抽出20条结果人工用FOFA Web端重新查询验证。如果每一条都能在Web端找到对应记录说明导出和筛选中没有丢数据或改数据。第二个方法拿清洗后的有效资产表里的IP集合和甲方提供的已知资产库做交叉比对看覆盖率。如果覆盖率偏低多半是查询关键词覆盖不够需要补充查询语句如果覆盖率超过了甲方已知资产库那说明你的资产梳理比他们还全这份数据可以直接反哺给甲方。这两种验证手段虽然原始但非常有效。完成这一步后这批数据才真正进入到“可用”状态。6. 踩过的坑、边界条件与最重要的三条提醒6.1 最大的一次翻车忘了限速导致账号被限制我早期用批量工具的时候翻过一次大车。当时排了一个夜间任务本地放着跑了整晚第二天早上起来一看——前二十分钟数据正常二十分钟后所有请求返回异常账号被临时限制了。原因很简单并发调得太高请求间隔设得太短加上任务量集中在同一时段爆发式增长直接把频率限制顶穿了。那次之后我总结了两条铁律第一所有批量任务必须默认走慢速模式除非你有十足的把握知道当前账号的限速阈值第二每次大规模拉取前先跑一个100条的小任务试试水温确认稳定后再上量。这两条规则现在写进了我自己所有自动化脚本的最前面。6.2 数据污染问题别把CDN、云厂商的跳转页面当真实资产FOFA返回的数据里有很大一部分是云厂商的默认页面、CDN的拦截页、WAF的验证页面。这些记录虽然在测绘结果里但它并不代表真实业务系统。如果直接拿这些记录去做后续测试会浪费大量时间在无效目标上。处理方式是在筛选模块里维护一个“常见中间页指纹库”把市面上主流CDN、云WAF、安全厂家的拦截响应特征加进去。每次清洗数据时命中指纹库的自动标记为“疑似云防护或CDN页面”需要人工复查。拿真实业务资产的准确率主要就是靠这一步提升的。6.3 合规边界与本工具的正确打开方式最后必须提一句合规。FOFATOTO这类工具的价值在于让资产测绘更高效但前提是查询目标必须是自己有权限测试的资产或者经过了明确授权的资产范围。无论是FOFA本身的使用还是周边工具的批量拉取都应当遵守目标平台的服务条款和当地法律法规。使用这类工具时我建议在本地保留完整的任务日志包括查询语句、查询时间、导出记录。这不仅是自己复盘的需要在特殊情况下也是证明操作合规的重要依据。做安全这行能力越强越要谨慎工具本身是中性的但操作者必须清楚边界在哪里。如果能把批量查询的节奏控好、筛选规则沉淀成自己的方法论、并且始终守住合规底线FOFATOTO这样的工具会成为你日常工作中很顺手的一环。它不复杂但确实能让测绘这件事从“手动搬砖”变成“半自动流水线”。
返回列表