Drozer簡介
Drozer是一款針對Android系統的安全測試框架。Drozer可以通過與dalivik VM交互、與其他應用程序的IPC端點交互、與底層操作系統的交互,來避免正處於開發階段或者正處於部署於組織的Android應用程序和設備暴露出安全風險。
Drozer優點
- 有助於更快的完成Android安全評估:Drozer可以大大縮減Android安全評估的耗時,通過攻擊測試暴露Android APP的漏洞。
- 基於真機測試:Drozer運行在Android模擬器和真實設備上,它不需要USB調試或其他開發工具即可使用。
- 自動化和可擴展:Drozer有很多擴展模塊,可以利用這些擴展模塊進行測試以發現更多Android安全問題。
啟動Drozer
准備環境
本此使用的是win10系統,如果使用其它系統搭建,需准備不同的版本:
- Windows10
- Google pixel
- Python2.7 (必須用python2.7.。。。用3會報錯https://www.python.org/ftp/python/2.7.14/python-2.7.14.amd64.msi
- drozer-2.4.4. https://github.com/mwrlabs/drozer (安裝時必須選擇python2.7)
- Adb AndroidDebugBridge http://adbshell.com/downloads
- jdk1.8 https://blog.csdn.net/weixin_37601546/article/details/88623530
- 下載安裝手機agent,使用usb線將手機連接到電腦(或開啟一個模擬設備),使用adb將agent安裝到手機。agent下載地址:https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk
搭建步驟
a.打開手機的USB調試功能,將手機通過USB連接電腦。
b.安裝jdk環境和python環境,並配置環境變量。
c.安裝Android調試工具ADB。
d.安裝Drozer。(記得選擇python2,並將Drozer的安裝目錄選擇為python安裝目錄)
連接測試
- 命令:adb devices ,測試移動端在線
- 命令:drozer.bat console connect (執行前一般需要轉發端口,命令:adb forward tcp:31415 tcp:31415) ,打開dozer控制台
如上圖即搭建成功。
Android 開源安全測試工具 Drozer,安裝過程中的問題
首先打開測試客戶端的“drozer agent”應用,並打開Embbdded Server:
然后在pc端執行命令:drozer.bat console connect
(執行前一般需要轉發端口,命令:adb forward tcp:31415 tcp:31415
) ,打開dozer控制台:
Drozer命令
命令 | 功能 |
---|---|
help ABOUT | 顯示一個指定指令或模塊的幫助信息 |
run Module | 執行一個Drozer模塊 |
shell | 在設備上啟動一個交互式Linux shell |
list | 顯示當前會話所能執行所有Drozer模塊,不顯示未獲得相應權限的模塊 |
cd | 掛載一個特定的命名空間作為會話的根目錄,避免重復輸入模塊全稱 |
load | 加載一個包含Drozer命令的文件並且按順序執行 |
echo | 在控制台打印信息 |
clean | 移除Android設備上由Drozer存儲的臨時文件 |
module | 從互聯網發現並且安裝一個額外的模塊 |
permissions | 顯示Drozer agent被授予的權限 |
set | 將一個值存儲在一個變量中,這個變量將作為一個環境變量傳遞個任何由Drozer生成的Linux shell |
unset | 移除一個已命名變量,這個變量是由Drozer傳遞給Linux shell的 |
exit | 終止Drozer會話 |
Drozer基本命令的使用
檢索測試應用程序
命令:run app.package.list -f <app name>
列出應用程序基本信息
包括應用程序版本、應用程序數據存儲路徑、應用程序安裝路徑、相關權限等,命令:run app.package.info -a <package name>
確定攻擊面
Drozer可檢測apk源碼四大組件(activities、broadcast receivers、content providers、services)的export情況,並判斷export的組件提供那些服務,因為服務是可以調試的,可以將調試器附加到進程上,就行調試。
開始安全測試
activity組件
應用程序中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽並處理用戶的事件做出響應。 Activity之間通過Intent進行通信。在Intent的描述結構中,有兩個最重要的部分:動作和動作對應的數據。
- 查看activities的詳細信息,命令:
run app.activity.info -a <package name>
- 啟動設置為導出的activity,命令:
run app.activity.start --component <package name> 設置為導出的activity
可以確定成功繞過了登錄授權,造成了越權漏洞。
Content組件
android平台提供了Content Provider使一個應用程序的指定數據集提供給其他應用程序。這些數據可以存儲在文件系統中、在一個SQLite數據庫、或以任何其他合理的方式。其他應用可以通過ContentResolver類從該內容提供者中獲取或存入數據。只有需要在多個應用程序間共享數據是才需要內容提供者。
- 從Content Provider讀取信息,命令:
run app.provider.info -a <package name>
可以確定的是,這兩個Content Provider除了DBContentProvider的/keys路徑,都不需要特殊的權限就能和他們交互。 - 基於數據庫的Content Provider(數據泄露)
首先分析apk,判斷其名為DBContentProvider的Content Provider存在某種形式的數據庫,可以通過重建部分provider URIs,以進入Content Provider。Drozer提供了一個掃描模塊,其中包含了多種形式的猜測路徑的方式並將可進入的provider URIs顯示出來,命令:run scanner.provider.findurls -a <package name>
此時就可以使用其他的Drozer模塊,從這些可行的Provider URIs中提取信息,甚至更改數據庫里的數據。 - 訪問uri發現數據泄露,可看到一些敏感信息,命令:
run app.provider.query uri
- 基於數據庫的Content Provider(SQL注入)
通過修改傳遞給Content Provider的投影或選擇字段,很容易測試程序是否存在SQL注入漏洞,測試命令:
run scanner.provider.injection -a packageName 掃描那里可以進行SQL注入
run scanner.provider.sqltables -a com.mwr.example.sieve 列舉app的表信息
projection 測試:run app.provider.query contentProviderURI --projection "'"
selection 測試:run app.provider.query contentProviderURI --selection "'"
projection注入語句測試:run app.provider.query contentProviderURI --projection "* FROM xx;--"
Selection注入語句測試:run app.provider.query contentProviderURI --selection "1=1);--"
- 報錯信息顯示了視圖執行的整個查詢,因此可以利用這個漏洞列舉出數據庫中的所有表,執行命令:
run app.package.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM SQLITE_MASTER WHERE type='table';--"
- 獲取具體表信息
- 基於文件系統讀取和寫入(有可能被阻止)
在被導出的Content Provider中,我們可以合理的假設FileBackupProvider是一個基於文件系統的Content Provider,路徑代表想要打開的文件位置,執行命令:
讀取:run app.package.read uris/文件及路徑
拷貝:run app.package.download uris/文件及路徑 \本地文件及路徑
- 目錄遍歷檢測
run scanner.provider.traversal -a <package name>
Services組件
一個Service 是一段長生命周期的,沒有用戶界面的程序,可以用來開發如監控類程序。較好的一個例子就是一個正在從播放列表中播放歌曲的媒體播放器。在一個媒體播放器的應用中,應該會有多個activity,讓使用者可以選擇歌曲並播放歌曲。
然而,音樂重放這個功能並沒有對應的activity,因為使用者當然會認為在導航到其它屏幕時音樂應該還在播放的。在這個例子中,媒體播放器這個activity 會使用Context.startService()來啟動一個service,從而可以在后台保持音樂的播放。同時,系統也將保持這個service 一直執行,直到這個service 運行結束。
另外,我們還可以通過使用Context.bindService()方法,連接到一個service 上(如果這個service 還沒有運行將啟動它)。當連接到一個service 之后,我們還可以service 提供的接口與它進行通訊。拿媒體播放器這個例子來說,我們還可以進行暫停、重播等操作。 intent-filter未將exported設置為false,默認是可以導出的。
run app.service.info -a package_name 查看Services組件信息
run app.service.start --action 服務名 --component 包名 服務名 調用內部服務組件
Broadcast組件
BroadcastReceive廣播接收器應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice 來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。
測試常用命令:
run app.broadcast.info -a <package name> 測試對外的broadcast組件信息
run app.broadcast.send --component <package name> <component name> --action <action> --extra <type> <key> <value> 發送帶參數的惡意廣播
run app.broadcast.send --action <action> 向廣播組件發送不完整intent使用空extras,可以看到應用停止運行