前言
无论是日常渗透测试还是在做红蓝对抗,或者甲方自查风险,手机端的暴露面都是不可忽视的一部分。这里就涉及到一个很关键的模块,如何抓到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
11adb 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
然后重启模拟器,在受信任的凭据处即可看到burp的证书已经添加至系统证书下:
4、挂代理,抓包即可,基本上微信公众号,app、浏览器等数据包都可监听。
由于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 | 刷机必须解锁,也就是说能够进入bl界面,像华为这种,无法解锁的目前我也不知道怎么刷机。 |
我自己先尝试的pxeil手机,在最后用coolapk安装xposed由于没有vpn,安装没成功,但是学弟翻墙后一键安装成功了:如图:
然后我尝试进rec刷,一直爆错,因此更换成nexus5了。但是查资料有发现V2EX上有网上也有一种报错的解决方案https://www.v2ex.com/t/396476。说是用Flashfire可以刷成功,但是我记得迷迷糊糊有成功过一回,但是照样抓包不完全,遂弃之~
方案3:
对于双向证书校验一般情况抓包都会报错,原因在于服务器也会对客户端的证书进行验证,不通过则拒绝连接。因此在确定app是采用双向认证后,我们就需要获取服务端匹配的证书,用它对服务端进行匹配。
由于我本人没有实际对双向认证的app进行过抓包,但是通过学习安全客的这篇文章发现思路还是不难:
https://www.anquanke.com/post/id/190080
由于app采用双向认证,那客户端肯定能找到其证书文件,在获取到证书文件后,需要找到其安装密码.
在这一步有可能涉及到脱壳的知识,本文不做过多描述,在脱壳后用IDA加载二进制文件,在String窗口搜索证书的相关内容,追到证书密钥即可。然后再通过密钥在本机安装好证书:
用burp添加客户端证书:
然后选中该证书进行抓包即可。
在尝试用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就可以直接抓包。