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