HTTPS防抓包机制
[TOC]
一、常用的抓包工具
1.1 抓包工具
Charles
Fiddler
charles
1.1.1
安装步骤:
PC
端安装Charles
根证书:help --> SSLProxying --> Install Charles Root Ceriticate
;- 安装
Charles
根证书到手机:help --> SSLProxying --> Install Charles Root Ceriticate on a Mobile Device or Remote Browser
.
注意:安装证书过程需要手机wifi
设置电脑IP
地址代理,否则不会下载证书。
- 在手机浏览器中访问地址
chls.pro/ssl
,下载并安装Charles
根证书; PC
端口设置代理https
端口(域名地址)
Proxy --> SSL Proxying Settings
HTTP
抓包示例:
Fiddler
1.1.2 官网:https://www.telerik.com/download/fiddler
安装步骤:
- 确保
Android
设备和安装Fiddler
的电脑连接到同一个Wifi AP
上;- 配置
Fiddler
抓取并解密HTTPS
包:Tools --> Fiddler Option --> HTTPS
选项卡勾选Capture HTTPS CONNECTs
和Decrypt HTTPS traffic
;由于通过Wifi
远程连过来,所以在下面的选项中选择..from remote clients only
;切换到Connections
选项卡修改监听端口,勾选上Allow remote computer to connect
;- 设置
Android
设备,添加上代理服务器;- 导证书到
Android
设备;- 打开设备自带的浏览器,在地址栏输入代理服务器的
IP
和端口导入FiddlerRoot certificate
。
HTTPS
抓包示例:
二、中间人攻击原理
2.1 基础概念
TCP/IP
分层
2.1.1 TCP/IP
的分层共分为四层:应用层、传输层、网络层、数据链路层。
- 应用层:想用户提供营养服务时的通讯活动(
ftp
、dns
、http
);- 传输层:网络连接中两台计算机的数据传输(
tcp
、udp
);- 网络层:处理网络上流动的数据包,通过怎样的传输路径把数据包传送给对方(
ip
);- 数据链路层:与硬件相关的网卡、设备驱动等等。
HTTP/HTTPS
2.2.2 HTTP
:HyperText Transfer Protocol
(超文本传输协议),被用于在web
浏览器和网站服务器之间传递信息,在TCP/IP
中处于应用层。
- 通信使用明文,内容可能被窃听;
- 不验证通信方的身份,因此可能遭遇伪装;
- 无法证明报文的完整性,所以有可能遭到篡改。
HTTPS
:HTTPS
中的S
表示SSL
或者TLS
,就是在原HTTP
的基础上加上一层用于数据加密、界面、身份认证的安全层。
HTTP
+加密+认证+完整性保护 =HTTPS
HTTPS
单向认证
2.1.3
HTTPS
双向认证
2.1.4
2.1.5 抓包原理
https
防抓包手段
三、3.1 网络代理
3.1.1 代理检测
- 检测是否使用网络代理
- 将网络库(如
OKHttp
库)设置为无代理模式,不走系统代理
// HttpURLConnection:
URL url = new URL(urlStr);
urlConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
// OkHttp:
OkHttpClient client = new OkHttpClient().newBuilder().proxy(Proxy.NO_PROXY).build();
3.1.2 防御破解
try {
var URL = Java.use("java.net.URL");
URL.openConnection.overload('java.net.Proxy').implementation = function() {
return this.openConnection();
}
} catch(e) {
console.log("" + e);
}
try {
var Builder = Java.use("okhttp3.OkHttpClient$Builder");
var mybuilder = Builder.$new();
Builder.proxy.overload('java.net.Proxy').implementation = function(arg1) {
return mybuilder;
}
} catch(e) {
console.log("" + e);
}
3.2 证书固定
SSL-Pinning
3.2.1 - 证书锁定(
Certificate Pinning
): 在客户端代码内置仅接受指定域名的证书,而不接受操作系统或浏览器内置的CA
根证书对应的任何证书;-->弊端:证书有效期问题 - 公钥锁定(
Public key Pinning
):提取证书中的公钥并内置到客户端中,通过与服务器对比公钥值来验证链接的正确性。
SSL-Pinning
3.2.2 破解Xposed
框架 + justTrustMe
插件
Xposed
框架:Android
上应用广泛的HOOK
框架,基于Xposed
框架制作的外挂模块可以hook
任意应用层的java
函数,修改函数实现;justTrustMe
插件:justTrustMe
插件是一个用来禁用、绕过SSL
证书检查的基于Xposed
模块,将Android
系统中所有用于校验SSL
证书的API
证书的API
都进行了Hook
,从而绕过证书检查。
HOOK
3.3 对抗- 检测
HOOK
:检测Xposed
、Frida
、Substrate
等HOOK
框架; - 使用
Socket
连接:使用Socket
走TCP/UDP
,防止被应用层抓包; - 传输数据加密:协议字段加密传输,并因此秘钥,应用层加固;
native
层传输:将网络传输逻辑写到jni
层实现,提高反编译门槛。