李良盛 段海新, 鄭曉峰
1(清華大學網絡科學與網絡空間研究院 北京 100084)2(北京奇安信科技有限公司 北京 100015)
隨著互聯網的發展,越來越多的設備都連接到了互聯網上,網絡管理員面臨著更大的挑戰。不同的設備運行著各式各樣的操作系統,識別和修補易受攻擊的那些系統至關重要。網絡管理員采用多種安全技術來保護系統免受惡意活動的影響,而檢測出那些可能使用舊版本或不安全版本的操作系統的設備是其中一種重要方法。此外,網絡管理員為了對網絡中的各種設備進行資產管理,同樣需要操作系統識別技術識別出設備的操作系統。因此操作系統識別技術是重要的網絡安全技術。
操作系統指紋識別是指通過網絡數據包識別主機的操作系統信息。操作系統指紋則是指從某一操作系統所發送的網絡數據包中提取的可以區分不同操作系統的一系列特征項。其原理是不同的操作系統廠商在實現TCP/IP協議棧出現了細微的差別,這些差別具有獨特的特性,故而被稱為“指紋”。例如IP協議的TTL字段以及TCP協議的窗口字段和選項字段等就是最常見的可以區分不同操作系統的特征字段。
操作系統識別技術分為主動和被動兩類。主動操作系統指紋識別需要精心構造不同的數據包并發送出去,根據返回的結果來分析目標的具體操作系統。此方法最大的缺點在于發送的數據包會被防火墻或者入侵檢測系統攔截,并且會暴露自身的信息。被動操作系統指紋識別比主動操作系統指紋識別來說比較受限,只能被動地接受流量,從流量中分析出操作系統信息。本文主要研究被動操作系統識別。
被動操作系統識別技術主要根據TCP會話建立時發送的SYN數據包中的IP和TCP協議的特征字段來識別不同類型和版本的操作系統,其中的代表性工具就是p0f[1]。被動操作系統識別工具依賴于自身的指紋庫,但是p0f的指紋庫已經長期沒有更新。在識別流量的過程中,首先從流量中提取各個特征項,然后用特征項組成的指紋去指紋庫中匹配。匹配成功輸出識別結果,匹配不成功則輸出未知。然而指紋庫的生成需要搜集不同類型和版本的操作系標簽數據。人工去搜集標簽數據的方法效率低下,而且真實網絡環境中操作系統所產生的指紋多種多樣,僅僅憑人工搜集很難搜集完整。因此目前亟需一種自動化標記指紋的方法。
針對該問題,本文提出一種基于HTTP User-Agent來標記指紋的指紋庫自動化生成方法。采用User-Agent提取出的操作系統類型和版本信息作為IP和TCP協議提取出的指紋的標記。然后在大量HTTP網絡流量數據集上進行統計。根據統計結果發現,單個指紋統計出的出現頻率最高的一個或幾個標記占該指紋總數量的絕大部分。因此選擇出現頻率出現較高的操作系統類型和版本作為指紋的最終標記。這樣避免了HTTP User-Agent容易被修改帶來的不可信問題。
通過約2.2億的真實網絡產生的客戶端方向的HTTP流量數據,最終得到390條操作系統指紋標記數據,涵蓋了主流操作系統的各個版本,而p0f同方向的指紋只有91條。用新的指紋庫和p0f在相同的數據集上進行了對比驗證,實驗結果表明,新的指紋庫在識別正確率上優于p0f,證明了本方法的有效性。
p0f是被動操作系統指紋識別的代表性工具,最新版本為3.09b。p0f可以處理離線的pcap文件,也可以實時運行監控網絡流量數據。p0f通過TCP建立連接時雙方首次發送的SYN和SYN ACK數據包來識別通信雙方的操作系統。p0f的指紋的特征字段由IP協議和TCP協議的特征字段組成,包括IP協議的TTL字段、TCP協議的窗口字段、TCP頭部選項中的最大報文段長度(MSS)和窗口擴大因子(WSCALE)和選項的排列順序等。但是p0f目前缺乏更新,指紋數據庫最后更新時間是2016年4月,包含的操作系統也比較少,缺乏Windows 10等比較新的操作系統版本的指紋數據。
Ettercap[2]是一款可用的被動操作系統指紋識別工具,既可以檢測中間人攻擊,也能夠執行操作系統指紋識別。和p0f一樣,Ettercap使用TCP SYN數據包信息進行操作系統分類。然而,Ettercap并不是一個純粹的被動操作系統指紋識別工具,因為它向系統發送TCP SYN包并檢查響應包。Ettercap目前最近的更新是在2015年3月,指紋庫更新時間是2012年。
Sator[3]是一款可用的被動操作系統指紋識別工具。Satori自身帶有TCP和DHCP操作系統指紋識別引擎,還集成了p0f和Ettercap。因此對于TCP包Satori可以輸出三種結果。在局域網下Satori可以進行DHCP包識別。Satori最近的更新是在2013年5月,其使用p0f和Ettercap 2012年舊版本的指紋庫。
NetworkMiner是一款嗅探抓包工具,可以對網絡流量進行分析,包括操作系統指紋識別。NetworkMiner進行操作系統指紋識別的原理與p0f一致,使用了p0f和Satori的指紋數據庫。NetworkMiner最近的更新是在2019年1月,但其使用的是p0f和Ettercap的老舊指紋庫。
這些公開可用的被動操作系統指紋識別工具大都方法類似,都有缺乏更新的問題。
在操作系統指紋識別特征項的研究上,劉英等[4]研究了TCP協議選項字段對操作系統指紋識別的作用。文獻[3]在p0f所使用的指紋的特征字段的基礎上進行了優化,去除掉無用的特征字段,重新提取了指紋庫,并利用決策樹和SVM等算法進行分類,最終訓練的模型在測試數據上達到了80%左右的準確率。文獻[5]研究了會話內多個數據包之間的關聯關系,發現TCP FIN ACK包具有一定的區分操作系統的作用。文獻[6]研究了利用IP、TCP、UDP、ICMP、SSH、DNS、TLS和FTP等多種協議在多種機器學習算法的基礎上進行操作系統識別的效果,經過比較發現了TCP協議的特征字段具有最好的區分操作系統效果。文獻[7]利用TCP/IP、HTTP User-Agent和TLS三種指紋特征生成模型,研究了私有網絡下多會話模型的操作系統指紋識別效果,以一小時為時間窗口,識別正確率達到99%左右。但是該方法具有局限性,只適合于網絡中設備的IP地址基本不變化的情況。
HTTP協議允許客戶端和服務器在連接期間通過在消息中包含頭部字段來傳遞附加信息。HTTP User-Agent是HTTP頭部的一個重要字段。一個標準的User-Agent以標準化格式標明客戶端和操作系統的類型和版本等信息。Adhikari等[8]研究了直接利用網絡流量中HTTP User-Agent來標記設備類型。HTTP User-Agent非常容易修改,很多瀏覽器插件提供修改 User-Agent,爬蟲程序也需要修改User-Agent來偽裝成正常訪問。已有研究表明,在真實網絡流量中,偽造的User-Agent流量只占全部流量的很少一部分[9]。文獻[10]還提出通過比較在客戶端利用javascript得到navigator.userAgent與服務端流量中獲得的User-Agent的不一致性來發現瀏覽器指紋偽造的方法。
本文所提出的指紋庫自動化方法具有三個步驟:一是從HTTP流量數據中解析和提取特征項以及User-Agent。二是指紋對應操作系統信息的統計。三是根據統計結果選擇指紋標記。如圖1所示。

圖1 指紋庫自動化生成流程圖
根據p0f所使用的特征進行最終簡化,使用了IP和TCP協議的6個特征。表1列出5種典型的操作系統指紋及所使用的特征對應的值。

表1 典型的操作系統指紋
下面分別對每個特征的構造和處理方式進行說明:
TTL表示IP協議TTL字段的值。TTL字段是生存時間,每被轉發一次該字段的值減1,為0時被丟棄,一般的初始值為64、128和255等。Windows操作系統TTL初始值通常為128,Liunx和Mac OS X操作系統TTL初始值通常為64。在原始發送主機上捕獲的數據包TTL值直接從字段中提取,而其他位置捕獲的數據包需要通過就近原則計算出原始TTL值。
NZ_IPID表示DF(分片標志位)設置為1時ID(IP協議字段)值是否不為0。Mac OS X 10.13和10.14以及iOS 12等較新的操作系統在不分片時一直將ID設置為0。該特征需要對DF標志位和ID值進行判斷后得到結果。
ECN表示在IP和TCP協議的ECN(顯示擁塞通知)標志位的值。RFC3168[11]規定使用IP和TCP頭部中保留字段的后兩位作為ECN標志位。較新的操作系統,例如Windows 2012和2016等會使用該標志位。該特征直接來源于ECN標志位提取的值。
WSCALE表示TCP選項中窗口擴大因子的值。不同的操作系統具有不同的常用值。該特征直接從TCP選項中提取窗口擴大因子字段的值。
OPTLAYOUT表示TCP選項的每一項按出現的先后順序排序組成的字符串。常見的TCP選項有結束(EOL)、無操作(NOP)、最大報文段長度(MSS)、窗口擴大因子(Window Scale)、選擇性確認(SACK Permitted)和時間戳(Timestamps)等。該特征需要對所有的TCP選項進行按先后順序排序后得到值。
WIN_MSS表示TCP協議窗口值與TCP選項最大報文段長度的比值,如不能整除則該特征的值直接為窗口值。
上述特征均具有區分不同版本和類型操作系統的能力。
通過讀取網絡流量,并解析數據包中IP和TCP協議字段,直接提取字段的值或者通過間隔計算得到結果,最后得到特征對應的值。處理流程如圖2所示。

圖2 從網絡流量中提取特征處理流量圖
首先讀取網絡流量文件,然后設置過濾規則,只留下TCP的流量。對TCP數據包按字段進行解析,包括IPv4或者IPv6、TCP固定頭部和TCP選項等。根據解析出的標志位SYN是否值為1和ACK是否為值0判斷是否為初始SYN數據包。不滿足條件則繼續判斷網絡流量文件是否讀取完畢,未完畢則繼續解析單個數據包,完畢則結束。
HTTP User-Agent提取使用python-user-agents[12]工具。該工具基于Python語言編寫,可以提取User-Agent中的操作系統類型和版本以及HTTP客戶端的類型和版本。此外,還采用了關鍵詞提取的方法作為補充。少部分不能提取出操作系統信息的User-Agent數據將被丟棄。在選擇指紋的最終標記結果時,選擇方法上會避免掉HTTP User-Agent不可靠帶來的影響。
采用字典嵌套的方法進行統計。指紋信息作為字典的關鍵字(key),操作系統類型和版本及數量信息作為值(Value)。操作系統類型和版本及數量信息也是一個字典,操作系統類型和版本作為關鍵字,而出現數量作為值。
對于每一條指紋-操作系統數據對,首先將指紋作為關鍵字檢查字典是否已存在該指紋,不存在則加入該指紋。存在則檢查該指紋對應值的字典,操作系統類型和版本作為關鍵字,存在該關鍵字的值加1,不存在則加入該操作系統類型和版本。
單個指紋統計出的操作系統信息具有很多類型和版本,需要考慮選擇哪些操作系統類型和版本作為該指紋的最終標記結果。
首先計算出每個操作系統類型和版本所出現數量占該指紋總數量的百分比。考慮單個指紋出現數量最多的操作系統類型和版本,如果該操作系統類型和版本數量占比達到80%以上則只取該結果作為標記。如果出現數量最多操作系統類型和版本占比小于10%,則說明該指紋的統計結果非常分散,不合適選擇任一數據作為標記,從而丟棄該指紋,避免得到錯誤結果。
如果出現數量最多操作系統類型和版本占比在10%~80%之間,則考慮排名靠前的數據均作為該指紋的標記。由于指紋與操作系統是多對多關系,這樣做也是合理的。但是操作系統類型必須與第一標記結果相符,除Linux和Android以及Mac OS X和iOS外,因為這兩類操作系統具有同源性,對應的指紋可能會交叉。此外,單個指紋對應的數量太少的數據將直接丟棄。
通過部署在清華大學校園網邊界的探針得到整個大學的網絡流量數據。對2019年2月7日至16日共計10天的HTTP網絡流量數據進行處理,得到218 432 717條HTTP網絡流量數據。首先提取其中的IP和TCP協議的指紋特征項,其次提取HTTP User-Agent的操作系統類型和版本,然后將兩個結果組成一對。由于部分HTTP User-Agent無法提取出操作系統類型,因此丟棄掉此部分數據,最終得到173 696 297條數據。
首先對每一天的指紋和User-Agent提取對進行統計,再從2月7日到16日的順序合并統計結果。最終統計出506條不重復指紋數據。每天統計出的不重復指紋數量和最終統計結果的不重復指紋數量增長情況如圖3所示。

圖3 每天不重復指紋數量和最終統計結果的不重復指紋數量增長情況
可以看出,最終統計的不重復指紋數量增長越來越緩慢,說明每天的數據中重復的指紋較多,10天的數據基本涵蓋了校園網數據中的絕大部分出現的指紋。
根據506條不重復指紋每條統計出的數據,分別統計了每條指紋出現的數量占總數量的百分比。可以發現少數的指紋出現頻率較高,占了總數量的大部分。數量最多的指紋占總數量的43.95%,前10數量的指紋的和占總數量的90.75%,前40數量的指紋的和占總數量已經高達99.03%。TOP X指紋數量占總數量百分比情況如圖4所示。

圖4 TOP X指紋出現數量和占總數量百分比
單個指紋的統計結果示例如圖5所示。

圖5 單個指紋統計結果示例
第一行是指紋信息,后面行是該指紋對應HTTP User-Agent出現過的操作系統。可以看出,Windows 10占比最多,可以作為改指紋的標記。其他操作系統占比很少,不宜作為該指紋的標記。
首先統計了單個指紋所對應的出現次數最多的操作系統占該指紋出現總數量的百分比。為避免統計結果失真,該統計沒有使用只有一條操作系統信息的指紋數據。分為五類,每20%為一類。統計結果如圖6所示。

圖6 單條指紋的出現最多次數操作系統數量占該指紋總數量比例的分類
可以看出,單條指紋對應的出現次數最多的操作系統的指紋數量能夠占總數量達到80%以上的這類指紋有59.06%。達到40%以上的數量有93.70%,說明了絕大部分指紋的統計結果呈現了相同規律,也證明了選擇出現數量最多的操作系統作為標記的方法的正確性。
單個指紋出現TOP X的操作系統數據和的變化情況如圖7所示。

圖7 單個指紋出現TOP X的操作系統數據和的變化情況
可以看出,單個指紋TOP 4數量的操作系統之和占比達到了96.85%。因此對單個指紋的最多操作系統標記數量占比不足80%時,考慮后續三個數量次多的標記作為補充。但是必須要求操作系統類型與第一個標記數據一致,考慮到Linux和Android以及Max OS X和iOS的同源性,這兩類不做此要求。考慮到單個指紋出現次數過少比較容易得到錯誤標記,丟棄出現次數小于100次的指紋數據。
由統計結果發現少部分標記只有操作系統信息沒有版本信息。如果該標記不是該指紋的唯一標記則刪除此類數據。
最終得到390條指紋數據,其中不重復指紋273條,而p0f TCP SYN方向指紋庫數量只有91條。其分布如表2所示。

表2 新的指紋庫操作系統類型和版本數量
Linux所在欄無版本信息是由于Linux指紋對應的HTTPUser-Agent基本提取不出操作系統版本信息。
利用清華大學校園網2月17至19日三天的網絡流量數據進行測試,共計122 187 670條TCP會話數據,9 002 139條HTTP數據。其中91.89%的TCP會話數據提取的指紋能夠在新的指紋庫上命中。然后,用HTTP User-Agent提取結果進行對比驗證。通過修改p0f的數據讀入接口使其能處理校園網的網絡流量,同樣地,得到與User-Agent提取結果的對比,其中91.12%的TCP會話數據能夠在p0f的指紋庫上命中,結果如圖8所示。

圖8 校園網三天HTTP數據新指紋庫和p0f識別結果分別與User-Agent提取結果對比
類型是指操作系統類型,例如Windows與Max OS X。版本是指操作系統版本,例如Windows操作系統的版本 7或8等。版本一致包括了指紋庫識別結果有多種版本的情況。可以看出,新的指紋在校園網三天的數據識別結果,類型和版本均一致的達到了94.66%。p0f的識別結果則出現了71.31%的類型一致但是版本不一致的情況。這也從側面說明了p0f的指紋庫并不完備。新的指紋庫識別結果與User-Agent提取的結果只有1.48%操作系統類型不一致。同樣也驗證了User-Agent不可靠的情況非常少。
此外,還在人工搜集的標簽數據集上進行了測試。通過搭建虛擬機的方法,搭建了Windows、Linux和Mac OS X三大主流操作系統17個版本的虛擬機。通過腳本控制瀏覽器訪問國內Alex TOP 10網站產生目的端口為80、443的流量,訪問指定服務器的22、139、445和3389等端口產生流量。此外使用真實移動設備采集了iOS 12和Android 7的三分鐘網絡流量。所有標簽流量共計TCP SYN數據17 073條。
分別用新的指紋庫和p0f在該數據集上進行指紋識別。95.04%的數據能夠在新的指紋庫上命中,而89.99%的數據能夠在p0f指紋庫上命中。命中的數據其識別結果分類如圖9所示。

圖9 新的指紋庫和p0f在相同標簽數據集上識別結果對比
新的指紋庫在類型版本一致的識別結果占比76.45%,而p0f只有49.73%。只考慮操作系統類型識別準確率的話,新的指紋庫準確率高達99.79%,而p0f只有74.30%。在相同的標簽數據上,無論是命中率還是準確率,新的指紋庫都表現得比p0f要好。
目前公開可用的被動操作系統識別工具的指紋庫缺乏更新,而人工去搜集不同類型和版本的操作系統標簽數據來完善這些工具的指紋庫不僅效率低下而且很難搜集完整。本文提出了一種基于HTTP User-Agent來標記指紋的指紋庫自動化生成方法。利用約2.2億的HTTP網絡流量數據生成了涵蓋主流的操作系統類型和版本的新指紋庫。在相同的數據集上對新指紋庫與p0f在相同數據集上進行了測試,新的指紋庫得到了比p0f更優的操作系統識別結果,證明了本方法的有效性。目前的IP和TCP協議特征項難以區分相同類型的操作系統的不同版本,是下一步研究重點。