Использование беспорядочного режима

Я подключил 3 ноутбука в одной локальной сети.

1-й круг: 192.168.1.2
этап 2: 192.168.1.3
круг 3: 192.168.1.4

Я сделал lap-1 в качестве сервера и слушал порт 9333. Lap-2 действует как клиент. Используя netcat, я отправил данные с lap2 на lap1. Я могу захватывать пакеты, используя pcap в lap1. Я включил беспорядочный режим с помощью sudo ifconfig eth0 promisc, Также в pcap_live_open Метод, который я установил флаг случайного режима.

Затем я отключил беспорядочный режим, а также в pcap_live_open функция. Тем не менее я могу захватывать пакеты.

Я погуглил о случайном режиме, и что я могу сделать вывод, если устройство откроет интерфейс в случайном режиме, оно сможет захватывать все пакеты, подключенные к этой сети.

поэтому, учитывая это, я сделал действующий этап 3 в качестве сервера, а этап 2 - в качестве клиента. Я следовал той же процедуре, что и выше. Я запускаю исполняемый файл pcap на круге 1, надеясь, что смогу перехватывать пакеты, передаваемые между кругом 3 и кругом 2, но pcap, работающий на круге 1, не может делать это при включенном беспорядочном режиме. Все 3 круга подключены к одной сети.

Может кто-нибудь просветить меня использование беспорядочного режима с простым сценарием?

Это мой код pcap: 29988 является обратным (swap) 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);
      }
   }
}

2 ответа

Я ожидаю, что когда вы говорите, что все они находятся в одной сети, вы имеете в виду, что они подключены к одному и тому же коммутатору Ethernet. Этот коммутатор будет отправлять данные только на ноутбук1, который предназначен для ноутбука1. В прежние времена, когда было принято использовать концентратор Ethernet, весь трафик направлялся на все подключенные устройства, но теперь коммутатор очень дешев и концентраторы больше не распространены. Если вы можете найти концентратор, то вы можете попробовать это, но в противном случае вы сможете увидеть только трафик, предназначенный для вашего устройства.

Как упоминал Брэд, маршрутизатор знает, к какому порту подключено целевое устройство, поэтому он только отправляет туда пакеты. Если вы хотите попробовать это, вы можете использовать VirtualBox или VMware и подключить машины к виртуальной сети.

Другие вопросы по тегам