Nuclei 支持在主机操作系统上执行外部代码。此功能允许安全研究人员、渗透测试人员和开发人员扩展 Nuclei 的功能,执行超出常规协议测试范围的复杂操作。
通过利用此功能,Nuclei 可以与底层操作系统交互并执行自定义脚本或命令,从而开启了广泛的可能性。它使用户能够执行系统级配置、文件操作、网络交互等任务。这种控制和灵活性使用户能够根据自己的特定需求定制安全测试工作流程。
要编写代码模板,需要使用代码块来指示模板请求的开始。此块标记代码相关指令的开始。
要执行代码,需要指定系统环境中已安装或可用的语言解释器列表。这些解释器可以是(但不限于)bash、sh、py、python3、go、ps等,系统会按顺序搜索直到找到合适的解释器。这些解释器的标识符应与系统环境中识别的相应名称或标识符一致。
要执行的代码可以作为外部文件提供,也可以直接在模板中作为代码片段提供。
外部文件示例:
source: helpers/code/pyfile.py
代码片段示例:
source: |
import sys
print("hello from " + sys.stdin.read())
目标通过stdin传递给模板,执行的代码输出可供后续处理器和提取器使用。在Code协议中,response部分表示代码执行期间打印到stdout的所有数据。
Code协议支持的有效part值用于匹配器/提取器:
| 值 | 描述 |
|---|
| response | 执行输出(过滤尾随空格) |
| stderr | 原始标准错误输出(如果有) |
提供的示例演示了在模板中执行bash和python代码片段。按照给定顺序搜索指定的引擎,并相应地执行代码片段。此外,代码片段中使用了动态模板变量,在模板执行过程中会替换为相应的值,这显示了使用此协议可以实现的灵活性和自定义性。
id: code-template
info:
name: example code template
author: pdteam
severity: info
variables:
OAST: "{{interactsh-url}}"
code:
- engine:
- sh
- bash
source: |
echo "$OAST" | base64
- engine:
- py
- python3
source: |
import base64
import os
text = os.getenv('OAST')
text_bytes = text.encode('utf-8')
base64_bytes = base64.b64encode(text_bytes)
base64_text = base64_bytes.decode('utf-8')
print(base64_text)
http:
- method: GET
path:
- "{{BaseURL}}/?x={{code_1_response}}"
- "{{BaseURL}}/?x={{code_2_response}}"
# digest: 4a0a0047304502202ce8fe9f5992782da6ba59da4e8ebfde9f19a12e247adc507040e9f1f1124b4e022100cf0bc7a44a557a6655f79a2b4789e103f5099f0f81a8d1bc4ad8aabe7829b1c5:8eeeebe39b11b16384b45bc7e9163000
除了上述必需字段外,Code协议还支持以下可选字段,以进一步自定义代码的执行。
Args 是执行代码时发送给引擎的参数。例如,如果我们想为特定模板绕过PowerShell中的执行策略,可以通过向模板添加以下参数来实现。
- engine:
- powershell
- powershell.exe
args:
- -ExecutionPolicy
- Bypass
- -File
Pattern字段可用于在模板中执行代码片段时自定义临时文件的名称/扩展名
添加pattern: "*.ps1"将确保临时文件的名称符合给定模式。
这个代码示例展示了基于DSL的基本响应。
id: code-template
info:
name: example code template
author: pdteam
severity: info
self-contained: true
code:
- engine:
- py
- python3
source: |
print("Hello World")
extractors:
- type: dsl
dsl:
- response
# digest: 4a0a0047304502204576db451ff35ea9a13c107b07a6d74f99fd9a78f5c2316cc3dece411e7d5a2b022100a36db96f2a56492147ca3e7de3c4d36b8e1361076a70924061790003958c4ef3:c40a3a04977cdbf9dca31c1002ea8279
下面是一个示例代码模板,我们在执行PowerShell脚本的同时自定义执行策略行为并将模式设置为*.ps1
id: ps1-code-snippet
info:
name: ps1-code-snippet
author: pdteam
severity: info
description: |
ps1-code-snippet
tags: code
code:
- engine:
- powershell
- powershell.exe
args:
- -ExecutionPolicy
- Bypass
- -File
pattern: "*.ps1"
source: |
$stdin = [Console]::In
$line = $stdin.ReadLine()
Write-Host "hello from $line"
matchers:
- type: word
words:
- "hello from input"
# digest: 4a0a00473045022100eb01da6b97893e7868c584f330a0cd52df9bddac005860bb8595ba5b8aed58c9022050043feac68d69045cf320cba9298a2eb2e792ea4720d045d01e803de1943e7d:4a3eb6b4988d95847d4203be25ed1d46
运行代码模板
默认情况下,Nuclei不会执行代码模板。要启用代码协议执行,需要向nuclei显式传递-code标志。
nuclei -t code-template.yaml -code
了解更多
使用此功能时要谨慎,因为在主机操作系统上执行外部代码存在固有风险。确保执行的代码是安全的、经过充分测试的,不会对目标系统造成任何意外后果或安全风险至关重要。
为确保模板中代码的完整性,请务必使用模板签名方法对模板进行签名。