Skip to main content什么是大规模扫描?
在Nuclei上下文中,大规模扫描意味着在超过100个目标上运行Nuclei CLI。虽然Nuclei可以直接用于对任意数量的目标进行扫描,但我们建议了解更多内容以理解在不同场景下运行Nuclei的资源需求,以及如何正确调整标志和选项,避免资源过度使用并获得最佳性能。
资源过度使用
如果标志和可用选项配置不当,Nuclei可能会过度使用资源,并可能导致以下问题:
-
被系统OOM Killed(内存不足被杀死)
-
挂起和崩溃
-
错误代码137等
了解Nuclei如何消耗资源
Nuclei是一个高并发工具,由于工具性质,具有主要的网络I/O。并发性和内存使用之间存在直接关系。
max-requests
max-requests是模板info部分下的元数据字段,包含此模板可以发出的最大出站请求数。
以下是一些直接影响Nuclei资源利用率的标志和选项:
-
-c或-concurrency
此标志控制Nuclei中两个组件/操作的并发/并行性,其默认值为25。
-
一次并行运行的模板数量(在Template-Spray/默认模式/策略中)
每个目标并行运行的模板数量(在Host-Spray模式/策略中)
-
每个模板并行发送的请求数
例如:某些模板具有
payloads字段,并通常发送多个请求。每个模板的这种并发性由模板中的threads: 10值控制
但如果threads未定义或缺失(因为它是可选的),则nuclei将使用-c值来决定每个模板的请求并发性
-
-bs或-bulk-size
此标志控制Nuclei中目标的并发/并行性,其默认值为25。
在Host-Spray模式/策略中,此标志控制一次并行运行的最大目标数
在Template-Spray/默认模式/策略中,此标志控制每个模板并行运行的最大目标数
-
-hbs和-headc
-hbs(-headless-bulk-size)和-headc(-headless-concurrency)标志是-bs和-c标志的变体,专门用于headless模板,因为headless模板资源密集且在后台运行headless浏览器。
-
-jsc或-js-concurrency
(v3.1.8引入)此标志控制一次并行运行的最大JavaScript运行时数量。JavaScript运行时用于带有
flow字段和javascript协议的模板
虽然与http模板相比,javascript模板较少,但这提供了控制javascript模板资源利用率的方法。
此标志的默认值为120,经测试以最小的资源利用率达到最佳效果(注意:Nuclei默认重用javascript运行时,以避免为每个请求创建新运行时的开销)
-
-pc或-payload-concurrency
(v3.2.0引入)此标志控制每个模板并行运行的最大payload数量。此标志仅适用于带有
payloads字段且没有设置threads字段的模板,默认值为25,可根据需求更新
-
-rl或-rate-limit
此标志控制nuclei中http请求的全局速率限制,其默认值为每秒150个请求。
注意:设置较低/非常低的值会直接影响Nuclei的速度(RPS)和内存使用率,因为速率限制是在发送请求之前应用的,但此时请求已经准备好并在内存中等待发送
-
-rlm或-rate-limit-minute
-rl标志的替代方案,此标志控制nuclei中http请求的全局速率限制,但以每分钟请求数为单位(默认不使用,与-rl标志互斥)
-
-ss或-scan-strategy
此标志控制扫描目标的策略,其默认值为
auto
auto当前是template-spray策略的占位符
template-spray策略可理解为扫描的隐蔽模式,不会积极扫描单个目标。它不是在单个目标上运行所有模板,而是在多个目标上运行一个模板,从而减轻单个目标的负载,同时不影响扫描速度
host-spray策略可理解为更集中的扫描模式,它在单个目标上运行所有模板,然后再移至下一个目标
虽然差异可能看起来不显著,但在现实中,这在资源利用率和扫描速度方面起着主要作用。例如:template-spray策略更隐蔽,但消耗更多内存,因为每个模板的输入/目标块不同,这与host-spray策略相反,后者所有模板的输入/目标块相同
此标志仅决定扫描策略,并使用由-c和-bs标志指定的并发性
注意:host-spray策略当前不支持恢复功能,因为实现复杂
-
-rsr或-response-size-read
此标志控制nuclei应该读取的http响应的最大响应大小,其默认值为4MB(最大)。
例如:如果一个端点/目标返回100MB的响应(如zip文件或其他),则nuclei将只读取响应的前4MB,以避免DOS,因为读取的数据存储在内存中
这在Nuclei的内存使用中起着重要作用,因为在任何时刻,Nuclei的堆内存为
1-1.5x x (并发性 * response-size-read)
-
-stream
此标志使nuclei持续将输入流式传输到nuclei,而不是等待探测完成(默认行为),而不是探测所有输入url然后进行扫描
观察到此标志在
template-spray策略中运行时可能导致高内存使用率,因为涉及Marshal/Unmarshal开销,每个模板都有不同的输入/目标块副本
优化资源使用的建议
目前,没有现成的解决方案可以自动优化Nuclei进行大规模扫描。了解标志和选项的正确使用可以帮助优化Nuclei进行大规模扫描。
一般来说,以下是优化Nuclei进行大规模扫描的一些建议:
- 尽可能首选
host-spray策略
- 如果可能,不要通过设置低内存限制来限制GC(垃圾收集)。Nuclei(就像go标准http库一样)专注于重用内存,而不是释放它并再次分配它。这就是为什么Nuclei与其他Go工具一样,内存使用没有高波动,内存使用量要么逐渐增加,要么逐渐减少
- 在了解自己系统以及正在扫描的目标的需求和能力后,适当调整
-c、-bs和-rl标志
- 虽然Nuclei可以处理任何数量的目标,但我们建议根据目标或系统能力对目标进行批处理
基于功能的大规模扫描优化
-
-timeout
Timeout控制Nuclei等待响应的最长时间(当前默认值为http为10秒,code协议为6 * -timeout值)
此标志取决于您的目标和网络条件。设置低值可能导致假阴性,设置高值可能导致高内存使用率并减慢扫描过程。
-
-retries
Retries控制Nuclei应该尝试请求的最大重试次数(当前默认值为1)
当您在网络条件不稳定的目标上扫描时,此标志很有用。设置高值可能导致高内存使用率并减慢扫描过程。
-
-mhe或-max-host-error
此标志控制在从扫描中移除无响应主机之前允许每个主机的最大(网络类型)错误数(当前默认值为30)
-
-nmhe或-no-max-host-error
此标志禁用当无响应主机达到最大错误数时从扫描中移除它们的行为(当前默认值为30)
注意:此标志直接影响Nuclei的速度和内存使用率,因为它将无响应主机保留在内存中并重试它们。
报告性能问题
与其他类型的问题不同,性能问题需要更多信息和不同类型的信息来调试和修复此问题。因此,建议报告性能问题时提供以下信息:
- Nuclei版本(如果不是最新版本,请尝试使用最新版本)
- 系统信息(操作系统、内存、CPU)
- 目标数量和模板数量
- 上述使用的标志和选项,特别是-c、-bs、-rl、-ss
- 使用的任何其他标志和选项
上述信息将有助于了解问题是由于配置错误还是由于nuclei中的bug。如果问题性质更复杂,如内存泄漏,则需要收集应用程序配置文件并在问题描述中共享
可以使用PPROF=1环境变量在nuclei中启用分析,并接受附加选项PPROF_TIME=10s,使用这两个环境变量将启用分析,并且每10秒(PPROF_TIME)将收集CPU配置文件和内存配置文件的快照并存储在适当的目录中。有关分析的其他选项,请参阅nuclei-pprof。
报告内存泄漏等性能问题的一个好例子是#4552。
通过PDCP最大化您的Nuclei体验
在超过100个目标上构建Nuclei自动化或运行循环扫描,如果不了解Nuclei并实验标志和选项,可能是一项具有挑战性的任务。
另一个选择是考虑评估ProjectDiscovery Cloud Platform或PDCP。作为托管服务,它提供:
- 所有扩展和优化都被抽象
- 扫描是分布式的,请求以适当的方式分块,以便在没有假阴性的情况下扩展
PDCP包括许多其他有用的功能,用于漏洞扫描和ASM,如仪表板、集成、报告、循环扫描等
有关PDCP的更多信息,请访问PDCP