安全 APP攻防 第86天:APP攻防-资产收集篇&Frida&HOOK&Xposed&证书提取&单向双向&检验抓包 Yatming的博客 2025-09-12 2025-09-02 Mobexler
Mobexler 是基于 Elementary OS 的定制虚拟机,旨在帮助进行 Android 和 iOS 应用程序的渗透测试。Mobexler 预装了各种开源工具,脚本,黑客必备软件等,这些都是安全测试 Android 和 iOS 应用程序所必需的。其中就包含自带了 MobSF。
官网地址:https://mobexler.com/
IOS端-双向认证-SSL Kill switch 2
1 2 教程地址:`https://testerhome.com/topics/17249` GitHub:`https://github.com/nabla-c0d3/ssl-kill-switch2/releases`
使用docker安装mosf 1 2 docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
APP - 某社交 - 双向证书绕过 & Frida&HOOK 探探
这个是双向认证。
Firda安装 Firda 是一款易用的跨平台Hook工具, Java层到Native层的Hook无所不能,是一种 动态 的插桩工具,可以插入代码到原生App的内存空间中,动态的去监视和修改行为,原生平台包括Win、Mac、Linux、Android、iOS全平台。
Hook是干嘛的,就是假如一个APP打开需要执行1,2,3,但是可以利用hook技术让这个APP打开的时候,只执行3,让1,2停止。测试流程
1 2 3 pip install frida pip install frida-tools pip list #可以查看已经按照的库,查看frida的版本为16.1.11(这里看自己安装的版本)
模拟器安装 Frida
注意:版本要与本地 Frida 一致
下载:https://github.com/frida/frida/releases
真机:就看 ARM 版本及位数
模拟器:无 ARM 的位数
使用终端模拟器执行下面命令获取是 x 几,我这里是 x86_64
1 getprop ro.product.cpu.abi
将下载好的文件复制到模拟器的 adb.exe (若是夜神则叫 nox_adb,exe) 同级目录下进行安装,在该目录下打开终端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 获取开启模拟器的接口,若是开启了模拟器就会有信息 .\nox_adb.exe devices # 将文件传输到模拟器指定目录下 .\nox_adb.exe push D:\arsenal\APP\firda\frida-server-17.2.17-android-x86_64 /data/local/frida-x86 # 使用命令连接到模拟器(使用exit 退出) .\nox_adb.exe shell # 然后进行执行 cd /data/local/ chmod +x ./frida-x86 ./frida-x86 # 然后卡着不动就是没问题的,重新启动一个终端,使用以下命令获取模拟器进程 # 这里是小迪配置了全局变量可以直接这么用,咱们还没有,所以需要找到这个exe的路径进行执行或者添加到全局变量 frida-ps -U ps | grep frida
转发并启动 Frida
测试流程
BP 监听网卡及端口
开启 wifi 代理后 (包括使用 app 代理),app 界面无返回,BP 基本无数据包,显示网络异常,关闭后恢复正常
开启 XP 开启代理之后发现 app 界面还是返回不了,显示你的网络出错了,网络异常等
开启某营地进行检测是否配置正确,发现可以正常抓取到数据包,说明 XP 模块和代理正常
以上说明该 app 不是单向验证,是双向验证,解决方案如下三种:(小迪推荐第二种)
方案 1:Firda+r0capture+WireShark
GitHub 地址:https://github.com/r0ysue/r0capture
模拟器执行:./frida-x86
获取包名:ls /data/data 或 Apk 资源器查看
使用 r0capture 抓包
使用:
1 frida-ps -U -a #得到当前运行的包名
1 python r0capture.py -U -f com.p1.mobile.putong -p tantan.pcap
这种方案我没有成功初步判断是adb环境的问题,我adb环境是雷神模拟器的,所以夜神模拟器链接的时候匹配不到。但是我又不知道如何配置多个adb环境,同时不想切来切去,以后有时间再弄。
果然是adb环境的原因,用雷电模拟器试了一下:
但是我这里运行之后,没有内容???
方案 2:Firda+HOOK-JS+BurpSuite
GitHub 地址:https://github.com/apkunpacker/FridaScripts
模拟器执行:./frida-x86
此方案也可以解决单向验证证书
本地执行:
在模拟器中开启 app 代理,代理服务器为 BP 监听的地址端口
在项目中找到要使用的 js 文件复制到 adb.exe 同级目录下,然后在该目录下打开终端后执行以下命令 这里用到的是 SSLUnpinning.js
1 frida -U -f 包名 -l .\hookjs文件
此时就会自动打开该软件,bp 能够抓到数据包。
1 frida -U -f com.p1.mobile.putong -l .\SSLUnpinning.js
这里探探都打不开了,感觉是更新了。用王者营地做演示吧
1 2 com.tencent.gamehelper.smoba frida -U -f com.tencent.gamehelper.smoba -l .\SSLUnpinning.js
没开任何框架同样可以抓包
方案 3:导入证书 利用场景:能反编译,有证书文件
直接使用解压工具解压 apk 文件,然后在其中查找 apk 的证书文件
小迪说一般在 assets 和 res 目录中,后缀通常为 cer、bks、p12、crt
提取证书文件路径可以使用 mobsf,也可以使用 appinfo
appinfo 的 GitHub 地址:https://github.com/kelvinBen/AppInfoScanner
反编译后得到证书文件的密钥
Burp 导入证书后实现对应抓包
将提取到的证书安装到 BP 流程: 打开 BP->settings-> 搜索 tls->Client TLS certificates->add-> 选择从 apk 提取到的证书安装 -> 若需要密码(一般需要密码的证书才是对的),还需从 apk 反编译源码中找到密钥
另外一种方式抓包的方式 解包工具 解包 1 2 3 4 # 使用方式 java -jar apktool.jar d com.xtuone.android.syllabus_9.9.2_197.apk -o chaoji 前面是要解包的apk,后面是解包之后保存的文件夹
打包 1 2 # 如果想要对刚刚解包的apk进行重新打包 java -jar apktool.jar b chaoji -o chaoji.apk
安卓加固的简单介绍 对于加了壳的apk,包里面会有一些符合特定特征的文件,比较简单的方式就是通过检测apk是否符合这些特征,当然随着各大加固平台不断的迭代,其特征也可能会不断的迭代。
我们只需要知道大概原理就可以了,常见的特征判断是判断lib下是否存在特定的so文件,比如看雪上有人总结过的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 # libchaosvmp.so , libddog.solibfdog.so # libexec.so, libexecmain.so,ijiami.dat # libsecexe.so, libsecmain.so,libSecShell.so # libDexHelper.so , libDexHelper-x86.so # libprotectClass.so, libjiagu.so libjiagu.so, libjiagu_art.so libjiagu.so, libjiagu_x86.so # libegis.so,libNSaferOnly.so # libnqshield.so # libbaiduprotect.so # aliprotect.dat,libsgmain.so,libsgsecuritybody.so # libtup.so, libexec.so,libshell.so mix.dex lib/armeabi/mix.dex ,lib/armeabi/mixz.dex # libtosprotection.armeabi.so, libtosprotection.armeabi-v7a.so, libtosprotection.x86.so # libnesec.so # libAPKProtect.so # libkwscmm.so, libkwscr.so, libkwslinker.so # libx3g.so
查壳工具 1 java -jar ApkScan-PKID.jar
直接运行即可。
脱壳工具
Firda 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 https://github.com/frida/frida/releases frida12.3.6 Android5-6 Python3.7 frida12.8.0 Android7-8 Python3.8 frida14+ Android9+ Python3.8 安装firda pip install frida==16.4.8 pip install frida-tools==12.1.2 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple frida==16.2.1 国内源卡更换\临时 pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple 清华:pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 阿里:pip config set install.trusted-host https://mirrors.aliyun.com/pypi/simple/ 查看安装 pip list 注意版本 frida-tools==1.0.0 ------ 12.0.0<=frida<13.0.0 frida-tools==1.1.0 ------ 12.0.0<=frida<13.0.0 frida-tools==1.2.0 ------ 12.1.0<=frida<13.0.0 frida-tools==1.2.1 ------ 12.1.0<=frida<13.0.0 frida-tools==1.2.2 ------ 12.1.0<=frida<13.0.0 frida-tools==1.2.3 ------ 12.1.0<=frida<13.0.0 frida-tools==1.3.0 ------ 12.3.0<=frida<13.0.0 frida-tools==1.3.1 ------ 12.3.0<=frida<13.0.0 frida-tools==1.3.2 ------ 12.4.0<=frida<13.0.0 frida-tools==2.0.0 ------ 12.5.3<=frida<13.0.0 frida-tools==2.0.1 ------ 12.5.9<=frida<13.0.0 frida-tools==2.0.2 ------ 12.5.9<=frida<13.0.0 frida-tools==2.1.0 ------ 12.5.9<=frida<13.0.0 frida-tools==2.1.1 ------ 12.5.9<=frida<13.0.0 frida-tools==2.2.0 ------ 12.5.9<=frida<13.0.0 frida-tools==3.0.0 ------ 12.6.17<=frida<13.0.0 frida-tools==3.0.1 ------ 12.6.17<=frida<13.0.0 frida-tools==4.0.0 ------ 12.6.21<=frida<13.0.0 frida-tools==4.0.1 ------ 12.6.21<=frida<13.0.0 frida-tools==4.0.2 ------ 12.6.21<=frida<13.0.0 frida-tools==4.1.0 ------ 12.6.21<=frida<13.0.0 frida-tools==5.0.0 ------ 12.6.21<=frida<13.0.0 frida-tools==5.0.1 ------ 12.7.3<=frida<13.0.0 frida-tools==5.1.0 ------ 12.7.3<=frida<13.0.0 frida-tools==5.2.0 ------ 12.7.3<=frida<13.0.0 frida-tools==5.3.0 ------ 12.7.3<=frida<13.0.0 frida-tools==5.4.0 ------ 12.7.3<=frida<13.0.0 frida-tools==6.0.0 ------ 12.8.5<=frida<13.0.0 frida-tools==6.0.1 ------ 12.8.5<=frida<13.0.0 frida-tools==7.0.0 ------ 12.8.12<=frida<13.0.0 frida-tools==7.0.1 ------ 12.8.12<=frida<13.0.0 frida-tools==7.0.2 ------ 12.8.12<=frida<13.0.0 frida-tools==7.1.0 ------ 12.8.12<=frida<13.0.0 frida-tools==7.2.0 ------ 12.8.12<=frida<13.0.0 frida-tools==7.2.1 ------ 12.8.12<=frida<13.0.0 frida-tools==7.2.2 ------ 12.8.12<=frida<13.0.0 frida-tools==8.0.0 ------ 12.10.4<=frida<13.0.0 frida-tools==8.0.1 ------ 12.10.4<=frida<13.0.0 frida-tools==8.1.0 ------ 12.10.4<=frida<13.0.0 frida-tools==8.1.1 ------ 12.10.4<=frida<13.0.0 frida-tools==8.1.2 ------ 12.10.4<=frida<13.0.0 frida-tools==8.1.3 ------ 12.10.4<=frida<13.0.0 frida-tools==8.2.0 ------ 12.10.4<=frida<13.0.0 frida-tools==9.0.0 ------ 14.0.0<=frida<15.0.0 frida-tools==9.0.1 ------ 14.0.0<=frida<15.0.0 frida-tools==9.1.0 ------ 14.2.0<=frida<15.0.0 frida-tools==9.2.0 ------ 14.2.9<=frida<15.0.0 frida-tools==9.2.1 ------ 14.2.9<=frida<15.0.0 frida-tools==9.2.2 ------ 14.2.9<=frida<15.0.0 frida-tools==9.2.3 ------ 14.2.9<=frida<15.0.0 frida-tools==9.2.4 ------ 14.2.9<=frida<15.0.0 frida-tools==9.2.5 ------ 14.2.9<=frida<15.0.0 frida-tools==10.0.0 ------ 15.0.0<=frida<16.0.0 frida-tools==10.1.0 ------ 15.0.0<=frida<16.0.0 frida-tools==10.1.1 ------ 15.0.0<=frida<16.0.0 frida-tools==10.2.0 ------ 15.0.0<=frida<16.0.0 frida-tools==10.2.1 ------ 15.0.0<=frida<16.0.0 frida-tools==10.2.2 ------ 15.0.0<=frida<16.0.0 frida-tools==10.3.0 ------ 15.0.0<=frida<16.0.0 frida-tools==10.4.0 ------ 15.0.0<=frida<16.0.0 frida-tools==10.4.1 ------ 15.0.0<=frida<16.0.0 frida-tools==10.5.0 ------ 15.0.0<=frida<16.0.0 frida-tools==10.5.1 ------ 15.0.0<=frida<16.0.0 frida-tools==10.5.2 ------ 15.0.0<=frida<16.0.0 frida-tools==10.5.3 ------ 15.0.0<=frida<16.0.0 frida-tools==10.5.4 ------ 15.0.0<=frida<16.0.0 frida-tools==10.6.0 ------ 15.0.0<=frida<16.0.0 frida-tools==10.6.1 ------ 15.0.0<=frida<16.0.0 frida-tools==10.6.2 ------ 15.0.0<=frida<16.0.0 frida-tools==10.7.0 ------ 15.0.0<=frida<16.0.0 frida-tools==10.8.0 ------ 15.0.0<=frida<16.0.0 frida-tools==11.0.0 ------ 15.2.0<=frida<16.0.0 frida-tools==12.0.0 ------ 16.0.0<=frida<17.0.0 frida-tools==12.0.1 ------ 16.0.0<=frida<17.0.0 frida-tools==12.0.2 ------ 16.0.0<=frida<17.0.0 frida-tools==12.0.3 ------ 16.0.0<=frida<17.0.0 frida-tools==12.0.4 ------ 16.0.0<=frida<17.0.0 frida-tools==12.1.0 ------ 16.0.0<=frida<17.0.0 frida-tools==12.1.1 ------ 16.0.9<=frida<17.0.0 frida-tools==12.1.2 ------ 16.0.9<=frida<17.0.0 frida-tools==12.1.3 ------ 16.0.9<=frida<17.0.0 frida-tools==12.2.0 ------ 16.0.9<=frida<17.0.0 frida-tools==12.2.1 ------ 16.0.9<=frida<17.0.0 frida-tools==12.3.0 ------ 16.0.9<=frida<17.0.0
首先安装:
1 2 3 pip install frida-tools pip install frida pip install frida-dexdump
我这里是17.2.17
,所以我的服务端同样要下载对应的版本:
adb的配置 1 2 # 下载地址 https://developer.android.com/tools/releases/platform-tools?hl=zh-cn
首先要配置环境变量:
能出现版本说明没有问题。
开启USB调试。
开启之后:
1 adb devices #如果出现下图就说明没有问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 雷电模拟器官方设置的文章 https://help.ldmnq.com/docs/LD9adbserver adb shell #单个模拟器的情况,直接shell进入命令行 1. 多开模拟器的情况下,在命令行窗口输入命令:adb devices ,显示运行中的设备。 2. 打开雷电多开器(点击模拟器屏幕右侧的多开器按钮或双击桌面的雷电多开器) 模拟器编号从0开始,设备号从5554开始。模拟器编号每+1,设备号+2. emulator-5554 对应编号0的模拟器 emulator-5556 对应编号1的模拟器 emulator-5558 对应编号2的模拟器 ...... 以此类推,根据编号和设备号的对应关系,选择对应的模拟器进行连接 3. 根据对应模拟器的设备号,输入连接命令:adb -s emulator-xxxx shell ,进行连接。
使用adb链接模拟器之后,将firda的服务端传输到模拟器中:
1 adb push D:\arsenal\APP\firda\frida-server-17.2.17-android-x86_64 /data/local/tmp
1 2 # 赋予777权限 chmod 777 frida-server-17.2.17-android-x86_6
1 2 3 4 5 # 将其运行 ./frida-server-17.2.17-android-x86_6 # 回到windows frida-ps -U #查看进程
使用firda脱壳 1 2 3 4 5 总结来说就是有一些app,虽然有壳,但是在运行的时候是会自己将壳脱掉,这个时候在抓取对应内存里面的内容就可以得到数据 frida-ps -U -a #查看当前运行的包名 frida-dexdump -U -f 包名xxx.xxx #脱出源码,有时该命令可以使用时会报错,可以在尝试以下命令 frida-dexdump -FU -d -o .
可以发现报错了,那么只能用最后的命令,抓取整个系统的内存的东西。
执行出来就是这一堆文件,然后将他们放到jadx里面就行
可以将其保存一个文件,然后用grep进行搜索一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # 查找相关key值 grep -rEi "accesskeysecret|appsecret|accesskey_secret|app_secret|api.weixin.qq.com|aliyuncs.com|myqcloud.com|myhuaweicloud.com" . grep -rEi "accesskey|accesskeysecret|appkey|appid|appsecret|access_key|accesskey_secret|app_key|app_id|app_secret|api.weixin.qq.com|weixin.qq.com|aliyuncs.com|myqcloud.com|myhuaweicloud.com" . grep -rEi "accesskey|accesskeysecret|access_key|accesskey_secret|access.key|secret.key|secretkey" . # 查找密码等敏感信息 grep -irE "*password = *|*password*" . # 查找URL grep -Ero '(http|https)://[a-zA-Z0-9./?=#:&_-]*' . | grep -v "w3.org" | grep -v "xml.org" | grep -v "android.com" | grep -v "xml.apache.org" > http.txt cat http.txt | awk -F ":" '{sub(/^[^:]*:/, ""); print}' | grep -v http://127.0.0.1 | grep -v http://www.w3.org | sort | uniq > rr2.txt # 查找IP grep -rE '[^.]\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b[^.]' . # 查找相关配置文件 find ./ -iname "*property*" find ./ -iname "*config*"
配置抓包
下载链接:
1 2 https://jesse205.github.io/MagiskChineseDocument/delta/main.html https://github.com/1q23lyc45/KitsuneMagisk/releases #github
发现报错了:
然后在重启一下。
传入下图这个压缩包:
如果可以在凭据里面找到说明没有问题。
这个时候就发现可以正常抓包了。