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