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基本命令的使用
Drozer官方測驗apk
檢索測驗應用程式
??命令: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,可以看到應用停止運行
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/2005.html
標籤:其他
