Skip to main content
Nuclei可以作为一个可自动化的Netcat,允许用户发送和接收网络数据,同时提供对响应的匹配和提取功能。 网络请求以network块开始,指定模板请求的起始点。
# 从这里开始模板的请求
tcp:

输入

请求中的第一部分是inputs。输入是将发送到服务器的数据,以及可选的从服务器读取的任何数据。 最简单的方式是指定一个字符串,它会通过网络套接字发送。
# inputs是发送到服务器的输入列表
inputs: 
  - data: "TEST\r\n"
你也可以发送十六进制编码的文本,这些文本会先解码,然后原始字节会被发送到服务器。
inputs:
  - data: "50494e47"
    type: hex
  - data: "\r\n"
输入中也可以定义辅助函数表达式,这些表达式会先被计算,然后发送到服务器。上面的十六进制编码示例可以通过辅助函数这样发送:
inputs:
  - data: 'hex_decode("50494e47")\r\n'
使用inputs还可以从套接字读取数据。指定非零值的read-size就可以实现这一点。你还可以为读取的数据指定名称,这样就可以对该部分进行匹配。
inputs:
  - read-size: 8
读取指定字节数并仅对其进行匹配的示例:
inputs:
  - read-size: 8
    name: prefix
...
matchers:
  - type: word
    part: prefix
    words: 
      - "CAFEBABE"
多个步骤可以按顺序链接在一起,以进行网络读取/写入。

主机

请求的下一部分是要连接的host。可以在路径中放置动态变量,以在运行时修改其值。变量以{{开始,以}}结束,并且区分大小写。
  1. Hostname - 变量会被命令行提供的主机名替换。
示例值:
host: 
  - "{{Hostname}}"
Nuclei也可以与目标服务器建立TLS连接。只需在Hostname前添加tls://前缀即可。
host:
  - "tls://{{Hostname}}"
如果在主机中指定了端口,则用户提供的端口将被忽略,模板端口优先。

端口

从Nuclei v2.9.15开始,在网络模板中引入了一个名为port的新字段。此字段允许用户单独指定端口,而不是将其包含在host字段中。 之前,如果你想为针对SSH的漏洞利用编写网络模板,你必须在host字段中同时指定主机名和端口,像这样:
host:
  - "{{Hostname}}"
  - "{{Host}}:22"
在上面的示例中,会发送两个网络请求:一个到输入/目标中指定的端口,另一个到默认SSH端口(22)。 引入port字段的原因是为用户提供更多灵活性,使其能够在默认和非默认端口上运行网络模板。例如,如果用户知道SSH服务在非默认端口2222上运行(在执行带服务发现的端口扫描后),他们可以简单地运行:
$ nuclei -u scanme.sh:2222 -id xyz-ssh-exploit
在这种情况下,Nuclei将使用端口2222而不是默认端口22。如果用户在输入中不指定任何端口,则默认使用端口22。然而,这种方法可能不易理解,并且可能在日志中生成警告,因为预计有一个请求会失败。 编写网络模板的先前设计的另一个问题是请求可能会发送到意外的端口。例如,如果Web服务在端口8443上运行,用户运行:
$ nuclei -u scanme.sh:8443
在这种情况下,xyz-ssh-exploit模板将向scanme.sh:22发送一个请求,向scanme.sh:8443发送另一个请求,这可能会返回意外响应,最终导致错误。这在自动化场景中尤其成问题。 为了解决这些问题,同时保持现有功能,网络模板现在可以按以下方式编写:
host:
  - "{{Hostname}}"
port: 22
在这种新设计中,在非标准端口上运行模板的功能仍然存在,但默认保留端口(8044380808443808153)除外。此外,可以通过添加一个名为exclude-ports的新字段来自定义默认保留端口列表:
exclude-ports: 80,443
使用exclude-ports时,默认保留端口列表将被覆盖。这意味着如果要在端口80上运行网络模板,则必须在port字段中明确指定。 从Nuclei v3.1.0开始,port字段支持逗号分隔的值,并且可以在port字段中指定多个端口。例如,如果要在端口54325433上运行网络模板,可以在port字段中这样指定:
port: 5432,5433
在这种情况下,Nuclei将首先检查列表中的端口是否开放,并且只在开放的端口上运行模板。

匹配器/提取器部分

Network协议支持的有效part值用于匹配器/提取器如下:
描述
request网络请求
data从网络套接字读取的最终数据
raw / body / all从套接字接收的所有数据

网络模板示例

下面提供了用于检测服务器上运行的MongoDB的hex编码输入的最终示例模板文件,其中包含工作匹配器:
id: input-expressions-mongodb-detect

info:
  name: Input Expression MongoDB Detection
  author: pdteam
  severity: info
  reference: https://github.com/orleven/Tentacle

tcp:
  - inputs:
      - data: "{{hex_decode('3a000000a741000000000000d40700000000000061646d696e2e24636d640000000000ffffffff130000001069736d6173746572000100000000')}}"
    host:
      - "{{Hostname}}"
    port: 27017
    read-size: 2048
    matchers:
      - type: word
        words:
          - "logicalSessionTimeout"
          - "localTime"
更完整的示例在这里提供。