最近要写一款基于被动式的漏洞扫描器,因为被动式是将我们在浏览器浏览的时候所发出的请求进行捕获,然后交给扫描器进行处理,本来打算自己写这个代理的,但是因为考虑到需要抓取https,所以最后找到Mitmproxy这个程序。
安装方法:
pip install mitmproxy
接下来通过一个案例程序来了解它的使用,下面是目录结构
sproxy
|utils
|__init__.py
|parser.py
|sproxy.py
sproxy.py代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#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提交的参数 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
# 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抓取浏览器请求的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/q251500/article/details/79341562