Можно ли добавить заголовок Ethernet к пакетным данным, захваченным с помощью pcap? - PullRequest
0 голосов
/ 02 января 2019

По сути, у меня есть попытка перенаправить трафик, я пытаюсь перехватить пакеты, используя pcap, а затем либо отредактировать фрейм Ethernet для пакетов, либо создать новый с другим адресом назначения.

Я знаю, что могу легко создавать фреймы Ethernet с помощью libnet, однако я не уверен, как создать фрейм с помощью libnet и "прикрепить" его к началу пакета.

Я также пытаюсьчтобы сделать это в функции обратного вызова для pcap_loop, который я прикрепил.Если у кого-то есть идеи, это было бы здорово.Заранее спасибо.

void decode(pcap_t* handle, const struct pcap_pkthdr* pkthdr, const u_char* packet)
{
    u_char* ethhead = packet;  //Get Ethernet header
    u_char* iphead = packet+14;  //Skip Ethernet header
    struct ethhdr* eth_header = malloc(ETH_HLEN);
    struct iphdr* ip_header = iphead;
    int len = 6;
    char libbuf[LIBNET_ERRBUF_SIZE];
    memcpy(eth_header, packet, ETH_HLEN);

    libnet_t* l = libnet_init(LIBNET_LINK, "enp6s0", libbuf);
    u_int32_t target_ip = inet_addr("192.168.1.7");
    u_int8_t gateway_mac = libnet_hex_aton("76:b0:65:cd:13:d2", &len);
    u_int8_t target_mac = libnet_hex_aton("d0:b2:f4:12:06:e1", &len);
    u_int8_t this = libnet_get_hwaddr(l);

    if((ip_header->saddr == target_ip) || (ip_header->daddr == target_ip))
    {
      printf("\n----------------------  Caught %d byte packet  ----------------------\n", pkthdr->len);
      dump(packet, pkthdr->len);

      if(eth_header->h_proto != ETH_P_ARP)
      {
        printf("\nEthernet frame:\n");
        printf("Source MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n", ethhead[0],ethhead[1],ethhead[2], ethhead[3],ethhead[4],ethhead[5]);
        printf("Destination MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n", ethhead[6],ethhead[7],ethhead[8], ethhead[9],ethhead[10],ethhead[11]);

        if (*iphead==0x45)  //For IPv4
        {
          printf("\n\nIP Header:\n");
          printf("Version: %i\n", ip_header->version);
          printf("Type of service: %i\n", ip_header->tos);
          printf("Header length: %i\n", ip_header->ihl);
          printf("Total Length: %i\n", ip_header->tot_len);
          printf("Time to live: %d\n", ip_header->ttl);
          printf("Layer-4 protocol %i\n", ip_header->protocol);
          printf("Source host %d.%d.%d.%d\n", iphead[12], iphead[13], iphead[14],iphead[15]);
          printf("Dest host %d.%d.%d.%d\n", iphead[16],iphead[17], iphead[18], iphead[19]);

          if((int)iphead[9] == 6)
          {
            struct tcphdr *tcp_header;
            tcp_header = iphead + ip_header->ihl;
            printf("\n\nTCP Header:\n");
            printf("Source Port: %i\n", tcp_header->source);
            printf("Dest Port: %i\n", tcp_header->dest);
            printf("Sequence Number: %i\n", tcp_header->seq);
            printf("Acknowledgement Number: %i\n", tcp_header->ack_seq);
            printf("URG: %i\n", tcp_header->urg);
            printf("ACK: %i\n", tcp_header->ack);
            printf("PSH: %i\n", tcp_header->psh);
            printf("RST: %i\n", tcp_header->rst);
            printf("SYN: %i\n", tcp_header->syn);
            printf("FIN: %i\n", tcp_header->fin);

            printf("Checksum: %i\n", tcp_header->check);
          }
        }


      printf("\n---------------------------------------------------------------------\n");

      int inject;
      if(ip_header->daddr == target_ip)
      { 
         inject = libnet_autobuild_ethernet(&target_mac, eth_header->h_proto, l);
        if(inject == -1)
          printf("\n\n ----ERROR IN libnet_build_ethernet----");

        libnet_write(l);
        libnet_destroy(l);
      }
      else if(ip_header->saddr == target_ip)
      {
        inject = libnet_autobuild_ethernet(&gateway_mac, eth_header->h_proto, l);
        if(inject == -1)
          printf("\n\n ----ERROR IN libnet_build_ethernet----");
        libnet_write(l);
        libnet_destroy(l);
      }

      free(eth_header);
    }
  }
}

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

...