HTTP抓包分析工具有比较多,如Fiddler,FireBug,HttpWatch,Tcpdump,PAW(mac)等。在做移动开发时,找到一款合适自己的能进行移动设备HTTP抓包的工具也是非常重要的。正所谓,工欲善其事必先利其器。
在windows机器上,经常用的最多的是fiddler工具,很强大,图形化界面,使用方便、简单;在mac上,Charles 类似fiddler工具,同样是易于操作的图形化界面,同样都是通过代理的方式实现抓包功能,可通过工具分析http(s)包、修改resquest、response内容,满足日常需求。
个人非常喜欢Fiddler,功能强大,而且还支持替换文件,对于调试线上的js/css文件非常方便。在windows上是个很趁手的工具。
今天给大家介绍一款强大的支持手机端抓包的工具:mitmproxy中间人代理工具。
Mitmproxy是一个基于python的中间人代理的框架。它的功能强大,使用简单。支持SSL的HTTP中间人代理工具,它允许你检查HTTP和HTTPS流量并支持直接改写请求。做过渗透测试的肯定很熟悉工具burpsuite或Fiddler,这些工具能够拦截并修改http或https的数据包,对于分析数据包交互的应用来说是非常有用的。但是这些工具都是整套给我们做好了。比如如果想自己定制一套这样的工具,添加一些自己需要的功能,如批量自动改写数据,自动提取数据等,那么我想,mitmproxy将是一个比较好的选择,因为它提供了一个可供用户调用脚本的功能,而不必每次打开fiddler、手动去修改request或者response,通过脚本定制化就能实现数据篡改。
官网地址:http://mitmproxy.org/ 。
它是开源的,托管在github上,使用python开发,跨平台。
github开源地址https://github.com/mitmproxy/mitmproxy
一、介绍
mitmproxy工程工具包,主要包含了3个组件:
(1)mitmproxy:拦截的http(s)记录控制台显示 【window不支持】
(2)mitmdump:命令行接口,可以对接python脚本,通过脚本实现监听后的处理,可定制个人需求。【脚本可用此模式运行】
(3)mitmweb:web形式展示
二、使用环境
1.Python3.6及以上 (python -V查看版本)
2.更新pip(避免部分依赖包未下载)
3.安装mitmproxy
pip install mitmproxy #安装依赖包的同时也将环境安装
三、配置
电脑端设置
电脑和手机连接到同一个wifi环境下。运行时,需要指定电脑的ip地址,并约定一个端口号:
mitmproxy -p 2386
手机端设置
手机和电脑连接同一个wifi,然后设置代理。进入WLAN,找到当前连接的wifi,长按,弹出的框中选择“修改网络”,进入后,选择“显示高级选项”,代理选择为“手动”,代理服务器主机名设置为mac端的ip地址,端口号是跟刚刚设置的2386,设好后保存。如下图:
-
访问mitm.it 网址,直接下载、安装、信任CA证书(https协议需要)
使用mitmproxy【window不可用,linux、mac可使用,笔者使用linux系统】
- 启动mitmproxy,默认8080,也可指定端口
mitmproxy -p 8888#指定端口
mitmproxy文档地址 https://docs.mitmproxy.org/stable/
四、拦截HTTP请求/响应
mitmproxy是一个支持SSL的HTTP中间人代理工具,它允许你检查HTTP和HTTPS流量并支持直接改写请求。它位于客户端和Server端之间,它可以获取客户端的Request,然后修改再发送给Server端;Server端得到Request之后再发出相应的Response,又会被mitmproxy拦截,如果你想修改response,便可修改后再发给客户端。
要想在windows平台上自动批量修改数据,可运行mitmdumps工具,启动时可以使用-s参数导入外部的脚本进行拦截处理。
mitmdumps -s mitm_script.py
mitm_script.py为自己定制的修改数据的脚本。
五、自定义脚本
完成了上述工作,我们已经具备了操作 mitmproxy 的基本能力 了。接下来开始开发自定义脚本,这才是 mitmproxy 真正强大的地方。
脚本的编写需要遵循 mitmproxy 规定的套路,这样的套路有两个。
第一个是,编写一个 py 文件供 mitmproxy 加载,文件中定义了若干函数,这些函数实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的函数,形如:
"""
Created on 2018-08-14 00:04:17
@author: wangzheng
Sys_Env : Windows_AMD64 Python3.6.2
Email:yaoyao12348@126.com
WeChat: hrcl2015 (WeiXin)
Filename:
Description : 插件
"""
import mitmproxy.http
from mitmproxy import ctx
num = 0
def request(flow: mitmproxy.http.HTTPFlow):
global num
num = num + 1
ctx.log.info("We've seen %d flows" % num)
第二个是,编写一个 py 文件供 mitmproxy 加载,文件定义了变量 addons,addons 是个数组,每个元素是一个类实例,这些类有若干方法,这些方法实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的方法。这些类,称为一个个 addon,比如一个叫 Counter 的 addon:
"""
Created on 2018-08-14 23:54:43
@author: wangzheng
Sys_Env : Windows_AMD64 Python3.6.2
Email:yaoyao12348@126.com
WeChat: hrcl2015 (WeiXin)
Filename:
Description : 插件
"""
import mitmproxy.http
from mitmproxy import ctx
class Counter:
def __init__(self):
self.num = 0
def request(self, flow: mitmproxy.http.HTTPFlow):
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)
class Counter2:
def __init__(self):
self.num = 0
def request(self, flow: mitmproxy.http.HTTPFlow):
self.num = self.num + 1
ctx.log.info("secend addons %d flows" % self.num)
addons = [ Counter(),Counter2() ]
#这里可以放多个插件
这里强烈建议使用第二种套路,直觉上就会感觉第二种套路更为先进,使用会更方便也更容易管理和拓展。况且这也是官方内置的一些 addon 的实现方式。
对一次 web 请求,我可以理解为“HTTP 请求 -> HTTP 响应”的过程。
由上面的代码可以看出,每发生一个事件,python脚本就执行响应的代码,事实上考虑到 mitmproxy 的实际使用场景,大多数情况下我们只会用到针对 HTTP 生命周期的几个事件。再精简一点,甚至只需要用到 http_connect、request、response 三个事件就能完成大多数需求了。
六、总结
mitmproxy工具最强大的功能莫过于自定义脚本实现数据按需修改的功能。想象一下,安卓手机上termux+mitmproxy+python,可以完成各种各样的功能。比如,有奖答题软件的破解,考试APP软件数据的提取与篡改。有兴趣可联系我。