DCE SMB 检查器

DCE SMB 检查器概述

类型

检查器(服务)

使用方式

检测

实例类型

多实例

所需其他检查器

已启用

true

DCE/RPC 协议使不同网络主机上的进程可以像在同一主机上一样进行通信。这些进程间通信一般通过 TCP 和 UDP 在主机之间传输。在 TCP 传输中,DCE/RPC 也可以进一步封装在 Windows 服务器消息块 (SMB) 协议或 Samba 中;Samba 是一种在由 Windows 和类似 UNIX 或 Linux 操作系统组成的混合环境中用于进程间通信的开源 SMB 实现。

虽然大多数 DCE/RPC 漏洞出现在针对 DCE/RPC 服务器(实际上可能是网络上运行 Windows 或 Samba 的任何主机)的 DCE/RPC 客户端请求中,但在服务器响应中也可能出现漏洞。

IP 封装所有 DCE/RPC 传输。TCP 传输所有面向连接 DCE/RPC,如 SMB。

dce_smb 检查器检测 SMB 协议中面向连接的 DCE/RPC,并使用协议特定特征(包括信头长度和数据分段顺序)来:

  • 检测封装在 SMB 传输中的 DCE/RPC 请求和响应。

  • 分析 DCE/RPC 数据流并检测 DCE/RPC 流量中的异常行为和逃避技术。

  • 分析 SMB 数据流并检测异常 SMB 行为和逃避技术。

  • 对 SMB 进行分片,对 DCE/RPC 进行分片重组。

  • 规范化 DCE/RPC 流量,以便规则引擎进行处理。

下图说明了 DCE SMB 检查器开始为不同传输处理 SMB 流量的点。

dce_smb 检查器通常接收适用于 NetBIOS 会话服务的已知 TCP 端口 139 或以类似方式实现的已知 Windows 端口 445 上的 SMB 流量。由于 SMB 具有除传输 DCE/RPC 以外的许多功能,因此,检查器会首先测试 SMB 流量是否携带 DCE/RPC 流量,如果不是则停止处理,如果是则继续处理。

dce_smb 检查器参数和功能的描述包括 DCE/RPC 的 Microsoft 实施,包括 Microsoft 远程过程调用 (MSRPC),以及 SMB 和 Samba。

基于目标的策略

Windows 和 Samba DCE/RPC 的实现有很大不同。例如,在对 DCE/RPC 流量进行分片重组时,所有 Windows 版本都在第一个分片中使用 DCE/RPC 上下文 ID,而所有 Samba 版本都在最后一个分片中使用上下文 ID。再如,Windows Vista 在第一个分片中使用操作编号报头字段来识别特定函数调用,而 Samba 及其他所有 Windows 版本都在最后一个分片中使用操作编号字段。

Windows 和 Samba SMB 的实现有很大不同。例如,Windows 在与命名管道配合使用时可识别 SMB OPEN 和 READ 命令,而 Samba 不能识别这些命令。

因此, dce_smb 检查器使用基于目标的方法。配置 dce_smb 检查器实例时, policy 参数指定 DCE/RPC SMB 协议的实施。将此信息与主机信息相结合,建立默认的基于目标的服务器策略或者,您可以配置以其他主机和 DCE/RPC SMB 实施为目标的其他检查器。默认的基于目标的服务器策略指定的 DCE/RPC SMB 实施适用于另一个 dce_smb 检查器实例没有作为目标的任何主机。

dce_smb 检查器可以使用 policy 参数定位的 DCE/RPC SMB 实施包括:

  • WinXP(默认)

  • Win2000

  • WinVista

  • Win2003

  • Win2008

  • Win7

  • Samba

  • Samba-3.0.37

  • Samba-3.0.22

  • Samba-3.0.20

文件检查

dce_smb 检查器支持 SMB 版本 1、2 和 3 的文件检查。

dce_smb 检查器检查正常的 SMB 文件传输。这包括通过文件处理检查文件类型和签名,以及为 file_data 规则选项设置指针。 dce_smb 检查器支持与 file_id 检查器配合使用时检查 SMB 版本 1、2 和 3 的正常 SMB 文件传输(详见 Snort 3 开源文档,可从 https://www.snort.org/snort3获取)。要启用文件检测,请根据需要配置 file_id 检查器,并设置 dce_smb 、smb_file_inspectionsmb_file_length 参数。smb_file_length 参数表示 file_id 检查器检查的文件数据字节数(从 file_data IPS 规则选项指示的指针开始)。有关详细信息,请参阅 Snort 3 开源文档,网址为 https://www.snort.org/snort3)。

解除分区

dce_smb 检查器支持重组分片的数据包。此功能在内联模式下非常有用,可以在完整的分片重组完成之前于检测流程的早期阶段捕获漏洞攻击,或捕获利用分段隐藏自身的漏洞攻击。请注意,禁用分片重组可能会导致大量的漏报。

DCE SMB 检查器参数

DCE SMB 端口配置

绑定程序 检查器定义 DCE SMB 端口配置。有关详细信息,请参阅绑定程序检查器概述

示例:
[
   {
       "when": {
           "role":"any",
           "service":"netbios-ssn",
           "ports": ""
       },
        "use": {
            "type":"dce_smb"
       }
   }
]

max_frag_len

指定分片重组允许的最大分片长度(以字节为单位)。为了处理更大的分段,检查器会在进行分段重组之前考虑此大小的数据包内容。



在此参数中指定的值必须大于或等于规则检查数据所需的深度以确保 检测到。要确保所有数据都通过检测,请使用默认值。


类型: 整数

有效范围: 151465535

默认值: 65535

smb_max_compound

指定一个 SMB 请求中要处理的最大命令数。

类型: 整数

有效范围:0255

默认值: 3

smb_max_chain

指定允许的链式 SMB AndX 命令的最大数量。通常,超过若干链式 AndX 命令即表示存在异常行为,可能代表有躲避行为。指定 1 表示不允许链式命令,指定 0 将会禁止检测链式命令数量。

dce_smb 检查器会首先计算链式命令数量,如果随附的 SMB 检查器规则已启用,并且链式命令数量等于或超过配置的值,预处理器将会生成事件。然后会继续进行处理。

您可以启用规则 133:20 来生成此参数的事件,并且在内联部署中丢弃违规数据包。

类型: 整数

有效范围:0255

默认值: 3

disable_defrag

指定是否对 DCE/RPC 流量进行分片重组。当启用时,dce_smb 检查器仍会检测异常并向规则引擎发送 DCE/RPC 数据,但可能会检测不出分片 DCE/RPC 数据中的漏洞。

尽管 disable_defrag 提供了不对流量进行碎片整理的灵活性,并且可以加快处理速度,但大多数 DCE/RPC 漏洞都试图利用碎片来隐藏漏洞。启用此参数将会忽略大多数已知漏洞,从而造成大量误报。

类型: boolean

有效值:truefalse

默认值:false

limit_alerts

指定是否将 DCE 警报限制为每个签名每个流最多一个。

类型: boolean

有效值:truefalse

默认值: true

reassemble_threshold

指定将重组的数据包发送到规则引擎之前,DCE/RPC 取消分片和分片重组缓冲区中待排队的最小字节数。此参数在内联模式下非常有用,因为它可以在内联模式下检测到潜在的漏洞攻击,可以在完整的分片重组完成之前提前捕获漏洞。

请注意,值越小,实现早期检测的可能性越高,但可能会对性能造成负面影响。如果启用此参数,应当测试性能所受的影响。

0 将禁用重组。

类型: 整数

有效范围: 065535

默认值: 0

策略

指定目标主机或受监控网段上主机使用的 Windows 或 Samba DCE/RPC 应用。

类型: enum

有效值: 从以下列表中选择的字符串: Win2000WinXPWinVistaWin2003Win2008Win7SmbSmb-3.0.37Sack-3.0.22Smb-3.0.20

默认值: WinXP

smb_max_credit

指定最大待处理请求数。

类型: 整数

有效范围: 165536

默认值: 8192

smb_file_depth

指定在 SMB 流量中检测到文件时检查的字节数,从 file_data IPS 规则选项指定的位置开始(如 Snort 3 开源文档所述,可从 https://www.snort.org/snort3获取)。

指定 -1 以禁用文件检查。

指定 0 以表示不受限制的文件检查。

类型: 整数

有效范围: -132767

默认值: 16384

在 SMB 流量中检测到文件时, smb_file_length 参数表示检查器从 file_data IPS 规则选项中设置的指针开始检查的文件数据字节数。为了检查文件类型和签名, dce_smb 使用 file_id检查器中设置的 enable_typetype_length enable_signature signature_length 参数。有关 file_id 检查器的详细信息,请参阅 https://www.snort.org/snort3提供的 Snort 开源文档。

memcap

指定分配给检查器的最大内存限制(以字节为单位)。当达到或超过最大内存上限时, dce_smb 检查器会删除最近最少使用的数据以腾出更多空间。

类型: 整数

有效范围: 5129,007,199,254,740,992 (maxSZ)

默认值: 8,388,608

smb_fingerprint_policy

因为检查器检测在 SMB Session Setup AndX 请求和响应中识别出的 Windows 或 Samba 版本。如果检测到的版本不同于为 策略 检查器参数配置的 Windows 或 Samba 版本,检测到的版本将会仅覆盖为该会话配置的版本。

例如,如果将策略 (Policy) 设置为 Windows XP,而检查器检测到 Windows Vista,则检查器将对该会话使用 Windows Vista 策略。其他设置仍然有效。

类型: enum

有效值: none, client, serverboth

  • 使用 客户端,检查该策略类型的服务器到客户端流量。

  • 使用 服务器,检查该策略类型的客户端到服务器流量。

  • 使用 两者,检查该策略类型的服务器到客户端流量和客户端到服务器流量。

  • 使用 none 以禁用 Windows 或 Smba 版本检测。

默认值: none

smb_legacy_mode

如果 smb_legacy_mode (Legacy SMB Inspection Mode)则系统只会将 SMB 入侵规则应用于 SMB 版本 1 流量,并将 DCE/RPC 入侵规则应用于使用 SMB 版本 1 作为传输的 DCE/RPC 流量。

smb_legacy_modefalse时,系统将 SMB 入侵规则应用于使用 SMB 版本 1 和 2 的流量,并且:

  • 对于版本 7.0 和 7.0.x,系统仅将 SMB 用于 SMB 第 1 版,将 DCE/RPC 入侵规则应用于 DCE/RPC 流量。

  • 对于版本 7.1+,系统使用 SMB 作为 SMB 版本 1 和 2 的传输,将 DCE/RPC 入侵规则应用于 DCE/RPC 流量。

类型: boolean

有效值:truefalse

默认值:false

valid_smb_versions

指定要检测的 SMB 版本。使用空格字符分隔多个 SMB 版本。

类型: 字符串

有效值: v1, v2, v3, all

默认值:all

DCE SMB 检查器规则

启用 dce_smb 检查器规则,以 生成事件并在内联部署中丢弃攻击性数据包

表 1. DCE SMB 检查器规则

GID:SID

Rule Message

133:2

SMB - NetBIOS 会话服务会话类型错误

133:3

SMB - 错误的 SMB 消息类型

133:4

SMB - 错误的 SMB ID (SMB1 不是 \xffSMB 或 SMB2 不是 \xfeSMB)

133:5

SMB - 错误字数计数或结构大小

133:6

SMB - 错误字节计数

133:7

SMB - 格式错误类型

133:8

SMB - 错误的偏移量

133:9

SMB - 零数据总数

133:10

SMB - NetBIOS 数据长度小于 SMB 信头长度

133:11

SMB - 剩余 NetBIOS 数据长度小于命令长度

133:12

SMB - 剩余 NetBIOS 数据长度小于命令字节数

133:13

SMB - 剩余 NetBIOS 数据长度小于命令数据大小

133:14

SMB - 剩余总数据计数小于此命令的数据大小

133:15

SMB - 发送的总数据 (STDu64) 大于命令预期的总数据

133:16

SMB - 字节数小于命令数据大小 (STDu64)

133:17

SMB - 命令数据大小对于字节数无效

133:18

SMB - 具有待处理树连接响应的树连接请求过多

133:19

SMB - 具有待处理读取响应的读取请求过多

133:20

SMB-命令链接过多

133:21

SMB - 多个链式登录请求

133:22

SMB - 多个链式树连接请求

133:23

SMB - 链式/复合登录和注销

133:24

SMB - 链式/复合树连接后树断开

133:25

SMB - 链式/复合开管道后接闭管道

133:26

SMB - 无效共享访问

133:44

SMB - 发现无效的 SMB 版本 1

133:45

SMB - 发现无效的 SMB 版本 2

133:46

SMB - 无效用户、树连接、文件绑定

133:47

SMB - 命令复合过多

133:48

SMB - 零数据计数

133:50

SMB — 超出最大未完成请求数

133:51

SMB — 具有相同 MID 的待处理请求

133:52

SMB - 已弃用协商的方言

133:53

SMB - 使用已弃用的命令

133:54

SMB - 使用异常命令

133:55

SMB - 命令的设置计数无效

133:56

SMB - 客户端尝试在会话中进行多个方言协商

133:57

SMB - 客户端尝试创建文件或将文件的属性设置为只读/隐藏/系统

133:58

SMB - 提供的文件偏移量大于指定的文件大小

133:59

SMB - SMB2 报头中指定的下一个命令超出负载边界

DCE 检查器入侵规则选项

dce_iface

指定以下以逗号分隔的元素:

  • 服务接口的 UUID。

  • 接口版本(可选)。默认设置会与任何版本匹配。

  • 规则是否应匹配请求中的任何分段的指示符(可选)。默认设置仅匹配第一个分段。

在 DCE/RPC 协议中,客户端调用某个服务之前必须先绑定该服务。当客户端向 服务器发送绑定请求时,它可以指定要绑定的一个或多个服务接口。每个接口均由一个 UUID 表示,并且每个接口 UUID 都与一个唯一索引(或情景 ID)配对,将来的请求可用于引用客户端调用的服务。服务器使用其接受为有效的接口 UUID 进行响应,并允许客户端向这些服务发出请求。当客户端发出请求时,它将指定情景 ID,以便服务器知道客户端向哪个服务发出请求。

使用 dce_iface 规则选项,规则可以询问检查器客户端是否已绑定到特定接口 UUID,以及此客户端请求是否向该接口发出请求。这可以消除多个服务成功绑定到 的误报,因为检查器可以将绑定 UUID 与请求中使用的情景 id 相关联。

dce_iface 选项需要在检查器中跟踪面向连接的 DCE/RPC 的客户端绑定和修改情景请求以及服务器绑定确认和修改情景响应。对于每个“绑定和修改情景”请求,客户端指定一个接口 UUID 列表以及将在 DCE/RPC 会话期间用于引用接口的每个接口 UUID 的句柄(或情景 ID)。服务器响应指示它允许客户端向哪些接口发出请求 — 它要么接受或拒绝客户端绑定到特定接口的希望。此跟踪是必需的,以便在处理请求时,可以将请求中使用的情景 ID 与其作为句柄的接口 UUID 相关联。

在以下条件下, dce_iface 规则选项匹配:

  • 指定的接口 UUID 与 DCE/RPC 请求的接口 UUID(通过情景 ID 引用)相匹配

  • 未提供 版本 参数,或提供了 版本 参数且该参数与 DCE/RPC 请求的接口 UUID 匹配

  • 提供了 any_frag 参数,或者不存在 any_frag 参数并且 dce_iface 选项与初始请求分片中的 UUID 和版本条件匹配

示例:

dce_iface:4b324fc8-1670-01d3-1278-5a47bf6ee188;
dce_iface:4b324fc8-1670-01d3-1278-5a47bf6ee188, <2;
dce_iface:4b324fc8-1670-01d3-1278-5a47bf6ee188,any_frag;
dce_iface:4b324fc8-1670-01d3-1278-5a47bf6ee188, =1, any_frag;

dce_iface.uuid

DCE/RPC 请求可以指定 UUID 编号是以大端字节还是小端字节表示。接口 UUID 在请求中的表示形式根据请求中指定的字节顺序而不同。 dce_rpc 检查器会对 UUID 进行规范化。这意味着 dce_iface 规则选项中的 UUID 规范必须以相同的方式写入,而无论请求的字节顺序如何。

例如,小端字节绑定请求将表示如下 UUID:

|f8 91 7b 5a 00 ff d0 11 a9 b2 00 c0 4f b6 e6 fc|

高字节在前绑定请求将表示相同的 UUID,如下所示:

|5a 7b 91 f8 ff 00 11 d0 a9 b2 00 c0 4f b6 e6 fc|

在使用 dce_iface 选项的 Snort 3 规则中,无论请求的字节序如何,UUID 必须使用大端字节顺序在字符串中表示:

5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc

类型: 字符串

语法: dce_iface: <UUID>;

有效值: 其中: UUID 是 32 个十六进制数字,以连字符分隔五组,显示格式为: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

示例: dce_iface:5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc;

dce_iface.version

服务接口具有与其关联的版本。某些接口版本可能不容易受到某些漏洞攻击。为此,您可以在 dce_iface 选项中指定一个或多个版本号,以确定是否需要检查特定攻击程序。

类型: 间隔

语法: dce_iface: <range_operator><positive integer>; or dce_iface: <positive integer><range_operator><positive integer>;

有效值:范围格式表 中指定的一个或多个正版本号和 range_operator的集合。

示例: dce_iface:=6;

dce_iface.any_frag

可以将 DCE/RPC 请求分为一个或多个分段。在 DCE/RPC 信头中设置标志以指示当前分段是请求的第一个分段、中间分段还是最后一个分段。仅当 DCE/RPC 请求是第一分段(或完整请求)时,对 DCE/RPC 请求中数据的许多检查才具有相关性。因此,第一个分段之后的分段包含 DCE/RPC 请求更深层次的数据。例如,在请求的前五个字节(例如,长度字段)中查找数据的规则会在除第一个字节之外的分段上找到错误的数据。后续分段的开头距离请求的开头偏移一段长度。这可能是分段 DCE/RPC 流量中误报的一个来源。

因此,默认情况下,DCE_RPC 检查器仅匹配请求中的初始分片。要强制检查器检查匹配请求中的所有分片,请将 any_frag 添加到 dce_iface 规则选项。请注意,已进行分片重组的 DCE/RPC 请求被视为完整请求。

语法: dec_iface: any_frag;

示例: dce_iface: any_frag;

dce_opnum

匹配 DCE RPC 操作编号、操作编号范围或操作编号列表。此选项表示可对接口进行的一个或多个特定函数调用。客户端绑定到特定服务接口并向其发出请求后,规则需要确定客户端对服务进行的函数调用,以检查是否存在可能存在于函数调用中的漏洞。函数调用被指定为用双引号括起来的操作编号 (opnums) 列表

类型: 字符串

语法: dce_opnum: <opnum_list>;

其中, opnum_list 是下列各项之一:

  • 单个整数。

  • 以逗号分隔的整数列表。

  • 指定的整数范围,用连字符分隔范围内的最小和最大数字。

  • 以上各项的任意。

有效值: DCE/RPC 请求 opnum 的列表。

示例:

dce_opnum: "15";
dce_opnum: "15-18";
dce_opnum: "15, 18-20";
dce_opnum: "15, 17, 20-22";

dce_stub_data

此选项将检测光标(用于在规则处理中遍历数据包负载)放在 DCE/RPC 末节数据的开头,不考虑前面的规则选项。如果存在 DCE/RPC 末节数据,则此选项匹配。

语法: dce_stub_data;

示例: dce_stub_data;

表 2. 范围格式

范围格式

Operator

说明

operator i

<

少于

>

大于

=

平分

不等于

小于或等于

大于或等于

j operator k

<>

大于 j 且小于 k

<=>

大于或等于 j 且小于或等于 k