效率工具篇 — fiddler 抓包代理

http 代理工具

通常来说,代理的作用常常有以下几种原因:

  1. 解决网络问题:比如不同机房网络跨公网或者跨网络通信,需要走代理来解决通信问题
  2. 统一鉴权:比如内部组件不能直接暴露给外部,需要走鉴权,但是我们通常不会给每一个组件都搞一套鉴权,这种情况可以只暴露一个代理组件,由这个组件解决鉴权问题,鉴权之后,请求做纯转发
  3. 调试,处理:代理的本质是请求转发,请求包会过一遍代理,所以我们可以趁这个中间过程,可以对包分析,或者处理

通常,我们学习一种网络协议的时候,最简单也最深刻的方式就是抓包来看看,这里网络包到底是什么格式,传递的是什么内容?交互是几次?

对吧,有了网络协议包,还有啥不明白的,不得比直接看代码强一百倍。

对象存储的 S3 协议是基于 http 协议之上的,当我们在使用对象存储的时候,你就不好奇 PUT,GET,DELETE 等操作到底是怎么回事?

所以,我们就需要一个好用的抓包工具,这里有三个选项:

  1. wireshark
  2. fiddler
  3. charles

其中 wireshark 这个呢肯定功能是满足的,别说 http 包了,啥协议层的包都能抓,缺点就是太重了,大炮打蚊子,而且对于这种简单抓取 http 包的场景不是很友好。

fiddler 这个工具呢就非常简单易用,能够直接代理 http 的请求,代理协议支持 https 和 socks ,缺点是只有 windows 系统平台上有。

charles 这个也好用,而且是跨平台的,几大平台都有,windows,mac,但是缺点是要钱,还挺贵。

所以呢,我自己代理 http 包的时候,用的基本都是 fiddler 工具,相信 fiddler 应该很多搞 web 开发的人都用过,这个 http 的代理工具最大的特点免费加实用就够了,在初期研究 S3 协议层的时候,这个工具非常有用。

fiddler

官网:https://www.telerik.com/fiddler

image.png

啥都不要做,先跑起来

fiddler 启动之后,会自动把自己设置成系统默认的代理,默认代理端口 8888 。你打开个浏览器,然后刷下百度页面,你就能看到抓到的 http 包了,如下:

image.png

这个注意两个东西:

  1. 左边的页面:能看到抓到的页面,点击能看到详情包
  2. 右边我们先注意到 filter 这个按钮,这个是定义让你抓什么样的 http 包的过滤条件,我这里设置的是 “ * ”,就是说,所有的 http 包都抓。

代理示意图

image.png

代理端口在哪里配置?

因为有些时候,我们可能需要显式指定代理端口,所以我们在深入看下配置,其实这个端口是可以配置的。

Tools -> Options -> Connections

image.png

Connections 配置:

image.png

这里我们看到 fiddler 的默认代理端口是 8888 ,并且 fiddler 启动之后,默认情况会自动把系统代理设置成 fiddler 。

对象存储协议怎么研究?

怎么抓对应 host 的包?

为什么需要过滤指定的 host ? 如果过滤条件是“ * ”,就会被无关的请求刷屏。 研发对象存储系统的时候,经常需要在本地调试系统,调试的入口自然是 S3 协议,现在我们就看下怎么抓到指定的 http 包。

Filters 设置

image.png

Inspectors 页面

这个页面就可以看到协议的详情,http 的请求,http 的响应,如下:

image.png

上面的例子,通过这个我们就可以看到请求包,就这么几个 header :

  1. User-Agent:CloudBerryLab.Base.HttpUtil.Client 5.9.1 (http://www.cloudberrylab.com/)
    1. 我测试用的 S3 客户端是 CloudBerryLab ,这里的头部是这个工具加的。其实还有很多的 S3 工具,可以见我另一篇文章:【】
  2. x-amz-date:Sun, 07 Jun 2020 13:53:31 GMT
    1. 跟 aws 字段含义一样
  3. Authorization:AWS PjFtQJWfvKrSLYkSlV-keCKWzmXzSK1Zp3R9S5MV:DNkuelnTQY4xgwARx+NTuQ4Gxc4=
    1. S3 V2 签名字段
  4. Host:192.168.56.12:20000
    1. 我为了展示,在一台虚拟机上起了一个 S3 的服务端,虚拟机地址+端口就是 192168.56.12,20000

所以,这就明白了呀,原来 S3 V2 版本的请求包这么简单,我这里发送的是一个 list bucket 的请求,返回的是 bucket的列表,响应包如下:

HTTP/1.1 200 OK
X-Log: BUCKET:4;S3APIv2:5
X-Reqid: -UYAAG3e9GdjRxYW
x-amz-request-id: -UYAAG3e9GdjRxYW
Date: Sun, 07 Jun 2020 13:53:30 GMT
Content-Length: 231
Content-Type: text/plain; charset=utf-8

<ListAllMyBucketsResult>
<Owner>
    <ID>260637563</ID>
    <DisplayName>260637563</DisplayName>
</Owner>
<Buckets>
    <Bucket>
        <Name>qiya-bucket</Name>
        <CreationDate>2020-06-07T13:52:25.000Z</CreationDate>
    </Bucket>
</Buckets>
</ListAllMyBucketsResult>

断点交互

我们跟进一步,如果我能把这个请求暂停住,并且做自己的设置,是不是就更好?这样我们甚至可以篡改请求包,做更深入的调试请求。

下面我举一个断点住 list bucket 请求,故意篡改签名,让请求失败。

bpu 设置断点

在下面黑框框里,使用 bpu 命令断点:

bpu 192.168.56.12:20000

image.png

断点住就显示成红色如下:

image.png

篡改签名头部数据

右键点击,选中 ‘Edit Header’ 编辑头部数据(估计随便改掉几个字符串,预期签名不过)

image.png

image.png

修改完之后,点击 ‘Run to Completion’ ,让请求继续走下去,发到后端:

image.png

返回结果截屏:

image.png

返回的结果也和预期一样,返回的错误码是 403 ,响应里面也是预期的是 SignatureDoesNotMatch 信息。看,我们就利用这个 fiddler 中间 hook 代理的过程,无业务感知的篡改了头部数据,达到了预期。

你能抓包,你能篡改,就能完成非常多的功能,接下来就靠大家的想象力。


坚持思考,方向比努力更重要。关注公众号:奇伢云存储,获取更多干货。 关注我公众号, 获取更多干货