fiddler原理+fiddler为什么抓chrome而不能抓curl和httpclient?fiddler为什么能篡改报文?
0 https原理
1 fiddler原理
https://www.cnblogs.com/sucretan2010/p/11526467.html
Fiddler工作于七层中的应用层,(wireshark工作在4层)
大家都知道手机系统中集成了系统认为可信的CA根证书,如果服务器的证书是这些机构颁发了,HTTPS请求时系统才认为是安全的,否则SSL握手失败(前提是APP中使用系统默认证书信任机机制)。Fiddler自签名证书肯定不在系统信任的证书列表中,那怎么办呢?我们可以在手机中把Fiddler自签名的证书导入到信任证书列表中就可以解决这个问题了。
接下来打开手机中的浏览器,在地址栏输入Fiddler监听的IP:端口,比如:192.168.1.106:8888。
2 fiddler为啥能截取chrome
https://www.cnblogs.com/ZaraNet/p/10204856.html
我们发现,我们只要干什么事,都被会被他们截取,他们究竟是干了什么邪门的事情?我们打开浏览器的设置-搞基-系统-代理。
如下图,我们逐一打开,发现其中的端口号和我们的Fiddler工具中的设置端口一毛一样,这就是代理工具关键。当然这也是fiddler修改的。意思就是中间经过了个人,就是这个代理工具,fiddler,所以它能抓到这个包。
其中需要注意的是,当fiddler一关闭,那么这个代理就会被关闭,也就变成灰色的了。
如果是其他浏览器,有可能打开fiddler那个代理可能不会自动开启,需要你自己找,自己开,自己关。。。。
这下我们明白了,fiddler不同于wireshark在传输层抓包,它是在应用层“抓”包(说抓包不是很恰当,接包比较恰当),需要客户端显式设置fiddler这个代理服务器,这也是为什么fiddler可以修改报文,而wireshark不行。
在此基础上,我们让curl也可以抓包
3 curl
https://blog.csdn.net/weixin_34256074/article/details/92642092
curl -x localhost:8888 www.baidu.com
4 java httpclient
https://blog.csdn.net/w820896059/article/details/103008091
2种方式都可以
HttpHost proxy = new HttpHost("127.0.0.1", 8888, "http"); DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sc); CloseableHttpClient httpClient = HttpClients.custom().setRoutePlanner(routePlanner) .setSSLSocketFactory(sslConnectionSocketFactory) .build();
********************* HttpHost proxy = new HttpHost("127.0.0.1", 8888, "http"); SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sc); CloseableHttpClient httpClient = HttpClients.custom().setProxy(proxy) .setSSLSocketFactory(sslConnectionSocketFactory) .build();
5 应用层原理(以curl为例)
理论上可以在http应用层搞定
客户端
post http://Proxy/xx/xx/xx
host Target
->代理
post http://Target/xx/xx/xx
host Target
论证需要传输层抓包
169.xx.xx.122 linux server ,发出curl
curl -x 10.xx.xx.181:8888 http://xx.com/xx/xx(无所谓)
tcpdump -i eth0 tcp and dst host 10.xx.xx.181 -s 0 -w traffic.pcap
10.xx.xx.181(windows)
开fiddler,允许远程连接 7.2
https://webconcepts.info/concepts/http-method/CONNECT
https://www.jianshu.com/p/1a49a7b08ee0
HTTP 1.1 这个版本是当前版本,包含GET
HEAD
POST
OPTIONS
PUT
DELETE
TRACE
CONNECT
这8个方法
HTTP1.1协议规范保留了CONNECT方法,此方法是为了能用于能动态切换到隧道的代理服务器(proxy,译注:可以为代理,也可以是代理服务器)。
6 抓不到的原因:
6.1 协议
fiddler并不支持全部协议,目前已知的有http2、tcp、udp、websocket等,如果应用走了以上协议,那么fiddler肯定是抓不到的。
http2:因为fiddler是基于.net framework实现的,因为.net framework不支持http2,所以fiddler无法抓取http2
https://www.cnblogs.com/kristin/p/8445141.html
6.2 证书写死在app中,fiddler不能抓取
fiddler抓包的原理是中间人攻击,也就是说,两头瞒,欺骗客户端&&欺骗服务器端,如果https证书写死在app里,也就是说,app不信任fiddler颁发给它的证书,app只信任自己的证书,fiddler没法瞒客户端了,因此fiddler也就抓取不到包了。
再多说几句,如果是自己开发的app,开发调试方便起见,可以使用类似wireshark的工具导入服务器证书,抓包解密。
ssl pinning https://www.v2ex.com/t/725541
6.3 ios10.3 以后注意 通用 -> 关于 -> 证书信任设置->信任charles的根证书.Charles 浏览器http/https APP/https 3.3
6.4
我需要抓取https请求,苹果手机可以毫无问题的抓取,而安卓就不可以。原因是安卓7之后对证书的策略进行变更,应用不再使用用户证书。
有两种方式绕过:
- 在手机上安装系统证书
- 修改app的manifest文件重新打包(程序员设置)
这里我们只讲第一种方法, 所以我们需要把证书添加到系统证书中。
为此,我们需要一台已经root的小米手机。
7 主要参数设置
7.1 pc&app都有
7.2 手机
https://blog.csdn.net/qq_39720249/article/details/81069929
8 一个实际的案例
8.1 背景
同事系统更新后,发现打开fiddler的情况下,包括google.com在内的一切https网站打开后,显示警告,进而必须使用thisisunsafe后门才能打开页面
8.2 分析
因为chrome不信任fiddler的证书,有可能系统更新时把系统信任证书列表更新了一遍,估计又全是CA机构认证的了
8.3 解决
fiddler-tools-options-https-Actions-trust root certificate
8.4 结果
重启fiddler,刷新google.com,没用
重启chrome,可以了,猜测可能chrome启动时继承操作系统的证书信任列表,故要重启一下
cnblog 前/后
8.5
自从fiddler root 进入系统信任证书列表,自签名的网站在chrome也不再显示Not Secure了,因为自签名证书被fiddler拦截了,改为信任的fiddler证书
fiddler前
fiddler后
9 想起当时一个场景:tcp(netty)的调用同步化(异步阻塞)及与http协议、浏览器关系【重点】
当时有一个现成的netty http客户端可以请求成功,做到中途,由于对netty异步的不熟悉及同步异步http的概念的不清晰,导致代码写不下去了
想着换httpclient吧,但是自己写的httpclient客户端死活服务端没有返回数据;后来是硬是把netty异步同步化了
====================
现在想来,可以抓包比较netty与httpclient发出报文的区别:
1 netty/httpclient+setProxy —— 部署在我们的服务器(在对方白名单中)—— 本机linux安装代理fiddler —— 对方的服务器 ok
2 使用工作在传输层的wireshark配合tcpdump,有个问题,wireshark必须有对方服务器的私钥才能解秘报文 nok