windows共享文件夹使用中的问题(SMB协议)

时间:2024-04-15 12:19:15

关于SMB

windows的文件共享,使用的是SMB协议。SMB协议有v1,v2,v3三个版本,其中v1版本是CIFS协议的扩充。
这几个协议的报文和内容在网上真的是挺难找到说明的。。

问题

最近在接入一个仪器时碰到了问题,仪器是嵌入式系统(连支持人员都找不不到。。),在网上好不容易找到一个设备说明,可以通过windows共享文件夹将里面的内容导出来。

我在win7系统上开放了共享文件夹,经过一系列guest用户配置、防火墙配置以后,设备可以成功传输上文件了。

初步分析

不过想在公司的虚拟机上直接获取文件夹,而虚拟机使用的是windows server 2012,这时候问题来了,仪器访问不了2012系统的共享文件夹,一直报错。
我做了一些对比

  • win7系统,设备始终能存储文件;
  • 2012系统,设备始终不能访问;
  • 2012系统,我使用win7电脑是可以访问的
  • 用xp系统,也能访问2012系统的共享文件夹(这个操作是后来做的)

抓包分析

陷入了死胡同,从测试来看,推测可能是win7和win2012系统共享文件夹某些设置有区别。无奈使用wireshark抓取报文尝试分析猜测。
有如下发现

  • 设备访问使用的是SMBv1版本协议
  • 设备在写入win7系统时,先后使用open和write指令,
    • open指令打开文件,按道理系统应该返回一个可写的权限,但是系统返回的是全0(即只读)
    • write指令写入时,可以成功(按我的理解应该是不能成功的)
  • 而设备在写入win2012系统,使用同样的指令
    • open同样返回只读权限
    • write指令则返回失败

完全一样的指令流程,win2012上写入失败,而win7成功。
而且从报文信息看,win2012写入失败是有一定道理的(权限不足),但是为什么会权限不足,我调整了很久的用户权限策略,依旧没有改变。

关于这个情况,个人推测可能是某个时期SMB协议的漏洞,win7存在,而在win2012中修复了。

对比分析

同样抓包了其他windows系统访问win2012系统时的报文。
发现访问时,会使用SMB2.1版本协议,与设备不同。

尝试禁用SMB2.1,限制系统只能使用SMBv1,发现在SMB连接建立过程中,有特殊的NTLMSSP认证过程,而设备没有这个步骤。
怀疑权限的授予,可能与这个过程有关。

无论如何,我是不可能改设备的代码的。。只能从自己身上想办法。

规避方案

设备改不了,只能从服务器这边想办法,搜了很久也没有看到有人碰到类似问题。
windows的SMB我也debug不了,最后决定自己在服务器上开一个SMB服务,同时把windows自带的SMB服务关掉(Server这个服务,否则端口会冲突)。
SMB服务使用的是这个实现,我把SMBv2/v3,以及windows authentication选项全部关闭。
测试以后终于能用了

心塞(* ̄︿ ̄)