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的机器可以,目前还没有找到好的方法,有知道的朋友可以分享下

python 的 quote(),unquote(),urlencode()编码解码

 python  python 的 quote(),unquote(),urlencode()编码解码已关闭评论
3月 212016
 

python中几个关于url编解码的接口区别:

quote(),unquote(),quote_plus(),unquote_plus(),urlencode() ,pathname2url(),url2pathname()

urllib中还提供了一些辅助方法,用于对url进行编码、解码。url中是不能出现一些特殊的符号的,有些符号有特殊的用途。我们知道以get方式提交数据的时候,会在url中添加key=value这样的字符串,所以在value中是不允许有’=’,因此要对其进行编码;与此同时服务器接收到这些参数的时候,要进行解码,还原成原始的数据。这个时候,这些辅助方法会很有用:

urllib.quote(string[, safe]):对字符串进行编码。参数safe指定了不需要编码的字符;

urllib.unquote(string) :对字符串进行解码;

urllib.quote_plus(string [ , safe ] ) :与urllib.quote类似,但这个方法用’+’来替换’ ‘,而quote用’%20’来代替’ ‘

urllib.unquote_plus(string ) :对字符串进行解码;

urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。例如 字典{‘name’: ‘dark-bull’, ‘age’: 200}将被转换”name=dark-bull&age=200″

urllib.pathname2url(path):将本地路径转换成url路径;

urllib.url2pathname(path):将url路径转换成本地路径;

data = 'name = ~a+3' 
data1 = urllib.quote(data) print data1 # result: name%20%3D%20%7Ea%2B3  
print urllib.unquote(data1) # result: name = ~a+3  
data2 = urllib.quote_plus(data) print data2 # result: name+%3D+%7Ea%2B3  
print urllib.unquote_plus(data2) # result: name = ~a+3  
data3 = urllib.urlencode({ 'name': 'dark-bull', 'age': 200 }) 
print data3 # result: age=200&name=dark-bull  
data4 = urllib.pathname2url(r'd:/a/b/c/23.php'
print data4 # result: ///D|/a/b/c/23.php  
print urllib.url2pathname(data4) # result: D:/a/b/c/23.php 
摘自:http://www.iteedu.com/plang/python/urllib/quote.php