对抗AndroidSSLPinning,前沿技术对抗Android

文件 0
SSLPinning 武汉分公司徐华峰 在移动客户端安全测试中,需要代理客户端与服务器之间的HTTP(S)流量,才能测试其业务功能的安全漏洞。
若客户端安全性较高,在验证服务器身份时使用了HTTPS+SSLPinning(SSL证书绑定)特性,就会造成代理软件无法正常使用,从而不能继续进行业务功能的测试。
本文则试图解决该问题。
引言 移动客户端的安全测试大概可以分为三个部分:客户端安全、通信安全、服务器端安全。
客户端安全包括组件暴露、敏感数据存储等;通信安全包括通信加密、校验等;服务器端安全包括数据安全(注入等)、业务安全等。
根据以往的客户端测试经验发现,有较大数量的移动客户端应用,把重点放在了通 信安全上,通过加密通信(HTTPS协议+“Android应用程序”)。
SSLPinning特性),以期能够掩盖客户端
一、什么是SSLPinning 应用在其他方面的安全问题,尤其是在数据 HTTPS协议验证服务器身份的方式通 安全、业务安全等方面。
然而,HTTPS协常有三种,一是根据浏览器或者说操作系统 议+SSLPinning特性模式并不是无敌的。
(Android)自带的证书链;二是使用自签名 本文通过绕过SSLPinning,来证明该模式证书;三是自签名证书加上SSLPinning特 的脆弱性,以及通过该模式掩盖其他安全问性。
第一种需要到知名证书机构购买证书, 题的不可行性(本文仅测试Android平台,需要一定预算。
第二种多见于内网使用。
第 对于IOS、WP其他平台类似,后文统称为三种是安全性最高的,但是需要浏览器插件 67 前沿技术 或客户端使用了SSLPinning特性。
会调用一个验证证书的B函数,在A调用B函数的同时,会传个密钥库C参数到B函数, Android应用程序在使用HTTPS协议时也使用类似的三种方式验证服务器身份, 根据B函数的返回结果,A函数决定程序是否继续下去。
根据上述过程,若想改变证书验证结果,可以从3个点着手:
1、改变A函数,使得无 分别是系统证书库、自带证书库、自带证书库+SSLPinning特性。
所以SSLPinning,即SSL证书绑定,是验证服务器身份的一种方式,是在HTTPS协议建立通信时增加的代码逻辑,它通过自己的方式验证服务器身份,然后决 论B函数返回什么结果,程序都能继续运行下去;
2、改变B函数,使得其总返回TRUE;
3、将代理的证书导入C密钥库。
下面将从这3个点依次绕过SSL证书绑定。
(二)实战
1.准备样例APK: 定通信是否继续下去。
它唯一指定了服务器的身份,所以安全性较高。

二、绕过SSLPinning (一)对策分析 测试环境:Android手机安装该APK,使用无代理网络访问时,返回服务器的响应包,如图1;而使用代理网络访问时,SSL验证出错,服务器没有响应包。
如图
2。
客户端绑定了SSL证书,不能简单地 通过导入代理的证书来绕过,但可以通过修 改客户端源码,改变其验证证书的逻辑。
分析可知,验证证书的逻辑会分为3个 点(
A,B,C),形式为
A.B(C),即在A中调 用B函数,而B函数会加载C参数。
当然 也可能是2个点,B(C)形式。
从软件架构角 度看,多为形式
A.B(C)。
通俗的讲,在客户 端启动时,会执行初始化A函数,A函数中 图
1
2 68 前沿技术 代理工具:Fiddler2,导出fiddler证书,如图
3。

3 APK反编译:使用apktool–dSSLPinningExample.apk得到APK文件的smali代码,如图
4、图5;使用好压等压缩软件打开APK文件,解压出classes.dex,然后dex2jar.batclasses.dex得到APK文件的Java代码,如图
6。
找到位置:A函数位置,如图
7、图8;B函数位置,如图
9、图10;C密钥库位置,如图11。
图4图
7 图8图
5
6
9 69 前沿技术 图10 图13 然后访问,可以得到服务器的响应包,即绕过 图11
2.方法一删除A函数中调用B函数的操作。
根据准备工作,从图7发现确实调用了pinCertificates,而图8是调用pinCertificates的smali代码,所以可以删除该段smali代码,使A函数不调用pinCertificates函数。
然后重打包apktoolbSSLPinningExample,接着自签名生成的APK,重新安装到手机。
SSLPinning成功。
图12、图13分别是修改APK前后,fiddler代理到的数据包。

3.方法二修改B函数,使其总返回TRUE。
根据准备工作,从图9中看到,pinCertificates函数会加载密钥库,而图10是加载密钥库的smali代码,所以可以修改pinCertificates函数,让其不加载密钥库,直接返回。
然后重打包、 自签名生成的APK、重新安装到手机。
然后访问https://github. com,可以得到服务器的响应包,即绕过SSLPinning成功。

4.方法
修改密钥库
C,导入fiddler代理的根证书。
根据准备工作,从图11中看到,APK确实带有自己的密钥库, 所以可以导入fiddler的根证书到该密钥库。
然后重打包、自签名生 成的APK、重新安装到手机。
然后访问,可以 图12 得到服务器的响应包,即绕过SSLPinning成功。
70 前沿技术 导入证书步骤可以按照图14,证书导入密钥库时,会要求输入密钥库的密钥,可以从调用pinCertificates处找到。
logcat,我们或多或少会从logcat中找到些机会,如图15,APK进行http连接时会调用GET方法,可以从logcat中看到GET所在的类及所在行。
图15 图14
三、总结•SSLPinning特性可以绕过,通过加密通信方式掩盖其他安全 问题的存在不可行性。
•方法一可能会出现在程序其他地方再次验证证书的问题,所以 方法二较好。
•APK大多会进行代码混淆,导致很难找到方法
一、方法二所需 要的目标位置,所以方法三应该是首选。
•虽然方法三简单易行,但难说APK没有其他保护措施(比 如说校验密钥库的完整性),又加上代码混淆过,此时则可以借用 •还有其他现成的解决方法(使用xposed框架,HOOK系统函数等)。

四、参考文献AndroidSSLBKS证书的生成过程:/ hehe9737/article/details/10001545bcprov-ext-jdk15on-146.jar下载:/ download/t3w/5648487xposed框架模块:http://repo.xposed.info/module-overviewxposed框架SSL模块:/iSECPartners/ Android-SSL-TrustKillergithub关于SSLPinning项目:/search?
utf 8=%E2%9C%93&q=ssl+pinning 71

标签: #文件夹 #文件夹 #回收站 #回收站 #转换成 #回收站 #回收站 #磁盘