CIFS协议文档.docx
- 文档编号:12107444
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:24
- 大小:162.46KB
CIFS协议文档.docx
《CIFS协议文档.docx》由会员分享,可在线阅读,更多相关《CIFS协议文档.docx(24页珍藏版)》请在冰点文库上搜索。
CIFS协议文档
1CIFS协议■-■-
1.1CIFS协议概述
1.2CIFS协议头格式
1.2.1头域
1.2.2命令域
1.2.3错误类域
1.2.4错误代码域
1.2.5flags域
1.2.6flags2域
1.2.7填充或安全签名域………….….
1.2.8TID域…
1.2.9PID域
1.2.10UID域
1.2.11MID域
1.2.12Wordcount和Parameterwords(参数域)
1.2.13Bytecount和buffer域(缓冲)
1.3CIFS协议的安全机制'
1.3.1用户级安全
1.3.2共享级安全
1.3.3加密
1.4CIFS协议的完整性
1.4.1机会锁■--■■-
1.5CIFS协议包交换流程
1.5.1包交换的第一部分一一协商和参数传递
1.5.1.1建立NetBIOS会话
1.5.1.2CIFS协议版本协商
1.5.1.3用户登录
1.5.1.4连接特定资源
1.5.2包交换的第二部分——数据交换
1.5.2.1属性、操作等参数传递
1.5.2.2数据交换
5
6
8
8
8
9
10
-10
10
10
11
11
12
12
13
13
14
2NetBI0S协议
2.1NetBI0S概述-''
2.2NetBIOS名称服务-"
-15
15
2.2.1NetBIOS名称■15
2.2.2NetBIOS名称属性和格式15
2.2.3NetBIOS名称解析方式15
2.2.4NetBIOS名称识别策略16
2.2.5NetBIOS名称管理16
2.3NetBIOS会话服务16
2.3.1概述16
2.3.2NetBIOS会话原语17
2.4NetBIOS数据报服务17
1、CIFS协议
1.1CIFS协议概述
通用网际文件系统(CIFS)是微软服务器消息块协议(SMB)的增强版本,是计算机用户在企业内部网和因特网上共享文件的标准方法。
CIFS通过定义一种与应用程序在本地
磁盘和网络文件服务器上共享数据的方式相兼容的远程文件访问协议使之能够在因特网上进行协作。
定义了客户端向服务器端的请求和服务器端得应答报文。
CIFS数据包格式为标
准头部+2个可变长区域。
CIFS协议有很多版本,每个协议的版本称为一种方言,并分配一个唯一的字符串来识别。
当客户端希望访问远程服务器上的文件时,第一次发送的CIFS数据包是一个协商版本
的数据包。
在这个数据包中,客户端列出了自己可以提供的版本字符串。
服务器在响应数据
包中选择其中一种版本字符串发送给客户端。
这样两者就协商出一个CIFS协议的版本。
1.2CIFS协议头格式
0
1
2
3
4
5
6
7
0
1
2
3
4
5
61
7
0
112
314
5
6
7
0
1
2
3
4
5
6
7
0xFF
'S'
'M'
'B'
Command
Errorclass
Mustbezero
Errorcode
Errorcode(continued)
Flags
Flags2
填充或者安全签名,
通常标准的填充是
0
树ID(TID)
进程
ID
(PID)
用户
ID
(UID)
多重识别码(
MID)
wordcount
Parameterwords[wordcount]
Bytecount
Buffer[bytecount]
1.2.1头域
每个CIFS数据包的开始包含4个字节的头。
第一个字节是OxFF,第二个字节是字母‘S'的ASCII表示,第三个字节和第四个字节分别为‘M'和‘B'。
1.2.2命令域
命令域为1个字节,用来表示CIFS数据包的类型。
其各种命令对应的数值见下:
SMB_COM_CREATE_DIRECTORY0x00SMB_COM_DELETE_DIRECTORY0x01
SMB_COM_OPEN0x02SMB_COM_CREATE0x03SMB_COM_CLOSE0x04SMB_COM_FLUSH0x05
SMB_COM_DELETE0x06SMB_COM_RENAME0x07
SMB_COM_QUERY_INFORMATION0x08SMB_COM_SET_INFORMATION0x09
SMB_COM_READ0x0ASMB_COM_WRITE0x0BSMB_COM_LOCK_BYTE_RANGE0x0CSMB_COM_UNLOCK_BYTE_RANGE0x0DSMB_COM_CREATE_TEMPORARY0x0ESMB_COM_CREATE_NEW0x0F
SMB_COM_CHECK_DIRECTORY0x10SMB_COM_PROCESS_EXIT0x11
SMB_COM_SEEK0x12SMB_COM_LOCK_AND_READ0x13SMB_COM_WRITE_AND_UNLOCK0x14
SMB_COM_READ_RAW0x1ASMB_COM_READ_MPX0x1B
SMB_COM_READ_MPX_SECONDARY0x1CSMB_COM_WRITE_RAW0x1D
SMB_COM_WRITE_MPX0x1ESMB_COM_WRITE_COMPLETE0x20
SMB_COM_SET_INFORMATION20x22SMB_COM_QUERY_INFORMATION20x23
SMB_COM_LOCKING_ANDX0x24SMB_COM_TRANSACTION0x25
SMB_COM_TRANSACTION_SECONDARY0x26SMB_COM_IOCTL0x27
SMB_COM_IOCTL_SECONDARY0x28SMB_COM_COPY0x29
SMB_COM_MOVE0x2ASMB_COM_ECHO0x2B
SMB_COM_WRITE_AND_CLOSE0x2CSMB_COM_OPEN_ANDX0x2D
SMB_COM_READ_ANDX0x2ESMB_COM_WRITE_ANDX0x2F
SMB_COM_CLOSE_AND_TREE_DISC0x31SMB_COM_TRANSACTION20x32
SMB_COM_TRANSACTION2_SECONDARY0x33SMB_COM_FIND_CLOSE20x34SMB_COM_FIND_NOTIFY_CLOSE0x35SMB_COM_TREE_CONNECT0x70SMB_COM_TREE_DISCONNECT0x71SMB_COM_NEGOTIATE0x72
SMB_COM_SESSION_SETUP_ANDX0x73
SMB_COM_LOGOFF_ANDX0x74
SMB_COM_TREE_CONNECT_ANDX0x75
SMB_COM_QUERY_INFORMATION_DISK0x80
SMB_COM_SEARCH0x81
SMB_COM_FIND0x82
SMB_COM_FIND_UNIQUE0x83
SMB_COM_NT_TRANSACT0xA0
SMB_COM_NT_TRANSACT_SECONDARY0xA1
SMB_COM_NT_CREATE_ANDX0xA2
SMB_COM_NT_CANCEL0xA4
SMB_COM_OPEN_PRINT_FILE0xC0
SMB_COM_WRITE_PRINT_FILE0xC1
SMB_COM_CLOSE_PRINT_FILE0xC2
SMB_COM_GET_PRINT_QUEUE0xC3
SMB_COM_READ_BULK0xD8
SMB_COM_WRITE_BULK0xD9
SMB_COM_WRITE_BULK_DATA0xDA
1.2.3错误类域
服务器用来指明请求是否成功。
通常情况下为0表示成功,如果不为零,这个域表示该错误代码是什么类。
错误类为以下值之一:
ERRDOS(0X01)-错误是从核心DOS操作系统设置
ERRSRV(0x02)-错误是由服务器的网络文件管理器
ERRHRD(0x03)-硬件错误
ERRCMD(0xFF)-命令没有在“SMB”格式
1.2.4错误代码域
该域为2字节长度,表示已发生的错误的类型。
通常为0表示没有错误。
各种错误对应的数值见下:
1.2.5flags域
长度为1字节,此域包含了8个独立的标志。
没有设置的标志客户端必须设定为0,服
务器需要忽略该标志。
编号从最低位到最高位其定义如下:
1
2
3QASELESS
Reservedforobso丄昌曹(?
色ntLANMAN1.0
requests.(LOUK_工J9D_REJYDf
WRJTE_ANO_CLOSE)
Reserved(mustJaczero)・
Reserved(mustbezero)・
WhenQnfallpathnamesknthisLANMANl•口
SM3iL二曰匸trea-cedascase-less・
0:
为过时的请求保留位(LOCK_AND_READ,LOCK_AND_CLOSE);
1保留位。
(必须为0);
2:
保留位。
(必须为0);
3:
设置为1时,路径名无视大小写,设置为0时,路径名是区分大小写的。
4:
保留位。
(客户端必须设置为0,服务器端忽略该位);
5:
为过时的请求保留位(SMB_COM_OPEN,SMB_COM_CREATE,
SMB_COM_CREATE_NEW);
6:
为过时的请求保留位(SMB_COM_OPEN,SMB_COM_CREATE,
SMB_COM_CREATE_NEW);
7:
设置为1时,表示是服务器对客户端请求的应答,其命令域常与客户端请求的命令域相同。
该域可以通过设置为0和1明确区分是请求还是应答。
1.2.6flags2域
2字节,定义了更多的标志位。
Val^eNair.e:
SMBFLAGS2
datatypeSTR工MG丄nthis514BmessageareencodedasUNICODE.Otherwise,theyareinASCII»
0:
设置为1,表示服务器可能在响应中返回长文件名。
(KNOWS_LONG_NAMES)
1:
设置为1,表示客户端知道扩展属性。
(KNOWS_EAS)
2:
设置为1,表示SMB需要验证。
(诚信检查?
)(SECURITY_SIGNATURE)
3:
保留位。
6:
设置为1,任何请求的路径名为长路径名。
(IS_LONG_NAME)
11:
设置为1,客户端知道扩展安全协商。
(EXT_SEC)
12:
设置为1,SMB中的任何请求的路径名需在分布式文件系统中解决。
(DFS)
13:
设置为1,表明如果客户端没有读权限但有执行权限,读命令被允许。
这个标志只对读请求有效。
14:
设置为1,返回的错误代码为32位。
否则错误类和错误域包含DOS-style错误信息。
当传输协商的NT状态代码时,该域在每个SMB中都必须为1。
16:
设置为1,表示数据包中的字符编码为UNICODE,设置为0,表示数据包中的字符编
码为ASCII。
1.2.7填充或安全签名域
通常标准的填充是0,此栏通常设置为0。
1.2.8TID域
TID是一个16位的数字,用来标识这个CIFS数据包指的是什么资源(通常为磁盘共享或者打印机)。
当数据包交换没有牵涉到某个资源时,这个域是无意义的,可以忽略的。
如果某客户端希望对某资源进行访问,则该客户端发送的CIFS数据包中的命令域设置为SMB_COM_TREE_CONNECT_ANDX。
在这个包中就指定共享或者打印机的名称。
然后服务器将对该资源和客户端进行验证,然后发送应答表示成功。
在这个应答数据包中,服务器可以将TID域设置为任何数字。
而从那时起,如果客户端希望对该资源提出请求,TID
就会被设置为上次客户端给定的TID数字。
1.2.9PID域
PID是一个16位的数字,用来标识客户端上的哪个进程发出的CIFS请求。
服务器使用
这个数字来检查并发问题(通常是为了保证文件不会被竞争中的客户端进程所损坏)。
1.2.10UID域
UID是一个16位的数字,迎来标识在客户端发出CIFS请求的用户。
客户端必须发送
一个包含用户名和密码的CIFS数据包请求来获得服务器给定的UID。
服务器在验证了用户名和密码之后会应答该请求,该应答中包含一个服务器生成的UID。
之后该客户端在未来的CIFS请求中均使用该UID。
如果客户端的请求需要检查权限,服务器将验证请求的UID有没有必须的权限。
一个UID只为已形成的NetBIOS会话有效。
服务器和不同的用户的其他会话可能使用相同
的UID。
注意:
如果服务器是在共享级的安全模式下,UID是无意义的,可以忽略。
1.2.11MID域
MID是一个16位数字,用来标识多个客户端的要求。
每当客户端发送一个CIFS数据
包,服务器就检查MID来看它是否还有没有应答的请求。
如果有,它保证了新要求会被被赋予一个新的MID以区别以前的请求。
每当服务器应答一个CIFS请求时,发送的应答包中确保和相应地请求中的MID相同。
这样,用户就知道哪些未完成的请求与收到的应答是对应的。
1.2.12Wordcount和Parameterwords(参数域)
CIFS数据包使用这两个域来表示命令的具体参数数据。
Parameterwords域是一个可变
长(需是16位的整数倍)。
Wordcount域实际表明parameterwords域的长度(以2字节为单
位)。
每种数据包类型的wordcount域在CIFS1.0草案中有定义。
每个单独的命令都有2个wordcount定义,一个是给客户端定义的,一个是给服务器端定义的。
这是必要的,因为请求和应答不一定需要相同的wordcount。
1.2.13Bytecount和buffer(缓冲区)
和wordcount、parameterwords的定义非常相似。
Buffer域的长度是可变的。
Bytecount表示buffer域有多少字节。
参数域和缓冲区的主要区别是存储什么类型的数据。
参数域通常包含少量的数据包命令参数选项,而缓冲区包含大量的原始数据(如共享文件中的数据)。
1.3CIFS协议的安全机制
CIFS提供认证和授权这2种安全机制,其中认证又包括共享级认证和用户级认证。
A是一个对CIFS客户端标记为网络共享可用的共享服务器(通常是一个文件夹或者打印机)。
限制访问共享文件有两种办法:
1.3.1用户级安全
希望访问该共享的客户端必须提供用户名和密码。
(windowsNT和windows2000)
用户级认证方式为不同用户提供不同的用户名,因此能提供高于共享级认证的安全性,但用户名和口令是以明文方式传送或者虽然加密也容易受到字典攻击,因此也存在被监听和破解的威胁。
进一步的改进方法可以加密用户名和口令,还可以利用服务器消息块
SMB(ServerMessageBlock)的签名机制实现客户机和服务器之间的双向认证。
1.3.2
共享级安全
被共享的文件本身需要一个密码来访问,
提供的安全保障
确认。
(windows95和windows98)
在共享级认证方式下,整个共享点只有一个单一的口令用于共享访问,
有限,只能用于对安全性要求不高的公共资源共享或临时资源共享等场合。
1.3.3加密
用户和共享级安全性中,实际的密码是以加密格式发送到服务器的。
常用两种加密方法较新的NTstyle和老的LANmanagestyle,但两种加密方法均采用挑战-应答认证,服务器
向客户端发送一个随机字符串并期望得到响应,客户端将用户名和随机数合并后用HASH
函数生成一个字节串发送给服务器(其在HASH函数中使用的密钥就是由口令生成
的?
?
?
)
就是这个地方不是很明白,在HASH中,这个随机串扮演什么角色。
我理解的是:
当时用户注册时就将用户名明文存储在服务器中,而密码是经过HASH(或者其他处理)得到的长度确定的字符串存放于服务器中,这样突破服务器只知道用户名,不知道密码。
但是这个密码形成的字符串(设为m)却可以用来验证。
客户端将自己的用户名和随机串合并成一个长串,密码再次经过相同的步骤形成定长字符串作为HASH的密码使用。
即如下式:
username(用户名)key(密码)string(随机字符串)
m是处理过的key,由key可以很容易得到m,由m得到key很难客户端发送=HASHm(username||string)
服务器将该字节串和自己的计算结果比较,若二者相同则通过认证,否则认证失败。
1.4CIFS协议的完整性
1.4.1机会锁
机会锁(数据完整性,感觉和数据库中的锁异曲同工),当CIFS数据包指定打开一个文件,就需要对该文件加一个机会锁,如果服务器将这个文件加锁后,其他客户端实体就不能再访问这个文件。
这允许客户端对这个文件进行任何它想要的修改二不需要将其立即写入服务器。
1.levelIIoplock
2.Exclusiveoplock
3.Batchoplock
1.5CIFS协议包交换流程
CIFS数据包交换流程一共分为两个部分:
1.第一部分(当客户端启动与服务器建立连接时):
一个NetBIOS会话建立、CIFS版本协商、发送用户名和密码,这样,服务器端的一个资源被连接。
2.第二部分:
访问一个共享文件从中读取需要的数据。
注意:
客户端总是发送到服务器的TCP的139端口,而服务器应答给客户端自己选择的临时端口。
此外,以下CIFS域可设为下面的默认值,当然也可以根据自己的具体情况进行设定:
1.errorclass/errorcodes:
客户端发送时总为0,服务器端应答时也为0。
2.Flags:
所有数据包均设置成0x00。
(区分大小写路径)
3.Flags2:
所有数据包均设置成0x0001。
(支持长文件名)
4.填充和安全签名:
所有数据包均设为0.
1.5.1包交换的第一部分——协商和参数传递
当CIFS客户端确定希望访问CIFS服务器上的资源,交换下面的数据包。
首先,NetBIOS会话建立,提供可靠的传输服务。
然后,客户端和服务器端协商CIFS版本。
然后客户端登录到服务器,发送用户名和密码,服务器验证成功后客户端连接到所需的资源。
1.5.1.1建立NetBIOS会话
包1C->S请求:
目的:
建立NetBIOS会话(listen和call)
首先客户端在139端口建立一个与服务器之间的全双工TCP连接。
完成之后,客户端通过建立TCP连接和发送NetBIOS会话请求数据包。
会话的请求报文中包含客户端的NetBIOS名称,服务器的NetBIOS名称和一个整数常量表示数据包的目的是建立一个NetBIOS会话。
包2S->C应答:
目的:
NetBIOS会话确认
如果上述会话请求数据包中包含服务器的NetBIOS名称,而且数据包是正确的格式,服务器会发送一个简单的会话确认数据包(4字节)来表明会话建立成功或者失败。
1.5.1.2CIFS协议版本协商
包3C->S请求:
目的:
CIFS协议版本协商
客户端发送一个CIFS请求数据包包含SMB_COM_NEGOTIATE命令,缓冲区中包含客户端可以解析的CIFS协议版本。
具体各个域的值为:
Command:
SMB_COM_NEGOTIATE(0x72)
TID:
在这个包中被忽略
PID:
设置为客户端处理进程的ID
UID:
在这个包中被忽略
MID:
任何唯一的编号
Wordcount:
0
Parameterwords:
无
Butecount:
设置为119(可根据客户端可以解析的版本数变化)
Buffer:
包含119字节的版本描述
包4S->C应答:
目的:
CIFS协议版本协商
服务器响应客户端的协商请求,从客户端给定的版本中选择一个。
应答数据包中各个域的值为:
Command:
SMB_COM_NEGOTIATE(0x72)
TID:
在这个包中被忽略
PID:
因为是从服务器发送,被忽略
UID:
在这个包中被忽略
MID:
匹配客户端发送的唯一的编号
Wordcount:
取决于选择的版本。
Parameterwords:
包含选定的版本和许多服务器属性。
比较重要的是MAXMPXCOUNT(客
户端可以发起的请求最大数)和32位能力标志。
Bytecount:
可变,通常大于8
Buffer:
通常包含一个8字节的随机字符串,在以后的数据包中,客户端用来加密。
1.5.1.3用户登录
包5C->S请求:
目的:
用户登录客户端发送CIFS数据包,包含用户名和密码,以获得一个UID。
这个数据包也要转发客户端功能给服务器,所以即使使用共享级安全也必须发送这个数据包。
数据包各个域的值如下:
Command:
SMB_SESSION_SETUP_ANDX(0x73)
TID:
在这个包中北忽略
PID:
设置为客户端处理进程的ID
UID:
在这个包中被忽略
MID:
任何唯一的编号
Wordcount:
12
Parameterwords:
列出了客户端的功能。
也包含了要在下面缓冲区中提供的密码的大小。
Bytecount:
可变值,下面的缓冲区包含加密的用户名、密码、操作系统的名称和LAN
Manager。
Bytecount的值取决于这些尸体的字符串的大小
Buffer:
包含用户名、密码、操作系统的名称等。
包6S->C应答:
目的:
返回给客户端UID或者返回错误,如果验证不成功的话。
一旦服务器受到加密的用户名和密码,检查后如果是正确的,发
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CIFS 协议 文档
![提示](https://static.bingdoc.com/images/bang_tan.gif)