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

posted on 2021-02-02 23:16  silyvin  阅读(796)  评论(0编辑  收藏  举报