延續上一次建置SQL Server連結伺服器的問題, 在使用Microsoft Network Monitor(NetMon)錄得封包並找到原因後, 又做了一點進一步的研究。在下載NetMon時發現官方對它已不再維護了, 又在相關文章中看到另一個繼任者—-Microsoft Message Analyzer(MMA), 但以下文章中有提到它2019/11月起也已不再維護, 文章分別如下, 只是文章的日期看了讓人有點前後錯亂, 就提供給大家自行判斷吧。
- https://www.microsoft.com/en-us/download/details.aspx?id=4865 (NetMon下載連結, 裡面的發版日期是2020/10月)
- https://docs.microsoft.com/en-us/windows/client-management/troubleshoot-tcpip-netmon (NetMon介紹文, 文章是2018/12月, 不過比較像是把文章重新上傳到github的時間)
- https://docs.microsoft.com/en-us/message-analyzer/microsoft-message-analyzer-operating-guide (MMA的操作介紹文, 是上一篇提到NetMon由MMA取代的連結文章, 文章是2016/10月)
- https://docs.microsoft.com/zh-tw/openspecs/blog/ms-winintbloglp/dd98b93c-0a75-4eb0-b92e-e760c502394f (MMA的介紹文, 文章是2020/1月)
就在NetMon及MMA都不再更新後, 官方也乾脆推薦第三方工具, 首推如Wireshark。Wireshark可以直接分析NetMon錄出來的檔案(*.cap), 不過我在使用的時候卻發現一個狀況, 由於前一篇文是錄SQL Server的封包, 這裡看到的狀況也就是在SQL Server的封包上。
首先來說HandShake封包, 針對如OS層發出的HandShake封包, 不論在NetMon或是Wireshark界面上看來是很像的。例如下面這個是在Wireshark上看到OS的HandShake封包清單, 有Client Hello、Server Hello等等, 這點在NetMon上也是很相似的

下面這個就是NetMon上看到Client Hello封包內與TLS有關的部份

下面這個則是在Wireshark上看到Client Hello封包與TLS有關的內容, 是不是和上面很相似?

但如果進一步來看SQL Server的HandShake封包清單, NetMon部份仍像是上面那畫面一樣, 但Wireshark卻像下面這樣, 不太相同了, 所以, 我一開始一直找不到, 最後透過Frame Number一一對照, 才確認了SQL Server的HandShake在Wireshark中是如下的樣式。

而且, 在Wireshark封包中最下面就只有如下一行Pre-Login Message - TLS exchange, 沒有更詳細的內容,

相對於以上, 在NetMon上則是有如下更多詳細內容可看, 而且比較像上面OS層的HandShake封包的表示方式。

再來是針對TLS版本的進一步研究。在NetMon上因為可以很清楚地看到每個封包使用的TLS版本, 像是上一次SQL Server的分析結果, 例如第一個Client Hello發出的是TLS 1.2(下圖), 而因為遠端SQL Server 2005不支援TLS 1.2, 所以Server Hello回來的是TLS 1.0(下下圖)。這裡的版本, 可以在Frame Details視窗內清楚地看到,


但是, 到了Wireshark上, 因為如上面提到, 在SQL Server封包的TLS方面沒有太多詳細資訊, 變成要以其他方式來辨別。這裡得用Packet Bytes視窗(相當於NetMon中的Hex Details)來加以分析。
- 這裡第一個byte 16就代表NetMon中的ContentType: HandShake
- 接下來的2個03 03或03 01則代表TLS的版本。03 03 是TLS 1.2, 03 01 是TLS 1.0。就這樣由此處來分辨TLS的版本(參考 https://www.ietf.org/rfc/rfc5246.txt 的page 19)
- 這一部份可參考網路上一則討論: https://security.stackexchange.com/questions/142939/determine-ssl-tls-version-using-wireshark
