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緩存表

這是一個來自 Stack Overflow 上的Q&A:Android:熱點的ARP表無法探測到所有連接到其上的WiFi設備

另一位作者在讀取本地ARP時也遇到了一點問題Android ARP tables

問題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

發佈了37 篇原創文章 · 獲贊 15 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章