内网渗透从零到一之SMB协议
字数 1900 2025-08-26 22:12:02

SMB协议内网渗透详解

0x00 概述

SMB(Server Message Block)协议是Microsoft Windows中实现的网络文件共享协议,在内网渗透中常用于横向移动。常见的工具如atexec、smbexec、psexec等都基于SMB协议。

0x01 SMBv1协议

基本概念

  • CIFS协议是SMBv1协议的特定版本称呼
  • 功能包括:
    • 客户端和服务器之间传输文件
    • 访问集中式打印队列
    • 使用命名管道进行进程间通信

SMBv1消息结构

SMBv1消息由三部分构成:

  1. SMB_Header - 固定长度头部
  2. SMB_Parameters - 可变长度参数块
  3. SMB_Data - 可变长度数据块

SMB_Header结构

SMB_Header {
    UCHAR Protocol[4];      // 协议标识,通常为"\xFFSMB"
    UCHAR Command;          // 命令代码
    SMB_ERROR Status;       // 状态码
    UCHAR Flags;            // 标志位
    USHORT Flags2;          // 扩展标志位
    USHORT PIDHigh;         // 进程ID高字节
    UCHAR SecurityFeatures[8]; // 安全特征
    USHORT Reserved;        // 保留字段
    USHORT TID;             // 树ID
    USHORT PIDLow;          // 进程ID低字节
    USHORT UID;             // 用户ID
    USHORT MID;             // 多路复用ID
}

SMB_Parameters结构

SMB_Parameters {
    UCHAR WordCount;        // Words数组长度
    USHORT Words[WordCount]; // 参数数组
}

SMB_Data结构

SMB_Data {
    USHORT ByteCount;       // Bytes数组长度
    UCHAR Bytes[ByteCount]; // 数据数组
}

常见SMBv1命令

  1. SMB_COM_NEGOTIATE (0x72) - 协商协议方言
  2. SMB_COM_SESSION_SETUP_ANDX (0x73) - 配置SMB会话,进行NTLM身份认证
  3. SMB_COM_TREE_CONNECT_ANDX (0x75) - 建立到服务器共享的客户端连接
  4. SMB_COM_TRANSACTION2 (0x32) - 事务处理命令,包含多个子命令

SMB_COM_TRANSACTION2子命令

  1. TRANS2_QUERY_PATH_INFORMATION - 获取文件或目录信息
  2. TRANS2_QUERY_FS_INFORMATION - 请求共享基础的对象存储信息
  3. TRANS2_FIND_FIRST2 - 搜索目录中的文件或目录

典型SMBv1会话流程

net use \\10.1.1.1\ipc$dir \\10.1.1.1\c$为例:

  1. SMB_COM_NEGOTIATE - 协商协议
  2. SMB_COM_SESSION_SETUP_ANDX - NTLM认证
  3. SMB_COM_TREE_CONNECT_ANDX - 连接共享
  4. 多个SMB_COM_TRANSACTION2 - 执行操作

0x02 SMBv2协议

与SMBv1的区别

  • 标头结构分为ASYNC和SYNC两种
  • 命令集不同
  • 性能和安全改进

常见SMBv2命令

  1. SMB2 NEGOTIATE (0x00) - 协商协议方言
  2. SMB2 SESSION_SETUP (0x01) - 建立认证会话
  3. SMB2 TREE_CONNECT (0x03) - 连接共享
  4. SMB2 IOCTL (0x0B) - 发送控制命令
  5. SMB2 CREATE (0x05) - 创建或访问文件
  6. SMB2 QUERY_INFO (0x10) - 查询信息
  7. SMB2 CLOSE (0x06) - 关闭文件

典型SMBv2会话流程

  1. SMB2 NEGOTIATE - 协商协议
  2. SMB2 SESSION_SETUP - NTLM认证
  3. SMB2 TREE_CONNECT - 连接共享
  4. SMB2 IOCTL/CREATE/QUERY_INFO - 执行操作
  5. SMB2 CLOSE - 关闭资源

0x03 SMBv3协议

特点

  • 基于SMBv2的消息结构
  • 新增特性:
    • 加密消息(SMB2 TRANSFORM_HEADER)
    • 压缩消息(SMB2 COMPRESSION_TRANSFORM_HEADER)

版本协商

  • 服务器和客户端协商使用最高共同支持的版本
  • 如Windows Server 2012默认使用SMB3.0.2方言

0x04 协议版本控制

禁用SMBv2/v3(强制使用SMBv1)

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 0 -Force

启用SMBv2/v3

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 1 -Force
# 需要重启计算机生效

0x05 渗透测试应用

常见利用场景

  1. Pass-the-Hash(PTH)攻击 - 使用NTLM哈希进行认证
  2. 共享枚举 - 发现网络共享资源
  3. 文件传输 - 上传/下载文件
  4. 命令执行 - 通过命名管道执行命令

常用工具

  1. psexec - 远程命令执行
  2. smbexec - SMB协议命令执行
  3. atexec - 通过任务计划执行命令
  4. smbmap - SMB共享枚举
  5. crackmapexec - SMB多功能工具

0x06 防御建议

  1. 禁用SMBv1协议
  2. 启用SMB签名
  3. 限制SMB访问(防火墙规则)
  4. 使用强密码策略
  5. 监控异常SMB活动

0x07 参考资源

  1. Microsoft SMB协议文档
  2. Wireshark SMB数据包分析
  3. Samba项目文档
  4. 渗透测试工具文档
SMB协议内网渗透详解 0x00 概述 SMB(Server Message Block)协议是Microsoft Windows中实现的网络文件共享协议,在内网渗透中常用于横向移动。常见的工具如atexec、smbexec、psexec等都基于SMB协议。 0x01 SMBv1协议 基本概念 CIFS协议是SMBv1协议的特定版本称呼 功能包括: 客户端和服务器之间传输文件 访问集中式打印队列 使用命名管道进行进程间通信 SMBv1消息结构 SMBv1消息由三部分构成: SMB_ Header - 固定长度头部 SMB_ Parameters - 可变长度参数块 SMB_ Data - 可变长度数据块 SMB_ Header结构 SMB_ Parameters结构 SMB_ Data结构 常见SMBv1命令 SMB_ COM_ NEGOTIATE (0x72) - 协商协议方言 SMB_ COM_ SESSION_ SETUP_ ANDX (0x73) - 配置SMB会话,进行NTLM身份认证 SMB_ COM_ TREE_ CONNECT_ ANDX (0x75) - 建立到服务器共享的客户端连接 SMB_ COM_ TRANSACTION2 (0x32) - 事务处理命令,包含多个子命令 SMB_ COM_ TRANSACTION2子命令 TRANS2_ QUERY_ PATH_ INFORMATION - 获取文件或目录信息 TRANS2_ QUERY_ FS_ INFORMATION - 请求共享基础的对象存储信息 TRANS2_ FIND_ FIRST2 - 搜索目录中的文件或目录 典型SMBv1会话流程 以 net use \\10.1.1.1\ipc$ 和 dir \\10.1.1.1\c$ 为例: SMB_ COM_ NEGOTIATE - 协商协议 SMB_ COM_ SESSION_ SETUP_ ANDX - NTLM认证 SMB_ COM_ TREE_ CONNECT_ ANDX - 连接共享 多个SMB_ COM_ TRANSACTION2 - 执行操作 0x02 SMBv2协议 与SMBv1的区别 标头结构分为ASYNC和SYNC两种 命令集不同 性能和安全改进 常见SMBv2命令 SMB2 NEGOTIATE (0x00) - 协商协议方言 SMB2 SESSION_ SETUP (0x01) - 建立认证会话 SMB2 TREE_ CONNECT (0x03) - 连接共享 SMB2 IOCTL (0x0B) - 发送控制命令 SMB2 CREATE (0x05) - 创建或访问文件 SMB2 QUERY_ INFO (0x10) - 查询信息 SMB2 CLOSE (0x06) - 关闭文件 典型SMBv2会话流程 SMB2 NEGOTIATE - 协商协议 SMB2 SESSION_ SETUP - NTLM认证 SMB2 TREE_ CONNECT - 连接共享 SMB2 IOCTL/CREATE/QUERY_ INFO - 执行操作 SMB2 CLOSE - 关闭资源 0x03 SMBv3协议 特点 基于SMBv2的消息结构 新增特性: 加密消息(SMB2 TRANSFORM_ HEADER) 压缩消息(SMB2 COMPRESSION_ TRANSFORM_ HEADER) 版本协商 服务器和客户端协商使用最高共同支持的版本 如Windows Server 2012默认使用SMB3.0.2方言 0x04 协议版本控制 禁用SMBv2/v3(强制使用SMBv1) 启用SMBv2/v3 0x05 渗透测试应用 常见利用场景 Pass-the-Hash(PTH)攻击 - 使用NTLM哈希进行认证 共享枚举 - 发现网络共享资源 文件传输 - 上传/下载文件 命令执行 - 通过命名管道执行命令 常用工具 psexec - 远程命令执行 smbexec - SMB协议命令执行 atexec - 通过任务计划执行命令 smbmap - SMB共享枚举 crackmapexec - SMB多功能工具 0x06 防御建议 禁用SMBv1协议 启用SMB签名 限制SMB访问(防火墙规则) 使用强密码策略 监控异常SMB活动 0x07 参考资源 Microsoft SMB协议文档 Wireshark SMB数据包分析 Samba项目文档 渗透测试工具文档