安全測試工具Drozer
背景
drozer 是個很不錯的滲透測試工具,主要用來發現Android元件可能存在的一些安全問題。
它使用起來比較簡單,掌握了幾個常用的命令就能夠對apk進行簡單的安全測試。網上有不少介紹drozer的文章,我這裡就做個搬運工,將drozer的使用做個小結。
安裝
首先要保證自己電腦上已經安裝了 Android開發環境 和 java環境。沒有安裝的可自行查詢,這裡不再介紹。
接下來是從官網下載drozer:官網地址。
下載之後解壓到某個目錄,然後你會看到如下圖的結構:
setup.exe就是PC端的工具,直接下一步完成安裝。agent.apk是手機端的代理app,通過 adb install 命令進行安裝。
開啟手機端apk,然後點選右下角的開啟server,然後點選Embedded server,會看到如下圖所示頁面:
可以看到它嘗試去bind port 31415,我們應該在pc端的命令列對埠進行轉發,在pc端執行:
adb forward tcp:31415 tcp:31415
可以看到手機端一直在等待連結,我們再在pc端執行:
drozer console connect
這樣就建立了連線了,如下圖所示:
如果碰到【Error 10054】之類的錯誤,檢查下手機端的服務是否開啟成功。
開始測試
我們先將待測試的apk安裝到手機上,然後開始測試。 如果不知道應用的包名,有很多種辦法可以知道,用drozer也可以。 run app.package.list -f [app關鍵字] 我們先確定我們的apk有哪些潛在的風險,在pc端執行,執行之後的結果如下圖所示:
run app.package.attacksurface packageName
從上面的結果我們可以看到它總共檢測了5個方面:4種元件有多少是被匯出的、另外app是否是可debug的。下面我們就逐個的講解下測試思路
Activity
我們首先檢視詳細的被攻擊的Activity,執行如下命令:
run app.activity.info -a packageName
以上面com.xdja.eoa為例,執行之後的結果如下圖所示:
我們可以看到這裡每個匯出的Activity都是沒有許可權限制的,一定程度上可能是存在問題的。不過需要注意的是每個app的LaunchActivity是匯出的。
接下來我們就可以對每個有風險的Activity展開攻擊了:
run app.activity.start –component packageName ActivityName
如果能直接開啟頁面,且出現了app crash或者頁面異常,我們就認為這個頁面是有問題的。
Service
和Activity的思路一樣,我們先來檢視具體的哪個Service被匯出了:
run app.service.info -a packageName
上面以OA為例時並沒有service匯出,所以我用安通+作為例子,如下所示
接下來對Service進行攻擊
dz> run app.service.send packageName serviceName –msg xxx
BroadcastReceiver
同樣,先去查詢broadcastReceiver的攻擊面。執行如下命令:
run app.broadcast.info -a packageName
還是以安通+為例,安通+竟然有十幾個匯出的broadcastReceiver,如下:
接下來是攻擊receiver,平時測試過程中,receiver的問題比較多,所以應該多留個心。
run app.broadcast.send –component 包名 ReceiverName –action actionName // 傳送一個不帶extras的廣播
run app.broadcast.send –component 包名 ReceiverName // 傳送空action的廣播。
// 一般用於檢測是否有拒絕服務漏洞
Content Providers
ContentProvider主要是可能存在資料洩露風險,對它進行檢測的命令會多一些。
首先我們執行命令檢視App中存在的ContentProvider以及許可權問題(許可權問題我們需要結合原始碼看許可權的級別以及許可權的定義是否有問題),不過需要說明的是,ContentProvider相對其他元件可能用的比較少:
run app.provider.info -a packageName
接著我們可以獲取所有可以訪問的URi,如果有uri可以被讀寫,表示可能存在資料洩露風險。
run scanner.provider.finduris -a packageName
我們看到這裡安通+是沒有uri可以訪問的,我試了好幾個app都沒有找到能讀的uri,我們這裡假設有可讀的uri,再執行命令:
run app.provider.query content://xxxx/xx –vertical
// 如果這裡能查詢到資料,說明存在資料洩露,如果不存在會報許可權不足之類的錯誤
接下來檢測是否存在SQL注入
run app.provider.query content://xxx –projection “’”
run app.provider.query content://xxx –selection “’”
// 這裡如果報錯了,說明存在SQL注入
還可以用來查詢所有的表,及表中的資料。這裡的查詢條件可以根據自己的需要定製
列出所有表:
run app.provider.query content://XXX –projection “* FROM SQLITE_MASTER WHERE type=’table’;–”
獲取某個表(如Key)中的資料:
run app.provider.query content://XXXXX –projection “* FROM Key;–”
// 如果能獲取到資料,說明存在SQL注入
最後我們還可以同時檢測SQL注入和目錄遍歷
run scanner.provider.injection -a packageName
run scanner.provider.traversal -a packageName