李華峰,陳 虹
(1.唐山師范學院 計算機系,河北 唐山 063000;2.河北廣電網絡集團 唐山子公司,河北 唐山 063000)
隨著我國經濟的不斷發展,網絡的普及化程度也越來越快。但是由于網絡通信協議本身的不完善性,ARP攻擊頻繁的出現在各個單位的局域網中。ARP攻擊原理是通過偽造IP地址和MAC地址的對應關系來實現的,本身利用了ARP協議的漏洞。由于導致了IP和MAC的錯誤對應,會破壞計算機和交換路由器的ARP路由表。從而導致計算機不能正常聯網,嚴重時可以竊取內網用戶的信息,從而給用戶造成了巨大的損失。
網絡通信協議中,為了能夠在局域網中實現快速的通信,在網絡中的每一臺計算機和交換路由器中都會有一段緩存專門用來保存局域網內的 ARP信息。以此來實現 MAC地址和ARP地址的相互對應。ARP協議規定一個ARP數據包的格式應當包含以下信息:目的地址,源地址,幀類型,硬件類型,協議類型,硬件地址長度,協議地址長度,包類型,發送端MAC,發送端IP,目的MAC,目的IP。[1]
當局域網中任意一個節點(計算機或交換路由設備)需要進行通信時,往往需要向外發送一個ARP包,而其他的通信節點接受到了這個包時,就會把MAC和IP地址的對應關系存入到ARP的緩存表中。以后再需要使用時,直接在緩存表中查詢即可。ARP緩存表由于容量的限制,采用了一種“老化機制”。這樣可以減少ARP緩存表的長度,同時加快查詢的速度。
由于通信協議中,ARP地址協議本身存在著缺陷,ARP表中采用的是動態的更新的方式,同時通信的節點對網絡中的ARP數據包并沒有驗證的機制。當局域網中一個節點修改了本來應該發送的ARP數據包,將其中的源地址,發送端MAC,發送端IP,目的MAC,目的IP數據加以修改,成為了一個欺騙性的數據包,而這個數據包到達其他節點時,往往也更新了這些節點的ARP緩存表。
一個完整的ARP攻擊過程包括:
步驟1:首先攻擊發起節點,需要偽造一個ARP REPLY數據包,將這個數據包中目的地址修改為目標節點,而源地址通常修改為攻擊發起節點的MAC地址,而源IP修改為網關的IP。
步驟2:修改完成以后,在局域網中發送這個數據包。
步驟3:當目標節點接受到這個修改以后的ARP REPLY包,由于采用動態更新的機制,于是會刷新本機的ARP數據表,將(網關IP,網關MAC)刷新成(網關IP,攻擊發起節點的MAC)。
步驟4:當目標節點再次需要訪問外部時,由于所有的數據需要先通過網關,而這時因為目標節點的ARP緩存表中的數據已經被修改,本來的數據就全部發送到了攻擊發起機。
步驟5:攻擊發起機偽造一個ARP REPLY包,在源MAC地址填入攻擊發起機的MAC地址,而源IP部分填入目標節點的IP,目的地址填入網關MAC、IP,然后將這個包發給網關,網關接收到這個偽造的ARP REPLY包后,由于源IP為目標節點的IP,于是在它的ARP緩存表里刷新了一項,將(目標節點的IP,目標節點的MAC)刷新成(目標節點的IP,攻擊發起機的MAC)。
步驟6:這時候外部傳給目標節點的數據包經過網關時,就通通轉發給攻擊發起機。這樣就實現了阻止目標節點上網的目的。將接收到的包,將目的地址部分修改,其它數據不動的再轉發出去,這樣就達到了監聽的目標節點所有的對外數據包[2]。
由于ARP欺騙通常要在局域網內實現,而且必須知道被欺騙的主機的IP地址和MAC地址,所以為了更好的模擬ARP的欺騙,特地設計了掃描模塊,來取得局域網內可以攻擊的目標。掃描模塊效果如圖1。

圖1 IP-Mac掃描結果
采用了線程技術的掃描模塊的AddIPData模塊,主要的實現代碼如下
hostAddress=InetAddress.getByName(host);
hostIP=hostAddress.getHostAddress();
hostName=hostAddress.getHostName();
Process pr=rt.exec("nbtstat -a "+host);
bufReader=new BufferedReader_
(new InputStreamReader(pr.getInputStream()));
physicalAddress="未知";
for(int i=1;i<=30;i++){
line=bufReader.readLine();
if(line!=null && line.indexOf("MAC Address")!= -1 ){
physicalAddress = line.substring(18,35);
System.out.print(physicalAddress);
}
}
基于 ARP欺騙的原理,設計了 ARP欺騙模型并通過Java語言實現,主要包含了下列的4個模塊。
第一個模塊是用來與物理設備的通信的模塊。這個模塊的主要功能是用來取得和網卡等網絡設備的連接。通過編程接口來實現對物理設備的操作。主要代碼如下
private NetworkInterface[] devices;
private NetworkInterface device;
devices=jpcap.getDeviceList();
device=devices[1];
第二個模塊是修改ARP數據包數據的模塊。在這個模塊可以對ARP數據包里的目的地址,源地址,幀類型,硬件類型,協議類型,硬件地址長度,協議地址長度,包類型,發送端MAC,發送端IP,目的MAC,目的IP信息進行各種操作。
EthernetPacket ethPacket=new EthernetPacket();
ethPacket.frametype=EthernetPacket.ETHERTYPE_ARP;
ethPacket.dst_mac=targetMAC;
ethPacket.src_mac=netDevice.mac_address;
arpP.datalink=ethPacket;
第三個模塊是發送ARP包。這個模塊的主要功能修改好了以后的數據包需要發送到目標地址。
第四個模塊用來轉發接收到的ARP包。這個模塊的主要功能將目標計算機的數據包再轉發到網關,以及將從網關得到的數據轉回到目標計算機。執行結果如圖2。

圖2 ARP攻擊實現
針對ARP攻擊的實現機制,本文提出了應對ARP攻擊的可以使用的防范措施:
(1)采用靜態綁定的方式
鑒于ARP攻擊的動態實時的規律,可以采用靜態綁定的方式對ARP攻擊進行防范。將內網IP和MAC靜態綁定,在網內把主機和網關都做IP和MAC綁定,同時在網關也進行靜態綁定。靜態綁定方式的缺點是需要對所有的主機都進行綁定因而需要大量的工作量[3]。
(2)使用專門的防護軟件
最常見的防護軟件就是ARP防火墻,通常采用系統內核層攔截技術和主動防御技術,可解決大部分欺騙、ARP攻擊帶來的問題,從而保證通訊安全(保障通訊數據不被網管軟件/惡意軟件監聽和控制)、保證網絡暢通。
(3)使用具有ARP防護功能的硬件網絡設備。
分析了ARP的病毒攻擊機理以及這些攻擊會給局域網內的用戶帶來的危害,詳細介紹了如何開發一個具有局域網掃描功能的ARP欺騙模型,并針對性地提出防范ARP攻擊的措施。