案例链接
1)在确定代理成功,能正常抓取https流量后,打开APP,这里以dida.apk
为例。打开案例APP并测试通过手机号注册发送验证码流程,在单机发送验证码
按钮后会提示发送失败,请重试
2)观察数据包发现提示Client closed the connection before a request was made. Possibly the SSL certificate was rejected.
判断出是客户端主动停止与服务器端的连接,APP使用了证书绑定技术
3)解决方案是使证书绑定的函数失效,需要对不同网络框架中证书绑定的相关代码有一定了解。例如,App使用okhttp3网络框架进行证书绑定(见代码清单10-1),那么最终使用的证书绑定类总是CertificatePinner类,此时Hook的目标就是CertificatePinner类中的函数;App使用TrustManager完成证书的绑定,那么Hook的目标就是TrustManager类中的证书绑定的函数。
OkHttp3证书绑定代码
由于网络框架有很多,没对每个网络框架进行函数确定工作量会很大。幸运的是前人已经完成了很多种网络框架的证书绑定函数的收集工作并将这些函数的Hook集成到Objection或其他工具中。这里介绍两种工具,已经涵盖了绝大多数的网络框架
https://github.com/WooyunDota/DroidSSLUnpinning/blob/master/ObjectionUnpinningPlus/hooks.js
1)考虑到App可能在启动时就已经完成了证书绑定,在adbshell中先使用kill命令将App完全关闭再使用Objection进行注入,并使用如下命令完成证书解绑。
以下命令需要在Objection注入时执行,因此还需要使用Objection的-s/--start-command参数达到命令在应用启动之前就执行的效果。
2)在objection完成Hook后,同样继续测试发送验证码接口,发现仍然提示发送失败,请重试
。可能是objection工具并未集成足够多的网络框架证书绑定函数,可尝试使用上面推荐的 DroidSSLUnpinning
项目,该项目集成了更多的网络框架证书绑定相关函数。
经过DroidSSLUnpinning
和objection等将近20个网络框架证书绑定函数的Hook都失效的情况下,差不多可以得到结论:APP被混淆了。应对这种情况,大致有两个方法:
1)使用Hook File类句柄方法,需要注意的是,在终端中“”是特殊符号,因此在输入时需要对字符进行转义。可以参考的Objection注入命令:
然后点击发送验证码
在打印日志中以/system/etc/security/cacerts这个系统存放证书的路径为关键词在终端进行搜索,最终会发现有一个栈信息中存在着非常明显的CertificatePinner.java 文 件 名 信 息 , 因 此 可 以 判 定 对 应 的 函 数xp.f.a()就是对应的完成证书绑定的函数。
2)由于objection不支持对函数逻辑进行修改,故使用Frida脚本进行Hook
3)在使用Frida脚本Hook后,再次对相关流程进行测试的抓包结果如下所示
本案例使用便利蜂APP(bianlifeng.apk),也可以网上下载
1)使用浏览器访问百度测试,确定Charles可以正常抓取手机端流量,然后设置代理,打开便利蜂APP,点击登录或注册,输入手机号,获取验证码,发现获取失败,查看数据包返回 400 No required SSL certificate was sent
,可以得知该APP使用了服务端校验证书的方式
2)从安全客上下载Frida脚本,以spawn运行脚本,即可打印出证书名称和密码
实用FRIDA进阶:内存漫游、hook anywhere、抓包
脚本代码
运行结果:
获取证书名称,密码及其他信息
链接: https:
//pan
.baidu.com
/s/1xKT-zK1TEdTTV7cgLMW6RQ
?
pwd
=3597 提取码: 3597
链接: https:
//pan
.baidu.com
/s/1xKT-zK1TEdTTV7cgLMW6RQ
?
pwd
=3597 提取码: 3597
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!