這裡又牽扯到另外一個問題,去年大概十二月出了一篇文章「 Let Me Github That For You」,提到目前有許多公開的 rails 專案把程式碼放在 github 上,其中包含了剛剛說的 secret_token,也就是說如果有了這個 secret_token,我們便可以自行偽造 session 值。
For most stores, this ID is used to look up the session data on the server, e.g. in a database table. There is one exception, and that is the default and recommended session store - the CookieStore - which stores all session data in the cookie itself (the ID is still available to you if you need it)
翻譯:session_id 就是擺在那邊好看的,你如果要用可以拿去用唷!揪咪 ^.<
解法
關於解決方案,共有兩個面向,一個是使用者如何自救,讓漂流在外面的眾多 session cookie 能夠失效,免得被有心人盜用;另一個是開發者如何從 server 端來修正 CookieStore 帶來的困擾。
最近下載了神魔之塔這款遊戲…orz。
我發現在 Facebook 打廣告還算有用,真的就是因為他出現贊助在我牆上太多次,才決定下載試試看,而且當我意識到的時候,我已經花了整整一天在轉珠上面了,也難怪神魔之塔版會佔據 PTT 熱門看板前幾名,不是沒有道理 XD
我喜歡從應用層的協定來了解一款網路遊戲,了解程式和程式間的溝通,總能更了解開發者的思維。身為一個研究僧,動手來看看神魔之塔的 API 吧!
發現
一開始錄封包還滿訝異的,因為它是走 HTTP,沒有 SSL/TLS 的狀況下很容易被偷走遊戲資訊,而且其 session 好像大喇喇的出現在 GET 參數裡面,如下面一個取得獎賞清單的請求:
前幾天發現手機版 Facebook 多出了『編輯貼文』的功能,才發現最近 Facebook Android App Beta 3.7 版本多了一個 feature:Edit your posts and comments, and tap to see all your changes。目前網頁介面都還沒有看到可以編輯貼文的地方,這很特別,一個 web 起家的服務推出新功能是先從手機版開始!
編輯貼文的功能大家已經期待很久,我特別好奇它的 API 是長什麼樣子,想看看是不是有機會讓 web 版也能搶先使用,所以就從 Facebook 手機端應用程式抓出修改文章的 API,與大家分享。
#!/usr/bin/env ruby#encoding: UTF-8comment=ARGV[0]||"報告學長,完全沒有描述"collect_count=(ARGV[1]||5).to_iraw_data=`/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -s`# log raw_dataFile.open("log/raw.txt",'a')do|file|file.puts"# #{comment}"file.putsraw_dataend# collect all AP info in hashlines=raw_data.split(/[\r\n]/)lines.shiftwifi_info=lines.map{|line|nextif(line[1..32].nil?orline[33..-1].nil?)ssid=line[1..32].stripcols=line[33..-1].split(' ')bssid=cols[0]signal=cols[1].to_ichannel=cols[2].split(',').first.to_iifsignal!=0{ssid:ssid,bssid:bssid,signal:signal,channel:channel}else# parse errornextend}.compact# sort with signalwifi_info.sort_by!{|x|x[:signal]}# log top n AP infotop_wifi=wifi_info.reverse.firstcollect_countputstop_wifiFile.open("log/collect.txt",'a')do|file|file.puts"# #{comment}"top_wifi.eachdo|info|file.puts"gnome-terminal -e \"airbase-ng -c #{info[:channel]} -e '#{info[:ssid]}' -a #{info[:bssid]} $WLANIFACE\" &"endfile.puts"sleep 50"file.puts"killall airbase-ng"endputs"已經新增[#{comment}] #{top_wifi.size} 筆 AP 資訊"
這支程式是 Mac Only,執行後會抓出當下周圍的 AP 資訊,並擷取訊號強度前 n 筆(預設是 5 筆)的 AP,輸出成前面的 shell script 樣式。執行時的畫面大概長這樣:
結論
為了滿足我們想要製造手持裝置是在移動中的效果,可以透過持續偽造不同的 AP 來達成。本文提供了一段可以自動化切換偽造 AP 的 script 範例,還有一支用來收集 AP 資訊的程式。這樣一來,即使在家裡也可以在虛擬的世界啪啪造了!至於這到底有什麼實際上的應用,我也還沒有想到就是了 XD
如同前面所提到,我們需要偽造外部訊號,這可能需要一些硬體裝置。上網查了一下 GPS Signal Generator 一台就是上萬塊,嗯…跳過;要偽造基地台訊號,好像也沒有什麼頭緒(領域不熟)。唯一看起來比較可行的似乎就是從 wifi AP 著手了,而且從上面 Google API query 發現,雖然文件中對 AP 描述的參數很多,但實際上只要丟 macAddress 就可以很準確定位了。所以我猜測,如果手機定位也是這般單純的話,收集其他地方的 AP mac address,並且利用 google API 測試這些 mac address 可以正確查詢到經緯度,用這些 mac address 建幾個假 AP,就能夠成功偽造所在地理位置!
建立好 AP 後,手機上就可以多偵測到三台 SSID 為 TPE-Free Bus、WIFLY、CHT Wi-Fi(HiNet) 的 AP。直接打開 google map,竟然已經在台電大樓旁邊的伯朗咖啡了,距離實際所在地直線距離約六公里 LOL
消除其他 AP 訊號
由於這次實驗的地方是在高樓,其他 AP 訊號本來就比較薄弱,所以直接偽造目的地 AP 就可以成功改變地理位置。
對於怎樣讓手機不要掃到特定 AP 訊號這件事情,我實在沒有什麼特別想法,除非是拿硬體干擾,或是在手機包一圈能削弱無限訊號的材質,這些都有點麻煩。用了 wifi jammer 當關鍵字搜尋,大部分都是利用不斷發送 deauth 封包讓人不能連線,這個動作是能讓人連不到 AP 沒錯,但並不是讓裝置找不到 AP 訊號,那已經是應用層的攻擊而不是實體層的攻擊了。不過還是分享一下怎樣做到 deauth 的,用另一個好朋友 aireplay-ng:
雖然不太方便消除原本的 AP 訊號,但經過測試,放多一點偽造 AP 還是可以成功欺騙的,例如目前手機能夠接受到三個正常 AP 訊號,我們就偽造五六七八個目的地 AP 訊號。這點可以利用 Google Maps Geolocation API 證實,丟五個目的地 AP 資訊和三個真實地 AP 資訊,最後回傳的地點是目的地的經緯度,多數決 :)。而且通常偽造的 AP 訊號都會比較強(你應該是坐在網卡旁邊做實驗吧XD),多少也造成了欺騙的成功率。
結論
本篇目的是為了證實是否可以透過偽造假 AP 的方式,改變手持裝置的地理位置。經過簡單的實驗發現的確能做到這樣的事情,雖然成功的條件稍嫌嚴苛(現在很少 AP 訊號很少的地方了吧!),可能要到樓頂阿或是操場正中央啦!不過還是可以透過偽造多一點 AP 來達成。也許有些人會問為什麼要這麼麻煩做這些事情?一來純研究,二來對某些瘋狂的人來說,這個結果可能會是寶貝吧:p
其實對於真實地理位置欺騙這件事情,心中還有幾個想法,所以標題放了(1),那就期待接下來 shaolin’s 20% time 有沒有做出什麼成果囉!希望能成功,下次見XD