mitmproxy/mitmdump/mitmweb抓取websocket包并解码输出

 代理  mitmproxy/mitmdump/mitmweb抓取websocket包并解码输出已关闭评论
11月 292019
 

mitmproxy系列工具可以抓取websocket包并将它解码输出,需要怎么做呢?

 

mitmproxy/mitmdump/mitmweb命令行支持 -s  脚本文件.py,此脚本文件(addons)支持的Events事件见

https://docs.mitmproxy.org/stable/addons-events/#supported-events

 

mitmproxy 自带的addons实例文件可参考:https://github.com/mitmproxy/mitmproxy/tree/master/mitmproxy/addons

 

举例:(抓取并解码websocket的包并输出)

snifferWS.py

#!mitmdump -s

import mitmproxy.addonmanager

import mitmproxy.connections

import mitmproxy.http

import mitmproxy.log

import mitmproxy.tcp

import mitmproxy.websocket

import mitmproxy.proxy.protocol

class SniffWebSocket:

    def __init__(self):

        pass

    # Websocket lifecycle

    def websocket_handshake(self, flow: mitmproxy.http.HTTPFlow):

        “””

            Called when a client wants to establish a WebSocket connection. The

            WebSocket-specific headers can be manipulated to alter the

            handshake. The flow object is guaranteed to have a non-None request

            attribute.

        “””

    def websocket_start(self, flow: mitmproxy.websocket.WebSocketFlow):

        “””

            A websocket connection has commenced.

        “””

    def websocket_message(self, flow: mitmproxy.websocket.WebSocketFlow):

        “””

            Called when a WebSocket message is received from the client or

            server. The most recent message will be flow.messages[-1]. The

            message is user-modifiable. Currently there are two types of

            messages, corresponding to the BINARY and TEXT frame types.

        “””

        for flow_msg in flow.messages:

            packet = flow_msg.content

            from_client = flow_msg.from_client

            print(“[” + (“Sended” if from_client else “Reveived”) + “]: decode the packet here: %r…” % packet)

    def websocket_error(self, flow: mitmproxy.websocket.WebSocketFlow):

        “””

            A websocket connection has had an error.

        “””

        print(“websocket_error, %r” % flow)

    def websocket_end(self, flow: mitmproxy.websocket.WebSocketFlow):

        “””

            A websocket connection has ended.

        “””

addons = [

    SniffWebSocket()

]

 

使用命令行 mitmproxy或mitmdump或mitmweb 加 -s snifferWS.py(如: mitmweb -s snifferWS.py) 即可以看到websocket解码的输出了.

实际使用中我一般使用mitmweb -s snifferWS.py 方式,因为这样在web浏览器里可以窗口化显示http/https的详细输入输出,而在终端运行的窗口可以看到websocket的信息。

 

注意:

在使用中发现在我的ios 13.1的iphone机器上无法抓到websocket的解码内容,但android的机器可以,目前还没有找到好的方法,有知道的朋友可以分享下

mitmproxy支持https抓包

 开发  mitmproxy支持https抓包已关闭评论
11月 292019
 

mitmproxy支持https抓包,需要下载下对应文件

  1. 先运行mitmproxy或mitmdump或mitmweb启动代理服务器后(默认8080端口), 在手机里设置好代理服务器。
  2. 打开浏览器,并浏览地址: http://mitm.it, 可以看到下面的画面:选择对应系统的证书文件下载。
  3. 如果是ios用户,记得在描述文件下载后安装。

 

done!

6月 262015
 

mitmproxy抓https请求的文章,分享下,https不自定义加密都不安全了。

一、前言

http proxy在web渗透上占据着非常重要的地位,这方面的工具也非常多,像burp suite, Fiddler,Charles简直每个搞web的必备神器,还有历史比较久远的paros,webscarab等,实际上每个web漏洞扫描器都有http代理的功能。

而今天要介绍的mitmproxy代理工具,非常棒,特别是对https数据的截获,及可扩展性,bra bra……

之所以选择这款工具,是为了做移动APP的通信分析。我们知道使用http代理的基本条件就是网络要互通,而很多情况下,公司的移动网络与办公网络是隔离的,当然你可以用网络共享(或者买个小度wifi或360wifi)的方法来解决隔离。(记得几年前做移动通信分析时就遇到了网络隔离且没有无线网卡的尴尬情况。)

我的选择是在vps上搭建一个http代理(刚买了vps,正可着劲的折腾呢),这时候就需要命令行的工具了,于是选择了mitmproxy(其实我也用nginx搭建了代理,目前以查看通信为主,待熟练了,或许能用nginx-lua模块写个截获重写的模块,悲催的是nginx不支持https,扯远了)。

二、mitmproxy原理

mitmproxy就是代理,有篡改功能的代理。它支持两种模式,正向代理,与透明代理,支持http通信与https通信。

(正向代理,反向代理,透明代理的科普可以看http://z00w00.blog.51cto.com/515114/1031287这篇文章,很容易懂)

mitmproxy官网上也有介绍原理,这里附上好心人的翻译http://www.oschina.net/translate/how-mitmproxy-works

对代理很了解的同学,看看下面四幅图,就能知道是咋回事了。

1. http正向代理

mitmproxy——中间人攻击的神器 - 碳基体 - 碳基体

2. https正向代理

mitmproxy——中间人攻击的神器 - 碳基体 - 碳基体

3. http透明代理

mitmproxy——中间人攻击的神器 - 碳基体 - 碳基体

4. https透明代理

mitmproxy——中间人攻击的神器 - 碳基体 - 碳基体

三、mitmproxy安装

接下来我要在vps上安装mitmproxy了,该工具使用python编写,现在非常多的工具都是python编写的,都有专门的python黑客培训机构了,话说不会python的程序员不是好程序员。

python是跨平台的,因此mitmproxy也是跨平台的。

接下来以linux(debian 7)上安装为例,其他平台非常类似(mac上安装包用homebrew就好)

1. 首先安装python环境,了解python的可以不用看

#python及python依赖包apt-get install build-essential python-dev python-setuptools#安装pip,很好的python包管理器,类似于aptitude,apt-getwget https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gzpython setup.py install

2. 安装mitmproxy依赖包

sudo pip install netlib pyopenssl pyasn1 urwid pil lxml flask#下面是可选(为了解码用)sudo pip install pyamf protobuf#下面是可选(为了测试用)sudo pip install nose pathod countershape

3. 安装mitmproxy

sudo pip install mitmproxy

安装成功后会在生成两个工具/usr/local/bin/mitmproxy与/usr/local/bin/mitmdump

本人是个开源工具杀手,总会遇到问题

安装问题解决:

如果使用pip安装时,出现pkg_resources.DistributionNotFound:(刚升级了os x Mavericks版本就出现了这个问题),可以先更新pip

sudo easy_install –upgrade distributesudo easy_install –upgrade pip

四、CA证书的安装

要捕获https证书,就得解决证书认证的问题,因此需要在通信发生的客户端安装证书,并且设置为受信任的根证书颁布机构。下面介绍6种客户端的安装方法。

当我们初次运行mitmproxy或mitmdump时,

会在当前目录下生成 ~/.mitmproxy文件夹,其中该文件下包含4个文件,这就是我们要的证书了。

mitmproxy-ca.pem 私钥

mitmproxy-ca-cert.pem 非windows平台使用

mitmproxy-ca-cert.p12 windows上使用

mitmproxy-ca-cert.cer 与mitmproxy-ca-cert.pem相同,android上使用

1. Firefox上安装

preferences-Advanced-Encryption-View Certificates-Import (mitmproxy-ca-cert.pem)-trust this CA to identify web sites

2. chrome上安装

设置-高级设置-HTTPS/SSL-管理证书-受信任的根证书颁发机构-导入mitmproxy-ca-cert.pem

2. osx上安装

双击mitmproxy-ca-cert.pem – always trust

3.windows7上安装

双击mitmproxy-ca-cert.p12-next-next-将所有的证书放入下列存储-受信任的根证书发布机构

4.iOS上安装

将mitmproxy-ca-cert.pem发送到iphone邮箱里,通过浏览器访问/邮件附件

我将证书放在了vps上以供下载

http://tanjiti.com/crt/mitmproxy-ca-cert.pem mitmproxy iOS

http://tanjiti.com/crt/mitmproxy-ca-cert.cer mitmproxy android

http://tanjiti.com/crt/mitmproxy-ca-cert.p12 windows

http://tanjiti.com/crt/PortSwigger.cer BurpSuite (burpsuite的证书,随便附上)

5.iOS模拟器上安装

git clone https://github.com/ADVTOOLS/ADVTrustStore.gitcd ADVTrustStore/

DANI-LEE-2:ADVTrustStore danqingdani$ python iosCertTrustManager.py -a ~/iostools/mitmproxy-ca-cert.pem

subject= CN = mitmproxy, O = mitmproxyImport certificate to iPhone/iPad simulator v5.1 [y/N] yImporting to /Users/danqingdani/Library/Application Support/iPhone Simulator/5.1/Library/Keychains/TrustStore.sqlite3 Certificate added

实际上上面的操作就是给 ~/Library/Application Support/iPhone Simulator/5.1/Library/Keychains/TrustStore.sqlite3 数据库中表tsettings表中插入证书数据

6.Android上安装

将mitmproxy-ca-cert.cer 放到sdcard根目录下

选择设置-安全和隐私-从存储设备安装证书

五、工具使用

在vps上装好了mitmproxy代理,在客户端也装好了CA证书,接下来就可以使用了。

第一步:在vps上启动mitmproxy

mitmproxy -b xxx.xxx.xxx(指定监听的接口) -p xxx(指定端口)

果然我是开源工具杀手,运行时又报错了。

运行错误问题解决:

当运行mitmproxy报错:

Error: mitmproxy requires a UTF console environment.

Set your LANG enviroment variable to something like en_US.UTF-8

你可以先运行locale查看当前的语言环境,我的vps就是POSIX环境

[email protected]:/# locale

LANG=

LANGUAGE=

LC_CTYPE=”POSIX”

LC_NUMERIC=”POSIX”

LC_TIME=”POSIX”

LC_COLLATE=”POSIX”

LC_MONETARY=”POSIX”

LC_MESSAGES=”POSIX”

LC_PAPER=”POSIX”

LC_NAME=”POSIX”

LC_ADDRESS=”POSIX”

LC_TELEPHONE=”POSIX”

LC_MEASUREMENT=”POSIX”

LC_IDENTIFICATION=”POSIX”

LC_ALL=

现在我们需要的是把其修改为en_US.UTF-8

方法参考http://jrs-s.net/2010/11/18/setting-locale-to-utf-8-in-debian/

vim /etc/default/localeLANG=en_US.UTF-8. locale-gen#编辑/etc/profile,与/etc/bash.bashrc,增加 export LANG=en_US.UTF-8echo “export LANG=en_US.UTF-8” > /etc/profileecho “export LANG=en_US.UTF-8” > /etc/bash.bashrc source /etc/profilesource /etc/bash.bashrc

现在再运行locale,可以看到语言修改过来了

[email protected]:/# locale

LANG=en_US.UTF-8

LANGUAGE=

LC_CTYPE=”en_US.UTF-8″

LC_NUMERIC=”en_US.UTF-8″

LC_TIME=”en_US.UTF-8″

LC_COLLATE=”en_US.UTF-8″

LC_MONETARY=”en_US.UTF-8″

LC_MESSAGES=”en_US.UTF-8″

LC_PAPER=”en_US.UTF-8″

LC_NAME=”en_US.UTF-8″

LC_ADDRESS=”en_US.UTF-8″

LC_TELEPHONE=”en_US.UTF-8″

LC_MEASUREMENT=”en_US.UTF-8″

LC_IDENTIFICATION=”en_US.UTF-8″

LC_ALL=

然后就可以正常的运行了!

第二步:在手机或PC或浏览器上选择使用该http代理

第三步:使用客户端访问,现在就可以操作通信数据了

六、常见操作

1. mitmproxy

就介绍最常用到的修改请求,并回放请求的方法吧

(1)方向键定位请求

mitmproxy——中间人攻击的神器 - 碳基体 - 碳基体

(2)当黄色箭头>>定位到指定请求时,按回车enter进入请求中

mitmproxy——中间人攻击的神器 - 碳基体 - 碳基体

(3)按e进入编辑状态,然后按对应的蓝色字体来选择修改的部分

mitmproxy——中间人攻击的神器 - 碳基体 - 碳基体

可以修改query,查询字符串;path,路径;url ;header 请求头;form 表单;raw body 请求正文;method 请求方法。

(4)a 增加一行,tab键切换编辑字段,回车enter开始编辑,esc保存,q返回上一级

(5)修改完后,按r就可以重放请求,然后查看修改结果了

2. mitmdump

别忘了,mitmproxy还有个内向的双胞胎叫mitmdump(很像tcpdump),它是不交互版的mitmproxy。可以非实时的处理通信包。

我们可以在mitmproxy中按w,将通信数据保存到指定文件中后,然后用mitmdump来操作。接下来简单介绍一个例子,从mitmproxy中捕获到的数据包中,筛选出来自微博的数据包,然后重放这个数据包(其实也可以修改后再重放)

-n 表示不启用代理, -r表示从文件中读取数据包, -w表示将数据包存储到文件中,-c表示重放客户端请求包

mitmdump -nr all.data -w weibo.data “~u weibo”

mitmdump -nc weibo.data[replay] POST http://api.weibo.cn/2/client/addlog_batch?s=2edc0cfa7&gsid=4ubed3V0QehBa8KoNp4AA75J&c=android&wm=20005_0002&ua=Xiaomi-MI+2S__weibo__4.0.1__android__android4.1.1&oldwm=9975_0001&from=1040195010&skin=default&i=8764056d2&isgzip=&lang=zh_CN<< 200 OK 32B

3. mitmproxy API

开源精神最赞的是,可以像小时候玩积木一样,用大牛们提供的各种精巧工具,搭建自己合适的武器。

mitmproxy提供了libmproxy以供调用扩展。

我们可以查看一下libmproxy的详细说明,了解主要的API接口调用

pydoc libmproxy

官网给了一个自己编写脚本,来操纵数据包的例子,很简单,人人都能看懂

如下所示,就是在响应包中增加一个自定义头

def response(context, flow): flow.response.headers[“newheader”] = [“foo”]

我们可以在mitmdump 中使用这个脚本

-s表示从读取自定义脚本来处理数据包

mitmdump -ns examples/add_header.py -r infile -w outfile

好了,就介绍到这了。

转自:http://segmentfault.com/a/1190000002524455

4月 022015
 

 转自:http://liuxiang.logdown.com/posts/192057-use-mitmproxy-to-monitor-http-requests

Web 开发者经常需要通过查看页面被打开之后所发送的请求来调试自己开发的程序,现代浏览器,包括 Firefox, Chrome, Safari 都自带了开发工具,可以帮助开发者监控 HTTP 请求。但是有时候这些工具仍不能满足我们的需求,例如在做某些古老的浏览器(IE)上的兼容性调试时,就需要一个专门用于监控 HTTP 请求的工具才行。最近发现了一个强大的 HTTP 请求监控工具 ———— mitmproxy Home Page

1. 介绍

mitmproxy 是用 Python 和 C 开发的一个中间人代理软件(man-in-the-middle proxy),它可以用来拦截、修改、重放和保存 HTTP/HTTPS 请求。

它提供了两个命令行工具:

  • mitmproxy 具备交互界面
  • mitmdump 不具备交互界面,类似 tcpdump

本文只介绍 mitmproxy。

mitmproxy 支持两种工作模式:

  • HTTP 代理模式,也就是 mitmproxy 作为一个 HTTP 代理运行,类似于 HTTPSpy。
  • 透明模式,mitmproxy 通过 iptables/pf 作为一个 TCP 层代理运行,好处是不需要修改 HTTP 客户端的配置。

本文只介绍 HTTP 代理模式。

2. 安装

使用 pip 进行安装:

pip install mitmproxy

考虑到包括我朝在内的四大文(读作:zhuān)明(读作:zhì)国家所特有的网络环境,pip可能会出现网络连接超时等错误,可以加上 –proxy 选项:

pip install mitmproxy --proxy=127.0.0.1:8087

我在 OS X Mavericks 上安装还会遇到一个编译错误,可以通过添加 ARCHFALGS 环境来忽略此错误:

ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install mitmproxy --proxy=127.0.0.1:8087

3. HTTP 客户端配置

mitmproxy 安装完成之后,默认以 HTTP 代理模式工作,就需要 HTTP 客户端将代理配置修改为 mitmproxy 的地址。

启动 mitmproxy:

# 使用 -p 选项指定 HTTP 代理所监听的端口号,默认为 8080  mitmproxy -p 8080

以 Firefox + AutoProxy 插件为例,客户端的配置如下:

Snip20140402_13.png

4. 请求列表

在 Firefox 中打开一个网页,如:http://ruby-china.org/topics

Snip20140402_14.png

可以在 mitmproxy 中看到一个 HTTP 请求的列表:

Snip20140402_15.png

在 mitmproxy 中可以按 ? 进入到帮助信息界面,如需返回到请求列表界面则按 q。

在请求列表界面,黄色的箭头 >> 指示当前选择的请求,可以使用 vi 的快捷键 k, j 来移动箭头,PgUp、PgDown为上下翻页,此外空格键也可用来向下翻页。

如要清空列表,则按大写的 C。

5. 过滤请求列表

如果请求列表页面中的请求数量太多,则可以使用 mitmproxy 提供的过滤功能。

在请求列表界面按 l,此时列表界面的左下方会提示 Limit:,需要在此输出过滤表达式,过滤表达式的语法列在帮助信息界面,可以按 ? 进行查看。

例如,只显示所有的 JS 文件的请求,即请求的 URL 匹配 .js 的请求,则此处应该输入:~u .js

如需清除过滤,则同样按 l,然后删除过滤表达式即可。

6. 查看请求的具体信息

若要查看某个请求的具体信息,则在请求列表界面选中此请求后,按回车即可进入到查看请求的详细信息的界面:

Snip20140402_16.png

详细信息界面包括了 Request 和 Response 两个 Tab,可以按 tab 键切换,分别查看 Request 和 Response 的详细信息。

界面的左上方还显示了此次请求的发送时间。

mitmproxy 会使用合适的方式显示Request 和 Response 的 body 部分,例如对于压缩过的 JS ,mitmproxy 会解压缩后显示。如需要切换显示方式,可以在此界面按 m 来选择不同的显示方式。例如,对于包含了中文的 HTML 页面,如需要显示中文,可以使用 urlencoded 模式。

在详细信息界面可以按 / 对 body 部分进行搜索。

7. 拦截请求

mitmproxy 支持对请求进行拦截,拦截后还可以修改 Request 或 Response 的内容。

在请求列表界面按 i,在左下角会显示 Intercept filter:,要求输入过滤表达式,用于指示拦截哪些请求,此处的过滤表达式的语法同请求列表过滤表达式相同。

例如,如要拦截所有的 JS 文件的请求,则在此处输入 ~u .js。

再次访问 http://ruby-china.org/topics 页面,在 mitmproxy 的请求列表界面中可以看到对 JS 的请求都显示为橙色,表示这些请求被拦截了。

请求被拦截后,可以进入到该请求的详细信息界面,然后按 e,对请求进入编辑,编辑完成后按 ESC 退出编辑界面。按 a 放行该请求(也可以按大写的 A来放行所有被拦截的请求),请求被放行后,Server 收到的将是被编辑过的 Request。

当 Server 的 Response 返回到 mitmproxy 时,将再次被拦截,此时在详细信息界面按 e 可以对 Response 进行编辑,编辑完成后,同样按 ESC 退出编辑,同样按 a 或 A 放行 Response,客户端收到的 Response 将是被编辑过的 Response。

关于 mitmproxy 的更多用法,请参照其官网的文档:http://mitmproxy.org/doc/index.html