使用Drozer利器對APP程式碼層面進行滲透分析

  • 2020 年 2 月 26 日
  • 筆記

作者;小仙人

介紹;安全武器庫運營團隊核心成員

享受星球原創文章待遇

聲明;本篇文章為星球團隊成員原創文章,但並未申請公眾號原創許可權,如其他公眾號有需要轉文,即可自取,或者聯繫滲透雲筆記運營人員

APP面臨的主要風險存在哪幾點?

APP面臨的主要風險可以分為客戶端風險和服務端風險。

客戶端風險:逆向分析和已被入侵類用戶(輸入記錄、導出組件、進程注入等)

服務端風險:系統組件類(系統漏洞,如提權、心血、ShellShock、MS12-020)和業務應用類(注入、XSS、越權、文件上傳、弱口令、任意用戶註冊等)

在開始之前,我覺得很有必要聊聊APP目前的安全現狀。因為手機應用的快速增長,企業為了快速佔領市場,忽略了很多安全問題,這就讓黑客有可乘之機。而且由於安全是門系統學科,涉及知識範圍廣,大部分Android開發人員缺乏安全技術的積累,措施相對有限。其實市場上一些主流的APP都做了一定安全防範,比如加殼、程式碼混淆、so庫加密保護、資源文件加密、DEX安全保護等等。但是這些加固手段都需要不少的成本,如果單是請一個能獨立做這些加固的APP安全專家,那價格少說也5萬起步,這都不好說,對於大企業來說,這沒什麼,所以大企業的安全防護措施都做得不錯,但是小企業就不是這樣了,小企業因為成本問題,產品的安全性常常被忽略,導致大部分小眾APP產品常常遭受黑客的攻擊,從而大大影響項目的正常運行。

APP有兩種,一種Android,一種IOS,Android應用市場對APP的審核相對IOS來說也比較寬泛,審核上寬鬆很多。這裡對IOS安全不做過多描述,因為自身沒有親測過,沒有話語權。Android的安全問題有一大部分原因都是因為Android的組件暴露、許可權使用不當導致的。這就涉及到Android的四大組件問題了,接下來進行總結。

Android系統的四大組件

Activity:呈現可供用戶交互的介面

Service:長時間執行後台服務進程

Content Provider:在多個APP間共享數據

Broadcast Receivers:註冊特定事件,並在其發生時被激活

Drozer是一款綜合的安全評估和攻擊的Android框架,Drozer可以全面評估APP的安全性,並幫助團隊把APP的安全風險保持在可控範圍內。

Drozer的安裝教程:https://www.cnblogs.com/lsdb/p/9441813.html

這裡我準備了一台手機(已root、已開啟調試模式、已開啟開發者模式),不用Android模擬器,drozer已經安裝完成。

檢測手機是否成功連接電腦

adb devices

啟動drozer只需要兩條命令

adb forward tcp:31415 tcp:31415

drozer.bat console connect

【查看drozer支援哪些模組】

這裡涉及到每一個組件測試所對應的模組,為了更好的了解drozer,必須深入了解這些模組,這裡我總結每一個組件對應的模組。(下次測試的時候直接對應去複製粘貼出來就行)

Activity

app.activity.forintent — 找到可以處理已指定的包app.activity.info — 獲取activity組件資訊app.activity.start — 開啟activity組件scanner.activity.browsable — 獲取可從web瀏覽器調用的所有可瀏覽的activity組件

Service

app.service.info — 獲取service組件資訊app.service.send — 向服務組件發送消息並顯示答覆app.service.start — 開啟service組件app.service.stop — 停止service組件

Content Provider

app.provider.columns — 在內容提供程式中列出列app.provider.delete — 在內容提供程式中刪除app.provider.download — 在內容提供程式中下載支援文件app.provider.finduri — 在包中查找引用的內容URISapp.provider.info — 獲取Content Provider組件資訊app.provider.insert — 插入到Content Provider組件中app.provider.query — 查詢Content Provider組件app.provider.read — 從支援文件的Content Provider讀取app.provider.update — 更新Content Provider的記錄scanner.provider.finduris — 搜索可從上下文中查詢的Content Providerscanner.provider.injection — 測試Content Provider的注入漏洞scanner.provider.sqltables — 查找可通過SQL注入漏洞訪問的表scanner.provider.traversal — 測試Content Provider的基本目錄遍歷漏洞

Broadcast Receivers

app.broadcast.info — 獲取有關廣播接收器的資訊app.broadcast.send — 帶目的發送廣播app.broadcast.sniff — 註冊一個能嗅出特定意圖的廣播接收器

這只是對應四大組件的模組,還有剩餘一些模組這裡不做總結,具體用 list 命令查看。

如果想要獲取APP包資訊,那使用 app.package.* 模組。

app.package.attacksurface

獲取包攻擊面

app.package.backup

列出使用備份API的包(在標記「允許備份」時返回true)

app.package.debuggable

查找可調試包

app.package.info

獲取有關已安裝軟體包的資訊

app.package.launchintent

獲取包的啟動意圖

app.package.list

列出程式包

app.package.manifest

獲取包的AndroidManifest.xml

app.package.native

查找嵌入在應用程式中的本地庫

app.package.shareduid

查找具有共享uid的包

這裡最常用的就是獲取攻擊面、找調試包、獲取軟體包資訊、獲取包的manifest(這個感覺真沒必要,反編譯出來放到編輯器裡面看舒服多了)。以下是一些實例。

【獲取APP的基本資訊】

run app.package.info -a 軟體包名(個人感覺沒啥用)

【查找可能存在被攻擊的介面】

run app.package.attacksurface 軟體包名

【Activity測試】

run app.activity.info -a 軟體包名 –> 查看activity組件能被利用的介面(根據上圖可以知道有11個介面是可以被利用的,怎麼利用呢?繼續往下看)

run app.activity.start –component 軟體包名 軟體包名.activity.StartActivity –> 通過此命令能夠打開進入登錄介面

接下來就是一個個測試剩下的介面,親測之後,手機並沒有任何顯示其它東西,沒有任何利用價值,既然沒有利用價值,那麼對應用安全就沒任何威脅,可以判定為安全。

【Service測試】

對service組件測試,我們切換進其目錄,可以發現有四個模組,上面已經做了描述。Service組件,我測過,但是沒有任何反應,結果也不是參考資料里所描述,我對此也感到很疑惑,沒搞懂這一塊,如果哪位師傅看到小弟的不才,煩請傳授,我必感激不盡。

【某個伺服器發送資訊】

run app.service.send com.xxx.wwh com.xxxx.wwh.CryptoService –msg 1 5 3

【許可權提升】

run app.service.start –action com.test.vulnerability.SEND_SMS –extra string dest 11111 –extra string text 1111 –extra string OP SEND_SMS

【Content Provider測試】

【獲取Content Provider資訊】

run app.provider.info -a com.xxxxx.wwh

【檢測Content Provider是否存在SQL注入和目錄遍歷】

run scanner.provider.injection -a com.xxxxx.wwh

【獲取所有可以訪問的URI】

run scanner.provider.finduris -a com.xxxxx.wwh –> (有暴露的Provider就可以用drozer掃描可用的URI,根據上面的攻擊面資訊可以得知Content Provider exported為0,所以這裡的掃描結果都是無法查詢的URI)

【獲取各個URI的數據】

run app.provider.query content://com.xxxx.wwh.xxxxxx –vertical –> (如果查詢到數據說明存在漏洞,屬於數據泄露漏洞)

【讀取文件】

run app.provider.read content://com.xxxxxx.wwh.xxxxxx/etc/hosts

【檢查是否存在遍歷文件漏洞】

run scanner.provider.traversal -a com.xxxxx.wwh

【對某個URI進行注入】

run app.provider.query content://com.xxxxx.wwh.xxxxxx –projection "* FROM SQLITE_MASTER WHERE type='table';–"

run app.provider.query content://com.xxx.wwh.xxxxxx –selection "type='table';–"

【Broadcast Receivers測試】

【查看暴露的廣播組件資訊】

run app.broadcast.info -a com.xxxx.wwh

Broadcast Receivers沒測過,網上大部分參考資料都是Content Provider有攻擊面的,我實戰測試時Content Provider都不存在攻擊面

【Activity組件造成的安全危害及如何防範】

1. 惡意調用頁面(頁面敏感內容泄露) 2. 惡意接收數據(敏感數據泄露) 3. 惡意發送廣播、啟動應用服務(影響用戶體驗) 4. 調用組件惡意接收組件返回的數據

防範:

1. 不需要被外部程式調用的組件設置Android:exported="false"屬性

2. 設置特定組件的訪問許可權,對於希望Activity能夠被特定的外部程式訪問,可以為其設置訪問許可權,具體做法有三種:

(1)組件添加android:permission屬性;

如果希望Activity能夠被特定的程式訪問,就不能用android:exported屬性了,可以使用android:permission屬性來指定一個許可權字元串,聲明例子如下:

這樣聲明的Activity在被調用時,Android系統就會檢查調用者是否具有com.test.permission.MyActivity許可權, 如果不具備就會觸發一個SecurityException安全異常。要想啟動該Activity必須在AndroidManifest.xml文件中加入以下聲明:

<uses-permission android:name="com.test.permission.MyActivity">

(1)protectionLevel許可權聲明,exported屬性只是用於限制Activity是否暴露給其他app,通過配置文件中的許可權申明也可以限制外部啟動activity;

(2)聲明,如下

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span style="box-sizing: border-box; color: rgb(0, 136, 0);">"com.wooyun.custempermission"</span> /></span></code><ul style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

這樣聲明的Activity在被調用時,Android就會檢查調用者是否具有com.wooyun.custempermission許可權,如果沒有就會觸發SecurityException異常。

https://blog.csdn.net/chenjiang2936/article/details/53063406

https://blog.csdn.net/u013309870/article/details/69228125

總的來說

1. 當Activity組件為私有組件時,最好將exported的值為false;

2. 當Activity組件為公有組件時,建議對其進行許可權控制。

【Service組件造成的安全危害及如何防範】

1. 敏感資訊泄露 2.許可權提升、拒絕服務等風險 3.第三方APP任意調用

防範:

1. 不必要的service組件不必要導出,設置組件"android:exported"屬性為false;

2. 如果必須要提供給外部應用使用,就對組件進行許可權控制;

https://blog.csdn.net/weixin_34128411/article/details/92272150

http://www.droidsec.cn/android-service-security/

參考資料

https://blog.csdn.net/jianglianye21/article/details/80667346 — Drozer-Android安全測試基本使用教程-CSDN

http://www.sohu.com/a/316907526_698291 — 安全小課堂第139期【APP安全之四大組件漏洞】

https://www.cnblogs.com/lsdb/p/9441813.html — drozer安裝使用教程

https://www.freebuf.com/sectool/26503.html — FreeBuf測試案例

https://blog.csdn.net/GCF123123/article/details/82896828 — 安全測試|移動端安全測試drozer

https://www.jianshu.com/p/1ac864473c7c — 利用Drozer對Android app進行安全測試 | 簡書

https://blog.csdn.net/chenjiang2936/article/details/53063406 — Android研發安全-Activity組件安全(上)

https://blog.csdn.net/u013309870/article/details/69228125 — Android組件安全詳解

https://blog.csdn.net/JiaoMaGe/article/details/103024097 — Drozer之組件安全

https://blog.csdn.net/xianKOG/article/details/81702119 — Android四大組件、五大存儲、六大布局

https://blog.csdn.net/websinesafe/article/details/99714668 — 全方位對APP進行安全檢測