Drozer簡單使用

Drozer簡介

  Drozer是一款針對Android系統的安全測試框架。Drozer能夠經過與dalivik VM交互、與其餘應用程序的IPC端點交互、與底層操做系統的交互,來避免正處於開發階段或者正處於部署於組織的Android應用程序和設備暴露出安全風險。python

Drozer優勢

  • 有助於更快的完成Android安全評估:Drozer能夠大大縮減Android安全評估的耗時,經過攻擊測試暴露Android APP的漏洞。
  • 基於真機測試:Drozer運行在Android模擬器和真實設備上,它不須要USB調試或其餘開發工具便可使用。
  • 自動化和可擴展:Drozer有不少擴展模塊,能夠利用這些擴展模塊進行測試以發現更多Android安全問題。

啓動Drozer

準備環境

本此使用的是win10系統,若是使用其它系統搭建,需準備不一樣的版本:android

搭建步驟

a.打開手機的USB調試功能,將手機經過USB鏈接電腦。
b.安裝jdk環境和python環境,並配置環境變量。
c.安裝Android調試工具ADB。
d.安裝Drozer。(記得選擇python2,並將Drozer的安裝目錄選擇爲python安裝目錄)git

鏈接測試

  • 命令: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官方測試apkgithub

檢索測試應用程序

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

列出應用程序基本信息

  包括應用程序版本、應用程序數據存儲路徑、應用程序安裝路徑、相關權限等,命令:run app.package.info -a <package name>
測試apk基本信息shell

肯定攻擊面

  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,默認是能夠導出的。app

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,能夠看到應用中止運行
相關文章
相關標籤/搜索