抓包工具mitmproxy

1、作用

做app、小程序相关项目的时候,经常需要抓包工具获取接口以及返回值。

2、charles

一般常用的抓包工具是charles

博客介绍

破解

3、mitmproxy

charles很好用,但是不可以扩展,作为程序员,还是喜欢用程序进行自定义的扩展。

4、安装(基于python)

pip3 install mitmproxy

5、配置

代理设置:

PC端 chrome-设置-高级-系统-打开您计算机的代理设置

手机端(小米10) 设置-WLAN-选择与电脑相同的网络

代理选择手动 主机名写电脑的局域网ip(在pc端电脑使用ifconfig |gre inet)

192.168.0.83就是主机的地址

端口写你要监听的端口(PC端mitmproxy启动时设置的端口)

证书安装:

手机端-访问mitm.it-选择相应系统的证书进行安装

PC端可以直接访问根目录.mitmproxy

双击mitmproxy-ca-cert.pem(mac电脑)

6、使用(以电脑端chrom请求为例)

命令行方式 mitmproxy -p 8898

ui页面(一般用这个) mitmweb -p 8898 (自动打开127.0.0.1:8081)

可以过滤,修改参数再次请求、下载等功能,还是可以的

自定义扩展-程序 mitmdump

import json

from mitmproxy import http
from mitmproxy import proxy, options
from mitmproxy.script import concurrent
from mitmproxy.tools.dump import DumpMaster

file = open("mitmproxy.sql", "w+")

host_list = ['baidu.com']


class SaveRequestData:
    @concurrent
    def request(self, flow):
        pass

    @concurrent
    def response(self, flow: http.HTTPFlow) -> None:
        host = flow.request.host
        if host in host_list:
            item = {}
            item['url'] = str(flow.request.url)
            item['host'] = str(flow.request.host)
            item['method'] = str(flow.request.method)
            item['param_text'] = str(flow.request.content, encoding='utf-8').replace('\'', '\'\'')
            item['response_text'] = str(flow.response.text).replace('\'', '\'\'')

            headers = flow.request.headers.items()
            header_obj = {}
            for header in headers:
                key = str(header[0])
                value = str(header[1])
                header_obj[key] = value
            item['headers_text'] = json.dumps(header_obj)
            insert_data(item)
        # flow.response.text = '注入中'+page_buf


def start():
    myaddon = SaveRequestData()
    opts = options.Options(listen_host='127.0.0.1', listen_port=8898)
    # opts.add_option("body_size_limit", int, 0, "")
    # opts.add_option("keep_host_header", bool, True, "")
    #  opts.add_option("mode", str, "upstream:http://127.0.0.1:8118", "")
    # opts.add_option("ssl_insecure", bool, True, "")
    pconf = proxy.config.ProxyConfig(opts)
    m = DumpMaster(opts)
    m.server = proxy.server.ProxyServer(pconf)
    m.addons.add(myaddon)

    try:
        m.run()
    except KeyboardInterrupt:
        m.shutdown()


def insert_data(data):
    try:
        sql = "insert into request2(host_name,url,method,param_text,response_text,headers_text) values('%s','%s','%s','%s','%s','%s');"
        sql = sql % (
            data['host'], data['url'], data['method'], data['param_text'], data['response_text'], data['headers_text'])
        print(sql)
        file.write(sql)
        file.write("\r\n")
    except Exception as e:
        print(e)


if __name__ == '__main__':
    start()

拦截设定域名的请求 并将请求头、请求参数、返回集等数据拼装成sql语句入库

results matching ""

    No results matching ""