Python3自定义http/https请求拦截mitmproxy脚本实例

这篇文章主要介绍了Python3自定义http/https请求拦截mitmproxy脚本实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

脚本内容

代码如下:

 from mitmproxy import http, ctx from multiprocessing import Lock class Filter: def __init__(self, filter_info): self.log_info = "" self.mutex = Lock() self.filter_info = filter_info self.response_file = None self.switch_on = False self.log_file = "log.txt" def log(self, info) -> None: self.log_info += f"{info}\n\n" def write_log(self, mode="w+") -> None: self.mutex.acquire() with open(self.log_file, mode) as f: f.write(self.log_info) self.mutex.release() def is_target_flow(self, flow: http.HTTPFlow) -> bool: for info in self.filter_info: if info["str_in_url"] in flow.request.url: self.log_file = info["log_file"] self.switch_on = info["switch_on"] if info["response_file"] != None: self.response_file = info["response_file"] return True else: return False def modify_response(self, flow: http.HTTPFlow) -> http.HTTPFlow: if self.switch_on and self.response_file: with open(self.response_file, "r") as f: flow.response.content = f.read().encode() return flow def request(self, flow: http.HTTPFlow) -> None: if self.is_target_flow(flow): self.log_info = "" self.log(f"――METHOD――\n{flow.request.method}") self.log(f"――HOST――\n{flow.request.pretty_host}") self.log(f"――URL――\n{flow.request.pretty_url}") query = [i + ":" + flow.request.query[i] + "\n" for i in flow.request.query] self.log(f"――QUERY STRING――\n{''.join(query)}") if flow.request.urlencoded_form: form = [i + ":" + flow.request.urlencoded_form[i] + "\n" for i in flow.request.urlencoded_form] self.log(f"――FORM――\n{''.join(form)}") self.write_log() def response(self, flow: http.HTTPFlow) -> None: if self.is_target_flow(flow): self.log_info = "" self.log(f"――RESPONSE before modified――\n{flow.response.content.decode()}") flow = self.modify_response(flow) self.log(f"――RESPONSE after modified――\n{flow.response.content.decode()}") self.write_log(mode="a") filter_info = [ { "str_in_url": "getSimpleNews", "log_file": "getSimpleNews_log.txt", "switch_on": True, "response_file": "getSimpleNews_response.txt", }, { "str_in_url": "getQQNewsComment", "log_file": "getQQNewsComment_log.txt", "switch_on": True, "response_file": None, } ] addons = [ Filter(filter_info) ]

使用方法

运行mitmproxy指定使用该脚本和端口号即可:

mitmproxy -p 6666 -s xxx.py

在mitmproxy运行时:

1. 会拦截url中包含str_in_url字符串的请求

2. 会把response.content修改为当前mitm运行所在目录下的response_file文件中的内容

3. 打印信息在当前mitm运行所在目录下的log_file文件中

4. 如果无需修改response设置switch_on为False即为开关关闭

5. 如果不修改response的话response_file需要写None

补充知识:mitmproxy 监听指定端口

安装

使用python3的安装方式

https://mitmproxy.org/

监听指定端口

例子:Presto SQL请求的监听

Presto地址:http://datacenter4:18080

mitmproxy命令(端口8484)
mitmproxy \
--mode reverse:http://datacenter4:18080 \
--listen-host datacenter4 \
--listen-port 8484 \
--replacements :~s:\/\/datacenter4/:\/\/datacenter4:18080/

然后JDBC访问Presto使用:jdbc:presto://datacenter4:8484

效果

以上就是Python3自定义http/https请求拦截mitmproxy脚本实例的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » python