mitmproxy-python-api使用(转)

mitmproxy是一款使用python编写的中间人代理工具。包含了命令行界面、web界面和python api脚本三种方式进行代理抓包。其中python api可以用来编写自定义脚本,进行扩展,非常适合编写一些特定功能。

简单的介绍下mitmproxy的Python api使用。

官网的简单例子,给http新增一个header头。

def response(flow):
    flow.response.headers["newheader"] = "foo"
运行方式 mitmdump -s add_header.py

这里flow.response.headers 获取http请求头信息,其它的还有

flow.request.host  http请求host
flow.request.method  请求方法
flow.request.scheme  请求协议
flow.request.url     请求URL链接
flow.request.query   请求URL查询参数
flow.request.path    请求URL路径
flow.request.urlencoded_form  请求POST数据
flow.response.status_code  HTTP响应状态码
flow.response.headers    HTTP响应头信息
flow.response.get_text   HTTP响应内容

还有更多内容可以参考官方文档

以下代码为一个简单的脚本,作用是记录所有的流量,并保存到数据库中。

from mitmproxy.script import concurrent
import json,datetime
from sqlalchemy.databases import mysql
from sqlalchemy import Column, create_engine, Integer, Text,DateTime
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Proxy(Base):
    __tablename__ = 'Proxy'
    id = Column(Integer, primary_key=True, autoincrement=True)
    str = Column(mysql.MSMediumText)
    time=Column(DateTime,default=datetime.datetime.utcnow)

engine = create_engine('mysql+pymysql://root:root@localhost:3306/test')
DBSession = sessionmaker(bind=engine)
Base.metadata.create_all(engine)
session = DBSession()

result = {}


@concurrent
def request(flow):
    domain= flow.request.host
    method= flow.request.method
    result['scheme'] = flow.request.scheme
    result['request_headers'] = {}
    for item in flow.request.headers:
        result['request_headers'][item] = flow.request.headers[item]
    url_path= flow.request.path
    result['get_data'] = parser_data(flow.request.query)
    
    result['post_data'] = parser_data(flow.request.urlencoded_form)  #
    

@concurrent
def response(flow):
    status_code = flow.response.status_code
    result['response_headers'] = {}
    for item in flow.response.headers:
        result['response_headers'][item] = flow.response.headers[item]
    result['response_content'] = flow.response.get_text()
    result_json = json.dumps(result)
    # print(result_json)

    #插入数据库
    new_url = Proxy(str=result_json)
    session.add(new_url)
    session.commit()
    # 关闭session:
    # session.close()


def parser_data(query):
    data = {}
    for key, value in query.items():
        data[key] = value
    return data
使用方法 mitmdump -s script saveurl.py -p 8081

其中参数p为监听端口

另外如果直接在浏览器上挂代理的话会有很多其它无用的流量,推荐使用burpsuite的upstream功能。

如图,可以在这里自定义那些域名经过mitmproxy的代理,在渗透测试中可以有选择的将流量保存,便于日后分析。

原文地址:https://www.cnblogs.com/yigui/p/13932085.html