第86天:APP攻防-资产收集篇&Frida&HOOK&Xposed&证书提取&单向双向&检验抓包

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

探探

image-20250902080939502

这个是双向认证。

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

    image-20250902081356456

    将下载好的文件复制到模拟器的 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

image-20250902081456681

image-20250902081733931

image-20250902081758641

转发并启动 Frida

1
frida-ps -U

测试流程

  1. BP 监听网卡及端口
  2. 开启 wifi 代理后 (包括使用 app 代理),app 界面无返回,BP 基本无数据包,显示网络异常,关闭后恢复正常
  3. 开启 XP 开启代理之后发现 app 界面还是返回不了,显示你的网络出错了,网络异常等
    • 开启某营地进行检测是否配置正确,发现可以正常抓取到数据包,说明 XP 模块和代理正常
  4. 以上说明该 app 不是单向验证,是双向验证,解决方案如下三种:(小迪推荐第二种)

方案 1:Firda+r0capture+WireShark

  • GitHub 地址:https://github.com/r0ysue/r0capture
  • 模拟器执行:./frida-x86
  • 获取包名:ls /data/data 或 Apk 资源器查看
  • 使用 r0capture 抓包

image-20250902081920290

使用:

1
frida-ps -U -a		#得到当前运行的包名

image-20250902082438703

1
python r0capture.py -U -f com.p1.mobile.putong -p tantan.pcap

image-20250902084735275

这种方案我没有成功初步判断是adb环境的问题,我adb环境是雷神模拟器的,所以夜神模拟器链接的时候匹配不到。但是我又不知道如何配置多个adb环境,同时不想切来切去,以后有时间再弄。

果然是adb环境的原因,用雷电模拟器试了一下:

image-20250902091222105

但是我这里运行之后,没有内容???

方案 2:Firda+HOOK-JS+BurpSuite

  • GitHub 地址:https://github.com/apkunpacker/FridaScripts
  • 模拟器执行:./frida-x86
  • 此方案也可以解决单向验证证书
  • 本地执行:
    1. 在模拟器中开启 app 代理,代理服务器为 BP 监听的地址端口
    2. 在项目中找到要使用的 js 文件复制到 adb.exe 同级目录下,然后在该目录下打开终端后执行以下命令
      这里用到的是 SSLUnpinning.js

image-20250902082025637

1
frida -U -f 包名 -l .\hookjs文件

此时就会自动打开该软件,bp 能够抓到数据包。

image-20250902084952547

1
frida -U -f com.p1.mobile.putong -l .\SSLUnpinning.js

image-20250902091645411

这里探探都打不开了,感觉是更新了。用王者营地做演示吧

1
2
com.tencent.gamehelper.smoba
frida -U -f com.tencent.gamehelper.smoba -l .\SSLUnpinning.js

image-20250902092931653

没开任何框架同样可以抓包

方案 3:导入证书

利用场景:能反编译,有证书文件

  1. 直接使用解压工具解压 apk 文件,然后在其中查找 apk 的证书文件

    • 小迪说一般在 assets 和 res 目录中,后缀通常为 cer、bks、p12、crt
    • 提取证书文件路径可以使用 mobsf,也可以使用 appinfo
      • appinfo 的 GitHub 地址:https://github.com/kelvinBen/AppInfoScanner
  2. 反编译后得到证书文件的密钥

    • apk 有加固或者加壳,反编译需要先脱壳

    • 脱壳:

      • 先在使用.\nox_adb.exe shell,进入模拟器执行./frida-x86后,执行以下命令:这里用到的是DumpDex.js

        1
        frida -U -f 包名 -l .\hookjs文件

        然后需要执行一些命令才能脱壳,小迪还没讲

  3. Burp 导入证书后实现对应抓包

    • 将提取到的证书安装到 BP 流程:
      打开 BP->settings-> 搜索 tls->Client TLS certificates->add-> 选择从 apk 提取到的证书安装 -> 若需要密码(一般需要密码的证书才是对的),还需从 apk 反编译源码中找到密钥

另外一种方式抓包的方式

解包工具

apk_tool

解包

1
2
3
4
#使用方式
java -jar apktool.jar d com.xtuone.android.syllabus_9.9.2_197.apk -o chaoji

前面是要解包的apk,后面是解包之后保存的文件夹

image-20250901144704826

打包

1
2
#如果想要对刚刚解包的apk进行重新打包
java -jar apktool.jar b chaoji -o chaoji.apk

image-20250901145510912

安卓加固的简单介绍

对于加了壳的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
### 360
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
### APKProtect
libAPKProtect.so
### 几维安全
libkwscmm.so, libkwscr.so, libkwslinker.so
### 顶像科技
libx3g.so

查壳工具

1
java -jar ApkScan-PKID.jar

image-20250901151420560

直接运行即可。

脱壳工具

1
blackdex32

image-20250901152712109

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

image-20250901152831721

我这里是17.2.17,所以我的服务端同样要下载对应的版本:

image-20250901153211893

image-20250901153301948

adb的配置

1
2
#下载地址
https://developer.android.com/tools/releases/platform-tools?hl=zh-cn

首先要配置环境变量:

image-20250901153803509

image-20250901153936481

能出现版本说明没有问题。

image-20250901154440467

image-20250901154506648

开启USB调试。

image-20250901154541890

开启之后:

1
adb devices		#如果出现下图就说明没有问题

image-20250901154634322

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 ,进行连接。

image-20250901160644732

使用adb链接模拟器之后,将firda的服务端传输到模拟器中:

1
adb push D:\arsenal\APP\firda\frida-server-17.2.17-android-x86_64 /data/local/tmp

image-20250901161358602

image-20250901161422970

1
2
#赋予777权限
chmod 777 frida-server-17.2.17-android-x86_6

image-20250901162001229

1
2
3
4
5
#将其运行
./frida-server-17.2.17-android-x86_6

#回到windows
frida-ps -U #查看进程

image-20250901162403854

使用firda脱壳

1
2
3
4
5
总结来说就是有一些app,虽然有壳,但是在运行的时候是会自己将壳脱掉,这个时候在抓取对应内存里面的内容就可以得到数据

frida-ps -U -a #查看当前运行的包名
frida-dexdump -U -f 包名xxx.xxx #脱出源码,有时该命令可以使用时会报错,可以在尝试以下命令
frida-dexdump -FU -d -o .

image-20250901162843113

可以发现报错了,那么只能用最后的命令,抓取整个系统的内存的东西。

image-20250901165027563

执行出来就是这一堆文件,然后将他们放到jadx里面就行

image-20250901170804317

可以将其保存一个文件,然后用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*"

配置抓包

image-20250901173320815

下载链接:

1
2
https://jesse205.github.io/MagiskChineseDocument/delta/main.html
https://github.com/1q23lyc45/KitsuneMagisk/releases #github

image-20250901173815722

image-20250901173830088

image-20250901173852756

image-20250901173924341

image-20250901174045014

发现报错了:

image-20250901174120470

image-20250901174203528

image-20250901174307241

image-20250901174324162

然后在重启一下。

传入下图这个压缩包:

image-20250901194215631

image-20250901194255407

image-20250901194304518

image-20250901194432643

image-20250901194445371

image-20250901194457954

image-20250901194510357

如果可以在凭据里面找到说明没有问题。

image-20250901195117668

image-20250901195337007

这个时候就发现可以正常抓包了。