BaseProxy:异步http/https中间人
BaseProxy
异步http/https代理,可拦截并修改报文,可以作为中间人工具.仅支持py3.5+.项目地址:BaseProxy。
意义
BaseProxy项目的本意是为了使HTTP/HTTPS拦截更加纯粹,更加易操作,学习成本更低。
在Python领域,中间人工具非常强大和成功的是MitmProxy,但是有些地方不是很喜欢。
- Windows上安装比较费时费力
- 功能太多了,可惜我用不到这么多(似乎不是它的错,哈哈)
- 随着版本升级,采用插件化框架,需要定制功能,需要写个插件成为它的一部分(我只是想集成它而已).
因此BaseProxy就诞生了,不仅支持HTTPS透明传输,还支持HTTP/HTTPS拦截,简单易用,可以很好地集成到你们的项目中。
安装
安装非常简单,本项目已经发布到PyPI中...
pip3 install baseproxy
使用配置
启动baseproxy
在test文件夹下,有很多测试用例。以startserver.py为例。
from baseproxy.proxy import AsyncMitmProxy
baseproxy = AsyncMitmProxy(https=True)
baseproxy.serve_forever()
使用上述代码,就可以将HTTPServer运行起来了.对代码的解释如下:
https=True
是对https进行解密;https=False
是对于https实行透传- baseproxy默认运行在8788端口,如果想改变端口的话,修改为
AsyncMitmProxy(server_addr=('',port),https=True)
.
运行结果如下:
[2018-06-22 18:46:32] INFO HTTPServer is running at address( , 8788 )......
安装CA证书
1.将chrome浏览器代理服务器设置为127.0.0.1:8788,推荐使用SwitchyOmega插件.
2.设置好代理,并将baseproxy运行后,访问www.baidu.com.
3.这时候访问被拒绝,需要安装证书.在当前网页访问 baseproxy.ca,下载证书.
4.双击下载的证书,并安装到合法机构中.
5.接着访问百度就可以了.
注意:只有https=True
时,才需要安装CA证书。
开发
经过上一步的使用配置,baseproxy已经可以正常运行了,但是这样是远远不够的.baseproxy还提供了接口,方便开发者对http请求和响应进行修改.
接口
baseproxy提供了两个接口,一个是修改请求,一个是修改响应.
拦截请求
class ReqIntercept(InterceptPlug):
def deal_request(self,request):
pass
对于请求的拦截,需要继承ReqIntercept类,并重写其中的deal_request函数.在deal_request函数的最后,需要将修改后的request参数返回出去.
如果想抛弃这个请求,直接返回None.
request参数
deal_request函数中的request参数类型为Request类
成员变量
Name | 类型 | 含义 |
---|---|---|
hostname | str | 域名 |
port | int | 端口 |
command | str | 请求类型 |
path | str | 请求路径 |
request_version | str | HTTP协议版本 |
成员函数
def set_headers(self,headers)
- headers:类型为dict
- 用于设置头部
def get_header(self,key):
- key:类型为str
- 用于获取指定头部,返回str
def get_headers(self):
- 用于获取整个头部,返回为dict
def set_header(self,key,value):
- 头部 key,类型str
- 头部 value,类型str
- 用于设置头信息
def get_body_data(self):
- 获取请求体内容,返回类型为bytes
def set_body_data(self,body):
- 设置请求体内容,body类型为bytes
拦截响应
class RspIntercept(InterceptPlug):
def deal_response(self,response):
pass
对于响应的拦截,需要继承RspIntercept类,并重写其中的deal_response函数.在deal_response函数的最后,需要将修改后的response参数返回出去.
如果想抛弃这个响应,直接返回None.
response参数
deal_response函数中的response参数类型为Response类
成员变量
Name | 类型 | 含义 |
---|---|---|
hostname | str | 域名 |
port | int | 端口 |
status | int | 状态码 |
reason | str | 状态描述 |
response_version | str | HTTP协议版本 |
request | Request | 响应对应的请求实例 |
成员函数
def set_headers(self,headers)
- headers:类型为dict
- 用于设置头部
def get_header(self,key):
- key:类型为str
- 用于获取指定头部,返回str
def get_headers(self):
- 用于获取整个头部,返回为dict
def set_header(self,key,value):
- 头部 key,类型str
- 头部 value,类型str
- 用于设置头信息
def get_body_data(self):
- 获取响应体内容,返回类型为bytes
def set_body_data(self,body):
- 设置响应体内容,body类型为bytes
def get_body_str(self,decoding=None):
- decoding:编码,默认为None,内部采用chardet探测
- 返回响应体,类型为str.如果无法解码,返回None
def set_body_str(self,body_str,encoding=None):
- encoding:编码,默认为None,内部采用chardet探测
- 设置响应体,body_str类型为str
注册拦截插件
将拦截类完成后,需要注册到baseproxy中,需要调用AsyncMitmProxy的register函数.示例如下:
from baseproxy.proxy import ReqIntercept, RspIntercept, AsyncMitmProxy
__author__ = 'qiye'
__date__ = '2018/6/21 23:35'
class DebugInterceptor(ReqIntercept, RspIntercept):
def deal_request(self, request):
return request
def deal_response(self, response):
return response
if __name__=="__main__":
baseproxy = AsyncMitmProxy(https=False)
baseproxy.register(DebugInterceptor)
baseproxy.serve_forever()
小例子
将淘宝中的所有产品图片换成我公众号的二维码.代码在test文件夹的replace_image.py中,内容如下:
from baseproxy.proxy import RspIntercept, AsyncMitmProxy
class ImageInterceptor( RspIntercept):
def deal_response(self, response):
if response.get_header("Content-Type") and 'image' in response.get_header("Content-Type"):
with open("../img/qiye2.jpg",'rb') as f:
response.set_body_data(f.read())
return response
if __name__ == "__main__":
baseproxy = AsyncMitmProxy(https=True)
baseproxy.register(ImageInterceptor)
baseproxy.serve_forever()
效果如下:
参考项目
福利大放送
关注公众号:七夜安全博客
- 回复【1】:领取 Python数据分析 教程大礼包
- 回复【2】:领取 Python Flask 全套教程
- 回复【3】:领取 某学院 机器学习 教程
- 回复【4】:领取 爬虫 教程
知识星球已经50人了,随着人数的增多,价格之后会上涨,越早关注越多优惠。星球的福利有很多:
- 比如上面的教程,已经提前在知识星球中分享
- 可以发表一些问题,大家一块解决
- 我之后写的电子书,录制的教学视频,对于知识星球的朋友都是优惠的(基本上免费)
- 一些节假日会给大家发个红包或者赠书
BaseProxy:异步http/https中间人的更多相关文章
- Android安全之Https中间人攻击漏洞
Android安全之Https中间人攻击漏洞 0X01 概述 HTTPS,是一种网络安全传输协议,利用SSL/TLS来对数据包进行加密,以提供对网络服务器的身份认证,保护交换数据的隐私与完整性. ...
- 谈HTTPS中间人攻击与证书校验(二)
上文说到HTTPS的三次握手:http://www.cnblogs.com/wh4am1/p/6616851.html 不懂的再回头去看看 三.中间人攻击 https握手过程的证书校验环节就是为了识别 ...
- 谈HTTPS中间人攻击与证书校验(一)
一.前言 随着安全的普及,https通信应用越发广泛,但是由于对https不熟悉导致开发人员频繁错误的使用https,例如最常见的是未校验https证书从而导致“中间人攻击”,并且由于修复方案也一直是 ...
- HTTPS中间人攻击实践(原理·实践)
前言 很早以前看过HTTPS的介绍,并了解过TLS的相关细节,也相信使用HTTPS是相对安全可靠的.直到前段时间在验证https代理通道连接时,搭建了MITM环境,才发现事实并不是我想的那样.由于 ...
- https中间人攻击
攻击过程: 服务器向客户端发送公钥. 攻击者截获公钥,保留在自己手上. 然后攻击者自己生成一个[伪造的]公钥,发给客户端. 客户端收到伪造的公钥后,生成加密hash值发给服务器. 攻击者获得加密has ...
- 基于HTTPS的中间人攻击-BaseProxy
前言 在上一篇文章BaseProxy:异步http/https代理中,我介绍了自己的开源项目BaseProxy,这个项目的初衷其实是为了渗透测试,抓包改包.在知识星球中,有很多朋友问我这个项目的原理及 ...
- 【Spider】学习使用XMLFeedSpider
前面写了学习CrawlSpider遇到的问题后,今天学XMLFeedSpider又出现了启动后没爬取到数据,但又不报错的情况 经过排查,发现又是一个粗心大意的错误: class SpiderUserX ...
- Android安全开发之安全使用HTTPS
Android安全开发之安全使用HTTPS 1.HTTPS简介 阿里聚安全的应用漏洞扫描器中有证书弱校验.主机名弱校验.webview未校验证书的检测项,这些检测项是针对APP采用HTTPS通信时容易 ...
- python异步加协程获取比特币市场信息
目标 选取几个比特币交易量大的几个交易平台,查看对应的API,获取该市场下货币对的ticker和depth信息.我们从网站上选取4个交易平台:bitfinex.okex.binance.gdax.对应 ...
随机推荐
- sqlserver tablediff 实用工具
tablediff 是sqlserver自带的实用工具 sqlserver 2012 在110目录下,sqlserver2008在100目录下 官方参考文档如下: https://docs.micro ...
- 全球首款完全开源的堡垒机,符合 4A 的专业运维审计系统Jumpserver
Jumpserver是全球首款完全开源的堡垒机,是符合 4A 的专业运维审计系统. http://www.jumpserver.org https://github.com/jumpserver/ju ...
- [IDEA_3] IDEA 配置 GitHub 并上传项目
0. 说明 参考 Git & GitHub 的安装配置 IDEA 配置 GitHub 并上传项目 1. 安装配置 Git & GitHub 参照 Git & GitHub 的安 ...
- Java学习---面试基础知识点总结
Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线 ...
- MySQL基础之 支持的数据类型
MySQL的数值类型 整数类型 字节 有符号 无符号 TINYINT 1 -128~+127 0~255 SAMLLINT 2 -32768~+32767 0~65535 MEDIUMINT 3 -8 ...
- MyBatis 中的级联
MyBatis 的级联分为 3 种. 1.鉴别器(discriminator):它是根据某些条件决定采用具体实现类级联的方案,比如体检表要根据性别去区分. 2.一对一(association):比如学 ...
- Beta 冲刺 (7/7)
Beta 冲刺 (7/7) 队名:洛基小队 峻雄(组长) 已完成:人物释放技能部分的实现 后两天计划:整合脚本,测试内容 剩余任务:整合各部分脚本 困难:尽快完善整合出β版的内容 非易 已完成:商店功 ...
- VS2013自带报表+打印功能
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010773667/article/details/27540389 经过了VB版机房收费系统的学习 ...
- day2-课堂代码
# 字符串常用属性和操作 # a = 'aa' # b = 'bb' # c = 'cc' # d = a + b + c # print(d) # age = 50 # print('田老师的年龄是 ...
- table border
table的CSS为{border-collapse:collapse;border:none;},再设置td的CSS为{border:solid#000 1px;}是一个非常不错的方法. 示例: & ...