關於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選項全部關閉。
測試以后終於能用了
心塞(* ̄︿ ̄)