Drozer簡單使用


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,可以看到應用停止運行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM