前言
自騰訊與京東建立了戰略合作關系之后,筆者網上購物就首選京東了。某天在家里訪問京東首頁的時候突然吃驚地發現瀏覽器突然跳到了第三方網站再回到京東,心里第一個反應就是中木馬了。
竟然有這樣的事,一定要把木馬大卸八塊。
原因排查
首先在重現的情況下抓包,京東官網確實返回了一段Javascript讓瀏覽器跳轉到了yiqifa.com。
下圖是應用層的抓包。
服務器返回的代碼導致跳轉,基本可以排除本地木馬,推測是網絡或者服務器的問題。根據筆者的經驗,這種情況很大可能是鏈路上的流量劫持攻擊。當然也不能排除京東服務器被黑的情況。
繼續排查。應用層已經不行了,我們要用Wireshark抓網絡層的包。
從Wireshark結果可以看到,網絡上出現了兩個京東的HTTP響應。第一個先到,所以瀏覽器執行里面的Javascript代碼轉到了yiqifa.com;第二個HTTP響應由于晚到,被系統忽略(Wireshark識別為out-of-order)。
兩個京東的HTTP響應包,必然一真一假。快揭示真相了。
再來看看兩個HTTP響應的IP頭。
第一個包TTL值是252,第二個包TTL值是56,而之前TCP三次握手時京東服務器的TTL值是56,故可以判斷先到的包是偽造的,真的包晚到而被系統忽略。
至此,確認是鏈路上的劫持。
攻擊方式
繼續分析偽造的數據包。
偽造包的TTL值是252,也就是說它的原始TTL值應該是255(大于252的系統默認TTL值只能是255了,一般不會修改),也就表明攻擊者的設備離我隔了3個路由;而正常的京東網站的HTTP響應TTL值是56,隔了8個路由。物理上假的設備離我近,所以偽造的HTTP響應會先到——比較有意思的是,筆者實際監測時候發現也有偽造包晚到導致劫持失敗的情況。
推測是一個旁路設備偵聽所有的數據包,發現請求京東首頁的HTTP請求就立即返回一個定制好的HTTP響應。大致的攻擊示意圖如下。
當時筆者推測攻擊者在鏈路上大動干戈應該不會只針對一個網站,于是就訪問了下易迅、淘寶、天貓這些電商網站,結果發現易迅也受到同樣的攻擊。看起來這次流量劫持的目的是將電商網站流量導給返利聯盟,通過返利聯盟獲得當前用戶成交金額的返利。
基本確認運營商有問題,但是無法確認是運營商官方故意的還是遭到黑客攻擊或者是內部人士偷偷搞的。
攻擊源定位
來看看當時的路由結果:
如果按初始TTL值為255來算,HTTP包到達本機后為252,推算出經過了3(255-252)個路由,出問題的地方就在第4個路由附近,也就是這里的119.145.220.86(屬于深圳電信)。
當然了,雖然基本可以確認是第四個路由附近的問題(筆者連續幾天抓包,偽造的HTTP響應包TTL值一直是252),但是不排除設備故意構造一個初始TTL值(比如設置為254)來增加追查難度,為了嚴謹的治學態度及避免被攻擊者迷惑,所以證據要坐實了。
定位比較簡單,既然攻擊設備是旁路偵聽數據包,可以推測它是基于包而非狀態的,我們構造被偵聽的數據包(也就是直接發出訪問京東首頁的HTTP請求TCP包,不需要三次握手)多次發送,TTL值從1開始遞增,精確地傳遞數據包到每一個路徑上,直到出現偽造響應——沒有問題的位置是不會有響應的,第一個出現偽造響應的位置就是出問題的位置。