科普:流量劫持能有多大危害?
上一篇文章,介紹了常見的流量劫持途徑。然而無論用何種方式獲得流量,只有加以利用才能發(fā)揮作用。
不同的劫持方式,獲得的流量也有所差異。DNS 劫持,只能截獲通過域名發(fā)起的流量,直接使用 IP 地址的通信則不受影響;CDN 入侵,只有瀏覽網(wǎng)頁或下載時才有風(fēng)險,其他場合則毫無問題;而網(wǎng)關(guān)被劫持,用戶所有流量都難逃魔掌。
在本文中,我們通過技術(shù)原理,講解如下問題:
- 為什么喜歡劫持網(wǎng)頁?
- 只瀏覽不登陸就沒事嗎?
- 自動填寫表單有風(fēng)險嗎?
- 離開劫持環(huán)境還受影響嗎?
- 使用 HTTPS 能否避免劫持?
- 流量劫持能否控制我電腦?
為什么喜歡劫持網(wǎng)頁?
理論上說,劫持到用戶的流量數(shù)據(jù),也就獲得相應(yīng)程序的網(wǎng)絡(luò)通信。但在現(xiàn)實中,數(shù)據(jù)并不代表真實內(nèi)容。一些重要的網(wǎng)絡(luò)程序,都是私有的二進制協(xié)議,以及各種加密方式。想通過流量來還原出用戶的聊天信息、支付密碼,幾乎是不可能的。即使花費各種手段,破解出某個程序的通信協(xié)議,然而一旦程序升級改變了協(xié)議格式,或許就前功盡棄了。因此,很難找到種一勞永逸的客戶端劫持方案。
然而,并非所有程序都是客戶端的。一種新興的應(yīng)用模式 —— WebApp,發(fā)展是如此之快,以至于超越客戶端之勢。在如今這個講究跨平臺、體驗好,并有云端支持的年代,WebApp 越來越火熱。各種應(yīng)用紛紛移植成網(wǎng)頁版,一些甚至替代了客戶端。同時,也造就了流量劫持前所未有的勢頭。
WebApp,其本質(zhì)仍是普通的網(wǎng)頁而已。盡管網(wǎng)頁技術(shù)在近些年里有了很大的發(fā)展,各種新功能一再增加,但其底層協(xié)議始終沒有太大的改進 —— HTTP,一種使用了 20 多年古老協(xié)議。
在 HTTP 里,一切都是明文傳輸?shù)?,流量在途中可隨心所欲的被控制。傳統(tǒng)程序事先已下至本地,運行時只有通信流量;而在線使用的 WebApp,流量里既有通信數(shù)據(jù),又有程序的界面和代碼,劫持簡直輕而易舉。
上一篇也提到,如果在戶外沒有 3G 信號的地方釣魚,無法將獲得的流量轉(zhuǎn)發(fā)到外網(wǎng)。然而,使用網(wǎng)頁這一切就迎刃而解。我們完全可以在自己的設(shè)備上搭建一個站點,留住用戶發(fā)起離線攻擊。對于那些連上 WiFi 能自動彈網(wǎng)頁的設(shè)備,那就更容易入侵了。
因此,劫持網(wǎng)頁流量成了各路黑客們的鐘愛,一種可在任意網(wǎng)頁發(fā)起 XSS 的入侵方式。
下面,開始我們的攻防之旅。#p#
只瀏覽不登陸就沒事嗎?
每當磚家出來提醒時,總免不了這么一句:公共場合盡量不登錄賬號。于是,大家就認為只看網(wǎng)頁不登陸就平安無事了。
如果是公共的電腦,那也就無所謂;否則,自己的一些賬號可能就倒霉了。
在自己的設(shè)備上,大家都會記住各種賬號的登錄狀態(tài),反正只有自己用,也沒什么大不了的。然而,在被劫持的網(wǎng)絡(luò)里,一切皆有可能發(fā)生。即使瀏覽再平常不過的網(wǎng)頁,或許一個悄無聲息的間諜腳本已暗藏其中,正偷偷訪問你那登錄著的網(wǎng)頁,操控起你的賬號了。
聽起來似乎很玄乎吧,磚家似乎也沒說已登錄的賬號會怎么樣。難道隨便一個網(wǎng)頁,就能讓各種賬號被控制嗎?
大家都知道,HTTP 是無狀態(tài)的,不像傳統(tǒng)協(xié)議有個『會話』之類的概念。各種賬號的登錄狀態(tài),只能依靠瀏覽器的 Cookie 來實現(xiàn)。因此,只要有了的 Cookie 也就獲得了用戶賬號的使用權(quán)。
和傳統(tǒng) XSS 攻擊不同,流量劫持可以得到任何通信數(shù)據(jù),當然也包括那些受 HttpOnly 保護的 Cookie。攻擊腳本只需對某個站點發(fā)起請求,黑客即可在中途劫持到傳輸?shù)?Cookie 數(shù)據(jù)。如果同時發(fā)起眾多站點,就能覆蓋相當一部分目標了。
這種請求未必要真正訪問一次頁面,僅僅將 URL 作為圖片加載,將目標站點的 Cookie 送出即可。
黑客得到 Cookie,即可在自己瀏覽器里還原出登錄狀態(tài)。盡管你確實沒有登錄操作,但那些已登錄的卻能出賣你。
防范措施:
訪問一些重要的網(wǎng)站,盡量不要記住登錄狀態(tài),以免 Cookie 被泄露。不過,只要網(wǎng)站綁定了 Cookie 和 IP 段,這招的危害程度就大幅降低了,僅憑 HttpOnly 還是很不靠譜的。#p#
自動填寫表單有風(fēng)險嗎?
使用上面的方法獲得 Cookie,即使能控制賬號,但其密碼仍無法得知,隨時都有可能失去控制權(quán)。
不過,一些用戶有讓瀏覽器自動保存密碼的習(xí)慣。通過這點,我們是否能套出記住的密碼來呢?
分析下瀏覽器是如何自動填寫頁面表單的。其實很簡單,瀏覽器發(fā)現(xiàn)頁面 URL 和表單名匹配記錄里的,就自動填上了。
要是在流量可控的網(wǎng)絡(luò)里,剝離頁面所有內(nèi)容只剩表單,又會如何?
保存著的密碼仍能自動填上,并且可被腳本訪問到!
如果我們在用戶訪問的頁面里,創(chuàng)建大量的隱藏框架頁,即可嘗試獲取各種網(wǎng)站保存著的賬號了。(不過如今 Chrome 框架頁已經(jīng)不會自動填寫了。具體實現(xiàn)和瀏覽器有關(guān))。
不過,即使框架頁不自動填寫,但主頁面總得保留該功能吧。如果發(fā)現(xiàn)用戶某個打開著的網(wǎng)頁很久沒有交互了,可悄悄跳轉(zhuǎn)到如上那樣的純表單頁,無論能否獲取數(shù)據(jù),都將繼續(xù)跳轉(zhuǎn),一個接一個的嘗試。。。直到用戶切回窗口,再恢復(fù)到原先那個頁面。
由于泄露的是明文的賬號和密碼,即使數(shù)量不多,也能通過社工獲取到用戶的更多信息,最終導(dǎo)致更嚴重的泄露。
防范措施:
所以無論是 Cookie 記住登錄,還是瀏覽器自動填表,重要的賬號都應(yīng)慎用。
瀏覽器的自動填表也應(yīng)增加些安全策略,例如必須有用戶的交互才開始填寫,規(guī)定的時間里只能填有限次。#p#
離開劫持環(huán)境還受影響嗎?
或許你在想,網(wǎng)絡(luò)再怎么不安全,離開之后就應(yīng)該沒事了吧。
有時在公共場合趕上免費的 WiFi,打開網(wǎng)頁看一會新聞,是常有的事。這么短的時間里能有多大的事。不過在入侵腳本面前,一小會和長久并沒太大區(qū)別。機會只要出現(xiàn)了,無論多么短暫都能滲透。
如果只看重眼前利益,這種短暫的入侵并沒多少利用價值;但若放遠目光,能讓攻擊在今后發(fā)起,那就不再局限于時間和空間了。因此,我們需要一個時光機,讓入侵腳本穿越到用戶未來的時空運行。
若用傳統(tǒng) XSS 的思維,這幾乎無法實現(xiàn)。但在流量劫持面前,一切皆有可能 —— 因為我們能控制任意流量!
HTTP 緩存投毒
上一篇文章提到,但凡有緩存的地方都是大有可為的。顯然,對于有著復(fù)雜的 HTTP 緩存系統(tǒng)來說,存在缺陷是在所難免了。這種簡單的純文本協(xié)議,幾乎沒有一種簽名機制,來驗證內(nèi)容的真實性。即使頁面被篡改了,瀏覽器也完全無法得知,甚至連同注入的腳本也一塊緩存起來。
于是,我們可以將『緩存投毒』的概念,引入 HTTP 協(xié)議里。但凡具備可執(zhí)行的資源,都可以通過預(yù)加載帶毒的版本,將其提前緩存起來。
為了將緩存的有效期發(fā)揮到極致,我們事先在各大網(wǎng)站上,找出一些過期時間長、很久沒有修改的資源,評估其未來變化不大的可能。
當用戶打開任意一個 HTTP 網(wǎng)頁時,注入的 XSS 代碼開始預(yù)加載這些資源。由于一切流量都在控制之中,我們可以完全不走代理,而是返回自己的攻擊腳本。
用戶瀏覽器收到回復(fù)后,就將其一一緩存起來了。我們可以事先收集大量的資源地址,讓用戶在線的時間里,盡可能多的緩存受到感染。
未來,用戶訪問引用了這些資源的網(wǎng)站時,入侵腳本將穿越時空,從沉睡中喚醒。
只要用戶不清空緩存,這些被感染的腳本始終附著在瀏覽器緩存里,直到用戶強制刷新頁面時或許才能解脫。更多細節(jié)可參考這里。
離線儲存投毒
不過,有些網(wǎng)站使用的都是很短的緩存,上述的入侵方式似乎就無能為力了。不過,HTML5 時代帶來了一項新的緩存技術(shù) —— 離線儲存。由于它沒有過期時間,因此適用于任意網(wǎng)頁的投毒!
類似的,當用戶觸發(fā)了我們的注入腳本之后,我們創(chuàng)建一個隱形的框架頁,加載被感染的網(wǎng)頁。同樣,通過流量劫持,我們返回一個簡單的頁面,里面包含一個帶有 manifest 屬性的 HTML 文檔,以及后期運行的腳本。
由于通過隱藏框架訪問了這個頁面,用戶并不知情,但盡職的瀏覽器卻將其緩存起來。
未來,用戶打開被感染的網(wǎng)頁時,瀏覽器直接從離線儲存里取出,其中布置的腳本因此觸發(fā)。
由于是個空白頁面,因此需要填充上真實的網(wǎng)站內(nèi)容。最簡單的方法,就是嵌套一個原頁面的框架,并在 URL 里加上隨機數(shù),確保是最新的在線內(nèi)容。
因為嵌套的是同域框架,最終仍能被入侵腳本所控制。
不過,離線存儲投毒的后期影響會小一些。未來用戶在安全的網(wǎng)絡(luò)里打開頁面時,瀏覽器會再次請求 .appcache 文件。由于這個文件并不一定存在,因此瀏覽器很可能刪除掉離線數(shù)據(jù)。
理論上說只有一次的觸發(fā)機會,但它沒有過期時間,適用于任意 HTTP 頁面投毒。
防范措施:
在不安全的場合,盡量使用『隱身模式』瀏覽網(wǎng)頁。例如 Chrome 里按 Ctrl+Shift+N 就能調(diào)出,可將自己處于隔離的沙盒里。
FireFox 瀏覽器存儲離線文件時,會有用戶交互提示,提醒用戶是否有這必要。
也許不久后,框架頁面不再被離線儲存所接受,新標準隨時都有可能改變。但 HTTP 緩存投毒是協(xié)議棧的缺陷,因此很難防范,下一篇會發(fā)現(xiàn)實際入侵效果非常理想。#p#
使用HTTPS能否避免劫持?
如果從密碼學(xué)的角度來說,使用了 SSL 加密的數(shù)據(jù)確實難以破解,更不用談修改了。
然而,惹不起但總躲得起吧。雖然無法破解,但流量仍掌握在自己手中,走哪條路還是由我說的算,完全可以繞過你。
偷換證書
不同于簡單的 HTTP 代理,HTTPS 服務(wù)需要一個權(quán)威機構(gòu)認定的證書才算有效。自己隨便簽發(fā)的證書,顯然是沒有說服力的,HTTPS 客戶端因此會質(zhì)疑。
在過去,這并不怎么影響使用過程,無非彈出一個無效的證書之類的提示框。大多用戶并不明白是什么情況,就點了繼續(xù),導(dǎo)致允許了黑客的偽證書,HTTPS 流量因此遭到劫持。
在經(jīng)歷越來越多的入侵事件之后,人們逐漸意識到,不能再輕易的讓用戶接受不信任的證書了。如今,主流瀏覽器對此都會給予嚴重的警告提示,避免用戶進入偽安全站點。
如果重要的賬戶網(wǎng)站遇到這種情況,無論如何都不該繼續(xù),否則大門鑰匙或許就落入黑客之手。
因此,這種偷換證書的劫持,在安全意識越來越高的今天,很難再發(fā)揮實效了。我們需要一個更隱蔽的方式來躲開加密數(shù)據(jù)。
過濾 HTTPS 跳轉(zhuǎn)
事實上,在 PC 端上網(wǎng)很少有直接進入 HTTPS 網(wǎng)站的。例如支付寶網(wǎng)站,大多是從淘寶跳轉(zhuǎn)過來,而淘寶使用的仍是不安全的 HTTP 協(xié)議。如果在淘寶網(wǎng)的頁面里注入 XSS,屏蔽對 HTTPS 的頁面訪問,用 HTTP 取而代之,那么用戶也就永遠無法進入安全站點了。
盡管地址欄里沒有出現(xiàn) HTTPS 的字樣,但域名看起來也是正確的,大多用戶都會認為不是釣魚網(wǎng)站,因此也就忽視了。
因此,只要入口頁是不安全的,那么之后的頁面再安全也無濟于事。
當然也有一些用戶通過輸網(wǎng)址訪問的,他們輸入了 www.alipaly.com 就敲回車進入了。然而,瀏覽器并不知道這是一個 HTTPS 的站點,于是使用默認的 HTTP 去訪問。不過這個 HTTP 版的支付寶的確也存在,其唯一功能就是重定向到自己HTTPS站點上。
劫持流量的中間人一旦發(fā)現(xiàn)有重定向到 HTTPS 站點的,顯然不愿意讓用戶走這條不受自己控制的路。于是攔下重定向的命令,自己去獲取重定向后的站點內(nèi)容,然后再回復(fù)給用戶。于是,用戶始終都是在 HTTP 站點上訪問,自然就可以無限劫持了。
搜索引擎劫持
事實上,HTTPS 站點還有個很大的來源 —— 搜索引擎。遺憾的是,國產(chǎn)搜索引擎幾乎都不提供 HTTPS 服務(wù)。因此在不安全的網(wǎng)絡(luò)里,搜索結(jié)果是不具備任何權(quán)威的。
防范措施:
重要的網(wǎng)站必定使用 HTTPS 協(xié)議,登陸時需格外留意。
國外的大型網(wǎng)站幾乎都提供 HTTPS 服務(wù),甚至是默認的標準。相比國內(nèi)只有少數(shù)重要的服務(wù)才使用,絕大多數(shù)的信息都是在明文傳輸。這是為了方便什么來著,你猜。#p#
流量劫持能否控制我電腦?
如果不考慮一些瀏覽器安全漏洞,理論上說網(wǎng)頁與系統(tǒng)是完全隔離的,因此無需擔心系統(tǒng)受到影響。
釣魚插件
有時為了能讓網(wǎng)頁獲得更多的在線能力,安裝插件必不可少,例如支付控件、在線播放器等等。在方便使用的同時,也埋下了安全隱患。
如果是一些小網(wǎng)站強迫用戶安裝插件的,大家?guī)缀醵际侵弥焕?。但若一些正?guī)的大網(wǎng)站,提示用戶缺少某些插件,并且配上一些專業(yè)的提示,相信大多都會選擇安裝。而這一切,通過被注入的攻擊腳本完全能辦到。
不過,正規(guī)的插件都是有完整的數(shù)字簽名的,而偽造的很難躲過瀏覽器的驗證,會出現(xiàn)各種安全提示。因此,攻擊者往往使用直接下載的方式,提示用戶保存并打開安裝包。
頁面提權(quán)
現(xiàn)在越來越多的應(yīng)用程序,選擇使用內(nèi)嵌網(wǎng)頁來簡化界面的開發(fā),在移動設(shè)備上更是普遍。
通常為了能讓頁面和客戶端交互,賦予一些本地程序的接口供調(diào)用,因此具有了較高的權(quán)限。不過,正常情況下嵌入的都是受白名單限制的可信頁面,因此不存在安全隱患。
然而在被劫持的網(wǎng)絡(luò)里,一切明文傳輸?shù)臄?shù)據(jù)都不再具備可信度。同樣的腳本注入,就能獲得額外的權(quán)限了。
一些帶有缺陷的系統(tǒng),攻擊腳本甚至能獲得出乎意料的能力。通過之前提到的網(wǎng)頁緩存投毒,這顆埋下的地雷隨時都有可能觸發(fā)。
下載程序
即使上網(wǎng)從不安裝插件,但是下載程序還是經(jīng)常需要的。由于大多數(shù)的下載網(wǎng)站,使用的都是 HTTP 流量,因此劫持者能輕易的修改可執(zhí)行文件,將其感染上病毒或木馬,甚至完全替換成另一個程序。
用戶總認為從官網(wǎng)上下載的肯定沒問題,于是就毫無顧慮的打開了。這時,入侵的不再是瀏覽器環(huán)境,而是能控制整個系統(tǒng)了。
防范措施:
如果是從瀏覽器里下載的程序,留意是否具有數(shù)字簽名,正規(guī)的廠商幾乎都會提供。如果想試用一些來路不明的小程序,保存到虛擬機里使用就放心多了。
未來 SPDY 技術(shù)普及的時候,就再不用擔心網(wǎng)頁劫持這些事。它將 HTTP 協(xié)議封裝在加密的流量里傳輸,想劫持一個普通網(wǎng)頁都很困難了。
結(jié)尾
暫時就說到這。事實上類似 XSS 的攻擊方式還有很多,這里只談了一些能和流量劫持配合使用的。利用上一篇講述的各種劫持途徑,配合本文提到的入侵方式,可以劫持不少用戶了。下一篇,將演示如何利用這些原理,發(fā)起實戰(zhàn)攻擊。
原文鏈接:http://fex.baidu.com/blog/2014/04/traffic-hijack-2/