BaseProxy:异步http/https代理

BaseProxy

异步http/https代理,可拦截并修改报文,能被用于中间人工具,支持py3.5+.项目地址:https://github.com/qiyeboy/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类,并重写其中的dealrequest函数.在dealrequest函数的最后,需要将修改后的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类,并重写其中的dealresponse函数.在dealresponse函数的最后,需要将修改后的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()

效果如下:

参考项目

MitmProxy

proxy2

原文发布于微信公众号 - 七夜安全博客(qiye_safe)

原文发表时间:2018-06-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Seebug漏洞平台

WordPress REST API 内容注入漏洞分析

0x00 漏洞简述 1. 漏洞简介 在REST API自动包含在Wordpress4.7以上的版本,WordPress REST API提供了一组易于使用的HT...

2807
来自专栏从零开始学自动化测试

python接口自动化25-全局变量token项目设计

在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了。 一般token只需要获取一次就行了,然后其它使用unitt...

1302
来自专栏专注数据中心高性能网络技术研发

Find命令-Linux系统搜索利器

1.Motivation ---- 搜索查找是管理文件系统常用的操作,虽然动作逻辑本质上是匹配,很简单,但搜索也有很多种花样,可以用来加速搜索,快速提取想要的内...

2805
来自专栏游戏杂谈

Windows下的搜索神器 —— everything

介绍一款Windows下的神奇 —— everything,软件很小巧,但是搜索速度非常快,比Windows自带的搜索功能更强大、更快。掌握它的基本用法,在查找...

373
来自专栏技巅

Glusterfs之rpc模块源码分析(中)之Glusterfs的rpc模块实现(2)

1275
来自专栏FreeBuf

漏洞追踪:最新IE UXSS漏洞技术分析

最近David Leo在Full Disclosure上爆出了一个ie的 uxss 漏洞,可以绕过ie的同源策略。FreeBuf也有相关的报道(点我查看)。本文...

1807
来自专栏北京马哥教育

shell 中 "2>&1" 的研究(你以为你会了,其实你根本就不会)

前言 周五晚上,shuker,hades,我还有几位同事,我们一起加班到两点多,最后hades 在crontab 里添加了一个定时任务。 这本来没什么好说的...

2996
来自专栏流媒体

linux下Socket编程(一)简介

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”...

802
来自专栏散尽浮华

nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理

Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx可以用轮询、IP哈希、URL哈希等方式...

4376
来自专栏小狼的世界

使用PHP的正则抓取页面中的网址

最近有一个任务,从页面中抓取页面中所有的链接,当然使用PHP正则表达式是最方便的办法。要写出正则表达式,就要先总结出模式,那么页面中的链接会有几种形式呢?

912

扫码关注云+社区