Android開(kāi)啟USB調(diào)試可以做到什么程度的攻擊
0x01 初衷以及適用場(chǎng)景
android的usb調(diào)試模式本是為開(kāi)發(fā)者而設(shè)計(jì)的,開(kāi)發(fā)者在應(yīng)用開(kāi)發(fā)的過(guò)程中可用其對(duì)應(yīng)用進(jìn)行調(diào)試或測(cè)試。
adb提供一系列有助于開(kāi)發(fā)的功能,例如應(yīng)用安裝與卸載,備份與恢復(fù),日志的輸出與過(guò)濾,并且,它還提供一個(gè)權(quán)限相當(dāng)可觀的、很人性化的adb shell。
除開(kāi)發(fā)者外,逆向分析人員在對(duì)應(yīng)用進(jìn)行逆向分析以及動(dòng)態(tài)調(diào)試的時(shí)候,也會(huì)使用到adb接口,例如通過(guò)該接口對(duì)so或者smali進(jìn)行動(dòng)態(tài)調(diào)試與跟蹤,動(dòng)態(tài)對(duì)一些功能性的代碼進(jìn)行驗(yàn)證等等。
然而便利性與安全性在一定程度上是成反比的,在其豐富的功能之下,也存在著一系列安全問(wèn)題。
0x02 adb的信息泄露與權(quán)限泄露問(wèn)題
如果應(yīng)用在發(fā)布時(shí),沒(méi)有把logcat所輸出的調(diào)試信息刪除掉,那么很有可能造成敏感信息的泄露,輕微的情況,例如logcat可能打印出應(yīng)用所訪問(wèn)的網(wǎng)頁(yè)鏈接或者一些其它的中間變量,重則可能把賬號(hào)密碼也給泄露出來(lái),畢竟安卓開(kāi)發(fā)門(mén)檻低,開(kāi)發(fā)者水平難免參差不齊。
為了方便調(diào)試,開(kāi)發(fā)者甚至可能會(huì)這么寫(xiě):
安卓logcat信息泄露的情況在曾經(jīng)的烏云上披露過(guò)很多起,例如:
WooYun: 途牛網(wǎng)app logcat信息泄露用戶的同團(tuán)聊的聊天內(nèi)容
WooYun: 沖浪瀏覽器logcat出用戶短信
WooYun: 杭州銀行Android客戶端登錄賬號(hào)密碼信息本地泄露
此外,當(dāng)前市面上很多安卓應(yīng)用漏洞掃描平臺(tái)也會(huì)著重把logcat的濫用掃描出來(lái)呈現(xiàn)于報(bào)告中,例如騰訊金剛審計(jì)系統(tǒng)、阿里聚安全、360顯危鏡(前捉蟲(chóng)獵手)等。這也從側(cè)面體現(xiàn)了這個(gè)問(wèn)題的普遍性。
除了開(kāi)發(fā)者的失誤之外,adb本身的設(shè)計(jì)方面也有一些瑕疵,曾經(jīng)有一篇論文專門(mén)對(duì)該問(wèn)題進(jìn)行過(guò)研究:《Bittersweet ADB : Attacks and Defenses》。
通過(guò)ADB或者一個(gè)申請(qǐng)了ADB權(quán)限的Android應(yīng)用程序,可以在不申請(qǐng)權(quán)限的情況下監(jiān)控短信、電話記錄等隱私信息,監(jiān)控/模擬屏幕點(diǎn)擊事件,訪問(wèn)其它應(yīng)用程序的私有目錄,對(duì)Android設(shè)備進(jìn)行DoS攻擊等。
而上述行為大部分可以通過(guò)adb shell dumpsys命令得到,更具體內(nèi)容可查看參考鏈接[2]。
0x03 安卓備份問(wèn)題
這是一個(gè)相當(dāng)古老的問(wèn)題了,在低版本的安卓系統(tǒng)中,在對(duì)某個(gè)應(yīng)用進(jìn)行備份操作時(shí),會(huì)將其私有數(shù)據(jù)一并給備份出來(lái),然后即可通過(guò)特定的工具把它們提取出來(lái),如下圖:
那么應(yīng)用的私有數(shù)據(jù)中一般有些什么?首先便會(huì)有個(gè)人的身份憑證,或者是賬號(hào)密碼或者是別的憑證,一般應(yīng)用對(duì)私有數(shù)據(jù)是比較有信心的,畢竟它被稱為“私有數(shù)據(jù)”,因而挺多應(yīng)用都直接明文存著,有些雖然有加密處理,但是通過(guò)對(duì)應(yīng)用的逆向分析,即可將數(shù)據(jù)進(jìn)行解密,例如從某客戶端中backup出的內(nèi)容中含有如下文件:
通過(guò)對(duì)apk進(jìn)行逆向可發(fā)現(xiàn)其解密過(guò)程,照著解密類與方法抄一遍即可解密:
又如微信的數(shù)據(jù)庫(kù),有文章曾分析過(guò)微信數(shù)據(jù)庫(kù)的加密過(guò)程,并給出了其加密密鑰的生成方式,如果微信本地?cái)?shù)據(jù)庫(kù),uin,imei同時(shí)被拿到,便可根據(jù)后兩者算出數(shù)據(jù)庫(kù)的加密密鑰,并對(duì)加密后的數(shù)據(jù)庫(kù)進(jìn)行解密,這時(shí)你的所有聊天記錄都直接曬在太陽(yáng)下了。
除了直接手動(dòng)解密數(shù)據(jù)以外,還可以將這些數(shù)據(jù)通過(guò)adb restore原封不動(dòng)地恢復(fù)到另一個(gè)手機(jī)上,從而進(jìn)行身份偽造,例如droidsec上的文章《兩分鐘竊取身邊女神微博帳號(hào)》(參考鏈接[4])
有人注意到在使用adb backup時(shí)需要手動(dòng)點(diǎn)擊確認(rèn)才可進(jìn)行備份,如果攻擊者沒(méi)有機(jī)會(huì)點(diǎn)擊屏幕,就沒(méi)有問(wèn)題了,不過(guò)安卓有個(gè)機(jī)制叫做輸入輸出子系統(tǒng),在adb shell 下可以執(zhí)行sendevent命令,可以模擬各種用戶輸入,具體每種機(jī)型不一樣,在我的機(jī)器上發(fā)送如下event便可模擬點(diǎn)擊允許操作:
- #EV_KEY BTN_TOUCH DOWN
- sendevent /dev/input/event7 1 330 1
- #EV_ABS ABS_MT_POSITION_X 366
- sendevent /dev/input/event7 3 53 366
- #EV_ABS ABS_MT_POSITION_Y 690
- sendevent /dev/input/event7 3 54 690
- #EV_SYN SYN_REPORT 00000000
- sendevent /dev/input/event7 0 0 0
- #EV_KEY BTN_TOUCH UP
- sendevent /dev/input/event7 1 330 0
- #EV_SYN SYN_REPORT 00000000
- sendevent /dev/input/event7 0 0 0
0x04 通過(guò)adb種馬
既然通過(guò)adb可以安裝應(yīng)用,而且還是靜默的,那么自然也可以在用戶沒(méi)有感知的情況下給你種個(gè)馬。
不過(guò)一般的馬可能并沒(méi)有圖標(biāo)與界面等等增加被發(fā)現(xiàn)幾率的東西,而沒(méi)有被launch過(guò)的應(yīng)用是不能運(yùn)行的,也就是說(shuō)它們所注冊(cè)的BroadcastReceiver都是收不到東西的, 它需要一個(gè)喚醒的過(guò)程。
所幸adb shell也可以實(shí)現(xiàn)這個(gè)喚醒過(guò)程,通過(guò)adb shell am命令可以啟動(dòng)特定應(yīng)用包的特定組件,如此小馬就可以成功跑起來(lái)了。
當(dāng)然,如果攻擊者有更強(qiáng)勁的方式,例如直接adb push一個(gè)exploit上去,提權(quán)到root,就更加簡(jiǎn)單粗暴了。
0x05 惡意代碼注入
這種手段就相對(duì)優(yōu)雅一些了,在連接usb調(diào)試的情況下,可以通過(guò)一系列命令,向手機(jī)上已安裝的應(yīng)用中注入一段自定義的惡意代碼,這段代碼可以是簡(jiǎn)單地彈一聲問(wèn)候,也可以是非常復(fù)雜的遠(yuǎn)控。
為了進(jìn)一步增加可信度,可以選本來(lái)就申請(qǐng)了很高權(quán)限的應(yīng)用進(jìn)行注入,例如對(duì)一款通訊錄管理軟件進(jìn)行注入后,它請(qǐng)求讀取你的聯(lián)系人列表,看起來(lái)沒(méi)毛病。
盡管學(xué)術(shù)界與工業(yè)界有很多防止重打包的措施,但是在實(shí)際測(cè)試中,這種攻擊手段的成功率著實(shí)不低,并且,就算對(duì)某個(gè)應(yīng)用注入失敗了,最粗暴的方法還可以pm list packages -3把所有的包都列出來(lái)都搞一遍試試。
以下我自己寫(xiě)了一個(gè)簡(jiǎn)單的程序,對(duì)開(kāi)啟USB調(diào)試的手機(jī)上某應(yīng)用注入一段metasploit meterpreter http reverse shell的payload,整個(gè)過(guò)程中不需要對(duì)手機(jī)進(jìn)行任何操作,大體工作流程如下:
當(dāng)再次點(diǎn)擊注入后的應(yīng)用之后,在監(jiān)聽(tīng)服務(wù)器上開(kāi)啟的handler上即可接收到一個(gè)meterpreter的shell :
以上,便可在服務(wù)端對(duì)安卓應(yīng)用進(jìn)行遠(yuǎn)程控制了,拿到Android meterpreter shell之后,可以做的事情很多,包括隱私竊取、發(fā)送短信,打開(kāi)網(wǎng)頁(yè),截圖、照相。
甚至,可以調(diào)用你的前置后置攝像頭進(jìn)行實(shí)時(shí)監(jiān)控。
所支持的部分指令如下:
0x06 最后
在4.4以后的安卓版本,若要連接android設(shè)備上的adbd,需要對(duì)host機(jī)器進(jìn)行指紋的驗(yàn)證,這在很大程度上又降低了通過(guò)這些方式被攻擊的可能性。不過(guò)如今PC上的安卓管理軟件都是大力提倡你打開(kāi)usb調(diào)試,甚至?xí)徊揭徊浇棠阍趺创蜷_(kāi),因此還是會(huì)有相當(dāng)大一部分人暴露在此風(fēng)險(xiǎn)之下。
如上可見(jiàn),通過(guò)adb可以做的事情還是很多的,以上只是列舉了一部分,并且是當(dāng)前常用的一些小手段,想要完全防止被上述手段攻擊,最簡(jiǎn)單而有效的辦法便是關(guān)閉USB調(diào)試,并且盡量在正規(guī)的應(yīng)用市場(chǎng)下載可信的應(yīng)用。
畢竟,設(shè)想如果你正在火車(chē)站或者某公共場(chǎng)所,使用不知誰(shuí)放在那兒的公共充電插口,其背后是一臺(tái)惡意的計(jì)算機(jī),而你剛好打開(kāi)了,或者在它的誘導(dǎo)下,打開(kāi)了USB調(diào)試...



































