python使用mitmproxy抓取瀏覽器請(qǐng)求的方法
最近要寫一款基于被動(dòng)式的漏洞掃描器,因?yàn)楸粍?dòng)式是將我們?cè)跒g覽器瀏覽的時(shí)候所發(fā)出的請(qǐng)求進(jìn)行捕獲,然后交給掃描器進(jìn)行處理,本來(lái)打算自己寫這個(gè)代理的,但是因?yàn)榭紤]到需要抓取https,所以最后找到Mitmproxy這個(gè)程序。
安裝方法:
pip install mitmproxy
接下來(lái)通過(guò)一個(gè)案例程序來(lái)了解它的使用,下面是目錄結(jié)構(gòu)
sproxy
|utils
|__init__.py
|parser.py
|sproxy.py
sproxy.py代碼
#coding=utf-8
from pprint import pprint
from mitmproxy import flow, proxy, controller, options
from mitmproxy.proxy.server import ProxyServer
from utils.parser import ResponseParser
# http static resource file extension
static_ext = ['js', 'css', 'ico', 'jpg', 'png', 'gif', 'jpeg', 'bmp']
# media resource files type
media_types = ['image', 'video', 'audio']
# url filter
url_filter = ['baidu','360','qq.com']
static_files = [
'text/css',
'image/jpeg',
'image/gif',
'image/png',
]
class WYProxy(flow.FlowMaster):
def __init__(self, opts, server, state):
super(WYProxy, self).__init__(opts, server, state)
def run(self):
try:
pprint("proxy started successfully...")
flow.FlowMaster.run(self)
except KeyboardInterrupt:
pprint("Ctrl C - stopping proxy")
self.shutdown()
def get_extension(self, flow):
if not flow.request.path_components:
return ''
else:
end_path = flow.request.path_components[-1:][0]
split_ext = end_path.split('.')
if not split_ext or len(split_ext) == 1:
return ''
else:
return split_ext[-1:][0][:32]
def capture_pass(self, flow):
# filter url
url = flow.request.url
for i in url_filter:
if i in url:
return True
"""if content_type is media_types or static_files, then pass captrue"""
extension = self.get_extension(flow)
if extension in static_ext:
return True
# can't catch the content_type
content_type = flow.response.headers.get('Content-Type', '').split(';')[:1][0]
if not content_type:
return False
if content_type in static_files:
return True
http_mime_type = content_type.split('/')[:1]
if http_mime_type:
return True if http_mime_type[0] in media_types else False
else:
return False
@controller.handler
def request(self, f):
pass
@controller.handler
def response(self, f):
try:
if not self.capture_pass(f):
parser = ResponseParser(f)
result = parser.parser_data()
if f.request.method == "GET":
print result['url']
elif f.request.method == "POST":
print result['request_content'] # POST提交的參數(shù)
except Exception as e:
raise e
@controller.handler
def error(self, f):
pass
# print("error", f)
@controller.handler
def log(self, l):
pass
# print("log", l.msg)
def start_server(proxy_port, proxy_mode):
port = int(proxy_port) if proxy_port else 8090
mode = proxy_mode if proxy_mode else 'regular'
if proxy_mode == 'http':
mode = 'regular'
opts = options.Options(
listen_port=port,
mode=mode,
cadir="~/.mitmproxy/",
)
config = proxy.ProxyConfig(opts)
state = flow.State()
server = ProxyServer(config)
m = WYProxy(opts, server, state)
m.run()
if __name__ == '__main__':
start_server("8090", "http")
parser.py
# from __future__ import absolute_import
class ResponseParser(object):
"""docstring for ResponseParser"""
def __init__(self, f):
super(ResponseParser, self).__init__()
self.flow = f
def parser_data(self):
result = dict()
result['url'] = self.flow.request.url
result['path'] = '/{}'.format('/'.join(self.flow.request.path_components))
result['host'] = self.flow.request.host
result['port'] = self.flow.request.port
result['scheme'] = self.flow.request.scheme
result['method'] = self.flow.request.method
result['status_code'] = self.flow.response.status_code
result['content_length'] = int(self.flow.response.headers.get('Content-Length', 0))
result['request_header'] = self.parser_header(self.flow.request.headers)
result['request_content'] = self.flow.request.content
return result
@staticmethod
def parser_multipart(content):
if isinstance(content, str):
res = re.findall(r'name=\"(\w+)\"\r\n\r\n(\w+)', content)
if res:
return "&".join([k + '=' + v for k, v in res])
else:
return ""
else:
return ""
@staticmethod
def parser_header(header):
headers = {}
for key, value in header.items():
headers[key] = value
return headers
@staticmethod
def decode_response_text(content):
for _ in ['UTF-8', 'GB2312', 'GBK', 'iso-8859-1', 'big5']:
try:
return content.decode(_)
except:
continue
return content
參考鏈接:
https://github.com/ring04h/wyproxy
以上這篇python使用mitmproxy抓取瀏覽器請(qǐng)求的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python抓包程序mitmproxy安裝和使用過(guò)程圖解
- Python Charles抓包配置實(shí)現(xiàn)流程圖解
- Python爬蟲谷歌Chrome F12抓包過(guò)程原理解析
- python 抓包保存為pcap文件并解析的實(shí)例
- Python如何爬取微信公眾號(hào)文章和評(píng)論(基于 Fiddler 抓包分析)
- python實(shí)現(xiàn)linux下抓包并存庫(kù)功能
- python調(diào)用tcpdump抓包過(guò)濾的方法
- 使用Python實(shí)現(xiàn)windows下的抓包與解析
- Python3爬蟲mitmproxy的安裝步驟
- Python3自定義http/https請(qǐng)求攔截mitmproxy腳本實(shí)例
- python代理工具mitmproxy使用指南
- python如何利用Mitmproxy抓包
相關(guān)文章
Python排序算法快速排序VS歸并排序深入對(duì)比分析
快速排序和歸并排序是兩種常見的排序算法,在Python中有著重要的應(yīng)用,本文將深入探討這兩種算法的原理和實(shí)現(xiàn),并提供豐富的示例代碼來(lái)說(shuō)明它們的工作方式2024-01-01
pandas apply 函數(shù) 實(shí)現(xiàn)多進(jìn)程的示例講解
下面小編就為大家分享一篇pandas apply 函數(shù) 實(shí)現(xiàn)多進(jìn)程的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Python3.4 splinter(模擬填寫表單)使用方法
今天小編就為大家分享一篇Python3.4 splinter(模擬填寫表單)使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Python實(shí)現(xiàn)8個(gè)概率分布公式的方法詳解
在本文中,我們將介紹一些常見的分布(均勻分布、高斯分布、對(duì)數(shù)正態(tài)分布等)并通過(guò)Python代碼進(jìn)行可視化以直觀地顯示它們,感興趣的可以學(xué)習(xí)一下2022-05-05
Sublime如何配置Python3運(yùn)行環(huán)境
這篇文章主要介紹了Sublime如何配置Python3運(yùn)行環(huán)境問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Django中Migrate和Makemigrations實(shí)操詳解
這篇文章主要為大家介紹了Django中Migrate和Makemigrations實(shí)操詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
keras獲得某一層或者某層權(quán)重的輸出實(shí)例
今天小編就為大家分享一篇keras獲得某一層或者某層權(quán)重的輸出實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python實(shí)現(xiàn)代碼審查自動(dòng)回復(fù)消息
這篇文章主要介紹了python實(shí)現(xiàn)代碼審查回復(fù)消息生成的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2021-02-02

