catalogue
1. 什么是SMB 2. 基础SMB协议 3. SMB Clients and Servers
1. 什么是SMB
全世界有很多的客户端和服务端软件实现了SMB协议,全部windows工作站,windows 95,windows NT系统都同时支持SMB客户端和服务端
SMB本质上一种服务消息块(Server Message Block),它可以实现
1. 文件共享 2. 打印机共享 3. 串口共享 4. 通信抽象: 例如named pipes命名管道、计算机间的mail slots、RPC API调用
从上图可见,SMB是一个C/S request-response挑战响应协议
客户端和SMB服务端的连接可以基于TCP/IP、NetBEUI、或者IPX/SPX,下图展示了各层协议的支持关系
1. SMB was also sent over the DECnet protocol. Digital (now Compaq) did this for their PATHWORKS product. 2. 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). 3. 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的类型
1. Unique names 2. Global Names 3. Internet Group 4. Domain 5. Multihomed
0x2: SMB Protocol Variants
为了适应不断出现的新的应用场景,最原始的SMB协议也在不断产生新的变种
1. 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: 1) connecting to and disconnecting from file and print shares 2) opening and closing files 3) opening and closing print files 4) reading and writing files 5) creating and deleting files and directories 6) searching directories 7) getting and setting file attributes 8) locking and unlocking byte ranges in files 2. MICROSOFT NETWORKS 1.03(Core Plus Protocol): Included Lock&Read and Write&Unlock SMBs with different versions of raw read and raw write SMBs 3. MICROSOFT NETWORKS 3.0(DOS LAN Manager 1.0): The same as LANMAN1.0, but OS/2 errors must be translated to DOS errors. 4. LANMAN1.0(LAN Manager 1.0): The full LANMAN1.0 protocol. 5. DOS LM1.2X002(LAN Manager 2.0): The same as LM1.2X002, but errors must be translated to DOS errors. 6. LM1.2X002(LAN Manager 2.0): The full LANMAN2.0 protocol. 7. DOS LANMAN2.1(LAN Manager 2.1): The same as LANMAN2.1, but errors must be translated to DOS errors. 8. LANMAN2.1(LAN Manager 2.1): The full LANMAN2.1 protocol. 9. Windows for Workgroups 3.1a(LAN Manager 2.1): Windows for Workgroups 1.0 10. NT LM 0.12(NT LAN Manager 1.0): Contains special SMBs for NT 11. Samba(NT LAN Manager 1.0): Samba's version of NT LM 0.12 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这个层次可以衍生出不同的认证体系,有基于系统的,有基于域的,有基于数据库的
1. 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. 2. 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都会通过广播的方式来发送自己的相关信息,但是这里存在一个问题,广播包跨网段传输的问题
1. 在NetBEUI网络中,这个问题不存在 2. 但是在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获得实际的用途即可
1. SMB_COM_DELETE_DIRECTORY (0x01): 这是原始核心协议的一个命令,用来删除一个空的目录 2. SMB_COM_CLOSE (0x04): 这是原始核心协议的一个命令,用来关闭和一个有效的FID关联的对象的一个实例。Client closes the file represented by Tid and Fid. Server responds with success code. 3. SMB_COM_FLUSH (0x05): 这是原始核心协议的一个命令,用来要求服务器将当前文件的所有数据和信息都写回到存储器上 4. SMB_COM_DELETE (0x06): 这是原始核心协议的一个命令,用来删除一个或多个常规文件。支持文件名中有通配符,允许一次删除多个文件 5. SMB_COM_RENAME (0x07): 这是原始核心协议的一个命令,用来重命名一个或多个文件或目录 6. SMB_COM_CHECK_DIRECTORY (0x10): 这是原始核心协议的一个命令。用来检查指定的路径是否在服务器上存在 7. SMB_COM_LOCKING_ANDX (0x24): 此命令在LAN Manager 1.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 8. SMB_COM_TRANSACTION_SECONDARY (0x26): 此命令在LAN Manager 1.0中引入。用来完成SMB_COM_TRANSACTION中未传输完毕数据的传输。 9. SMB_COM_ECHO (0x2B): 此命令在LAN Manager 1.0中引入。客户端发送此命令测试和服务器的传输层连接。 10. SMB_COM_OPEN_ANDX (0x2D): 此命令在LAN Manager 1.0中引入。用来创建并打开一个文件,或者打开一个已存在的普通文件,并执行命令链中的命令。命令中包含客户端要打开的文件名,命名管道或设备。如果执行成功,服务器响应消息中要携带一个合法的FID。客户端在后续对此文件的操作请求中要提供相同的FID。 下面这些命令是可以放在SMB_COM_OPEN_ANDX命令的AndX链中: ·SMB_COM_READ ·SMB_COM_READ_ANDX ·SMB_COM_IOCTL ·SMB_COM_NO_ANDX_COMMAND 11. SMB_COM_READ_ANDX (0x2E): 此命令在LAN Manager 1.0中引入,在NT LAN Manager中对其进行了扩展。用来读取数据,可以读取普通文件,命名管道,或直接访问设别,比如串口(COM)或打印机接口(LPT)。如果客户端用NT LAN Manager或以后的版本协商,应该发送带有12个参数的请求,这个版本支持最大64-bit的文件。此命令是唯一一个支持读取64-bit大小文件的读取命令。 下面这些命令是可以放在SMB_COM_READ_ANDX命令的AndX链中: ·SMB_COM_CLOSE 12. SMB_COM_WRITE_ANDX (0x2F): 此命令在LAN Manager 1.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 13. SMB_COM_TRANSACTION2 (0x32): 此命令在LAN Manager 1.2中引入。支持服务器文件系统更丰富的语义集。允许客户端设置和获取扩展的key/value属性对,支持长文件名(比原始的8.3名字格式要长),可以执行目录搜索及其他任务。 14. SMB_COM_TRANSACTION2_SECONDARY (0x33): 此命令在LAN Manager 1.2中引入。用来完成SMB_COM_TRANSACTION2中未传完的数据。 15. SMB_COM_FIND_CLOSE2 (0x34): 此命令在LAN Manager 1.2中引入。用来关闭由命令TRANS2_FIND_FIRST2而打开的搜索句柄,服务器释放所有和此句柄相关的资源。 16. SMB_COM_TREE_DISCONNECT (0x71): 这是一个原始核心协议命令。用来关闭客户端访问服务器资源时使用的一条逻辑连接,连接依靠SMB头部的TID识别,断开后服务器将此TID视为无效的TID。所有和此TID相关的文件、目录及其他资源都被释放,文件和目录的锁也会被释放。 17. SMB_COM_NEGOTIATE (0x72): 这是一个原始核心协议命令。用来初始化服务器和客户端之间的SMB会话,必须在其他任何SMB命令发送之前完成。 每个SMB会话只能有一次协商过程,后续的SMB_COM_NEGOTIATE会被服务器拒绝并返回一个错误响应。 18、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 19. SMB_COM_LOGOFF_ANDX (0x74): SMB头部UID标记的用户被注销,服务器将释放所有此UID相关的资源,包括释放锁,关闭所有的文件,断开连接,取消所有没有处理完的命令,标记此UID无效。 下面的命令可以放在SMB_COM_LOGOFF_ANDX后面的AndX链中: ·SMB_COM_SESSION_SETUP_ANDX. 20. SMB_COM_TREE_CONNECT_ANDX (0x75): 此命令在LAN Manager 1.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 21. SMB_COM_NT_TRANSACT (0xA0): 此命令在NT LAN Manager中引入。扩展了由SMB_COM_TRANSACTION2提供的文件系统访问服务,允许处理非常大的参数和数据块。 22. SMB_COM_NT_TRANSACT_SECONDARY (0xA1): 此命令用来完成SMB_COM_NT_TRANSACT中未传完的数据。 23. 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 24. SMB_COM_NO_ANDX_COMMAND (0xFF): 此命令在LAN Manager 1.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[4]; // 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[6]; // 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 1. Microsoft Windows for WorkGroups 3.x, Windows 95, and Windows NT. 1) File Manager 2) the Windows 95 Explorer 3) connect to servers across the network 4) open files using a UNC (universal naming convention). 2. smbclient from Samba 3. smbfs for Linux 4. SMBlib (an SMB client library that is in development) Server 1. Samba 2. Microsoft Windows for Workgroups 3.x 3. Microsoft Windows 95 4. Microsoft Windows NT 5. The PATHWORKS family of servers from Digital 6. LAN Manager for OS/2, SCO, etc 7. VisionFS from SCO 8. TotalNET Advanced Server from Syntax 9. Advanced Server for UNIX from AT&T (NCR?) 10. LAN Server for OS/2 from IBM
Relevant Link:
https://www.samba.org/cifs/docs/what-is-smb.html
Copyright (c) 2017 LittleHann All rights reserved