文章目录
mitmproxy
mitmproxy是一个代理工具(软件安装 或 Python模块安装),实现代理请求(拦截请求或修改请求)。
1. 网络代理
网络代理是一种位于客户端和服务器之间的中间服务器,它充当客户端与目标服务器之间的中间人。当客户端发送请求时,请求首先被发送到代理服务器,然后由代理服务器转发给目标服务器,并将目标服务器的响应返回给客户端。
代理服务器的作用可以有多种形式,包括:
- 隐藏真实的客户端IP地址:代理服务器可以屏蔽客户端的真实IP地址,使目标服务器无法直接获取到客户端的真实位置信息。这种方式可以提供一定的匿名性和隐私保护。
- 缓存和加速:代理服务器可以缓存目标服务器的响应,当其他客户端请求相同的资源时,代理服务器可以直接返回缓存的响应,减少了对目标服务器的访问,提高了访问速度和网络效率。
- 过滤和访问控制:代理服务器可以根据设置的规则对请求进行过滤和访问控制。例如,可以通过代理服务器实现对特定网站或内容的屏蔽,或者对特定客户端的访问进行限制。
- 突破网络限制:在某些情况下,代理服务器可以用于突破网络限制。例如,当访问某些网站受到地理位置限制或网络审查时,可以通过使用代理服务器来绕过这些限制。
- 负载均衡:代理服务器可以作为负载均衡器,将请求分发到多个目标服务器上,以实现更好的性能和可靠性。
mitmproxy是一款流行的开源代理工具,用于拦截、修改和观察网络流量。它可以用于网络安全测试、调试和逆向工程等场景。
2. 安装
在安装前需要去下载Visual C++ Build Tools for Visual Studio 2015
安装到电脑。
https://my.visualstudio.com/Downloads?q=Visual%20Studio%202015%20update%203
解压 mu_visual_cpp_build_tools_2015_update_3_x64_dvd_dfd9a39c.iso
文件,然后默认安装。
用pip安装mitmproxy:
pip install mitmproxy
3. Https请求
如果想要让mitmproxy支持:http和https请求,就需要安装证书。
3.1 启动mitmproxy
>>>mitmdump -q -p 8888 -s test.py
from mitmproxy import http
def request(flow: http.HTTPFlow):
print("请求->", flow.request.url)
def response(flow: http.HTTPFlow):
...
3.2 获取证书
在电脑
C:\Users\Administrator\.mitmproxy
中去获取。
双击下载证书
3.3 配置代理
3.4 运行测试
4. 请求
4.1 读取请求
from mitmproxy import http
from mitmproxy.http import Request
def request(flow):
print("请求-->", flow.request.url)
print("请求-->", flow.request.host)
print("请求-->", flow.request.path)
print("请求-->", flow.request.query)
print("请求-->", flow.request.cookies)
print("请求-->", flow.request.headers)
print("请求-->", flow.request.method)
print("请求-->", flow.request.content)
def response(flow: http.HTTPFlow):
pass
4.2 修改请求
from mitmproxy import http
def request(flow):
flow.request.url = "https://www.baidu.com/"
def response(flow: http.HTTPFlow):
pass
4.3 拦截请求
可以拦截请求,并放回指定内容
from mitmproxy import http
from mitmproxy.http import HTTPFlow
from mitmproxy.http import Response
def request(flow: HTTPFlow):
if flow.request.url.startswith("https://dig.chouti.com/"):
flow.response = Response.make(
200, # (optional) status code
b"Hello World", # (optional) content
{"Content-Type": "text/html"} # (optional) headers
)
def response(flow: http.HTTPFlow):
pass
也可以直接kill请求
from mitmproxy import http
from mitmproxy.http import Request
from mitmproxy.http import HTTPFlow
def request(flow: HTTPFlow):
if flow.request.url.startswith("https://dig.chouti.com/"):
flow.kill()
def response(flow: http.HTTPFlow):
pass
5. 响应
5.1 读取响应
from mitmproxy import http
from mitmproxy.http import HTTPFlow
def request(flow: HTTPFlow):
...
def response(flow: http.HTTPFlow):
print(flow.request.url)
print(flow.response.status_code)
print(flow.response.cookies)
print(flow.response.headers)
print(flow.response.content)
5.2 修改响应
from mitmproxy import http
from mitmproxy.http import HTTPFlow, Response
def request(flow: HTTPFlow):
...
def response(flow: http.HTTPFlow):
flow.response = Response.make(
200, # (optional) status code
b"Hello World", # (optional) content
{"Content-Type": "text/html"} # (optional) headers
)
6. 案例:共享账号
6.1 登录bilibili获取cookies
from mitmproxy import http
from mitmproxy.http import HTTPFlow
def request(flow: HTTPFlow):
print(flow.request.url)
print(flow.request.cookies)
def response(flow: http.HTTPFlow):
...
6.2 在代理请求中设置cookies
from mitmproxy import http
from mitmproxy.http import HTTPFlow
def request(flow: HTTPFlow):
print(flow.request.url)
print(flow.request.cookies)
flow.request.cookies = [['_uuid', 'A98A10A1C-9F33-6339-17E4-CD8671029FB5A86227infoc'],
['buvid3', '6F2EA161-81E8-FC5D-692F-FF62C048B83B86528infoc'], ['b_nut', '1709354487'],
['buvid4',
'FDE22D0E-55C2-7A05-BE12-D69A19F71C7586528-024030204-nzup34dDLssl%2BNgRMbI%2BUQ%3D%3D'],
['enable_web_push', 'DISABLE'], ['FEED_LIVE_VERSION', 'V8'],
['header_theme_version', 'CLOSE'], ['CURRENT_FNVAL', '4048'],
['rpdid', "|(~|mm|k)~l0J'u~|mJlRl|m"], ['b_lsid', '6FDF9248_18DFEAFE967'],
['home_feed_column', '5'], ['browser_resolution', '1536-239'], ['bili_ticket',
'eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDk2MzcwNzEsImlhdCI6MTcwOTM3NzgxMSwicGx0IjotMX0.qxpceIj8gLlNQ33eR9d5jxfizfYD_AWX_zpvHAFixY4'],
['bili_ticket_expires', '1709637011'], ['bp_video_offset_250595597', '904259047290568723'],
['fingerprint', 'bc08d5f7f0d84ff74bf64c3b8cead4fc'], ['buvid_fp_plain', 'undefined'],
['buvid_fp', 'bc08d5f7f0d84ff74bf64c3b8cead4fc'], ['SESSDATA',
'e3f51de8%2C1724929938%2Cb3219%2A32CjDQyE1hfakSZT7vrNGmyYTP3Es7buyebKSAFmqg5JIZOH4RfRvNZRNydfq3JlRMLlcSVjd4SE0xc2I5T0dtVXFMMzBLbnhXZW5QNTNyeUZLVjNteDVaRUZ4V1FSQ2gwSXBCb09NLVFzc2cyRmpsNkJPOE9jVE9xdGlIS3gwZHlQWTJaX182SkZnIIEC'],
['bili_jct', 'a74e7345a811680a745797300a7ae525'], ['DedeUserID', '250595597'],
['DedeUserID__ckMd5', 'dd8e5953de09a630'], ['sid', 'qmre1dgw']]
def response(flow: http.HTTPFlow):
...
在配置完cookies后在被代理的电脑打开bilibili会显示为登录状态
若多台电脑接入代理则可以共享这个账号