Shaolin.TW

shaolin's 20% time

Wi-Fi Positioning System 欺騙 (1)

背景

目前手機的定位,一般來說有 全球定位系统(GPS)基地台定位(LBS)wifi定位(WPS)三種。 GPS 是手機接受到衛星訊號算出所在位置。 基地台定位主要是根據手機基地台來決定手機位置,可以透過 Google Maps Geolocation API 把基地台 LAC、CID 等資訊丟去查詢,會得到經緯度資訊。或是這裡直接有介面可以查詢:

參考輸入: MCC: 466 (Taiwan) MNC: 92 (Chungwa) 其他 MCC、MNC 資訊可以上 wikipedia 查詢 LAC、CID 資訊如果是 android 手機可以在撥打電話介面輸入『 * # * # 4 6 3 6 # * # * 』; iphone 手機可以在撥打電話介面輸入『 * 3 0 0 1 # 1 2 3 4 5 # * 』查看

wifi 定位是利用附近 WiFi access point 的資訊(主要是 MAC),去資料庫比對查詢這些 AP 所在位置,並根據 AP 訊號的強弱,推算出手持裝置的位置。同樣的我們也可以用 Google Maps Geolocation API 查詢:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# POST 以下 AP 資訊 (json format),是在台電大樓附近抓到的網路資訊
#  https://www.googleapis.com/geolocation/v1/geolocate?key=API_KEY
{
   "wifiAccessPoints":[
      {
         "macAddress":"78:cd:8e:a6:--:--",
         "signal":-67
      },
      {
         "macAddress":"ce:5d:4e:eb:--:--",
         "signal":-87
      }
   ]
}

Google 會回傳

1
2
3
4
5
6
7
{
   "location":{
      "lat":25.0184355,
      "lng":121.5305968
   },
   "accuracy":150.0
}

回傳的經緯度的位置在這邊,其實離我抓取 AP 資訊的位置非常非常近呢!

如果今天我們想要偽造自己的真實地理位置,最有效的方法,應該是偽造外部的訊號:偽造衛星訊號、偽造基地台訊號或者偽造 WiFi 訊號,讓手機抓到這些訊號後以為自己是在別的地方。我明瞭透過軟體可以直接修改位置,市面上也有很多程式可以做到,但這些程式多半是利用手機 MockLocations 的機制,許多應用程式會去禁止這些行為。所以,基於研究精神,想要去探討是否有其他可以偽造位置的方式。

假設

如同前面所提到,我們需要偽造外部訊號,這可能需要一些硬體裝置。上網查了一下 GPS Signal Generator 一台就是上萬塊,嗯…跳過;要偽造基地台訊號,好像也沒有什麼頭緒(領域不熟)。唯一看起來比較可行的似乎就是從 wifi AP 著手了,而且從上面 Google API query 發現,雖然文件中對 AP 描述的參數很多,但實際上只要丟 macAddress 就可以很準確定位了。所以我猜測,如果手機定位也是這般單純的話,收集其他地方的 AP mac address,並且利用 google API 測試這些 mac address 可以正確查詢到經緯度,用這些 mac address 建幾個假 AP,就能夠成功偽造所在地理位置!

沒想到在 survey 這條路的時候,發現 2008 年已經有人做過一樣的研究 (iPhone and iPod Location Spoofing Attacks)!非常的鉅細靡遺,這篇文章簡單來說,要達成這樣的欺騙,只需要符合兩個條件:

  1. 偽造目的地 AP 環境 (MAC address 符合即可),另外這些 MAC address 必須要能夠從資料庫查詢到,不管是 APPLE, Goole, Skyhook 的 wifi 地理位置資料庫。
  2. 消除目前手機接收到的所有 wifi 訊號,透過發送假訊號塞爆(jam)連線。

OKay!照著這兩條準則實驗看看囉 :p

驗證

偽造 AP

原本的研究用了另外的硬體設備去偽造,似乎有些麻煩。這邊我只用了一張網卡,用軟體控制網卡發送 beacons 封包,一張網卡就可以偽造多個 AP。 使用的軟體是好朋友 airbase-ng,其實也只下了三行指令偽造了三台 AP,是前兩天去台電大樓伯朗咖啡抓來的 AP 資訊

1
2
3
4
5
airbase-ng -c <頻道> -e <欲偽造的 ESSID> -a <欲偽造的 BSSID> <網卡>

airbase-ng -c 11 -e "TPE-Free Bus" -a d8:c7:c8:78:--:-- wlan2
airbase-ng -c 6 -e WIFLY -a 78:cd:8e:a6:--:-- wlan2
airbase-ng -c 1 -e "CHT Wi-Fi(HiNet)" -a ce:5d:4e:eb:--:-- wlan2

建立好 AP 後,手機上就可以多偵測到三台 SSID 為 TPE-Free Bus、WIFLY、CHT Wi-Fi(HiNet) 的 AP。直接打開 google map,竟然已經在台電大樓旁邊的伯朗咖啡了,距離實際所在地直線距離約六公里 LOL

Screenshot_2013-07-13-19-35-55.png

消除其他 AP 訊號

由於這次實驗的地方是在高樓,其他 AP 訊號本來就比較薄弱,所以直接偽造目的地 AP 就可以成功改變地理位置。 對於怎樣讓手機不要掃到特定 AP 訊號這件事情,我實在沒有什麼特別想法,除非是拿硬體干擾,或是在手機包一圈能削弱無限訊號的材質,這些都有點麻煩。用了 wifi jammer 當關鍵字搜尋,大部分都是利用不斷發送 deauth 封包讓人不能連線,這個動作是能讓人連不到 AP 沒錯,但並不是讓裝置找不到 AP 訊號,那已經是應用層的攻擊而不是實體層的攻擊了。不過還是分享一下怎樣做到 deauth 的,用另一個好朋友 aireplay-ng:

1
2
3
aireplay-ng --deauth <次數> -o 1 -a <AP  BSSID> -e <AP  SSID> -c <手持裝置的BSSID> mon0
ex:
aireplay-ng --deauth 9999999 -o 1 -a 11:22:33:44:55:66 -e targetAP -c 77:88:99:00:aa:bb mon0

雖然不太方便消除原本的 AP 訊號,但經過測試,放多一點偽造 AP 還是可以成功欺騙的,例如目前手機能夠接受到三個正常 AP 訊號,我們就偽造五六七八個目的地 AP 訊號。這點可以利用 Google Maps Geolocation API 證實,丟五個目的地 AP 資訊和三個真實地 AP 資訊,最後回傳的地點是目的地的經緯度,多數決 :)。而且通常偽造的 AP 訊號都會比較強(你應該是坐在網卡旁邊做實驗吧XD),多少也造成了欺騙的成功率。

結論

本篇目的是為了證實是否可以透過偽造假 AP 的方式,改變手持裝置的地理位置。經過簡單的實驗發現的確能做到這樣的事情,雖然成功的條件稍嫌嚴苛(現在很少 AP 訊號很少的地方了吧!),可能要到樓頂阿或是操場正中央啦!不過還是可以透過偽造多一點 AP 來達成。也許有些人會問為什麼要這麼麻煩做這些事情?一來純研究,二來對某些瘋狂的人來說,這個結果可能會是寶貝吧:p

其實對於真實地理位置欺騙這件事情,心中還有幾個想法,所以標題放了(1),那就期待接下來 shaolin’s 20% time 有沒有做出什麼成果囉!希望能成功,下次見XD

Wi-Fi positioning system 欺騙 (2) »

Comments