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模型中的位置,更便於理解,如圖:
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具體內容
由於本地ARP快取表是有生存期的,所有每個生命週期結束後,上面的過程會再次重複;
ARP的生存期根據動靜態快取表的不同也有不同。靜態快取表一直儲存,直到計算機重啟;動態快取表項的潛在生命週期是10分鐘,新加入的快取項2分鐘內沒有使用,則該專案過期並被刪除,如果專案在使用,則加2分鐘(生命值…如果專案始終在使用,則又加2分鐘(生命值…直到加滿10分鐘…
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