1. 程式人生 > >Android 平臺上的 ARP 和 ARP欺騙

Android 平臺上的 ARP 和 ARP欺騙

前言:想要做的功能是在Android某個應用中加入arp,使Android手機和指定MAC的裝置進行Socket連線前,能夠向路由請求獲得該MAC對應IP,前提是手機和裝置在同一區域網下。寫一篇非常詳細的學習Android平臺上的ARP的部落格吧。

一、關於ARP

1. ARP概述

百度百科_ARP維基百科_ARP都讀了一下,感覺還是Wikipedia介紹的更細緻深刻

Address Resolution Protocol

Address Resultion Protocol (ARP)是一個通訊協議,用於將網路層地址(如一個IPv4地址)轉換成資料鏈路層實體地址例如乙太網地址(也被稱作MAC地址)。

在Internet Protocol Version 6(IPv6)中,ARP功能由Neighbor Discovery Protocol(NDP)取代

Wikipedia還給出了ARP在網路OSI模型中的位置,更便於理解,如圖:

ARP在因特網協議中的位置

2. ARP過程

ARP是如何執行這個轉換的呢?舉個栗子:

這裡寫圖片描述

同一區域網很多主機,主機0想要知道主機1的MAC,就會在區域網內發一個廣播:“我是IP-0,MAC-0;我想知道IP-1的MAC是多少?”所有收到這個廣播的主機都會進行判斷,如果自己不是IP-1,就丟棄該廣播;主機1則會回覆主機0:“主機0,我是IP-1,我的MAC是MAC-1!”收到回覆後的主機0,更新了自己的本地ARP快取表。主機1的MAC一旦確定,主機0就可以向主機1傳送IP通訊了。

3. ARP具體內容

  1. 由於本地ARP快取表是有生存期的,所有每個生命週期結束後,上面的過程會再次重複;

  2. ARP的生存期根據動靜態快取表的不同也有不同。靜態快取表一直儲存,直到計算機重啟;動態快取表項的潛在生命週期是10分鐘,新加入的快取項2分鐘內沒有使用,則該專案過期並被刪除,如果專案在使用,則加2分鐘(生命值…如果專案始終在使用,則又加2分鐘(生命值…直到加滿10分鐘…

  3. ARP欺騙:ARP是建立在網路中各個主機相互信任的基礎上的,盲目信任難免導致缺陷。ARP請求為廣播形式傳送,網路中的主機可以自主傳送ARP應答,①收到回覆的主機不會檢測該回復的真實性,就直接將其記錄到本地快取表MAC列②ARP協議並不止在傳送ARP請求才接收ARP應答,只要主機接收到ARP應答資料包,就會對本地ARP快取表進行更新。攻擊者們就通過傳送偽ARP回覆報文,纂改主機本地MAC表。

    要更直觀就得上圖(*  ̄3)(ε ̄ *)

    這裡寫圖片描述

二、基於Android平臺的ARP

:幾個簡單的ARP指令

arp 【root】 請求本地arp快取表中ip們的mac

arp -a 【root】同arp

cat 【無需root】 proc/net/arp 檢視快取表

1. Android手機本地ARP快取表

紅米手機上安裝了一個終端模擬器,輸入 cat proc/net/arp 指令:

這裡寫圖片描述

實驗室晚上人好多呢,奇怪的是紅米怎麼快取了那麼多主機的IP和MAC…

同一時段,同一Wifi,另一個華為手機的本地ARP:

這裡寫圖片描述

看到這裡我一個人就想靜靜為什麼差別這麼大( ˇˍˇ )

當主機A要訪問區域網下另一個主機B時,會廣播ARP請求“B(192.168…)的MAC是多少?”收到回覆後存到ARP表,如果一段時間兩者不通訊,刪除本地的IP-MAC對應條目。是不是紅米一直開機,一直撩著周圍的主機呢?(忽然想到我有在一直執行一個ARP欺騙的程式…⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄),關機重啟了紅米還真是的,表裡只有一個AP-IP-MAC項了呢。

第二天又做了個測試,這次用了有root許可權的華為:

(1)關機重啟後,ARP表中僅有AP的IP-MAC

(2)開始執行Droidsheep及ARP欺騙,搜到幾隻正在逛淘寶的小夥伴

這裡寫圖片描述

(3)再次回到模擬終端,cat proc/net/arp,嗯被ARP攻擊的幾隻IP出現了
這裡寫圖片描述

(4)接下來su到許可權,傳送ARP請求,證實是本地ARP表中的幾隻

這裡寫圖片描述

上圖勝於雄辯⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

紅米和華為的ARP表差別這麼大,問題應該來自Droidsheep和本地ARP表是否有清除過吧。

2. 讀取Android手機本地ARP快取表

問題1:作者將Android手機作為熱點,用以下程式碼檢視自己的ARP表,發現大部分裝置都在表中,只有一個奇怪的裝置沒有出現或者可以說是,時隱時現

public ArrayList getClientList(boolean onlyReachables, int reachableTimeout) {
    BufferedReader br = null;
    ArrayList<ClientScanResultSO> result = null;

   try {
        result = new ArrayList<ClientScanResultSO>();
        br = new BufferedReader(new FileReader("/proc/net/arp"));
        String line;
        while ((line = br.readLine()) != null) {
            String[] splitted = line.split(" +");

            if ((splitted != null) && (splitted.length >= 4)) {
                // Basic sanity check
                String mac = splitted[3];
                System.out.println("mac is***************"+ mac);
                if (mac.matches("..:..:..:..:..:..")) {
                    boolean isReachable = InetAddress.getByName(splitted[0]).isReachable(reachableTimeout);
                    String name = InetAddress.getByName(splitted[0]).getHostName();
                    if (!onlyReachables || isReachable) {
                        result.add(new ClientScanResultSO(splitted[0], splitted[3], splitted[5], isReachable, name));
                    }
                }
            }
        }
    } catch (Exception e) {
        Log.e(this.getClass().toString(), e.getMessage());
    } finally {
        try {
            br.close();
        } catch (IOException e) {
            Log.e(this.getClass().toString(), e.getMessage());
        }
    }

    return result;
}

作者的問題可能來自於沒有將 proc/net/arp 檔案中的所有資料完全讀出,也可能和裝置的特殊有關,不過程式碼會是一個很好的栗子:如何讀取手機本地ARP快取表。問題2也給出了相關程式碼。

三、關於DroidSheep

DroidSheep很容易下載到,執行情況在上文中有PO圖,這裡不再贅述

其實類似的發包抓包軟體蠻多的,下一步打算學Shark for root