【问题标题】:use of promiscuous mode使用混杂模式
【发布时间】:2014-04-23 12:19:54
【问题描述】:

我在同一个局域网中连接了 3 台笔记本电脑。

第 1 圈:192.168.1.2
第 2 圈:192.168.1.3
第 3 圈:192.168.1.4

我将 lap-1 作为服务器并监听 9333 端口。 lap-2 充当客户端。使用 netcat 我将数据从 lap2 发送到 lap1。我能够在 lap1 中使用 pcap 捕获数据包。我已经使用sudo ifconfig eth0 promisc 打开了混杂模式。同样在pcap_live_open 方法中,我设置了混杂模式标志。

然后我关闭了混杂模式以及pcap_live_open 功能。我仍然能够捕获数据包。

我在谷歌上搜索了混杂模式,我可以推断出,如果设备以混杂模式打开接口,它将能够捕获连接到该网络的所有数据包。

所以考虑到这一点,我将第 3 圈作为服务器,第 2 圈仍然作为客户端。我遵循与上述相同的程序。我在 lap-1 中运行 pcap 可执行文件,希望我能够捕获在 lap-3 和 lap-2 之间传输的数据包,但是在 lap-1 中运行的 pcap 在混杂模式下无法做到这一点。所有 3 圈都连接到同一个网络。

谁能启发我在简单场景中使用混杂模式?

这是我的 pcap 代码: 29988 是 9333 的反向(交换),我只是在寻找那个。

#include <pcap/pcap.h>
#include <stdint.h>

const u_char *packet;  

int main()   
{
   char *dev = "eth0";
   pcap_t *handle;        
   int j=0;
   char errbuf[PCAP_ERRBUF_SIZE];  
   struct bpf_program fp;    
   bpf_u_int32 mask;      
   bpf_u_int32 net;    
   struct pcap_pkthdr header;   
   uint8_t *ip_header_len;
   uint16_t ip_header_len_val;
   uint16_t *port;

   /* Find the properties for the device */
   while (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {
      printf("Couldn't get netmask for device %s: %s\n", dev, errbuf);
      net = 0;
      mask = 0;
   }
   printf("lookedup pcap device: %s\n", dev);

   /* Open the session in promiscuous mode */
   handle = pcap_open_live(dev, BUFSIZ,1,0, errbuf);
   if (handle == NULL) {
      printf("Couldn't open device %s: %s\n", dev, errbuf);
   }
   /* Compile and apply the filter */
   if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
      printf("Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
      pcap_close(handle);
   }
   /*     if (pcap_setfilter(handle, &fp) == -1) {

        printf("Couldn't install filter %s: %s", filter_exp, pcap_geterr(handle));
        return(-1);
    }
    */ 

   /* Grab a packet */
   while ((packet = pcap_next(handle, &header)) != NULL)
   {
      uint16_t *data_size;
      uint16_t size,total_len_val,tcp_header_len_val; 
      char tdata[128];     
      uint8_t *data,*tcp_header_len;
      uint16_t *total_len;

      //ip_proto = (uint8_t *)&packet[9];
      ip_header_len = (uint8_t *)&packet[14];

      ip_header_len_val = (*ip_header_len) & 0x0F;
      ip_header_len_val = ip_header_len_val*4;
      // printf("IP header len val:%d\n",ip_header_len_val);

      port = (uint16_t *)&packet[14+ip_header_len_val+2];
      //printf("port:%d\n",*port);

      total_len = (uint16_t *)&packet[14+2];
      total_len_val = ((*total_len) >> 8) & 0x00FF;
      total_len_val = total_len_val + (((*total_len) << 8) & 0xFF00);
      //total_len_val=*total_len;
      // printf("tot len val:%d\n",total_len_val);
      tcp_header_len = (uint8_t *)&packet[14+ip_header_len_val+12];
      tcp_header_len_val = (*tcp_header_len) & 0xF0;
      tcp_header_len_val = tcp_header_len_val>>4;
      tcp_header_len_val = tcp_header_len_val * 4;
      // printf("tcp header len val:%d\n",tcp_header_len_val);
      size = (total_len_val- ip_header_len_val) - tcp_header_len_val;


      data = (uint8_t *)&packet[14+ip_header_len_val+tcp_header_len_val];

      memset(tdata,0,128);
      mempcpy(tdata,data,size);
      tdata[size]='\0';
      if((*port)==29988)
      {       
         printf("Data Packet:%s\n",tdata);
      }
   }
}

【问题讨论】:

  • 它们是如何连接的?如果您有路由器,它可能只会将数据包发送到正确的端口,因此不会有数据包到达 lap1 进行捕获。
  • 是通过路由器。我将如何测试它?

标签: c linux pcap promiscuous-mode


【解决方案1】:

我希望当您说它们都在同一个网络上时,您的意思是它们连接到同一个以太网交换机。该开关只会将数据发送到以笔记本电脑 1 为目的地的笔记本电脑 1。在过去,通常使用以太网集线器,然后所有流量都流向所有连接的设备,但现在交换机非常便宜,集线器不再常见。如果您能找到一个集线器,那么您可以尝试一下,否则您将只能看到流向您设备的流量。

【讨论】:

  • 我已经通过路由器连接了所有设备。我只需要混杂模式有用的用例
  • 除非您可以将路由器/交换机配置为也将所有流量转发到您正在嗅探的端口,或者您可以找到旧式集线器,否则不会有应用程序。
  • 请参阅the Wireshark Wiki page on Ethernet captures,详细讨论在交换机上捕获时可能遇到的问题以及这些问题的可能解决方案。 (不要假设“路由器”也不是交换机。)
【解决方案2】:

正如 Brad 提到的,路由器知道目标设备连接到哪个端口,所以它只在那里发送数据包。如果你想试试这个,你可以使用 VirtualBox 或 VMware,并在虚拟网络中连接机器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 2012-03-31
    • 2014-01-02
    • 1970-01-01
    • 2012-03-18
    • 2020-07-04
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多