基于mitmproxy0.13的二次开发

一、什么是mitmproxy

mitmproxy是一款支持HTTP(S)的中间人代理工具。和Fiddler、burpsuit的功能相同,但fiddler的二次开发需要用jsp脚本来做且功能不是很强大;burpsuit则是用java来写的,接口太复杂看文档看的都要死了。相反的mitmproxy则是用python开发,接口比较容易看懂,且在官方的包里有一个examples的文件夹,里面有很多例子,实在不行还可以直接看源码,很方便。

二、工作原理介绍(以HTTPS为例)

1.客户端发起一个到mitmproxy的连接,并且发出HTTP CONNECT请求,
2.mitmproxy作出响应(200),模拟已经建立了CONNECT通信管道,
3.客户端确信它正在和远端服务器会话,然后启动SSL连接。在SSL连接中指明了它正在连接的主机名(SNI),
4.mitmproxy连接服务器,然后使用客户端发出的SNI指示的主机名建立SSL连接,
5.服务器以匹配的SSL证书作出响应,这个SSL证书里包含生成的拦截证书所必须的通用名(CN)和服务器备用名(SAN),
6.mitmproxy生成拦截证书,然后继续进行与第3步暂停的客户端SSL握手,
7.客户端通过已经建立的SSL连接发送请求,
8.mitmproxy通过第4步建立的SSL连接传递这个请求给服务器。

摘自:freebuf

在官方文件的docs.schematics文件夹里有流程图片,我贴下大家看下:

三、如何使用接口

首先先包含如下两个包:

下面是程序的入口点:

port是端口、cadir是证书所在的文件夹,当然证书要自己做,博客之前的文章里有,想看的网上翻翻,就不在这里写了。

可以看到MyMaster这个类就是主要功能入口:

上面代码,f里就保存的是请求的url、头和post的数据。response是一样的我就不写了。直接拿来是入库、重放、修改都是你的事了。

四、存在的问题

在我二次开发过程中发现这个版本存在信息泄露问题,大概用几十分钟后内存就被占满了,去官网查了下也确实有人提出这个问题,并已在最新的版本修复了(谁让我当时非要用python2.7呢!),可是最新版本是python3.4开发的且接口也有点变化,过段时间要用3.4重写了,重写之后我也会写个教程出来,恩,就这样。

发表评论