一、前言:
項目測試間隙調研了下移動APP安全測試,發現不少文檔都提到了Drozer這款安全測試工具,遂拿來學習並投入項目中實踐下。
二、Drozer介紹:
Drozer是一款針對Android的安全測試框架,分為安裝在PC端的控制台、安裝在終端上的代理APP兩部分。可以利用APP的IPC通信,動態的發現被測試APP的安全風險。
貼一張網上的圖片,Drozer的功能點:


三、安裝
1、官方下載地址
2、安裝比較簡單,不介紹了。
中間有個java環境變量的小插曲說明下,如果運行drozer console connect后,報“ Could not find java. Please ensure that it is install ed and on your PATH. ”檢查下自己本地的java環境變量是否有問題,如果設置正確,但是drozer還是找不到的話,Windows用戶在“c:\users\用戶名”文件夾下新建.drozer_config文件,文件內容為:
[executables]
java=C:\Program Files\Java\jdk1.7.0_79\bin\java.exe
javac=C:\Program Files\Java\jdk1.7.0_79\bin\javac.exe
(路徑為自己的jdk目錄)
Windows文件名不能為空,導致不能新建.drozer_config文件的話,cmd下用命令rename 1.drozer_config .drozer_config改文件名為空。
四、界面介紹及連接設備
1、頁面展示:
PC上的控制台,用的是免費社區版,所以控制台沒有UI界面。
手機上的代理APP頁面展示:
2、連接設備:
首先運行設備上的Drozer代理並啟動守護服務,然后運行下面的命令做端口轉發:
adb forward tcp:31415 tcp:31415使用下面的命令建立鏈接:
drozer console connect
五、常用命令介紹:
1、查找所有的攻擊面:
dz> run app.package.attacksurface com.example |
輸出結果:
Attack Surface:
6 activities exported 暴露的控件接口
17 broadcast receivers exported 暴露的廣播接收器
0 content providers exported 數據提供接口,數據泄漏
3 services exported service服務接口
is debuggable
|
解釋:
- 應用程序中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽並處理用戶的事件做出響應。應用程序中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽並處理用戶的事件做出響應。Activity之間通過Intent進行通信。在Intent 的描述結構中,有兩個最重要的部分:動作和動作對應的數據
- BroadcastReceive廣播接收器:應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice 來響應它們收到的信息,或者用NotificationManager 來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。
- content providers exported:android平台提供了Content Provider使一個應用程序的指定數據集提供給其他應用程序。這些數據可以存儲在文件系統中、在一個SQLite數據庫、或以任何其他合理的方式, 其他應用可以通過ContentResolver類(見ContentProviderAccessApp例子)從該內容提供者中獲取或存入數據.(相當於在應用外包了一層殼), 只有需要在多個應用程序間共享數據是才需要內容提供者。例如,通訊錄數據被多個應用程序使用,且必須存儲在一個內容提供者中。它的好處:統一數據訪問方式。
- service服務接口,一般常駐,連接上公開的service后,可通過service提供的接口調起其他activity等。
檢測到攻擊面,可進行的攻擊:
- activities exported 越權攻擊,發送偽造消息等;
- broadcast receivers exported 發送惡意廣播,偽造廣播消息,越權攻擊等;
- content providers exported 數據泄漏,SQL注入等;
- services exported 越權攻擊,服務拒絕,權限提升等;
2.1、intent介紹:
- 可以將Intent理解為不同組件之間通信的“媒介”專門提供組件互相調用的相關信息。Intent可以啟動一個Activity,也可以啟動一個Service,還可以發起一個廣播Broadcasts。
- Intent有以下幾個屬性: 動作(Action),數據(Data),分類(Category),類型(Type),組件(Compent)以及擴展信(Extra)。其中最常用的是Action屬性和Data屬性。通過Drozer完整的發送intent消息命令格式為:
run app.activity.start [-h] [–action ACTION] [–category CATEGORY [CATEGORY …]] [–component PACKAGE COMPONENT] [–data-uri DATA_URI][–extra TYPE KEY VALUE] [–flags FLAGS [FLAGS …]] [–mimetype MIMETYPE]
2.2、對activity嘗試進行攻擊:
- 來一把越權攻擊:繞過登錄頁直接拉activity,看到有activity啟動不需要權限,嘗試用drozer直接拉起這些activity看看。
run app.activity.start --component com.example com.example.activity.WelcomeActivity
- 發送偽造的殘缺消息,刻意制造不完整的intent,發送給對應的activity。
run app.activity.start --action android.intent.action.SEND --component com.example com.example.activity.share.ShareToSessionActivity
intent中缺少extra部分
3、查看暴露的廣播組件接口
run app.broadcast.info -a com.example -i 獲取暴露的廣播組件信息 |
嘗試拒絕服務攻擊,向廣播組件發送不完整intent(空action或空extras)
run app.broadcast.send --component com.example com.example.sdk.communication.AppRegisterReceiver --extra string TEXT "hahahaha"
傳遞空的action
4、查看數據接口
數據泄漏問題;
--直接訪問URI獲取敏感信息;--目錄遍歷;
構造特殊的URI進行SQL注入;
|
獲取content provider的信息
dz> run app.provider.info -a com.example -i |
使用drozer的scanner模塊去猜測可能存在的URIs
dz> run scanner.provider.finduris -a com.example |
檢測可注入的URI的注入點
dz> run scanner.provider.injection -a com.example |
SQL注入的方式,如果上一步有拿到可注入的URI
獲取某個表(如Key)中的數據:run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM Key;--"
5、查找service服務接口
獲取公開的service服務接口信息
dz> run app.service.info -a com.example -i |
直接啟動服務看下
run app.service.start --action com.example.plugin.game.service.GameDownloadService --component com.example com.example.plugin.game.service.GameDownloadService
6、文件操作
- 安裝minimal來可以獲取暫時的root權限
run tools.setup.minimalsu |
- 進入shell模式,查看/data/data/com.example下是否有明文存儲敏感信息
- 在AndroidManifest.xml中android:allowBackup字段是否為true。當這個標志被設置為true或不設置該標志時應用程序數據可以備份和恢復,adb調試備份允許惡意攻擊者復制應用程序數據。有名的栗子新浪微博android客戶端越權泄密事件。
六、總結:
使用Drozer在項目中實踐后,有發現多處不校驗導出組件(activity,broadcast,service等)傳遞參數導致的安全漏洞,反饋給開發后進行排查,現已經全部修復。
本文來自網易實踐者社區,經作者yixin.shenhui授權發布。