catalogue

. 什么是SMB
. 基础SMB协议
. SMB Clients and Servers

1. 什么是SMB

全世界有很多的客户端和服务端软件实现了SMB协议,全部windows工作站,windows 95,windows NT系统都同时支持SMB客户端和服务端

SMB本质上一种服务消息块(Server Message Block),它可以实现

. 文件共享
. 打印机共享
. 串口共享
. 通信抽象: 例如named pipes命名管道、计算机间的mail slots、RPC API调用

从上图可见,SMB是一个C/S request-response挑战响应协议

客户端和SMB服务端的连接可以基于TCP/IP、NetBEUI、或者IPX/SPX,下图展示了各层协议的支持关系

. SMB was also sent over the DECnet protocol. Digital (now Compaq) did this for their PATHWORKS product.
. NetBIOS over TCP/IP seems to be referred to by many names. Microsoft refers to it as NBT in some places and NetBT in others (specifically in their Windows NT documentation and in the Windows NT registry).
. Others refer to it as RFCNB. NetBEUI is sometimes refered to as NBF (NetBIOS Frame Format?) by Microsoft

一旦建立起连接,SMB客户端可以发送SMB指令(SMB commands),用于访问共享资源,打开文件,读写文件等文件操作,看起来就和在本地操作文件系统一样,只不过是通过SMB协议远程进行

0x1: NetBIOS Names

如果SMB下层基于TCP/IP、DECnet、或者NetBEUI,那么NetBIOS name就会在很多情况下被使用到和出现,NetBIOS name最多15字节,在默认情况下,这个名字就是GetComputerName() API获取的值,例如我本机这里是WINDOWS-2181810,在网络间传输时,这个NetBIOS name会被填充到16字节,最后一个字节用于标识这个NetBIOS name的类型

. Unique names
. Global Names
. Internet Group
. Domain
. Multihomed

0x2: SMB Protocol Variants

为了适应不断出现的新的应用场景,最原始的SMB协议也在不断产生新的变种

. PC NETWORK PROGRAM 1.0(Core Protocol):
The original version of SMB as defined in IBM's PC Network Program. Some versions were called PCLAN1.0, It could handle a fairly basic set of operations that included:
) connecting to and disconnecting from file and print shares
) opening and closing files
) opening and closing print files
) reading and writing files
) creating and deleting files and directories
) searching directories
) getting and setting file attributes
) locking and unlocking byte ranges in files . MICROSOFT NETWORKS 1.03(Core Plus Protocol): Included Lock&Read and Write&Unlock SMBs with different versions of raw read and raw write SMBs
. MICROSOFT NETWORKS 3.0(DOS LAN Manager 1.0): The same as LANMAN1., but OS/ errors must be translated to DOS errors.
. LANMAN1.(LAN Manager 1.0): The full LANMAN1. protocol.
. DOS LM1.2X002(LAN Manager 2.0): The same as LM1.2X002, but errors must be translated to DOS errors.
. LM1.2X002(LAN Manager 2.0): The full LANMAN2. protocol.
. DOS LANMAN2.(LAN Manager 2.1): The same as LANMAN2., but errors must be translated to DOS errors.
. LANMAN2.(LAN Manager 2.1): The full LANMAN2. protocol.
. Windows for Workgroups .1a(LAN Manager 2.1): Windows for Workgroups 1.0
. NT LM 0.12(NT LAN Manager 1.0): Contains special SMBs for NT
. Samba(NT LAN Manager 1.0): Samba's version of NT LM 0.12
. CIFS 1.0(NT LAN Manager 1.0): Really NT LM 0.12 plus a bit

这里我们重点关注一下最后也是最新的一项SMB协议变种CIFS

在NetBIOS出现之后,Microsoft就使用NetBIOS实现了一个网络文件/打印服务系统,这个系统基于NetBIOS设定了一套文件共享协 议,Microsoft称之为SMB(Server Message Block)协议。这个协议被Microsoft用于它们Lan Manager和Windows NT服务器系统中,而Windows系统均包括这个协议的客户软件,因而这个协议在局域网系统中影响很大。
随着Internet的流行,Microsoft希望将这个协议扩展到Internet上去,成为Internet上计算机之间相互共享数据的一种标 准。因此它将原有的几乎没有多少技术文档的SMB协议进行整理,重新命名为CIFS(Common Internet File System),并打算将它与NetBIOS相脱离,试图使它成为Internet上的一个标准协议

0x3: SMB Security

SMB定义了如下两个层级的安全,注意在User Level这个层次可以衍生出不同的认证体系,有基于系统的,有基于域的,有基于数据库的

. Share level.
Protection is applied at the share level on a server. Each share can have a password, and a client only needs that password to access all files under that share. This was the first security model that SMB had and is the only security model available in the Core and CorePlus protocols. Windows for Workgroups' vserver.exe implements share level security by default, as does Windows 95. . User Level.
Protection is applied to individual files in each share and is based on user access rights. Each user (client) must log in to the server and be authenticated by the server. When it is authenticated, the client is given a UID which it must present on all subsequent accesses to the server. This model has been available since LAN Manager 1.0.

Under both of these security levels, the password is encrypted before it is sent to the server. NTLM and the older LAN Manager (LM) encryption are supported by Microsoft SMB Protocol. Both encryption methods use challenge-response authentication, where the server sends the client a random string and the client returns a computed response string that proves the client has sufficient credentials for access.

0x4: Browsing the network

在一个中大型网络中,往往有很多SMB Server,并且随时可能有新的Server加入旧的Server退出,为了让网络中的Client能感知到这些变化,每一个SMB Server都会通过广播的方式来发送自己的相关信息,但是这里存在一个问题,广播包跨网段传输的问题

. 在NetBEUI网络中,这个问题不存在
. 但是在TCP/IP网络中,子网络的路由器会选择性地过滤一些广播包,为了解决这个问题,微软引入了Browser servers以及Windows Internet Name Service(WINS)

Relevant Link:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365234(v=vs.85).aspx

2. 基础SMB协议

SMB包头部分

0x1: SMB Command Header

SMB Command Header的长度不是固定的,不同的命令有不同的长度,上图中的SMB Command Header在实际的协议中并不是真的就叫这个名字,而是根据对应的协议有对应的名字。下面列举了一些SMB中常用到的Command,但是要明白的是,SMB协议是一个在不断扩展和更新的协议,包括像CIFS这种SMB增强版有很多扩展出来支持的协议,实际在使用的使用我们只要查询对应的datasheet获得实际的用途即可

. SMB_COM_DELETE_DIRECTORY (0x01): 这是原始核心协议的一个命令,用来删除一个空的目录
. SMB_COM_CLOSE (0x04): 这是原始核心协议的一个命令,用来关闭和一个有效的FID关联的对象的一个实例。Client closes the file represented by Tid and Fid. Server responds with success code.
. SMB_COM_FLUSH (0x05): 这是原始核心协议的一个命令,用来要求服务器将当前文件的所有数据和信息都写回到存储器上
. SMB_COM_DELETE (0x06): 这是原始核心协议的一个命令,用来删除一个或多个常规文件。支持文件名中有通配符,允许一次删除多个文件
. SMB_COM_RENAME (0x07): 这是原始核心协议的一个命令,用来重命名一个或多个文件或目录
. SMB_COM_CHECK_DIRECTORY (0x10): 这是原始核心协议的一个命令。用来检查指定的路径是否在服务器上存在
. SMB_COM_LOCKING_ANDX (0x24): 此命令在LAN Manager .0中引入,不适用大于32-bit的文件。支持最大64-bit的实现在NT LAN Manager中引入。此命令用来锁定一个普通文件中一段连续的数据。支持锁定任一指定文件中任意多的数据段,前提是这些数据段没有重叠的部分。锁定可以防止其他进程使用一个独立的文件句柄(FID)对文件锁定部分进行锁、读和写操作。任何进程使用获取锁的文件的FID都可以访问被锁定的数据。
此命令也可以被服务器用来发送一个OpLock中断通知消息给客户端,客户端收到后发送确认消息。这是CIFS协议中服务器发送请求消息的一个例子。
下面列举的是SMB_COM_LOCKING_ANDX后可能发送的命令
·SMB_COM_CLOSE
·SMB_COM_FLUSH
·SMB_COM_LOCKING_ANDX
·SMB_COM_READ
·SMB_COM_READ_ANDX
·SMB_COM_WRITE
·SMB_COM_WRITE_ANDX
. SMB_COM_TRANSACTION_SECONDARY (0x26): 此命令在LAN Manager .0中引入。用来完成SMB_COM_TRANSACTION中未传输完毕数据的传输。
. SMB_COM_ECHO (0x2B): 此命令在LAN Manager .0中引入。客户端发送此命令测试和服务器的传输层连接。
. SMB_COM_OPEN_ANDX (0x2D): 此命令在LAN Manager .0中引入。用来创建并打开一个文件,或者打开一个已存在的普通文件,并执行命令链中的命令。命令中包含客户端要打开的文件名,命名管道或设备。如果执行成功,服务器响应消息中要携带一个合法的FID。客户端在后续对此文件的操作请求中要提供相同的FID。
下面这些命令是可以放在SMB_COM_OPEN_ANDX命令的AndX链中:
·SMB_COM_READ
·SMB_COM_READ_ANDX
·SMB_COM_IOCTL
·SMB_COM_NO_ANDX_COMMAND
. SMB_COM_READ_ANDX (0x2E): 此命令在LAN Manager .0中引入,在NT LAN Manager中对其进行了扩展。用来读取数据,可以读取普通文件,命名管道,或直接访问设别,比如串口(COM)或打印机接口(LPT)。如果客户端用NT LAN Manager或以后的版本协商,应该发送带有12个参数的请求,这个版本支持最大64-bit的文件。此命令是唯一一个支持读取64-bit大小文件的读取命令。
下面这些命令是可以放在SMB_COM_READ_ANDX命令的AndX链中:
·SMB_COM_CLOSE
. SMB_COM_WRITE_ANDX (0x2F): 此命令在LAN Manager .0中引入。用来向普通文件,命名管道,或直接访问设备,比如串口(COM)或打印机接口(LPT)中写入数据。如果客户端用NT LAN Manager或以后的版本协商,应该发送带有14个参数的请求,这个版本支持最大64-bit的文件。此命令是唯一一个支持写64-bit大小文件的读取命令。
下面这些命令是可以放在SMB_COM_WRITE_ANDX命令的AndX链中:
·SMB_COM_READ
·SMB_COM_READ_ANDX
·SMB_COM_LOCK_AND_READ
·SMB_COM_CLOSE
. SMB_COM_TRANSACTION2 (0x32): 此命令在LAN Manager .2中引入。支持服务器文件系统更丰富的语义集。允许客户端设置和获取扩展的key/value属性对,支持长文件名(比原始的8.3名字格式要长),可以执行目录搜索及其他任务。
. SMB_COM_TRANSACTION2_SECONDARY (0x33): 此命令在LAN Manager .2中引入。用来完成SMB_COM_TRANSACTION2中未传完的数据。
. SMB_COM_FIND_CLOSE2 (0x34): 此命令在LAN Manager .2中引入。用来关闭由命令TRANS2_FIND_FIRST2而打开的搜索句柄,服务器释放所有和此句柄相关的资源。
. SMB_COM_TREE_DISCONNECT (0x71): 这是一个原始核心协议命令。用来关闭客户端访问服务器资源时使用的一条逻辑连接,连接依靠SMB头部的TID识别,断开后服务器将此TID视为无效的TID。所有和此TID相关的文件、目录及其他资源都被释放,文件和目录的锁也会被释放。 . SMB_COM_NEGOTIATE (0x72): 这是一个原始核心协议命令。用来初始化服务器和客户端之间的SMB会话,必须在其他任何SMB命令发送之前完成。
每个SMB会话只能有一次协商过程,后续的SMB_COM_NEGOTIATE会被服务器拒绝并返回一个错误响应。 、SMB_COM_SESSION_SETUP_ANDX (0x73): 此命令用来配置一个SMB会话。如果服务器运行在user级访问控制模式,至少发送一个SMB_COM_SESSION_SETUP_ANDX命令,执行用户登录服务器并建立一个有效的UID。
在CIFS协议中,在SMB_COM_SESSION_SETUP_ANDX命令执行成功之前发送SMB_COM_TREE_CONNECT或SMB_COM_TREE_CONNECT_ANDX是违反协议的,即使服务器运行在share级的访问控制模式。在SMB_COM_SESSION_SETUP_ANDX请求之后,包含SMB_COM_TREE_CONNECT_ANDX批处理请求的AndX链可以满足这一需求,匿名认证也可以满足这一需求。
一个SMB会话用允许有多个SMB_COM_SESSION_SETUP_ANDX,用来建立额外的UID或建立额外的虚拟链路。
下面的命令可以放在SMB_COM_SESSION_SETUP_ANDX后面的AndX链中:
·SMB_COM_TREE_CONNECT_ANDX
·SMB_COM_OPEN
·SMB_COM_OPEN_ANDX
·SMB_COM_CREATE
·SMB_COM_CREATE_NEW
·SMB_COM_CREATE_DIRECTORY
·SMB_COM_DELETE
·SMB_COM_DELETE_DIRECTORY
·SMB_COM_FIND
·SMB_COM_FIND_UNIQUE
·SMB_COM_RENAME
·SMB_COM_NT_RENAME
·SMB_COM_CHECK_DIRECTORY
·SMB_COM_QUERY_INFORMATION
·SMB_COM_SET_INFORMATION
·SMB_COM_OPEN_PRINT_FILE
·SMB_COM_TRANSACTION
. SMB_COM_LOGOFF_ANDX (0x74): SMB头部UID标记的用户被注销,服务器将释放所有此UID相关的资源,包括释放锁,关闭所有的文件,断开连接,取消所有没有处理完的命令,标记此UID无效。
下面的命令可以放在SMB_COM_LOGOFF_ANDX后面的AndX链中:
·SMB_COM_SESSION_SETUP_ANDX.
. SMB_COM_TREE_CONNECT_ANDX (0x75): 此命令在LAN Manager .0中引入。用来建立一条客户端和服务器之间的连接,共享资源依靠共享名确定。连接建立后,此连接将用服务器返回的TID作为识别标记。
下面的命令可以放在SMB_COM_TREE_CONNECT_ANDX后面的AndX链中:
·SMB_COM_OPEN
·SMB_COM_OPEN_ANDX
·SMB_COM_CREATE
·SMB_COM_CREATE_NEW
·SMB_COM_CREATE_DIRECTORY
·SMB_COM_DELETE
·SMB_COM_DELETE_DIRECTORY
·SMB_COM_SEARCH
·SMB_COM_FIND
·SMB_COM_FIND_UNIQUE
·SMB_COM_RENAME
·SMB_COM_NT_RENAME
·SMB_COM_CHECK_DIRECTORY
·SMB_COM_QUERY_INFORMATION
·SMB_COM_SET_INFORMATION
·SMB_COM_OPEN_PRINT_FILE
·SMB_COM_TRANSACTION
. SMB_COM_NT_TRANSACT (0xA0): 此命令在NT LAN Manager中引入。扩展了由SMB_COM_TRANSACTION2提供的文件系统访问服务,允许处理非常大的参数和数据块。
. SMB_COM_NT_TRANSACT_SECONDARY (0xA1): 此命令用来完成SMB_COM_NT_TRANSACT中未传完的数据。 . SMB_COM_NT_CREATE_ANDX (0xA2): 此命令在NT LAN Manager中引入。用来创建并打开一个新文件,或者打开一个已存在的文件,或打开并清空一个已存在的文件,或创建一个目录,或创建一个命名管道。返回的FID可以用在后续的请求消息中。
消息中包含客户端想要创建或打开的文件名,目录,或命名管道和RootDirectoryFID。如果执行成功,服务器返回一个FID标记打开的资源。客户端在后续的请求消息中必须携带此FID。客户端必须拥有对资源所在目录的写权限,才能创建一个新的文件或目录;或者拥有文件的写权限来执行截断文件的操作。
下面的命令可以放在SMB_COM_NT_CREATE_ANDX后面的AndX链中:
·SMB_COM_READ
·SMB_COM_READ_ANDX
·SMB_COM_IOCTL . SMB_COM_NO_ANDX_COMMAND (0xFF): 此命令在LAN Manager .0中引入。设计此命令的目的是用来指明一个AndX链的结束

例如这里在SMB认证的第一个包,SMB Command Header是这样的

0x2: SMB Header

typedef unsigned char UCHAR;          // 8 unsigned bits
typedef unsigned short USHORT; // 16 unsigned bits
typedef unsigned long ULONG; // 32 unsigned bits typedef struct {
ULONG LowPart;
LONG HighPart;
} LARGE_INTEGER; // 64 bits of data typedef struct {
UCHAR Protocol[]; // Contains 0xFF,'SMB'
UCHAR Command; // Command code
union {
struct {
UCHAR ErrorClass; // Error class
UCHAR Reserved; // Reserved for future use
USHORT Error; // Error code
} DosError;
ULONG Status; // 32-bit error code
} Status;
UCHAR Flags; // Flags
USHORT Flags2; // More flags
union {
USHORT Pad[]; // Ensure section is 12 bytes long
struct {
USHORT PidHigh; // High part of PID
ULONG Unused; // Not used
ULONG Unused2;
} Extra;
};
USHORT Tid; // Tree identifier
USHORT Pid; // Caller's process id
USHORT Uid; // Unauthenticated user id
USHORT Mid; // multiplex id
} SMB_HEADER;

Relevant Link:

http://blog.sina.com.cn/s/blog_705eb43a0100o5ah.html
http://blog.csdn.net/qq_33336155/article/details/53307308
https://msdn.microsoft.com/en-us/library/aa302274.aspx
http://www.cnblogs.com/xunbu7/p/3232968.html
http://blog.nsfocus.net/resolution-smb-protocol/
file:///C:/Users/Administrator/Downloads/[MS-CIFS].pdf
https://msdn.microsoft.com/en-us/library/ff470014.aspx
https://msdn.microsoft.com/en-us/library/ff470072.aspx
http://blog.chinaunix.net/uid-28193347-id-3420341.html
https://wiki.samba.org/index.php/Samba3/SMB2
https://msdn.microsoft.com/en-us/library/ff469916.aspx

3. SMB Clients and Servers

如今支持SMB的厂商有非常多,包括

clients
. Microsoft Windows for WorkGroups .x, Windows , and Windows NT.
) File Manager
) the Windows Explorer
) connect to servers across the network
) open files using a UNC (universal naming convention).
. smbclient from Samba
. smbfs for Linux
. SMBlib (an SMB client library that is in development) Server
. Samba
. Microsoft Windows for Workgroups .x
. Microsoft Windows
. Microsoft Windows NT
. The PATHWORKS family of servers from Digital
. LAN Manager for OS/, SCO, etc
. VisionFS from SCO
. TotalNET Advanced Server from Syntax
. Advanced Server for UNIX from AT&T (NCR?)
. LAN Server for OS/ from IBM

Relevant Link:

https://www.samba.org/cifs/docs/what-is-smb.html

Copyright (c) 2017 LittleHann All rights reserved

SMB(Server Message Block) Protocal Research的更多相关文章

  1. 服务信息块协议 SMB(Server Message Block protocol)

    SMB(Server Message Block)是协议名,它能被用于Web连接和客户端与服务器之间的信息沟通. SMB协议 SMB最初是IBM的贝瑞·费根鲍姆(Barry Feigenbaum)研制 ...

  2. Server Message Block

    Question: Server Message Block文件共享存储虚拟机的优势是什么? Answer:微软在Windows Server 2012和Hyper-V 3.0中引进了SMB文件共享存 ...

  3. SMB扫描-Server Message Block 协议、nmap

    版本 操作系统 SMB1 Windows 200.xp.2003 SMB2 Windows Vista SP1.2008 SMB2.1 Windows 7/2008 R2 SMB3 Windows 8 ...

  4. 【解决了一个问题】腾讯云中使用ckafka生产消息时出现“kafka server: Message contents does not match its CRC.”错误

    初始化的主要代码如下: config := sarama.NewConfig() config.Producer.RequiredAcks = sarama.WaitForAll // Wait fo ...

  5. Windows Server 2012 虚拟化实战:存储(一)

    在计算机世界我们随处可以见的一种方法,那就是抽象.1946年冯诺依曼提出了计算机的基本结构包含:计算器,存储器和I/O设备.这可能是对计算机这一新生事物最重要的一次抽象,它直接影响了今后几十年计算机软 ...

  6. smb

    smb编辑 SMB(Server Message Block)是协议名,它能被用于Wap连接和客户端与服务器之间的信息沟通.

  7. Kali学习笔记14:SMB扫描、SMTP扫描

    SMB(Server Message Block)协议,服务消息块协议. 最开始是用于微软的一种消息传输协议,因为颇受欢迎,现在已经成为跨平台的一种消息传输协议. 同时也是微软历史上出现安全问题最多的 ...

  8. CIFS 与 SMB 有什么区别?

    CIFS 与 SMB 有什么区别? https://www.getnas.com/2018/11/30/cifs-vs-smb/ 网络协议 一知半解 学习一下挺好的.. 记得 win2019 已经废弃 ...

  9. 利用SMB jcifs实现对windows中的共享文件夹的操作

    需求是在本地上传文件到服务器上,服务器是windows的,使用共享文件夹提供权限给你的. 利用第三方: CIFS (Common Internet File System) SMB(Server Me ...

随机推荐

  1. Asp.Net Core 全局模型验证

    public class ActionFilter : IActionFilter { /// <summary> /// action 执行之前 /// </summary> ...

  2. Docker:测试环境的准备-建立一台centos测试机

    一.安装虚拟机并配置网络,下面演示在一台工作机上搭建环境 基础准备: 安装VMware-workstation-full-15.0.0-10134415.exe 安装虚拟机,镜像文件:CentOS-7 ...

  3. 【Python 18】BMR计算器2.0(数值类型转换与while循环)

    1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...

  4. Spark RDD持久化、广播变量和累加器

    Spark RDD持久化 RDD持久化工作原理 Spark非常重要的一个功能特性就是可以将RDD持久化在内存中.当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内 ...

  5. Redis内存优化memory-optimization

    https://redis.io/topics/memory-optimization  官方文档 一.特殊编码: 自从Redis 2.2之后,很多数据类型都可以通过特殊编码的方式来进行存储空间的优化 ...

  6. echarts堆叠图添加总量

    echarts在使用中往往会遇到需要展示总量信息的情况,比较典型的就是3维统计的堆叠柱状图 堆叠是在柱状图的基础上,给几项设置同一stack来实现的.不考虑在tips中实现总和,有两种方式可以实现总和 ...

  7. Node.js完整的响应html页面(包括css,js文件)

    主要思想就是任何一个静态文件也应该做响应,一个获取静态文件都应当请求来处理,这是主要思想. 同时要注意两点.第一,对于不同的文件类型,比如html,css,js,请求头里面的文件类型需要根据不同的文件 ...

  8. docker 安装 fastdfs

    fastdfs 安装 //1.拉取镜像 docker pull morunchang/fastdfs //2.启动tracker docker run -d --name tracker --net= ...

  9. 基于idea的springcloud的helloworld项目搭建过程整理

    Springcloud的搭建主要包括三个部分:服务注册中心.服务提供者.服务消费者.每一个部分都是一个springboot项目,它们通过配置文件(application.properties或appl ...

  10. jvm 垃圾回收机制和算法(转)

    stop-the-world 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC ...