Python黑帽编程 3.1 ARP欺骗
Posted 玄魂工作室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python黑帽编程 3.1 ARP欺骗相关的知识,希望对你有一定的参考价值。
Python灰帽编程 3.1 ARP欺骗
ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据监听、篡改、重放、钓鱼等攻击方式。
在进行ARP欺骗的编码实验之前,我们有必要了解下ARP和ARP欺骗的原理。
3.1.1 ARP和ARP欺骗原理
ARP是地址转换协议(Address Resolution Protocol)的英文缩写,它是一个链路层协议,工作在OSI 模型的第二层,在本层和硬件接口间进行联系,同时对上层(网络层)提供服务。我们知道二层的以太网交换设备并不能识别32位的IP地址,它们是以48位以太网地址(就是我们常说的MAC地址)传输以太网数据包的。也就是说IP数据包在局域网内部传输时并不是靠IP地址而是靠MAC地址来识别目标的,因此IP地址与MAC地址之间就必须存在一种对应关系,而ARP协议就是用来确定这种对应关系的协议。
ARP工作时,首先请求主机会发送出一个含有所希望到达的IP地址的以太网广播数据包,然后目标IP的所有者会以一个含有IP和MAC地址对的数据包应答请求主机。这样请求主机就能获得要到达的IP地址对应的MAC地址,同时请求主机会将这个地址对放入自己的ARP表缓存起来,以节约不必要的ARP通信。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除。
局域网上的一台主机,如果接收到一个ARP报文,即使该报文不是该主机所发送的ARP请求的应答报文,该主机也会将ARP报文中的发送者的MAC地址和IP地址更新或加入到ARP表中。
ARP欺骗攻击就利用了这点,攻击者主动发送ARP报文,发送者的MAC地址为攻击者主机的MAC地址,发送者的IP地址为被攻击主机的IP地址。通过不断发送这些伪造的ARP报文,让局域网上所有的主机和网关ARP表,其对应的MAC地址均为攻击者的MAC地址,这样所有的网络流量都会发送给攻击者主机。由于ARP欺骗攻击导致了主机和网关的ARP表的不正确,这种情况我们也称为ARP中毒。
根据ARP欺骗者与被欺骗者之间的角色关系的不同,通常可以把ARP欺骗攻击分为如下两种:
1. 主机型ARP欺骗:欺骗者主机冒充网关设备对其他主机进行欺骗
2. 网关型ARP欺骗:欺骗者主机冒充其他主机对网关设备进行欺骗
图2
其实很多时候,我们都是进行双向欺骗,既欺骗主机又欺骗网关。
了解了基本原理之后,我们下面动手实现ARP欺骗程序。
3.1.2 基本网络信息
首先,我们来查看下当前虚拟机Kali Linux的网络配置和ARP缓存。
图3
如图5所示,Kali Linux 以太网卡为eth0,ip地址为192.168.1.102,MAC地址为00:0c:29:6e:98:a6。下面我们再查看Kali Linux的ARP缓存。
图4
下面再用同样的方法查看Windows 系统的信息。
图5
windows本身地址为192.168.1.18,同样缓存了路由器的地址。
下面我们将windows所在主机作为靶机,将Kali Linux所在虚拟机作为攻击机,进行编程测试。
3.1.3 构造ARP欺骗数据包
我们先完成第一个目标,告诉目标主机192.168.1.18网关的地址为Kali Linux所在主机的地址:192.168.1.102。
在程序的顶部,我们先导入scapy。
import sys
import time
from scapy.all import (
get_if_hwaddr,
getmacbyip,
ARP,
Ether,
sendp
)
注意这里面的几个方法,get_if_hwaddr为获取本机网络接口的函数,getmacbyip是通过ip地址获取其Mac地址的方法,ARP是构建ARP数据包的类,Ether用来构建以太网数据包,sendp方法在第二层发送数据包。
我们先解下Ether的参数:
图6
dst : DestMACField = (None)
src : SourceMACField = (None)
type : XShortEnumField = (36864)
构造一个以太网数据包通常需要指定目标和源MAC地址,如果不指定,默认发出的就是广播包,例如:
图7
再来了解下ARP类构造函数的参数列表:
图8
hwtype : XShortField = (1)
ptype : XShortEnumField = (2048)
hwlen : ByteField = (6)
plen : ByteField = (4)
op : ShortEnumField = (1)
hwsrc : ARPSourceMACField = (None)
psrc : SourceIPField = (None)
hwdst : MACField = (\'00:00:00:00:00:00\')
pdst : IPField = (\'0.0.0.0\')
构造ARP需要我们注意的有5个参数:
l op。取值为1或者2,代表ARP请求或者响应包。
l hwsrc。发送方Mac地址。
l psrc。发送方IP地址。
l hwdst。目标Mac地址。
l pdst。目标IP地址。
定向欺骗
现在来构造数据包就很容易了,回到我们最初的目标,我们想告诉192.168.1.23这台主机网关地址为192.168.1.102所在的主机,构造的数据包应该是这样的:
pkt = Ether(src=[1.102的MAC], dst=[1.18的Mac]) / ARP(1.102的MAC, 网关IP地址, hwdst=1.18MAC, pdst=1.18IP地址, op=2)
上面的代码我们不论是以太网数据包还是ARP数据包,我们都明确指定了来源和目标,在ARP数据包中,我们将Kali Linux的Mac地址和网关的IP地址进行了绑定,op取值为2,作为一个响应包被1. 18接到,这样1. 18会更新自己的ARP缓存表,造成中毒,从而1. 18发往网关的数据包都会被发往1.102。
那么我们如果要欺骗网关,把网关发往1.18的数据包都发送到Kali Linux(1.102)上,根据上面的代码稍作修改即可:
pkt = Ether(src=[1.102的MAC], dst=[网关的Mac]) / ARP(1.102的MAC, 1. 18地址, hwdst=网关MAC, pdst=网关IP地址, op=2)
上面构造的两个数据包都是ARP响应包,其实发送请求包也可以进行毒化,请求包毒化的原理是,我们请求时候使用假的源IP和MAC地址,目标主机同样会更新自己的路由表。
ARP请求的方式欺骗主机,构造的ARP包如下:
pkt = Ether(src=[1.102的MAC], dst=[1. 18的Mac]) / ARP(1.102的MAC, 网关IP地址, hwdst=1. 18MAC, pdst=1. 18IP地址, op=1)
ARP请求的方式欺骗网关,构造的ARP包如下:
pkt = Ether(src=[1.102的MAC], dst=[网关的Mac]) / ARP(1.102的MAC, 1. 18地址, hwdst=网关MAC, pdst=网关IP地址, op=1)
我们看到构造ARP请求和响应的主要区别在op的值。
目前我们欺骗的方式都是一对一欺骗的,事实上我们可以发送广播包,对所有主机进行欺骗。
广播欺骗
广播欺骗,首先以太网数据包直接构造一个广播包,ARP包不用填写目标主机的信息即可。
下面是ARP广播响应包的构造方式:
pkt = Ether(src=mac, dst=\'ff:ff:ff:ff:ff:ff\') python scapy的用法之ARP主机扫描和ARP欺骗