Drozer簡單使用

exp發表於2020-07-05

Drozer簡介

  Drozer是一款針對Android系統的安全測試框架。Drozer可以通過與dalivik VM互動、與其他應用程式的IPC端點互動、與底層作業系統的互動,來避免正處於開發階段或者正處於部署於組織的Android應用程式和裝置暴露出安全風險。

Drozer優點

  • 有助於更快的完成Android安全評估:Drozer可以大大縮減Android安全評估的耗時,通過攻擊測試暴露Android APP的漏洞。
  • 基於真機測試:Drozer執行在Android模擬器和真實裝置上,它不需要USB除錯或其他開發工具即可使用。
  • 自動化和可擴充套件:Drozer有很多擴充套件模組,可以利用這些擴充套件模組進行測試以發現更多Android安全問題。

啟動Drozer

準備環境

本此使用的是win10系統,如果使用其它系統搭建,需準備不同的版本:

搭建步驟

a.開啟手機的USB除錯功能,將手機通過USB連線電腦。
b.安裝jdk環境和python環境,並配置環境變數。
c.安裝Android除錯工具ADB。
d.安裝Drozer。(記得選擇python2,並將Drozer的安裝目錄選擇為python安裝目錄)

連線測試

  • 命令:adb devices ,測試移動端線上
    檢視連線裝置.JPG
  • 命令:drozer.bat console connect (執行前一般需要轉發埠,命令:adb forward tcp:31415 tcp:31415) ,開啟dozer控制檯
    開啟Drozer控制檯.JPG
    如上圖即搭建成功。
    Android 開源安全測試工具 Drozer,安裝過程中的問題
      首先開啟測試客戶端的“drozer agent”應用,並開啟Embbdded Server:
    drozer agent.apk
      然後在pc端執行命令:drozer.bat console connect (執行前一般需要轉發埠,命令:adb forward tcp:31415 tcp:31415) ,開啟dozer控制檯:
    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基本命令的使用

Drozer官方測試apk

檢索測試應用程式

  命令:run app.package.list -f <app name>
檢索包名

列出應用程式基本資訊

  包括應用程式版本、應用程式資料儲存路徑、應用程式安裝路徑、相關許可權等,命令:run app.package.info -a <package name>
測試apk基本資訊

確定攻擊面

  Drozer可檢測apk原始碼四大元件(activities、broadcast receivers、content providers、services)的export情況,並判斷export的元件提供那些服務,因為服務是可以除錯的,可以將偵錯程式附加到程式上,就行除錯。
測試apk的可攻擊點

開始安全測試

activity元件

應用程式中,一個Activity通常就是一個單獨的螢幕,它上面可以顯示一些控制元件也可以監聽並處理使用者的事件做出響應。 Activity之間通過Intent進行通訊。在Intent的描述結構中,有兩個最重要的部分:動作和動作對應的資料。

  • 檢視activities的詳細資訊,命令:run app.activity.info -a <package name>
    activities詳細資訊
  • 啟動設定為匯出的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
      可以確定的是,這兩個Content Provider除了DBContentProvider的/keys路徑,都不需要特殊的許可權就能和他們互動。
  • 基於資料庫的Content Provider(資料洩露)
      首先分析apk,判斷其名為DBContentProvider的Content Provider存在某種形式的資料庫,可以通過重建部分provider URIs,以進入Content Provider。Drozer提供了一個掃描模組,其中包含了多種形式的猜測路徑的方式並將可進入的provider URIs顯示出來,命令:run scanner.provider.findurls -a <package name>
    uris
      此時就可以使用其他的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';--"

列舉所有表

  • 獲取具體表資訊
    key表具體資訊
  • 基於檔案系統讀取和寫入(有可能被阻止)
    在被匯出的Content Provider中,我們可以合理的假設FileBackupProvider是一個基於檔案系統的Content Provider,路徑代表想要開啟的檔案位置,執行命令:
讀取:run app.package.read uris/檔案及路徑
拷貝:run app.package.download uris/檔案及路徑 \本地檔案及路徑

基於檔案系統的Content Provider

  • 目錄遍歷檢測
 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,可以看到應用停止執行