鏈路層劫持

鏈路層劫持

鏈路層劫持是指第三方(可能是運營商、黑客)通過在用戶至伺服器之間,植入惡意設備或者控制網路設備的手段,偵聽或篡改用戶和伺服器之間的數據,達到竊取用戶重要數據(包括用戶密碼,用戶身份數據等等)的目的。鏈路層劫持最明顯的危害就是賬號、密碼被竊取。

基本介紹

  • 中文名:鏈路層劫持
  • 所屬學科:計算機
防禦,原理詳解,

防禦

從鏈路層劫持的原理來看,我們發現核心的問題是:客戶端沒有辦法識別返回的應答是否真的是伺服器返回的,還是第三方返回的,所以簡單的信任了第三方的應答,丟棄了真正的應答。所以只要對伺服器本身進行身份驗證,就可以防止“誤接受”惡意應答。
HTTPS技術就是為此種場景而生,通過一個權威機構,派發證明伺服器合法身份的證書,用戶的電腦通過檢查證書的合法性,來辨別伺服器的真假(因為第三方黑客不可能偽造證書)。
因此,HTTPS網站能有效防禦鏈路層劫持。騰訊統一安全登錄就是用採用了HTTPS技術,來防止鏈路層劫持。

原理詳解

隨著套用安全的發展,大家都比較關注套用安全漏洞,其實在套用層之下的傳輸層也有很多安全風險,而且這些安全風險正在被廣泛利用。比如今天要給大家介紹的TCP鏈路劫持攻擊。
TCP鏈路劫持其實就是指網路鏈路上偵聽、偽造TCP包,達到控制目標網路鏈路的行為。最常見的就是某些設備實現的對非法站點的訪問攔截,以及一些地區運營商的網頁植入廣告行為。
因為廣域網的鏈路劫持影響面大,一般會影響一個地區甚至是全國,所以本文重點討論廣域網的TCP鏈路劫持,區域網路的劫持如ARP攻擊不在討論範圍。
發現的TCP鏈路劫持攻擊一般有兩種形式:中斷訪問型(分為單向發包和雙向發包)和替換頁面型。
中斷訪問型常見於阻止用戶訪問某些網站,如某些設備禁止用戶訪問某些站點、某地運營商的禁止ADSL多終端上網功能。其原理就是偽造服務端給用戶發RST包阻止TCP連線的建立(單向發包)。某些設備做得比較狠,在冒充服務端給用戶發RST包的同時也冒充用戶給服務端發RST包(雙向發包)。
替換頁面型常見於運營商植入廣告,也有篡改正常網頁進行SEO、騙流量的。筆者見過最惡劣的莫過於釣魚,如2011年出現過的Gmail釣魚事件以及一些不能告訴你的釣魚事件。原理也簡單,就是在一個HTTP請求後偽造服務端的HTTP回響給客戶端。
一次典型的TCP鏈路劫持替換頁面,我們可以看到,TCP三次握手完成後,HTTP請求包傳送後,客戶端收到兩個HTTP回響包,因為偽造的第一個包(10號)先到,所以第二個正常的HTTP回響包(13號)被客戶端忽略了。很明顯,在網路上有一個設備,偵聽整個會話,當匹配某個特徵就搶先發包劫持會話。
這些利用鏈路劫持進行的彈窗廣告、“技術問題”產生的誤攔截、植入代碼不慎將頁面弄亂、甚至是釣魚等將會損害用戶利益。筆者跟鏈路劫持的“不解之緣”就因此而起。
要解決鏈路劫持先要搞清楚是否是鏈路劫持,如是則出問題的大概位置在哪裡。鏈路劫持是區域性的,一般來講某地區用戶集中投訴,就可以聯繫用戶調查了。用戶往往不懂Wireshark抓包,還要遠程協助,如果網速慢就是悲劇……各種心酸且按下不表。
抓到可疑包之後關注兩個關鍵點:TTL值和IP Id(Identification)。根據實際觀測,偽造的TCP包的TTL值和Id是不符合邏輯的。
真實包的TTL是53,Id是按順序自增的,而偽造的包的TTL是64,Id始終是0。還有,筆者也見過某地運營商禁止ADSL多終端上網功能會偽造Id值恆為8888的RST包。
通過偽造的TTL值就可以大致定位偵聽設備的位置。利用偽造的數據包的TTL值加上當時用戶的路由即可定位:數據包每經過一個路由TTL值就會減一,我們找到假的包,看他的TTL(一般初始發出的TTL是256或128或64)減了多少,反推回去就找到出問題的位置了。
剛剛那個截圖,偽造的的TCP包TTL值是64,也就是可以推測出鏈路劫持就發生在區域網路內。的確如此,這個case是一個路由器軟體進行鏈路劫持的案例。
有個問題,如果攻擊者聰明一些,偽造包定製一個TTL值,就會導致我們難以精確定位。比如某些設備會發三次RST包,每次的TTL都不一樣。注意,我說的“難以定位”並非“不能定位”,還是有辦法的,需要動動腦子。
壞人是很多的,不能每次都被動等待用戶投訴,如何主動發現鏈路劫持呢?
客戶端訪問目標站點的時候,同一個TCP會話的TTL值發生較大變動,就可以判定為疑似劫持。以下python代碼就是一個利用Scapy檢測TCP鏈路劫持的示例:
#!/bin/python# # import sysfrom scapy.all import * conf.verb=0print "TCP Hijacking Delector by lake2"print "[+] Sniffing ...."ip_arr = {}while 1: a=sniff( filter="tcp and src host not 10.26.234.44", count=50) for b in a: ip_src = b.sprintf(r"%IP.src%") ip_ttl = b.sprintf(r"%IP.ttl%") if ip_arr.has_key(ip_src): c = int(ip_ttl) - int(ip_arr[ip_src]) if abs(c) > 4: print ip_src + " has been hijacking !!! debug info : " + str(ip_ttl) + " <-> " + str(ip_arr[ip_src]) else: ip_arr[ip_src] = ip_ttl print "=>"
檢測到某些設備攔截筆者在Google搜尋敏感關鍵字的鏈路劫持:
雙向RST的情況,部署在機房的IDS也可以發現端倪。
如果是替換頁面型攻擊,頁面hash或者HTML元素個數會有異常,這裡也可以作為一個檢測點。
防範鏈路劫持就比較困難,畢竟攻擊者控制著網路鏈路。不過並非不可能。
一是網站全程使用SSL。
再一個就是在客戶端或(和)伺服器丟棄偽造的TCP包。比如前面說到的單向中斷訪問型攻擊,就可以丟棄包含偽造特徵的TCP包(如Id為0或8888)。某些項目就是利用客戶端、服務端同時丟棄的方式來翻牆的。
最後,我們可以看到廣域網一點都不安全,所以敏感信息傳輸一定要加密,還要高強度加密;高端網頁最好有個校驗機制;自動升級的程式也一定要校驗檔案簽名。

相關詞條

熱門詞條

聯絡我們