内网渗透从零到一之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消息由三部分构成:
- SMB_Header - 固定长度头部
- SMB_Parameters - 可变长度参数块
- 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命令
- 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)
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 渗透测试应用
常见利用场景
- Pass-the-Hash(PTH)攻击 - 使用NTLM哈希进行认证
- 共享枚举 - 发现网络共享资源
- 文件传输 - 上传/下载文件
- 命令执行 - 通过命名管道执行命令
常用工具
- psexec - 远程命令执行
- smbexec - SMB协议命令执行
- atexec - 通过任务计划执行命令
- smbmap - SMB共享枚举
- crackmapexec - SMB多功能工具
0x06 防御建议
- 禁用SMBv1协议
- 启用SMB签名
- 限制SMB访问(防火墙规则)
- 使用强密码策略
- 监控异常SMB活动
0x07 参考资源
- Microsoft SMB协议文档
- Wireshark SMB数据包分析
- Samba项目文档
- 渗透测试工具文档