解决android模拟器抓包环境问题

前言

无论是日常渗透测试还是在做红蓝对抗,或者甲方自查风险,手机端的暴露面都是不可忽视的一部分。这里就涉及到一个很关键的模块,如何抓到app客户端与服务端的交互数据包。从防御方法上来讲,我所了解到的主要有以下几个情况:

1、远古时期,无ssl证书,明文传输数据。
2、采用ssl证书加密,但未使用做ssl Pining技术
3、采用ssl证书加密,但使用了ssl pining技术。
4、双向加密

而对于上述几种情况的抓包,第一种,几乎遇不到了,忽略2333.
第二种则需要根据android版本以及app的版本号来确定抓包方法,在这贴一下android版本中微信信任证书的情况作为示例:
安卓系统 7.0 以下版本,都会信任系统提供的证书
安卓系统 7.0 以上版本,微信 7.0 以下版本,微信会信任系统提供的证书
安卓系统 7.0 以上版本,微信 7.0 以上版本,微信只信任它自己配置的证书列表

经历与经验

下面就简单记录一下抓取app数据包的过程。
个人比较喜欢使用burpsuite,因此做了以下尝试:

方案1:

1、下载网易mumu模拟器并安装。
地址:http://a11.gdl.netease.com/nemu-2.0.23-1101153315.exe
模拟器2:腾讯网游助手(该模拟器微信不会被检测,但mac下经测试,某些app存在秒退现象):
地址:https://syzs.qq.com/

2、将burp证书用openssl将DER转换为PEM,然后输出subject_hash_old值并重命名该文件:命令如下:

1
2
3
4
▶ openssl x509 -inform DER -in /Users/sunu11/Downloads/cacert.der  -out cacert.pem
▶ openssl x509 -inform PEM -subject_hash_old -in cacert.pem|head -1
get hash
mv cacert.pem <hash>.0

3、下载adb http://adbshell.com/downloads ,连接模拟器,将证书传入系统证书文件夹下:

1
2
3
4
5
6
7
8
9
10
11
adb devices
adb connect 127.0.0.1:6555
adb root
adb remount //重新挂载为可写
adb push 9a5ba575.0 /sdcard/

adb connect 127.0.0.1:7555
adb shell
cat /sdcard/9a5ba575.0 > /system/etc/security/cacerts/9a5ba575.0 //此处由于网易mumu共享文件夹中文编码在cmd中显示存在问题,无法直接mv

chmod 644 /system/etc/security/cacerts/9a5ba575.0 //修改权限为644

图1
然后重启模拟器,在受信任的凭据处即可看到burp的证书已经添加至系统证书下:
图2

4、挂代理,抓包即可,基本上微信公众号,app、浏览器等数据包都可监听。
图3

由于mac上模拟器存在各种原因,因此转向使用测试实体机。

方案2:

我找了个老魅族手机(推荐闲鱼)android5.1,直接安装burp证书,设置代理即可抓取未采用ssl Pining防止中间人的app数据包。但如果存在ssl Pining防护,则需要借助xposed+justTrustMe模块,将所有用于校验SSL证书的API都进行Hook,从而绕过证书检查的方式来进行抓包,而在这个过程中,其实是与android版本没有太大关系。

下面记录一下之前刷pxeil装xp失败的经历:
听朋友说谷歌的pxeil跟nexus好刷机,因此闲鱼淘了个pxeil手机。要求root+xp框架,忘了说版本号了,给我寄过来的是android9的。本来是装好了xp框架的,但是安装justTrustMe模块后,发现可以解密抓到部分https数据包,但无法抓到一个验证码的包,导致无法正常使用app功能。以为是xp问题,但后续证明并非如此,且原因未知。
在发现无法抓取整个数据包后,尝试降低android版本,听朋友说8.1有刷成功,就刷8.1的安卓包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
刷机必须解锁,也就是说能够进入bl界面,像华为这种,无法解锁的目前我也不知道怎么刷机。
下载镜像包后解压到platform-tools目录。
adb reboot bootloader
进入镜像包解压目录。
./flash-all.sh
到这里基本上重启系统就更替完成了,但是由于我们想获取root权限,就需要安装一些其他软件,比如magisk、superSu等。这就需要用到下一步:。
重启刷入twrp(有些情况img与zip都需要刷入,twrp是第三方recovery环境,可以刷任意系统扩展包)
下载地址(能用最新的就用,老的也有可能有bug):
https://dl.twrp.me/sailfish/
adb reboot bootloader
fastboot boot twrp-3.3
为了避免其他bug,先重启一波再进入rec
然后安装magisk(获取root权限)
https://github.com/topjohnwu/Magisk/releases/download/v20.1/Magisk-v20.1.zip
在安装好之后,重启进入系统。
magisk工具也有一个插件MagiskTrustUserCerts,这个装上之后,也能抓取某些app没有使用ssl Pining技术的数据包。
然后再安装xp框架。
这里两种方式:
1、在coolapk.com安装xposed installer,安装好apk后,进入软件。用梯子直接下载。
2、在下面链接下载xposed进入rec刷入系统:
https://dl-xda.xposed.info/framework/sdk27/arm64/xposed-v90-sdk27-arm64-beta3.zip

我自己先尝试的pxeil手机,在最后用coolapk安装xposed由于没有vpn,安装没成功,但是学弟翻墙后一键安装成功了:如图:
图5
然后我尝试进rec刷,一直爆错,因此更换成nexus5了。但是查资料有发现V2EX上有网上也有一种报错的解决方案https://www.v2ex.com/t/396476。说是用Flashfire可以刷成功,但是我记得迷迷糊糊有成功过一回,但是照样抓包不完全,遂弃之~

方案3:

对于双向证书校验一般情况抓包都会报错,原因在于服务器也会对客户端的证书进行验证,不通过则拒绝连接。因此在确定app是采用双向认证后,我们就需要获取服务端匹配的证书,用它对服务端进行匹配。
由于我本人没有实际对双向认证的app进行过抓包,但是通过学习安全客的这篇文章发现思路还是不难:
https://www.anquanke.com/post/id/190080
由于app采用双向认证,那客户端肯定能找到其证书文件,在获取到证书文件后,需要找到其安装密码.
在这一步有可能涉及到脱壳的知识,本文不做过多描述,在脱壳后用IDA加载二进制文件,在String窗口搜索证书的相关内容,追到证书密钥即可。然后再通过密钥在本机安装好证书:
用burp添加客户端证书:
图6
然后选中该证书进行抓包即可。

在尝试用pxeil去抓https的数据包,一直不想放弃,恶心了好几天。后来发现确实有可能不是操作问题后选择了换机器2333,以下是过程中的一些体会:
1、其实,在过程中,有同事可以在windows系统上使用夜神抓取app的数据包,经过查看确实也是采用xp+justTrustMe模块。
2、由于xp官方仅仅支持到android8.1,后续推荐使用类xp框架太极。网上是有使用太极替代xp的例子。当然有有xp支持android9,不过需要安装魔图,而我第一次购买的二手机则是用的这种姿势,貌似那个验证码是tx的,抓包就卡在获取验证码处,因此放弃高版本android型号。
3、钱还是个好东西,朋友用的iphone(越狱),直接使用charles安装证书后就顺利抓到了ios端app的数据包。

补充

其实除了上面的方法,还有其他的很多思路,下面仅作记录,方便以后查阅:
1、有网友提出另一种抓包方式抓取微信PC端的流量,类似内网渗透中代理内网流量,在SocksCap64中设置代理服务器为burp的地址和端口,代理方式HTTP.然后设置微信走socksCap64代理。通过burpsuite抓包即可。—这种思路某些情况下没能成功23333.

2、将apk解包,通过控制app的证书信任机制再重打包安装进行抓包:

1
2
3
4
5
6
7
8
9
在res/xml/network_security_config.xml中加入:
<network-security-config>
<debug-overrides>
<trust-anchors>
<!-- Trust user added CAs while debuggable only -->
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>

然后在app的manifest文件中引入上面的文件:

1
2
3
4
5
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config" ... >
...
</application>
</manifest>

这里有个前提,重打包过程ok。不然坑很多。

3、对不走代理的app就只能借助手机中Http Catcher这类软件了。可对多种软件进行抓包。自行下载:https://github.com/JZ-Darkal/AndroidHttpCapture/releases

4、对于微信小程序抓包,也可以安装微信电脑测试版,可以支持打开小程序,用fiddler就可以直接抓包。

-------------本文结束感谢您的阅读-------------