某图片软件双向证书认证+加密传输分析
字数 1781 2025-08-30 06:50:12
双向证书认证与加密传输分析教学文档
1. 双向证书认证概述
双向证书认证(也称为双向TLS或客户端证书认证)是一种安全机制,其中客户端(如安卓应用)和服务器通过交换和验证彼此的证书来建立安全连接。与传统的单向TLS不同,双向TLS要求客户端也提供证书以便服务器验证其身份。
1.1 与传统TLS的区别
- 单向TLS:仅服务器向客户端提供证书,客户端验证服务器身份
- 双向TLS:客户端和服务器互相提供证书,进行双向身份验证
2. 判断应用是否使用双向证书认证
2.1 使用Charles抓包测试
- 将手机连接到开启Charles的电脑热点
- 尝试抓取应用的网络请求
- 如果Charles返回
400 Bad Request或403 Forbidden错误,则可能表明应用使用了双向证书认证
3. 绕过双向认证的方法
3.1 准备工作
- 关闭VPN和代理
- 确保网络环境干净
3.2 获取客户端证书
有两种主要方法获取客户端证书:
- 直接解压应用包:如果证书在应用包内,可以直接解压APK,在assets目录中导出证书
- 使用Frida动态dump证书(更常用)
3.2.1 使用Frida dump证书
Frida脚本主要功能:
- 在HTTPS双向认证(mTLS)过程中自动捕获并导出客户端证书和私钥
- Hook关键Java类的方法,特别是
KeyStore$PrivateKeyEntry的证书处理方法和java.io.File的文件操作 - 截获应用在TLS握手过程中使用的私钥和证书
- 将证书和私钥自动打包为PKCS12(.p12)格式,存储在应用数据目录下
- 使用固定密码"hooker"加密导出的证书文件
- 辅助定位应用中实现的SSL证书绑定(SSL Pinning)代码
操作步骤:
- 启动Frida
- 手动模拟正常使用app
- 证书会被dump到根目录下的Download文件夹
- 可能有多个证书,任选一个即可使用
- 使用adb将证书导出到本地
3.3 配置Charles客户端证书
- 打开Charles,进入
Proxy -> SSL Proxying Settings -> Client Certificates,点击Add - 在弹出的对话框中配置:
Host:填写请求的网站域名Port:填写目标端口(之前请求失败时对应的端口),也可以填写*(匹配所有端口)
- 点击
Import P12,选择之前导出的.p12证书文件 - 输入证书密码:
hooker - 勾选添加的证书,点击
OK确定 - 重新发起请求,现在应该可以看到解密后的响应内容
4. 加密传输分析
4.1 请求验证
在成功查看响应内容之后,建议使用Python复现请求以验证分析结果。
4.2 加密逻辑分析
加密逻辑的分析可以通过Hook各种加密算法来实现:
- Hook加密算法时输出传入的参数和函数返回的结果
- 将Hook结果与请求返回的结果对比
- 通过返回的数据可以定位到加密的算法(响应返回的数据非常长时,可能是直接对图片数据等大文件进行加密)
4.3 定位加密算法
- 使用算法Hook脚本监控常见加密算法
- 观察Hook输出中处理大量数据的函数(因为一般不会加密这么长的数据)
- 确定加密方式后,使用Python还原加密算法
4.4 解密流程
- 使用先前脚本发起请求
- 对返回的数据应用解密算法
- 分析解密后的数据
5. 完整流程总结
- 识别:通过Charles抓包失败判断是否使用双向认证
- 获取证书:使用Frida dump客户端证书和私钥
- 配置代理:在Charles中导入证书并配置客户端认证
- 分析加密:Hook加密算法定位具体实现
- 复现请求:使用Python实现带证书的请求和数据处理
- 解密数据:根据分析结果实现解密逻辑
6. 注意事项
- 确保在合法授权范围内进行此类分析
- 某些应用可能有额外的防护措施(如证书绑定、代码混淆等)
- 不同版本的应用程序可能有不同的实现方式
- 分析过程中可能需要结合静态分析和动态分析
7. 工具清单
- 抓包工具:Charles
- 动态分析工具:Frida
- 证书管理工具:OpenSSL(可选)
- 脚本语言:Python(用于复现请求)
- ADB工具:用于与安卓设备交互
通过以上步骤和方法,可以系统地分析和理解使用双向证书认证和加密传输的应用程序的通信机制。