突破HTTPS双向认证抓包

查看 124|回复 9
作者:森林雪人   
移动APP应用安全测试,抓包分析数据是测试的重要部分。从最初导入代{过}{滤}理证书能抓取到HTTPS数据,到后来flutter应用通过代{过}{滤}理软件抓取数据,再到后来的HTTPS双向认证,移动应用安全上的加固保护让数据抓包越来越困难。
目前最困难的还是突破HTTPS双向认证,我整理了笔记借用一个案例分享给大家--如何突破HTTPS双向认证实现抓包。
一、前置知识-Https单向认证和双向认证


单向认证.png (276.65 KB, 下载次数: 1)
下载附件
2020-12-4 16:39 上传



双向认证.png (386.2 KB, 下载次数: 2)
下载附件
2020-12-4 16:40 上传

二、突破客户端对服务端证书的认证,客户端已保存有服务端证书
需要破解的是单向认证第3步,客户端校验服务端证书是否合法。大部分使用证书锁定的APP采用的是HTTPS单向认证,仅使用本节介绍的xposed框架+SSLUnpinning  即可突破证书锁定。
APP客户端在发送请求前,客户端会拿APK包中的证书(含服务器公钥)和收到的证书对比,若不一致则不发送网络数据。
以burpsuite为例子,burpsuite生成的证书导入到android手机中,客户端对比发现burpsuite证书和APK包内中的证书不一致,则不发送网络数据。
我们需要绕过客户端证书的对比,让客户端认为收到的证书和自己包内的证书是一致的,自己在“安全”的环境中。
我直接使用的是xposed框架+SSLUnpinning模块实现绕过证书对比。
xposed框架
https://repo.xposed.info/module/de.robv.android.xposed.installer
SSLUnpinning:
https://repo.xposed.info/module/mobi.acpm.sslunpinning


sslunpinning.png (85.73 KB, 下载次数: 1)
下载附件
2020-12-4 14:46 上传

打开SSLUnpinning后,点击需要绕过证书验证的软件,软件后面显示unpinned,再重启软件,即可突破HTTPS证书单向锁定。


brower.png (129.42 KB, 下载次数: 0)
下载附件
2020-12-4 14:46 上传

三、突破服务端对客户端证书的认证,服务端已保存有客户端证书
对大部分证书锁定的APP使用上面第二节介绍的xposed框架+SSLUnpinning  即可突破证书锁定(大多数APP只验证服务端证书)。
如果使用xposed框架+SSLUnpinning后,服务端返回错误:


re.png (49.14 KB, 下载次数: 0)
下载附件
2020-12-4 14:57 上传

说明客户端未发送证书及公钥至服务端,服务端没有收到证书所以返回这个错误。
突破服务端对客户端证书的验证,即是破解双向认证第4,5步,需要把客户端证书和公钥发送至服务端。
必需找到客户端证书和公钥才行呀,这两个需要由客户端私钥生成。现在的目标就是找客户端私钥。
3.1 获取客户端私钥文件
对APK包进行反编译,在\assets\cer目录找到客户端私钥文件:
[color=]client_ssl.chain.bks



cer.png (15.08 KB, 下载次数: 1)
下载附件
2020-12-4 15:17 上传

另一文件是服务端公钥:server_ssl.chain.crt,由于已使用xposed+sslunpinning破解了客户端对服务端公钥的认证,所以这个文件不用关注。

[color=]client_ssl.chain.bks
是android使用的证书文件含有私钥,需要转换为burpsuites可以认识的p12格式,尝试将bks格式证书转换成p12格式证书,转换后发现无法使用,哪位大侠转换成功过可以告诉我,感谢!
不过我还有两种方式找到这个p12格式证书:
1、IOS包使用P12格式,可以从IOS包获取这个证书文件。
2、如果你测试公司自有产品,可以让研发同事将p12格式证书给你。
导入burpsuite时要知道这个p12格式证书的密码。导入方式:


22.png (72.61 KB, 下载次数: 0)
下载附件
2020-12-4 15:32 上传

Destination host是你测试的目标域名或IP,留空不用填写。点下一步后进入选择文件及输入密码窗口。


55.png (22.1 KB, 下载次数: 0)
下载附件
2020-12-4 15:34 上传

现在的目标是找到私钥文件的密码。
3.2 获取客户端私钥的密码
客户端证书私钥文件的密码是AES加密后保存到SO文件中,AES的密钥也保存在SO中,AES加密模式在java代码中实现。下面介绍分析过程
1、使用androidkiller反编译APK,搜索关键字:
[color=]client_ssl.chain.bks,
,找到

TheApplication文件


1.png (280.89 KB, 下载次数: 0)
下载附件
2020-12-4 16:05 上传

关注getBksAesKey()方法及SecurityMainBoard,CC2类,为方便分析使用jd-gui查询对应的java代码。


g2.png (513.18 KB, 下载次数: 1)
下载附件
2020-12-4 15:45 上传



sec.png (102.61 KB, 下载次数: 0)
下载附件
2020-12-4 20:46 上传

观察SecurityMainBoard()代码,发现引用了一个so文件。
2、将APK后缀改为.rar格式,使用rar软件打开base.rar,将目录\lib\armeabi-v7a\下的libxxx-security.so文件解压出来。


lib.png (24.56 KB, 下载次数: 0)
下载附件
2020-12-4 20:58 上传

使用IDA对这个libxxx-security.so文件进行静态分析,在function窗口找到


4.png (60.29 KB, 下载次数: 0)
下载附件
2020-12-4 16:11 上传

双击进入,找到AES密钥,及加密后的密文。


3.png (81.21 KB, 下载次数: 0)
下载附件
2020-12-4 16:05 上传

3、查找证书密码的AES加密方式
TheApplication中找到 cc2.class,发现localObject1为密钥,localObject2为IV,取密钥一半为IV。使用AES/CBC/PKCS7Padding方式。根据密钥、IV、密文、加密模式等信息解密出证书密钥密码


5.png (277.66 KB, 下载次数: 0)
下载附件
2020-12-4 16:15 上传

这里的AES加密后的密文及密钥是二进制的base64编码后的形式。AES解密时需要先转换为16进制,在工具中输入16进制的密文、密钥、IV,选择模式,成功解密出证书私钥密码。


6.png (66.16 KB, 下载次数: 0)
下载附件
2020-12-4 16:19 上传

以上是通过静态分析解密出密码,想简单方便也可以用另一个软件xposed 框架下的动态分析软件Inspeckage,运行后分析日志应该能找到解密后的密码。
3.3 burpsuite导入客户端私钥-开始抓包


7.png (61.32 KB, 下载次数: 0)
下载附件
2020-12-4 16:29 上传



8.png (56.08 KB, 下载次数: 0)
下载附件
2020-12-4 16:30 上传

输入解密后的密码,可以开始愉快地抓包了。
四、小结
1、客户端对服务端证书验证:使用xposed+SSLUnpinning绕过
2、服务端对客户端证书验证:burpsuite需要发送客户端证书及公钥才能证明自己是合法的,而证书及公钥由私钥生成,所以拿到客户端私钥即可,私钥保存于APK包内,所以找到私钥密码即可使用这个私钥。
以上内容以一款采用HTTPS双向认证的APP为例,简单介绍了突破HTTPS双向验证的过程,不同APP还需要具体分析,重要的是了解原理,理清思路。写的简略难免有出错的地方,欢迎指正。

证书, 下载次数

phantomer   

标题党啊,点进来啥都没讲,链接还是链接的一篇16年的文章。
woshicp   

所以怎么突破双向认证呢
Vvvvvoid   

真是个人才
digitalhouse   

完全沒提到突破啊...
這都是常識了
田田爱崽崽   

这,好TM复杂
qazwsxlty   

这只发了原理啊
穆塔muta   

然后呢,这就完了
pinesnow   

该说这是词不达意呢还是说标题党呢?说好的突破呢
xfmiao   

本文只是简单介绍了常识,并没有提出解决方案
您需要登录后才可以回帖 登录 | 立即注册

返回顶部