流量劫持攻擊之鏈路劫持剖析
0x00 前言
鏈路劫持屬于流量劫持攻擊的一種,在電商領(lǐng)域較為常見(jiàn),網(wǎng)絡(luò)上也有不少案例。本文作者將會(huì)結(jié)合公司實(shí)際發(fā)生的案例來(lái)簡(jiǎn)要剖析鏈路劫持有關(guān)技術(shù)。由于作者水平有限,見(jiàn)解淺顯在所難免,望大牛勿噴,如有描述不當(dāng)之處望各路看官批評(píng)指正。
0x01 劫持案例分析
案例現(xiàn)象描述:
有用戶反饋訪問(wèn)公司部分業(yè)務(wù)的URL時(shí)被重定向至公司其他業(yè)務(wù)的URL,導(dǎo)致用戶無(wú)法請(qǐng)求所需的服務(wù),嚴(yán)重影響了用戶體驗(yàn)以及用戶利益。我們第一時(shí)間通過(guò)遠(yuǎn)控的方式復(fù)現(xiàn)了上述現(xiàn)象,并及時(shí)抓取了相關(guān)數(shù)據(jù)包以供分析,當(dāng)然前期也采取了用戶電腦殺毒、開(kāi)發(fā)者工具分析等方式排除了用戶端個(gè)人原因的可能性。從圖1來(lái)看,初步判斷是運(yùn)營(yíng)商某員工所為,意欲通過(guò)流量重定向來(lái)獲取非法的流量分成,啥意思呢,被劫持的該業(yè)務(wù)的流量要經(jīng)過(guò)聯(lián)盟的該賬戶spm,使得公司再付費(fèi)給聯(lián)盟,歸根結(jié)底還是為了盈利。
圖1
案例問(wèn)題追蹤:
通過(guò)分析抓取的樣本數(shù)據(jù)發(fā)現(xiàn),數(shù)據(jù)包在傳輸過(guò)程中出現(xiàn)異常TTL,目標(biāo)機(jī)的正常TTL為51如圖2。
圖2
這里出現(xiàn)異常TTL值116和114,并且兩個(gè)包的ID(Identification)值相同,均為25576,如圖3和圖4,明顯是偽造的包。
圖3
圖4
另外服務(wù)器banner信息也發(fā)現(xiàn)了異常情況,公司提供的Server是Tengine的,網(wǎng)站編寫語(yǔ)言是Asp.Net的,在響應(yīng)頭中應(yīng)該能看到,而異常響應(yīng)頭部無(wú)此信息,如圖5所示:
圖5
綜上判斷,中間鏈路發(fā)生了劫持。劫持者應(yīng)該是利用在運(yùn)營(yíng)商內(nèi)部的便利條件,在網(wǎng)關(guān)路由器上添加嗅探程序,嗅探明文HTTP請(qǐng)求數(shù)據(jù)包,拿到要劫持的數(shù)據(jù)包之后,馬上給請(qǐng)求者返回HTTP response(302 到其他 url),導(dǎo)致用戶無(wú)法訪問(wèn)正常URL。
劫持意圖分析:
通過(guò)tcp流跟蹤,發(fā)現(xiàn)劫持行為指向了一個(gè)spm=s-32528773787910-pe-f-801.psy_**2的聯(lián)盟賬戶,如圖6、圖7所示,目的在于通過(guò)付費(fèi)流量來(lái)獲取利潤(rùn),這也驗(yàn)證了剛開(kāi)始的初步判斷。
spm可以理解為跟蹤引導(dǎo)成交效果數(shù)據(jù)的解決方案,可以用來(lái)評(píng)估某一個(gè)站點(diǎn)上某一頻道的訪問(wèn)和點(diǎn)擊效果,以及后續(xù)引導(dǎo)和成交情況。
圖6
圖7
劫持影響:
用戶無(wú)法正常訪問(wèn)所需業(yè)務(wù),且致公司流量及利益損失。
解決措施:
簡(jiǎn)單粗暴的應(yīng)對(duì)措施:封賬號(hào),相關(guān)部門投訴,當(dāng)然投訴的效果不能抱太大希望。
鏈路劫持其他案例
京東:http://www.freebuf.com/vuls/62561.html
唯品會(huì):http://www.jianshu.com/p/0397a89057a9
Github:http://www.360doc.com/content/16/0208/02/6427260_533236263.shtml
新浪:WooYun: 新浪博客疑似被流量劫持攻擊Github(目標(biāo)紐約時(shí)報(bào)和某墻倉(cāng)庫(kù)) ">WooYun: 新浪博客疑似被流量劫持攻擊Github(目標(biāo)紐約時(shí)報(bào)和某墻倉(cāng)庫(kù))
搜狐:WooYun: 搜狐視頻疑似流量劫持攻擊Github "> WooYun: 搜狐視頻疑似流量劫持攻擊Github
百度:http://cn.nytimes.com/china/20150331/c31hack/(需翻墻)
0x02 鏈路劫持概述
鏈路層劫持是指第三方(可能是運(yùn)營(yíng)商、黑客)通過(guò)在用戶至服務(wù)器之間,植入惡意設(shè)備或者控制網(wǎng)絡(luò)設(shè)備的手段,偵聽(tīng)或篡改用戶和服務(wù)器之間的數(shù)據(jù),達(dá)到竊取用戶重要數(shù)據(jù)(包括用戶密碼,用戶身份數(shù)據(jù)等等)的目的。鏈路層劫持最明顯的危害就是帳號(hào)、密碼被竊取。最常見(jiàn)的就是某些設(shè)備實(shí)現(xiàn)的對(duì)非法站點(diǎn)的訪問(wèn)攔截,以及一些地區(qū)運(yùn)營(yíng)商的網(wǎng)頁(yè)植入廣告行為。
鏈路劫持的原理就是運(yùn)營(yíng)商(也可能是黑客)在用戶訪問(wèn)網(wǎng)站的時(shí)候進(jìn)行竊聽(tīng),獲取用戶訪問(wèn)的目的ip后,然后以這個(gè)ip為source-ip冒充網(wǎng)站給用戶響應(yīng),通常響應(yīng)中會(huì)插入一段JS代碼,這段代碼可能會(huì)讓用戶去get一些非真實(shí)網(wǎng)站資源,最終可能造成真實(shí)頁(yè)面被插入廣告,被蒙層,甚至整頁(yè)面被替換,嚴(yán)重影響用戶體驗(yàn)以及企業(yè)形象。由于鏈路劫持可能通常發(fā)生在last-mile,而last-mile被運(yùn)營(yíng)商牢牢控住,所以這對(duì)監(jiān)測(cè)以及解決問(wèn)題帶來(lái)了巨大的挑戰(zhàn)。劫持原理大概如圖8所示。
圖8
目前發(fā)現(xiàn)的TCP鏈路劫持攻擊一般有兩種形式:中斷訪問(wèn)型(分為單向發(fā)包和雙向發(fā)包)和替換頁(yè)面型。
中斷訪問(wèn)型常見(jiàn)于阻止用戶訪問(wèn)某些網(wǎng)站,如某些設(shè)備禁止用戶訪問(wèn)某些站點(diǎn)、某地運(yùn)營(yíng)商的禁止ADSL多終端上網(wǎng)功能。其原理就是偽造服務(wù)端給用戶發(fā)RST包阻止TCP連接的建立(單向發(fā)包)。某些設(shè)備做得比較狠,在冒充服務(wù)端給用戶發(fā)RST包的同時(shí)也冒充用戶給服務(wù)端發(fā)RST包(雙向發(fā)包)。
替換頁(yè)面型常見(jiàn)于運(yùn)營(yíng)商植入廣告,也有篡改正常網(wǎng)頁(yè)進(jìn)行SEO、騙流量的。最惡劣的莫過(guò)于釣魚(yú),如2011年出現(xiàn)過(guò)的Gmail釣魚(yú)事件以及一些不為人知的釣魚(yú)事件。原理也簡(jiǎn)單,就是在一個(gè)HTTP請(qǐng)求后偽造服務(wù)端的HTTP響應(yīng)給客戶端。
0x03 鏈路劫持判斷依據(jù)
TTL:表現(xiàn)為TCP 報(bào)的 TTL 不一致甚至抖動(dòng)很大。一種情況是跟正常包的ttl相差明顯,就像以上本案例中的那樣;另一種情況是通過(guò)ttl來(lái)判斷操作系統(tǒng)類型,進(jìn)而間接判斷數(shù)據(jù)包是否有異常。
Identification:出現(xiàn)不符合 RFC 標(biāo)準(zhǔn)的情況。對(duì)于給定地址和協(xié)議的ip包來(lái)說(shuō),它的identification應(yīng)該是公差為1的單調(diào)遞增數(shù)列。每一個(gè)IP封包都有一個(gè)16位的唯一識(shí)別碼。當(dāng)程序產(chǎn)生的數(shù)據(jù)要通過(guò)網(wǎng)絡(luò)傳送時(shí)都會(huì)被拆散成封包形式發(fā)送,當(dāng)封包要進(jìn)行重組的時(shí)候這個(gè)ID就是依據(jù)了。標(biāo)識(shí)字段唯一地標(biāo)識(shí)主機(jī)發(fā)送的每一份數(shù)據(jù)報(bào)。通常每發(fā)送一份消息它的值就會(huì)加1。
Banner信息:與已知信息矛盾,如本案例中。
TTL:TTL是 Time To Live的縮寫,該字段指定IP包被路由器丟棄之前允許通過(guò)的最大網(wǎng)段數(shù)量。TTL是IPv4包頭的一個(gè)8 bit字段。
雖然TTL從字面上翻譯,是可以存活的時(shí)間,但實(shí)際上TTL是IP數(shù)據(jù)包在計(jì)算機(jī)網(wǎng)絡(luò)中可以轉(zhuǎn)發(fā)的最大跳數(shù)。TTL字段由IP數(shù)據(jù)包的發(fā)送者設(shè)置,在IP數(shù)據(jù)包從源到目的的整個(gè)轉(zhuǎn)發(fā)路徑上,每經(jīng)過(guò)一個(gè)路由器,路由器都會(huì)修改這個(gè)TTL字段值,具體的做法是把該TTL的值減1,然后再將IP包轉(zhuǎn)發(fā)出去。如果在IP包到達(dá)目的IP之前,TTL減少為0,路由器將會(huì)丟棄收到的TTL=0的IP包并向IP包的發(fā)送者發(fā)送 ICMP time exceeded消息。
TTL的主要作用是避免IP包在網(wǎng)絡(luò)中的無(wú)限循環(huán)和收發(fā),節(jié)省了網(wǎng)絡(luò)資源,并能使IP包的發(fā)送者能收到告警消息。
- //IP部首定義
- typedef struct _ip_hdr
- {
- unsigned char version : 4; //版本
- unsigned char ihl : 4; //首部長(zhǎng)度
- unsigned char tos; //服務(wù)類型
- unsigned short tot_len; //總長(zhǎng)度
- unsigned short id; //標(biāo)志
- unsigned short frag_off; //分片偏移
- unsigned char ttl; //生存時(shí)間
- unsigned char protocol; //協(xié)議
- unsigned short chk_sum; //檢驗(yàn)和
- in_addr src_addr; //源IP地址
- in_addr dst_addr; //目的IP地址
- }ip_hdr;
不同的操作系統(tǒng)環(huán)境TTL值一般是固定的一個(gè)數(shù),常見(jiàn)的是16的倍數(shù),然后每經(jīng)過(guò)一個(gè)節(jié)點(diǎn)減1。一般來(lái)說(shuō)服務(wù)器不會(huì)修改默認(rèn)的TTL值,例如Linux默認(rèn)的TTL為64,Windows默認(rèn)的TTL為128。
下面是默認(rèn)操作系統(tǒng)的TTL:
WINDOWS NT/2000 TTL:128 WINDOWS 95/98 TTL:32 UNIX TTL:255 LINUX TTL:64 WIN7 TTL:64
0x04 解決方案
(1)HTTPS
https是目前應(yīng)對(duì)鏈路劫持用的較多的解決方案。https是加密協(xié)議,我們隨便抓個(gè)http包,發(fā)現(xiàn)http包里面的所有東西都是明文的,這樣就會(huì)被監(jiān)聽(tīng),而https協(xié)議是加密的。
但是光加密還不夠,因?yàn)橹皇莂pplication data被加密了,網(wǎng)絡(luò)層的信息都沒(méi)有被加密,邪惡勢(shì)力依然可以用數(shù)據(jù)包的目的ip作為源ip響應(yīng)用戶。https還有另一大特點(diǎn)是要驗(yàn)證數(shù)字證書,為了確保客戶端訪問(wèn)的網(wǎng)站是經(jīng)過(guò)CA驗(yàn)證的可信任的網(wǎng)站。所以這就幾乎徹底杜絕了鏈路劫持的可能。
但是https也不是如此完美,雖然https解決了諸多安全問(wèn)題,但是對(duì)性能也有著比較大的影響。一是用戶要從http跳轉(zhuǎn)到https,并且要多幾次 TLS的握手,這會(huì)消耗一定的時(shí)間;二是服務(wù)器的壓力也會(huì)增加。除此之外如果使用全站的https,所有頁(yè)面里面的嵌入資源都要改成https,APP的程序也要進(jìn)行相應(yīng)的修改,CDN的所有節(jié)點(diǎn)也必須都支持https并且導(dǎo)入證書。所以全站https并不是一件容易的事情,國(guó)外的Google、 Facebook、Twitter早已支持全站https,但目前國(guó)內(nèi)大多數(shù)公司都沒(méi)有采用全站https的方式。全站https應(yīng)該是未來(lái)互聯(lián)網(wǎng)的趨勢(shì),關(guān)于全站https請(qǐng)參考資料【5】,這里不詳細(xì)闡述了。
(2)加強(qiáng)監(jiān)控與檢測(cè)
目前網(wǎng)上也有一些鏈路劫持檢測(cè)方法,如使用libpcap判斷鏈路層劫持,其原理是在鏈路層劫持的設(shè)備缺少仿造協(xié)議頭中ttl值的程序(或者說(shuō),偽造流量要優(yōu)先真實(shí)流量到達(dá)客戶電腦,所以沒(méi)有機(jī)會(huì)去偽造ttl值)。電腦每收到一個(gè)數(shù)據(jù)包,便交給程序,如果判斷某一IP地址流量的ttl值與該IP前一次流量的ttl值不同且相差5以上,便判定此次流量為在鏈路層中偽造的。有關(guān)代碼請(qǐng)參考【6】。
(3)其他/產(chǎn)品
目前騰訊做的比較領(lǐng)先,有鏈路劫持檢測(cè)的相關(guān)發(fā)明專利。
0x05總結(jié)
鏈路層劫持較為底層,而且很多涉及運(yùn)營(yíng)商行為,所以不可能從根本上來(lái)防止(或者找到運(yùn)營(yíng)商,或者抓住黑客,當(dāng)然運(yùn)營(yíng)商你是戰(zhàn)勝不了的你懂得)。個(gè)人認(rèn)為應(yīng)對(duì)鏈路劫持一般可以考慮幾個(gè)維度:業(yè)務(wù)層面、技術(shù)層面。所有的安全都是為業(yè)務(wù)服務(wù)的,在確保業(yè)務(wù)的前提下,做好安全防護(hù)措施。最重要的是技術(shù)層面加強(qiáng)有效檢測(cè)、監(jiān)控,包括對(duì)有關(guān)攻擊技術(shù)的研究、對(duì)日志流量等數(shù)據(jù)的分析。當(dāng)然,對(duì)企業(yè)來(lái)講,我們只能夠盡量做好自身,對(duì)于我們不可控的因素往往無(wú)能為力??傊?,廣域網(wǎng)一點(diǎn)都不安全,所以敏感信息傳輸一定要加密,還要高強(qiáng)度加密。
就到這里,請(qǐng)各位看官批評(píng)指正。
0x06 參考文獻(xiàn)
【1】:http://security.tencent.com/index.php/blog/msg/10
【2】:http://www.freebuf.com/vuls/62561.html
【3】:http://drops.wooyun.org/tips/11682
【4】:http://drops.wooyun.org/tips/127
【5】:http://blog.jobbole.com/78042/
【6】:http://3.1415926.science/%E7%BC%96%E7%A8%8B%E7%AE%97%E6%B3%95/2015/08/02/libpcap%E6%A3%80%E6%B5%8B%E9%93%BE%E8%B7%AF%E5%B1%82%E5%8A%AB%E6%8C%81/