【移动安全】记一次APP双向认证抓包

2019-10-31 21,483

前言

随着移动应用的发展和推广,APP应用安全越来越受到重视。APP中各类防抓包的机制的出现,让测试无法正常进行分析。
这篇文章算是总结一下我最近遇到的一款抓不到包的APP,给大家提供一个双向证书认证应该如何解决的思路。

判断证书双向认证

刚拿到此app时候常规方法一把梭,发现只要一开启手机代理,却提示网络异常,通过观察burpsuite的记录发现,只有请求包而没有响应包。
直觉告诉我应该是使用SSL Pinning防止中间人拦截攻击,然后我开启了ssl-kill-switch2后发现该APP所有的响应包返回 400 No required SSL certificate was sent的报错信息。
15723590482733.jpg

根据报错提示,搜了一下发现该错误是指服务器端启用了证书双向认证。

当服务器启用了证书双向认证之后,除了客户端去验证服务器端的证书外,服务器也同时需要验证客户端的证书,也就是会要求客户端提供自己的证书,如果没有通过验证,则会拒绝连接,如果通过验证,服务器获得用户的公钥。

该app直接封装了客户端的证书,相比于单项认证,无非就是多了一个服务器端验证客户端证书的过程,而在以往的用代理工具如burp这类工具,抓取https的包时,除了浏览器获取的是代理工具的证书外,默认是不发送证书给服务器端的。burp在抓取https报文的过程中也提供了双向认证的证书发送,但是是使用了burp提供的证书文件,也就是CA证书。app的服务端不认证这个burp提供的CA证书,那么我们就需要拿到匹配的证书,以其对服务端进行匹配。

突破思路

确定该APP是证书双向认证,那么APP客户端一定会存一个证书文件。通过对该APP解压并进入payload目录,发现只有一个.p12结尾的证书文件。
15723156116356.jpg

尝试点开发现需要安装密码。
15723156417576.jpg

app解密的代码逻辑

客户端发送数据包以后,需要去从app中读取这个证书文件,密码是以硬编码形式放在了代码中,利用这个代码中的密码字段去解密证书文件,从中读取以后,再进行解密并回传给服务器端进行确认。由此推断,寻找证书名称应该就可以拿到安装密码。

获取安装证书密码

首先对其APP进行砸壳,完成后我们解压缩然后使用IDA加载二进制文件。
然后在String窗口搜索证书的名称client,搜索后进入对应的类。
15721897768884.jpg

通过跟踪发现了该证书密钥,如下:
15722245813000.jpg

测试使用该密钥发现可以成功安装该证书:

15723157626160.jpg

burp添加客户端证书

host填写app服务端的主域名。
15723158801077.jpg

随后选择app客户端内的client.p12证书文件,并输入安装密码。

15723159401227.jpg

书成功导入,勾选即可使用。

15723159687530.jpg

ok~发现可以正常抓包,如下。
15723166452550.jpg

参考文章,感谢各位大佬的倾情奉献

https://se8s0n.github.io/2018/09/11/HTTP系列(五)/
https://xz.aliyun.com/t/6551#toc-14
https://juejin.im/post/5c9cbf1df265da60f6731f0a
https://www.secpulse.com/archives/54027.html


本文作者:TideSec

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/117194.html

Tags:
评论  (2)
快来写下你的想法吧!

TideSec

文章数:145 积分: 185

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号