Android高级架构师:Android平台HTTPS抓包解决方案及问题分析

Android高级架构师:Android平台HTTPS抓包解决方案及问题分析GitHub地址: https://github.com/MegatronKing/HttpCanary 废话不多说,在我工作的10年里

GitHub地址:

https://github.com/MegatronKing/HttpCanary

我立即在10 年的工作中收集了一些信息。如果需要,请私信我【学习】**,我可以分享。文章最后有相应的视频,感兴趣的朋友可以观看。我的所有文章都是系列文章,并附有相应的视频资料。我会慢慢更新的。我愿意和大家一起学习、共同进步,如果大家发现不足之处,请告诉我。

点击获取

Android学习PDF+架构视频+面试文档+源码笔记

抓包原理

==================================================================

几乎所有的网络数据包捕获都使用中间人方法(MITM)。流行且知名的抓包工具如Fiddler 和Charles 也使用中间人方法来抓包。

从上面的示意图我们可以看出,抓包的核心主要有两个问题。

MITM 服务器如何模拟真实服务器

MITM 客户如何冒充真实客户

第一个问题是,MITM服务器要成为真正的服务器,它必须能够向指定的域名颁发公钥证书,并且该公钥证书必须能够通过系统的安全验证。例如,客户端发送https://www.baidu.com/的网络请求。要冒充百度服务器,MITM服务器必须拥有www.baidu.com域名的公钥证书并将其发送给客户端。您还需要一个与您的私钥相匹配的公钥。

MITM服务器所做的就是从初始SSL/TLS握手包Client Hello中提取域名www.baidu.com,并使用应用程序内置的CA证书为www.baidu.com创建公钥证书并创建私有证书钥匙。 baidu.com 域名。创建的公钥证书在SSL/TLS 握手过程中发送到客户端。客户端收到公钥证书后,系统对证书进行验证,判断该证书是否为百度持有。该证书是由抓包工具伪造的。验证公钥证书时,为确保系统确定证书真实有效,数据包捕获应用程序中内置的CA 证书必须与实际证书颁发者(CA ) 匹配,必须手动安装在系统上。洗白了。因此,要捕获HTTPS数据包,必须先安装CA证书。

第二个问题是,MITM客户端是否伪装成客户端?这个问题通常不存在,因为服务器(在大多数情况下)不会验证客户端。例如,服务器通常不关心客户端是Chrome 还是IE 浏览器、Android 应用程序还是iOS 应用程序。当然,服务器也可以验证客户端。我们稍后会对此进行分析。

安装CA证书

====================================================================

要清理数据包捕获应用程序中内置的CA 证书,您必须将其安装在系统上。 Android系统将CA证书分为两种类型:用户CA证书和系统CA证书。顾明斯认为用户CA证书是用户安装的,而系统CA证书是系统安装的。显然,后者更为可靠、有效。

系统CA 证书存储在/etc/security/cacerts/目录中。该名称是CA 证书的subjectDN 前四位数字的移位或,带有后缀.0。 00673b5b.0。出于安全原因,需要root 权限才能添加和删除系统CA 证书。

对于未root的Android设备,用户只能安装用户CA证书。

无论是系统CA证书还是用户CA证书,您都可以在“设置> 系统安全> 加密和凭证> 可信凭证”中查看。

Android7.0用户CA限制

==================================================================================

从Android 7.0开始,系统不再信任用户CA证书(应用targetSdkVersion=24时启用,即使系统是7.0或更高版本,targetSdkVersion 24仍然受信任)。这意味着即使安装了用户CA 证书,您也无法在Android 7.0 及更高版本的计算机上捕获targetSdkVersion=24 的应用程序的HTTPS 包。

例如,在上例中,抓包工具使用内置的CA证书为www.baidu.com域名创建公钥证书,并在系统验证该证书时将其发送给客户端。由用户的CA证书签名。那么,如果您解决此限制,有四种已知方法(在7.0 之前的系统上被忽略)。

配置网络安全配置

========================================================================================

如果你想捕获自己的应用程序,只需在AndroidManifest中设置networkSecurityConfig即可。

?xml 版本=\’1.0\’ 编码=\’utf-8\’?

宣言.

应用程序android:networkSecurityConfig=\”@xml/network_security_config\”

……

……

?xml 版本=\’1.0\’ 编码=\’utf-8\’?

这意味着应用程序信任用户的CA证书,系统可以通过用户CA证书的验证。有关更多信息,请参阅

网络安全配置:

https://developer.android.com/training/articles/security-config

较低目标SDK 版本24

========================================================================================

如果你想获得一个应用程序包,你可以找到过去的版本,你所需要的只是它的targetSdkVersion 24。不过,随着Google Play开始限制targetSdkVersion,2019年8月1日后,targetSdkVersion=26成为强制要求,国内应用市场也逐渐开始遵守这一限制。大多数应用程序的targetSdkVersion 大于24。这意味着捕获HTTPS数据包变得越来越困难。

并行空间数据包捕获

====================================================================

如果要抓取targetSdkVersion=24的应用程序包怎么办?可以使用并行空间或者VirtualApp来救国。您可以使用多个应用程序(例如Parallel Space 和VirtualApp)作为主机系统来运行其他应用程序。如果Parallel Space或VirtualApp的targetSdkVersion是24,问题就解决了。

这里我推荐使用平行空间

与一些开源VirtualApps相比,Parallel Space运行更加稳定。不过,4.0.8625之前的平行空间版本的targetSdkVersion为24,请注意不要误安装。当然,你也可以直接在HttpCanary设置中安装并行空间。

安装到系统的CA 证书目录中

==========================================================================

对于root 的机器来说,这是完美且最好的解决方案。将CA证书安装到系统CA证书目录中,就能真正洗白假CA证书,即使不是也能成真。系统CA证书格式是一种特殊的.0格式,因此您必须以该格式导出抓包工具内置的CA证书。 HttpCanary 直接提供此导出选项。

操作路径:设置-SSL证书设置-导出HttpCanary根证书-系统信任(.0)。

PS. 不幸的是,HttpCanary v2.8.0 之前导出的证书名称可能不正确。我们建议升级到v2.8.0 或更高版本。

导出.0格式的证书后,可以使用MT管理器将.0文件复制到/etc/security/cacerts/目录下,或者通过adb重新挂载然后push(这里有提到一点,但是不要这样做) t 搜索它(不要搜索这个)SD 卡内的目录)。

安装Firefox 证书

==========================================================================

Firefox 浏览器Firefox 有自己的一套CA 证书管理,无论是系统CA 证书还是用户CA 证书,但Firefox 不识别它们。此时,您需要通过特殊方式将CA证书导入到Firefox中。否则,当您浏览网页时,Firefox 将停止工作。

HttpCanary v2.8.0版本提供了Firefox证书导入选项。在“设置”>“SSL 证书设置”>“将HttpCanary 根证书添加到Firefox”下:

单击右上角的复制按钮,将URL 复制到粘贴板,保留此页面,打开Firefox,然后粘贴复制的URL。

当出现“下载证书”弹出框时,请务必手动检查网站是否使用“信任”进行标记,并且电子邮件用户是否使用“信任”进行标记。然后检查。

修复公钥证书

====================================================================

证书固定是指嵌入在客户端服务器中的实际公钥证书。发出HTTPS 请求时,服务器发送给客户端的公钥证书必须与客户端内置的公钥证书匹配,请求才能成功。

在这种情况下,MITM服务器无法模拟真实服务器,因为MITM服务器创建的公钥证书与客户端上安装的公钥证书不匹配。此时抓包会显示为app网络错误。饿了么等已知应用程序使用证书锁定。

此外,某些服务器使用自签名证书(不是由实际CA 颁发者颁发的证书)。在这种情况下,应用程序在发出请求时必须使用证书固定。

固定证书的常见方法是在您的应用程序中构建公钥证书(.crt 或.cer 格式),并在创建TrustManager 时将公钥证书添加到您的应用程序。许多应用程序模拟或加密其内置公钥证书以防止反向提取。例如饿了么将其伪装成png。当然,没有必要纯粹模拟或加密公钥证书。自欺欺人。

证书固定对于数据包捕获来说是一个非常烦人的障碍,但总有办法绕过它,只是稍微麻烦一点。

修复JustTrustMe 破解证书

Xused和Magisk都有相应的模块来解密证书固定并实现定期抓包。破解的原理,粗略来说就是Hook创建SSLContext以及TrustManager相关的其他方法来移除修改后的证书。

基于VirtualApp的Hook机制解密证书锁定

Xused和Magisk需要刷机等特殊处理,但如果不想费心刷机,也可以在VirtualApp中添加hook代码,使用VirtualApp打开目标应用程序并抓包。当然,一些开发者已经实现了相关功能。请参阅下面的详细信息。

情况1:

https://github.com/PAGalaxyLab/VirtualHook

案例2:

https://github.com/rk700/CertUnpinning

但是,CertUnpinning 插件中的代码存在一个问题需要修复。

导入实际的公钥证书和私钥

如果客户端固定公钥证书,MITM 服务器必须维护与实际公钥证书匹配的私钥。如果开发者拥有真实服务器的公钥证书和私钥(例如百度的公钥证书和私钥,百度后端开发需要它们),则进入HttpCanary并导入常规数据包。您还可以完成捕获。

在“设置> SSL证书设置> 管理SSL导入证书”中,切换到服务器并导入公钥证书和私钥.p12和.bks格式文件。

双向认证

==================================================================

获取信息专栏

#Android高级架构师:以上关于Android平台HTTPS抓包方案及问题分析的信息均来自网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91615.html

Like (0)
CSDN的头像CSDN
Previous 2024年6月22日
Next 2024年6月22日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注