Mitmproxy 用于测试的“抓包神器”
点击“蓝字”关注我们吧!
前言
在移动商业广告的测试的工作中,经常会需要对广告请求进行捕获和分析,常使用的有两个测试工具:fiddler,Charles,这两个工具都可以对广告请求进行抓包,断点调试,请求替换,构造请求等,但是这两个工具都有一定的局限性。首先,fiddler只能在windows上运行,charles虽然可以在mac,windows上运行,但是收费。其次,在商业广告请求中经常会对接口协议进行加密处理,使用fiddler和charles就不容易解决了。最后,商业广告测试中需要对广告请求协议的各种字段进行校验,但业务涉及到多字段修改的情况下,再利用fiddler和charles逐一校验判断显然很浪费时间。经过调研和实际应用,我们发现mitmproxy这个工具非常灵活,它是基于Python开发的开源工具,提供了Python API,可以通过载入自定义 python 脚本轻松控制请求和响应。这是其它工具所不能做到的,通过自定义脚本进行二次开发,能够解决商业广告测试过程中所遇到的问题。
Mitmproxy简介
MITM(Man In The Middle Attack)中间人攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。mitmproxy 就是用于 MITM 的 proxy,用于中间人攻击的代理。首先会向正常的代理一样转发请求,保障服务端与客户端的通信,其次,会适时的查、记录其截获的数据,或篡改数据,引发服务端或客户端特定的行为。
mitmproxy有两个关联组件。一个是mitmdump,它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理逻辑。另一个是mitmweb,它是一个Web程序,通过它我们可以清楚观察mitmproxy捕获的请求。
Mitmproxy工作原理
mitmproxy有5种代理模式,主要包含:正向代理,透明代理,反向代理,上游代理,socks代理,在实际使用中经常用到正向代理,mitmproxy作为正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向mitmproxy代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
我们以HTTPS请求为例介绍一下mitmproxy作为正向代理抓包的过程:
①. 客户端连接到mitmproxy,并发出HTTP连接请求
②. mitmproxy响应建立了一个200的连接
③. 客户端认为它正在与远程服务器通信,并启动SSL连接。使用SNI来指定它连接到的主机名
④. mitmproxy使用客户端指定的SNI主机名与服务端建立一个SSL/TLS连接
⑤. 服务器使用匹配的证书进行响应,该证书包含生成拦截证书所需的CN和SAN值
⑥. mitmproxy生成拦截证书,并继续跟客户端SSL/TLS握手。
⑦. 客户端通过已建立的SSL/TLS连接发送请求。
⑧. mitmproxy通过步骤④ 中启动的SSL/TLS连接将请求传递到服务器。
实践应用
解决多字段校验效率问题
商业广告测试中有大量的重复性工作在打点校验上,为了节省测试时间和解决易漏测的问题,我们可以利用mitmproxy二次开发,自定义业务相关的校验规则,然后通过捕获请求对协议中的各个字段进行自动化校验,这样既可以提高测试效率,又避免了漏测问题。
以所测广告业务为例,首先建立addons.py文件,addons 是个列表,每个元素是一个类实例,这些类,称为一个个 addon,这些类有若干方法,这些方法实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的方法。如下图所示为addons文件内容,其中SemiNativeCSJAd则为addon。
SemiNativeCSJAd类中实现了mitmproxy提供的request和response事件,当触发该事件的时候,就会调用对应的方法。
其中将所有类型的广告打点中的公共字段校验抽取成公共方法semiNativeCSJfieldCheck调用。如下图所示:
通过以上方式,简单且有效的解决了多个字段校验问题。
解决商业广告中加解密问题
商业广告有不同的渲染形态,例如:激励视频类,模板类,在实际测试过程中,需要测试人员mock不同的广告进行测试,不仅如此,还会遇到需要对广告进行加解密的情况,那么具体应该怎么解决呢?以所测的广告业务为例需要做以下几个步骤:
①. mitmproxy拦截客户端发起的请求并获取某字段
②. 利用RSA算法根据请求的某字段解密获取到秘钥
③. 利用AES算法和 ②步骤的秘钥,对本地广告内容进行加密
④. mitmproxy将加密的广告返回给客户端
如下图是实现的代码,此mockMaxFile函数还可以根据入参传入不同广告文件即可实现不同广告的mock。
总结
以上就是mitmproxy的简单介绍和在商业广告测试中的应用,相比传统的抓包工具,mitmproxy可以通过载入自定义 python 脚本轻松实现各种定制化需求,提升测试效率和质量,不愧为“抓包神器”。