本文介绍 Afrog PoC 新增的 requires/requires-mode 门控能力:让高成本(弱口令/爆破/默认口令等)PoC 仅在目标命中指定指纹后执行,从而显著降低无效请求与扫描耗时。
在真实扫描中,弱口令/爆破类 PoC 往往非常耗时。如果对“所有端口 / 所有 HTTP 站点”都无差别执行,会带来:
- 扫描时间被大幅拉长(尤其是端口资产多、服务类型杂时)
- 误扫误打扰(对不相关的服务发送认证/登录请求)
- 用户体验不符合“专业漏扫”的常识流程(应先识别是什么,再做针对性检测)
requires 的目标就是把流程变为:
- 先跑指纹识别(fingerprinting stage)
- 只有命中相关指纹的目标,才执行对应的高成本 PoC
这两个字段写在 info: 下:
requires: 依赖的“指纹标签(tag)”列表requires-mode: 门控模式(可选,默认 strict)
-
数组写法(推荐)
- 示例:
requires: [nacos,redis]
- 示例:
-
字符串写法(逗号分隔)
- 示例:
requires: "nacos,redis"
- 示例:
requires 会被做以下标准化:去空格、转小写、去重。
核心规则非常简单:
- 如果 PoC 没写
requires:不启用门控(行为不变) - 如果 PoC 写了
requires:只有当该 target 的“指纹命中 tags”与requires有交集时,才允许执行
这里的“指纹命中 tags”来自指纹阶段命中的指纹 PoC 的 info.tags:
- 指纹 PoC 通常会带
fingerprinttag - 系统会忽略
fingerprint这个 tag,本质上是用它来区分“这是指纹 PoC” - 其它 tag(例如
ftp、mysql、nacos等)会作为“命中指纹 tags”参与门控匹配
如果你写:
requires: [nacos, seata]
含义是:“目标只要命中 nacos 或 seata 任意一种指纹,就执行该 PoC”。
requires-mode 用于控制“没有指纹结果”时怎么办。
strict 会在以下情况跳过 PoC:
- 指纹阶段没有结果(例如禁用了指纹阶段、或指纹 PoC 未覆盖、或目标没有命中)
- 有指纹结果,但与
requires不匹配
适用场景:
- 弱口令/爆破
- 默认口令
- 登录类高频探测
- 任何你不希望“对不相关目标也跑一遍”的 PoC
opportunistic 的行为是:
- 如果指纹阶段没有结果:不拦截,照常执行
- 如果有指纹结果但不匹配 requires:仍然跳过
适用场景:
- 你希望“有指纹就精准收敛,但没指纹也尽量不漏扫”的中低成本 PoC
门控需要把当前扫描的 target 映射成一个 key,才能关联到该 target 的指纹结果。建议遵循:
- Web 场景:使用带 scheme 的 URL
- 例如:
http://1.2.3.4:8848
- 例如:
- 网络服务:使用
host:port- 例如:
1.2.3.4:21
- 例如:
在 strict 模式下,如果 target 既不是 URL 也不是 host:port,可能会因为无法关联指纹结果而被跳过。
目标:只对确认为 Nacos 的站点执行 Nacos 默认口令/弱口令 PoC。
PoC 作者的表达方式:
- 指纹 PoC(fingerprinting)在
info.tags中包含:nacos,fingerprint - 弱口令/默认口令 PoC 在
info中声明:requires: [nacos]requires-mode: strict
运行效果:
- 命中 Nacos 指纹的目标:执行弱口令/默认口令 PoC
- 未命中 Nacos 指纹的目标:跳过,不做无意义请求
目标:只对确认为 FTP 的 host:21 执行匿名登录检测。
PoC 作者的表达方式:
- 指纹 PoC 的
info.tags:至少包含ftp,fingerprint - 匿名登录/弱口令类 PoC:
requires: [ftp]requires-mode: strict
运行效果:
- 只有命中 ftp 指纹的
host:21才会执行匿名登录检测 - 其它开放端口不会被无关的登录探测打扰
如果你让某些 PoC 使用 strict requires,就意味着它们强依赖“指纹阶段”产出。
Afrog 命令行中:
-nf:禁用指纹阶段(跳过带fingerprinttag 的 PoC)
因此:
- 不加
-nf:指纹先跑,strict requires 才能正常放行对应 PoC - 加了
-nf:指纹不跑,strict requires 大概率会跳过(因为没有指纹 tags 可匹配)
为了让 requires 门控稳定可靠,建议团队统一约定:
- 指纹 PoC 的
info.tags必须包含:fingerprint- 一个“主 tag”(产品/服务名,例如
mysql/ftp/nacos/redis)
- 弱口令/爆破/默认口令 PoC 的
requires只依赖“主 tag” - 分类 tag(例如
network/db/middleware)不建议写进 requires
这样能避免 requires: [network] 这类过宽依赖导致门控失效。
以下为“主 tag”建议(指纹 PoC 产出主 tag;高成本 PoC 依赖主 tag):
- FTP:主 tag
ftp,目标建议ip:21 - MySQL:主 tag
mysql,目标建议ip:3306 - Redis:主 tag
redis,目标建议ip:6379 - PostgreSQL:主 tag
postgresql,目标建议ip:5432 - SSH:主 tag
ssh,目标建议ip:22 - RDP:主 tag
rdp,目标建议ip:3389 - SMB:主 tag
smb,目标建议ip:445 - Nacos:主 tag
nacos,目标建议http(s)://ip:8848
strict 模式下,如果 target 不是 http(s)://... 或 host:port,可能无法命中指纹 key,从而被跳过。
建议:
- 网络服务一律使用
ip:port - Web 一律使用带 scheme 的 URL
strict requires 的设计目标就是:没有指纹结果就不跑高成本 PoC。
如果你希望“没指纹也尽量扫一遍”,把该 PoC 设置为 opportunistic 更合适。
Afrog 已有基于 tags 的收敛机制,用于在指纹结果存在时减少不相关 PoC 的执行。
requires 是一种更“显式”的声明方式:
- tags 过滤更偏“系统侧的智能收敛”
- requires 更偏“PoC 作者明确声明依赖”,尤其适合弱口令/爆破类 PoC
两者可以同时存在:requires 用于表达强依赖,tags 过滤用于进一步收敛与优化。
- 指纹 PoC 的
info.tags是否包含主 tag +fingerprint - 弱口令/爆破 PoC 是否写了
requires,并使用requires-mode: strict - 运行时是否误加了
-nf导致 strict 被全部门控 - target 是否使用了
http(s)://...或host:port