森林雪人 发表于 2020-12-4 14:16

突破HTTPS双向认证抓包

本帖最后由 森林雪人 于 2020-12-22 18:49 编辑

      移动APP应用安全测试,抓包分析数据是测试的重要部分。从最初导入代{过}{滤}理证书能抓取到HTTPS数据,到后来flutter应用通过代{过}{滤}理软件抓取数据,再到后来的HTTPS双向认证,移动应用安全上的加固保护让数据抓包越来越困难。
目前最困难的还是突破HTTPS双向认证,我整理了笔记借用一个案例分享给大家--如何突破HTTPS双向认证实现抓包。

一、前置知识-Https单向认证和双向认证







二、突破客户端对服务端证书的认证,客户端已保存有服务端证书
需要破解的是单向认证第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后,点击需要绕过证书验证的软件,软件后面显示unpinned,再重启软件,即可突破HTTPS证书单向锁定。



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

说明客户端未发送证书及公钥至服务端,服务端没有收到证书所以返回这个错误。

突破服务端对客户端证书的验证,即是破解双向认证第4,5步,需要把客户端证书和公钥发送至服务端。
必需找到客户端证书和公钥才行呀,这两个需要由客户端私钥生成。现在的目标就是找客户端私钥。


3.1 获取客户端私钥文件

对APK包进行反编译,在\assets\cer目录找到客户端私钥文件:client_ssl.chain.bks

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


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


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

现在的目标是找到私钥文件的密码。


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


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



观察SecurityMainBoard()代码,发现引用了一个so文件。

2、将APK后缀改为.rar格式,使用rar软件打开base.rar,将目录\lib\armeabi-v7a\下的libxxx-security.so文件解压出来。



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


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

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


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


以上是通过静态分析解密出密码,想简单方便也可以用另一个软件xposed 框架下的动态分析软件Inspeckage,运行后分析日志应该能找到解密后的密码。


3.3 burpsuite导入客户端私钥-开始抓包



输入解密后的密码,可以开始愉快地抓包了。


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

phantomer 发表于 2020-12-4 14:53

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

woshicp 发表于 2020-12-4 14:24

所以怎么突破双向认证呢

Vvvvvoid 发表于 2020-12-4 14:48

真是个人才

digitalhouse 发表于 2020-12-4 14:23

完全沒提到突破啊...

這都是常識了

田田爱崽崽 发表于 2020-12-4 14:25

这,好TM复杂

qazwsxlty 发表于 2020-12-4 14:25

这只发了原理啊

穆塔muta 发表于 2020-12-4 14:25

然后呢,这就完了

pinesnow 发表于 2020-12-4 14:35

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

xfmiao 发表于 2020-12-4 14:40

本文只是简单介绍了常识,并没有提出解决方案
页: [1] 2 3 4 5 6 7
查看完整版本: 突破HTTPS双向认证抓包