很多汽車保險公司為你提供衛星定位設備,用戶可以把衛星定位設備安裝到私家車上,那在任何時間和地點,都可以追蹤你的私家車位置。
當安裝了衛星定位設備,汽車保險公司可隨時知道你的車到過什麼地方。當然,如果你的私家車被賊人偷了,警方可通過衛星定位更有效找回你的私家車。
汽車保險公司還會提供專門的APP,即使你看不到你的私家車,也能透過手機上的APP知道你的私家車狀況。
接著,我下載了汽車保險公司的安卓版APP,不幸地,APP需要Google Play服務才可以正常運行。我是一個自由及開放源代碼軟件傳播人,我嘗試使用開放源代碼APP來運行保險公司的APP,而不使用Google Play服務。
幸然,我還是一個軟件開發者。現在,我開始分析保險公司APP的APIs,然後使用mitmproxy中間人代理軟件,來開發一個適用于保險公司APP的客戶端代碼。
授權
當運行保險公司APP時,用戶需要授權APP存取你的衛星定位設備位置。
當一開始授權時,APP會要求輸入你的身份證號碼。我填寫了我的身份證號碼,APP就運行以下的代碼:
curl -X POST -d 'BLUCS§§-1' http:///BICServices/BICService.svc/restpostcheckpicf
接著,網頁伺服器端作出請求響應,并存取了你的手機號碼:
2§§§-1
當看到這些凌亂的代碼,得知APP是使用HTTP請求響應,代碼的第一個和最後一個叁數是常量,而這代碼只需要兩個叁數就獲得我的手機號碼。假如我輸入不存在的身份證號碼,會得到以下代碼:
-1§§§-100%
然後,我需要確認手機號碼是否正確。接著,我需要輸入密碼。在之前,我已經透過電郵,向保險公司發送了我預設的密碼。輸入密碼后,APP就運行以下代碼:
curl -X POST -d 'BLUCS§§§§-_unknown---§§2§
§§-1' http:///BICServices/BICService.svc/restpostsmartphoneactivation
接著網頁伺服器端作出以下響應:
0§§
這叁數每次都會改變,這看來是用作識別客戶端的ID。當完成這階段操作,APP就得到授權,全面存取私家車的所有數據。
追蹤私家車位置
我開始實現追蹤汽車的功能,這功能可以存取20個私家車最近到訪過的地點。現在開始分析APP是怎樣存取數據:
curl -X POST -d 'ASS_NEW§§2§-1' http:///BICServices/BICService.svc/restpostlastnpositions
網頁伺服器端作出以下響應:
0§20§§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1---§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----§DD/MM/YYYY HH:mm:SS###0#1#1#1----
沒有header頭,沒有cookie,沒有授權認證?!
沒錯,你的猜想是對的。你只要有私家車的license許可證,就可以存取該私家車的20個最近到訪地點。那有什麼用途,我將會在下文解譯。
我一開始以為,伺服器儲存了我的IP地址,并授權了我的IP地址可儲存該私家車的地點數據。但是,我嘗試使用VPN連接伺服器,居然也能成功存該私家車的地點數據。
然後,我嘗試輸入不存在的私家車license許可證,得到以下響應:
-2§TARGA NON ASSOCIATA%
這表示:數據庫沒有該私家車的license許可證
那麼我們如何獲得其他私家車的license許可證,這很容易實現。所有的私家車license許可證都儲存在保險公司的數據庫,而且這些數據還包括了該車最近到訪過的20個地點。
網頁客戶端
汽車保險公司還提供了網頁端,這網頁端提供了更多功能給用戶。我登入了網頁并開始分析,發現網頁有幾個不同的域名,并且在任何請求響應中,都會使用到用戶的cookie。有一個請求響應值得我關注的,是該請求響應不需要任何認證
curl http:////(S())/NewRemoteAuthentication.aspx?RUOLO=CL&ID=&TARGA=&CONTRATTO=&VOUCHER=
在伺服器請求響應後,網頁客戶端顯示的HTML頁面:
NewRemoteAuthentication
-->
/(S())/NewRemoteAuthentication.aspx?RUOLO=CL&ID=&TARGA=" id="Form1">
self.close
// -->
這里包含一個iframe,而且該iframe還是外部鏈接的!

透過這頁面你可以得到:
關注了該保險公司網站的用戶全名
私家車的品牌和型號
私家車的總行駛里數
私家車的行駛次數
私家車每月行駛了多少次
存取每月行駛的詳細數據
存取每日行駛的詳細數據(經緯度、時間、日期)
存取每月行駛數據(駕駛私家車的頻率)



這里有大量數據,而且這些數據,是從安裝衛星定位設備那刻就開始記錄。
保險公司APP不需要任何認證就可以存取數據庫資料,因此我可以把剛剛已知的叁數填進去,向數據庫請求資料。通常地,數據庫請求不需要知道所有叁數,我只需要刪除一些不必要的叁數,剩下的叁數是我需要的。因此,我可以把代碼簡化成這樣:
curl http:////(S())/NewRemoteAuthentication.aspx?RUOLO=CL&ID=&TARGA=
可這里仍然有。這看來是個數字叁數,我把之前的到得數字叁數填進行,最後可以成功運行。
所以,http:////(S())/NewRicerca.aspx這頁面顯示了所有我想要的數據。但是我們怎樣得到這叁數?
我嘗試刪除這叁數,可是最終只得出一個空白的頁面。
接著,我認為NewRemoteAuthentication.aspx這頁面是負責這個叁數。我嘗試在這頁面刪除這叁數,令我驚喜的是,這頁面跳轉回NewRicerca.aspx這個頁面,而且還自動填寫了這叁數。現在,我可以調用NewRicerca.aspx這頁面來看所有數據庫資料。
結論
你只需要知道私家車的license許可證,就可以存取到該私家車的行駛資料,車主全名,私家車的位置。
我把這漏洞提交給了CERT Nazionale。
該汽車保險公司在這三星期內,已經更新了網頁端的邏輯漏洞。該公司還透過電郵向用戶表示,已經修復了APP手機端的漏洞。而在我向CERT Nazionale提交了漏洞後,舊的網頁端服務在一個半月後已經關閉了。
這是我的猜測,這個漏洞可能已經存在了三年,因為第一代安卓版APP的APIs仍然是使用至今。
|