簡(jiǎn)述會(huì)話劫持攻擊的兩種形式
所謂會(huì)話劫持攻擊,就是結(jié)合了嗅探以及欺騙技術(shù)在內(nèi)的攻擊手段。比如在一次正常的會(huì)話當(dāng)中,攻擊者也作為第三方參與在其中,不過他并不參與對(duì)話而是將兩方進(jìn)行對(duì)話所傳送的數(shù)據(jù)包中插入惡意數(shù)據(jù),當(dāng)然也可以對(duì)雙方的對(duì)話進(jìn)行監(jiān)聽甚至冒充為其中一方進(jìn)行對(duì)話的接管。
我們可以把會(huì)話劫持攻擊分為兩種類型:1、中間人攻擊(Man In The Middle,簡(jiǎn)稱MITM),2、注射式攻擊(Injection)
MITM攻擊簡(jiǎn)介
這也就是我們常說的“中間人攻擊”,在網(wǎng)上討論比較多的就是SMB會(huì)話劫持,這也是一個(gè)典型的中間人攻擊。要想正確的實(shí)施中間人攻擊,攻擊者首先需要使用ARP欺騙或DNS欺騙,將會(huì)話雙方的通訊流暗中改變,而這種改變對(duì)于會(huì)話雙方來(lái)說是完全透明的。關(guān)于ARP欺騙黑客防線介紹的比較多,網(wǎng)上的資料也比較多,我就不在多說了,我只簡(jiǎn)單談?wù)凞NS欺騙。DNS(Domain Name System),即域名服務(wù)器,我們幾乎天天都要用到。對(duì)于正常的DNS請(qǐng)求,例如在瀏覽器輸入www.hacker.com.cn,然后系統(tǒng)先查看Hosts文件,如果有相對(duì)應(yīng)的IP,就使用這個(gè)IP地址訪問網(wǎng)站(其實(shí),利用Hosts文件就可以實(shí)現(xiàn)DNS欺騙);如果沒有,才去請(qǐng)求DNS服務(wù)器;DNS服務(wù)器在接收到請(qǐng)求之后,解析出其對(duì)應(yīng)的IP地址,返回給我本地,最后你就可以登陸到黑客防線的網(wǎng)站。而DNS欺騙則是,目標(biāo)將其DNS請(qǐng)求發(fā)送到攻擊者這里,然后攻擊者偽造DNS響應(yīng),將正確的IP地址替換為其他IP,之后你就登陸了這個(gè)攻擊者指定的IP,而攻擊者早就在這個(gè)IP中安排好了惡意網(wǎng)頁(yè),可你卻在不知不覺中已經(jīng)被攻擊者下了“套”……DNS欺騙也可以在廣域網(wǎng)中進(jìn)行,比較常見的有“Web服務(wù)器重定向”、“郵件服務(wù)器重定向”等等。但不管是ARP欺騙,還是DNS欺騙,中間人攻擊都改變正常的通訊流,它就相當(dāng)于會(huì)話雙方之間的一個(gè)透明代理,可以得到一切想知道的信息,甚至是利用一些有缺陷的加密協(xié)議來(lái)實(shí)現(xiàn)。
注射式攻擊簡(jiǎn)介
這種方式的會(huì)話劫持攻擊持比中間人攻擊實(shí)現(xiàn)起來(lái)簡(jiǎn)單一些,它不會(huì)改變會(huì)話雙方的通訊流,而是在雙方正常的通訊流插入惡意數(shù)據(jù)。在注射式攻擊中,需要實(shí)現(xiàn)兩種技術(shù):1)IP欺騙,2)預(yù)測(cè)TCP序列號(hào)。如果是UDP協(xié)議,只需偽造IP地址,然后發(fā)送過去就可以了,因?yàn)閁DP沒有所謂的TCP三次握手,但基于UDP的應(yīng)用協(xié)議有流控機(jī)制,所以也要做一些額外的工作。對(duì)于IP欺騙,有兩種情況需要用到:1)隱藏自己的IP地址;2)利用兩臺(tái)機(jī)器之間的信任關(guān)系實(shí)施入侵。在Unix/Linux平臺(tái)上,可以直接使用Socket構(gòu)造IP包,在IP頭中填上虛假的IP地址,但需要root權(quán)限;在Windows平臺(tái)上,不能使用Winsock,需要使用Winpacp(也可以使用Libnet)。例如在Linux系統(tǒng),首先打開一個(gè)Raw Socket(原始套接字),然后自己編寫IP頭及其他數(shù)據(jù)。可以參考下面的實(shí)例代碼:
sockfd = socket(AF_INET, SOCK_RAW, 255);
setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
struct ip *ip;
struct tcphdr *tcp;
struct pseudohdr pseudoheader;
ip->ip_src.s_addr = xxx;
pseudoheader.saddr.s_addr = ip->ip_src.s_addr;
tcp->check = tcpchksum((u_short *)&pseudoheader,12+sizeof(struct tcphdr));
sendto(sockfd, buf, len, 0, (const sockaddr *)addr, sizeof(struct sockaddr_in));
對(duì)于基于TCP協(xié)議的注射式會(huì)話劫持攻擊,攻擊者應(yīng)先采用嗅探技術(shù)對(duì)目標(biāo)進(jìn)行簡(jiǎn)聽,然后從簡(jiǎn)聽到的信息中構(gòu)造出正確的序列號(hào),如果不這樣,你就必須先猜測(cè)目標(biāo)的ISN(初始序列號(hào)),這樣無(wú)形中對(duì)會(huì)話劫持加大了難度。
【編輯推薦】





















