這幾天瓶子哥所在辦公室電腦一打開網(wǎng)頁全是廣告,而且這個(gè)廣告還是很流氓的那種,直接霸屏,在原網(wǎng)頁上面嵌入了一層js廣告,必須得點(diǎn)擊它才能繼續(xù)瀏覽原始網(wǎng)頁,非常之流氓。氣得我是咬牙切齒,無處訴苦,還有我們經(jīng)常會(huì)發(fā)現(xiàn)打開網(wǎng)站莫名其妙的就被跳轉(zhuǎn)到hao123等網(wǎng)站上去了,后面還帶個(gè)推廣渠道的小尾巴。
今天我就以此為導(dǎo)火線,來分析下網(wǎng)站劫持這點(diǎn)貓膩,讓你洞悉網(wǎng)絡(luò)上的各種坑,以便更好的保護(hù)自己的錢財(cái)隱私不被壞人利用。
現(xiàn)如今網(wǎng)上泛到處泛濫著釣魚網(wǎng)站,頁面小廣告、電商劫持返利,流氓軟件推廣等,很多都通過如下手段實(shí)現(xiàn):
1.DNS劫持
2.中間人劫持
DNS劫持
DNS劫持一般用作釣魚網(wǎng)站,誘導(dǎo)用戶跳轉(zhuǎn)到劫持人預(yù)設(shè)的欺騙性網(wǎng)站,假網(wǎng)站會(huì)和用戶要訪問的網(wǎng)站在外觀上做的基本一模一樣,不細(xì)心觀察就很容易被騙過去,如果用戶警覺性不高,輸入相關(guān)網(wǎng)站的賬號(hào)密碼,則就會(huì)輕而易舉的被劫持人獲取到用戶的個(gè)人信息。
DNS劫持原理:
DNS(域名系統(tǒng))的作用是把網(wǎng)絡(luò)地址(域名,以一個(gè)字符串的形式)對(duì)應(yīng)到真實(shí)的計(jì)算機(jī)能夠識(shí)別的網(wǎng)絡(luò)地址(IP地址),以便計(jì)算機(jī)能夠進(jìn)一步通信,傳遞網(wǎng)址和內(nèi)容等。
比如我們?cè)L問baidu.com的時(shí)候?qū)嶋H上網(wǎng)絡(luò)是通過尋址 111.13.100.92來定位到baidu的web服務(wù)器的。而一般DNS劫持只能在特定的被劫持的網(wǎng)絡(luò)范圍內(nèi)進(jìn)行。
DNS劫持的方式:
一般都是通過各種漏洞、暴力破解等攻陷用戶或企業(yè)的路由器,然后篡改路由器里面的DNS設(shè)置,將DNS修改為劫持者預(yù)設(shè)的DNS服務(wù)器,用戶訪問網(wǎng)站后就很容易被釣魚。
所以我們平時(shí)在設(shè)置密碼時(shí)候一定要復(fù)雜一點(diǎn),避免被它人攻破,這里不做展開講。
今天我們主要講講中間人劫持的技術(shù)和如何用程序來實(shí)現(xiàn)。
簡(jiǎn)單來說,中間人劫持就是劫持者在用戶端和要訪問的服務(wù)器端的中間某個(gè)環(huán)節(jié)通過技術(shù)手段劫持到用戶的訪問流量,然后冒充服務(wù)器和用戶端在兩者之間進(jìn)行數(shù)據(jù)的篡改轉(zhuǎn)發(fā)。這中間可以使用http的302碼暫時(shí)重定向以及200 OK來進(jìn)行數(shù)據(jù)的轉(zhuǎn)發(fā)和響應(yīng),以便實(shí)現(xiàn)自己的業(yè)務(wù)邏輯。
進(jìn)行流量的代理劫持后(均為http劫持,https無法劫持)可以做哪些業(yè)務(wù)呢?,
1.iframe插入小廣告
2.訪問某些網(wǎng)站直接302跳轉(zhuǎn)劫持到其他網(wǎng)站,例如劫持到hao123很普遍。
3.各種電商返利劫持
4.劫持任意.app下載為吸費(fèi)流氓軟件。
5.無限擴(kuò)展。。。。
限于篇幅,這里只演示302如何進(jìn)行上述業(yè)務(wù)的實(shí)現(xiàn)。
1 .原理分析
302重定向原理:
如上圖,客戶端請(qǐng)求A服務(wù)器,A服務(wù)器返回302碼響應(yīng)說請(qǐng)重新到B服務(wù)器訪問資源,客戶端然后重啟發(fā)起向B服務(wù)器請(qǐng)求,B服務(wù)器響應(yīng)返回真正數(shù)據(jù)。
比如在我在安智市場(chǎng)下載一個(gè)今日頭條,下載請(qǐng)求鏈接是:www.anzhi.com/dl_app.php?s=3072998&n=5,緊接著服務(wù)器返回了 HTTP/1.1 302 Moved Temporarily 告訴我需要重定向到Location標(biāo)識(shí)的網(wǎng)址去下載:http://wap.apk.anzhi.com/data5/apk/201812/11/9e592fde5e51ac1b935a8e88dd2901de_06264700.apk。
下面就是安智市場(chǎng)下載apk的一個(gè)302重定向的例子,藍(lán)色箭頭標(biāo)識(shí)重定向。
知道了瀏覽器遵循302跳轉(zhuǎn)這個(gè)功能后,我們中間人劫持就可以冒充服務(wù)器對(duì)客戶發(fā)起的網(wǎng)站請(qǐng)求做302重定向?qū)崿F(xiàn)上述的業(yè)務(wù)功能。
這里我們以實(shí)現(xiàn)訪問http://shop.boqii.com 跳轉(zhuǎn)到 https://www.csdn.net/?TestName=dapingzi 為例演示中間人劫持,302重定向到csdn網(wǎng)站。
2.代碼實(shí)現(xiàn):
代碼實(shí)現(xiàn)過程之前我們先看下需要的技術(shù)要求:
1)首先要劫持掉用戶的流量,比如通過技術(shù)手段攻破用戶的路由器,或者利用免費(fèi)wifi來吸引用戶連接上我們的網(wǎng)絡(luò)。
2) 在路由器上部署嗅探程序。
下面為了方便,我利用本機(jī)電腦ubuntu下模擬路由器來實(shí)現(xiàn)中間人劫持。
程序的技術(shù)要求:
1)利用原始套接字開啟混雜模式進(jìn)行HTTP流量嗅探。
2)HTTP請(qǐng)求報(bào)文的解包。
3) 解析出應(yīng)用層數(shù)據(jù),分析特征網(wǎng)址,匹配要做業(yè)務(wù)的網(wǎng)址。
4)按照HTTP協(xié)議封裝302重定向報(bào)文,將302應(yīng)用層報(bào)文再次進(jìn)行原始報(bào)文組包,調(diào)換源目的IP地址,然后發(fā)送包出去,完成整個(gè)業(yè)務(wù)邏輯。
代碼片段實(shí)現(xiàn):
1)原始套接字進(jìn)行http流量嗅探
創(chuàng)建原始套接字
int socket_fd = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));if(socket_fd < 0){dbg_printf("socket is fail! ");return(-1);}
過濾HTTP GET請(qǐng)求
struct sock_fprog prog;prog.len = sizeof(tcp_filters)/sizeof(tcp_filters[0]);prog.filter = tcp_filters;ret = setsockopt(socket_fd,SOL_SOCKET,SO_ATTACH_FILTER,&prog,sizeof(prog));if(0 != ret){dbg_printf("setsockopt is fail! ");goto out;}
開啟混雜模式
struct packet_mreq mr;memset(&mr,0,sizeof(mr));mr.mr_ifindex = id;mr.mr_type =(on_off) ? PACKET_MR_PROMISC : PACKET_DROP_MEMBERSHIP;ret = setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,&mr,sizeof(mr));
通過select 監(jiān)聽獲取http報(bào)文
ret = select(raw_socket_fd+1, &rfds, NULL, NULL,NULL);
2)HTTP數(shù)據(jù)報(bào)文解包
這里利用以太網(wǎng)頭部(struct ethhdr *eth ),ip頭部(struct iphdr *iph),tcp頭部(struct tcphdr *tcph )來進(jìn)行報(bào)文解析解包,最后得到應(yīng)用層HTTP數(shù)據(jù)報(bào)文。參照網(wǎng)絡(luò)協(xié)議數(shù)據(jù)報(bào)文格式解包就行了,具體過程不再累述。
3)HTTP頭部解析
HTTP頭部由多個(gè)字段組成,例如我們?cè)L問shop.boqii.com后http請(qǐng)求報(bào)文頭部字段如下
我們這里只是簡(jiǎn)單的要獲取到用戶請(qǐng)求網(wǎng)址的url,因此只需要解析出HOST和URL字段。這里大家可以使用開源的httpparser來進(jìn)行http協(xié)議格式的解析。
上述的host:shop.boqii.com, url:/,匹配到shop.boqii.com/這個(gè)用戶請(qǐng)求后,就可以做業(yè)務(wù)了。
4)302響應(yīng)組包
劫持到用戶這個(gè)請(qǐng)求后(演示網(wǎng)站為shop.boqii.com),我們要做的業(yè)務(wù)是重定向到csdn網(wǎng)站,按照http協(xié)議格式來組包302響應(yīng)格式:
"HTTP/1.1 302 Moved Temporarily ""Location: https://www.csdn.net/?TestName=dapinzi ""Content-Type: text/html; charset=iso-8859-1 ""Content-length: 0 ""Cache-control: no-cache ""Connection:close "" ";
5)將應(yīng)用層的302數(shù)據(jù)再次封包,調(diào)換源目的IP地址,發(fā)包出去。
將302響應(yīng)數(shù)據(jù)再次按照tcp/ip/以太網(wǎng)幀格式封包后,調(diào)換源目的IP地址然后發(fā)包出去,達(dá)到冒充服務(wù)器端進(jìn)行數(shù)據(jù)回應(yīng)。成功劫持用戶請(qǐng)求。
限于篇幅影響,這里就不做過多技術(shù)講解,雖然看似功能不太復(fù)雜,但是用到的技術(shù)細(xì)節(jié)還是比較多的,喜歡的話,老鐵們可以關(guān)注瓶子哥一波哈,后面更多精彩的文章等著你。
具體的演示效果如下:
(暈,這里好像傳不了視頻,如果干興趣的話可以看我公眾號(hào)的這篇文章,視頻演示還是比較有意思)
上面視頻完成如下測(cè)試功能,mtop程序沒有運(yùn)行前,能夠正常訪問shop.boqii.com ,www.anzhi.com, m.2345.com網(wǎng)站,開啟mtop程序后,
1)shop.boqii.com 跳轉(zhuǎn)到 http://www.anzhi.com?TestName=dapingzi 并且?guī)Я藗€(gè)大瓶子尾巴
2)訪問m.2345.com / www.anzhi.com 返回給用戶:“哈哈,哥們兒,你被黑了?。?!
至此,完成一個(gè)簡(jiǎn)單的流量劫持,事實(shí)上,如果劫持了用戶的流量,黑客做的事情可能就不會(huì)像瓶子哥這么友善了哈,比如推廣病毒軟件,電商推廣,廣告,利用會(huì)話劫持獲取用戶的cookie,登錄賬戶等。
所以作為一個(gè)普通的用戶而言,面對(duì)中間人的潛在威脅,也需要提高自己的安全防范意識(shí),平時(shí)的密碼要設(shè)置級(jí)別高點(diǎn),不要輕易接入公共場(chǎng)所免費(fèi)wifi,而且要盡量使用https鏈接來訪問網(wǎng)站,提高警惕性。對(duì)于異常的SSL證書也要格外的小心,尤其是在涉及到金錢交易的時(shí)候,更加需要小心謹(jǐn)慎,避免落入他人的陷進(jìn)之中。