首页/电脑软件/ 突破HTTPS双向认证抓包

突破HTTPS双向认证抓包

作者:神奇   分类:电脑软件   时间:2020-12-07 20:31:09  标签:



移动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后,服务端返回错误:
同时在APK包内资源目录assets下可以找到.bks,.p12格式的证书。说明服务端会验证客户端证书。
突破服务端对客户端证书的验证,即是破解双向认证第4,5步,让服务端认为我们的burpsuite代{过}{滤}理是合法。
服务端存有客户端证书公钥,burpsuite必需有客户端证书公钥才能通过验证。
客户端公钥在哪里呢,这个需要由客户端私钥生成。现在的目标就是找客户端私钥。
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、使用反编译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文件解压出来。
使用对这个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是合法的,burpsuite需要有客户端公钥才能证明自己是合法的,而公钥由私钥生成,所以拿到客户端私钥即可,私钥保存于APK包内,所以找到私钥密码即可使用这个私钥。
以上内容以一款采用HTTPS双向认证的APP为例,简单介绍了突破HTTPS双向验证的过程,不同APP还需要具体分析,重要的是了解原理,理清思路。写的简略难免有出错的地方,欢迎指正。
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

评论:

发表评论:

code