51Testing软件测试网_妙用Mitmproxy实现加密加签环境下渗透测试

由 赵锐 发表于2021-10-15 17:30:00

出品|51Testing软件测试网


在做渗透测试的时候,经常会遇到报文加密加签的情况,即使通过了其他技术手段破解了加解密机制,  进行报文的篡改还是很不方便。


此时,可以引入一个开源的代理工具——Mitmproxy。


Mitmproxy简介


Mitmproxy是一个开源的HTTPS代理工具,顾名思义,Mitm是一个用于中间人(Man-in-the-middle) 攻击的代理工具。


如下图所示,Mitmproxy像正常的代理服务器一样工作于客户端和服务端之间,通过   转发通信报文维持通信,但同时Mitmproxy也可以查询,记录甚至篡改其转发的报文,从而引发服务端   或客户端的特定行为,来达到使用者的特定目的。


相比于成熟的代理抓包工具,如Burp Suite、Fiddler和Charles等,除了开源免费这一优势外,Mitmproxy提供了python API, 开发者可以通过自定义脚本实现高度定制的需求,本文也正是利用Mitmproxy的自定义脚本实现报文的加解密。


Mitmproxy脚本编写


Mitm的脚本结构通常如下所示:

from mitmproxy import http, ctxclass MyProxy1: def foo1:pass
def foo2:pass
class MyProxy2:...
addons = [MyProxy1(),MyProxy2(),...]

(左右滑动查看完整代码)


开启代理后并加载脚本后,Mitm将拦截的报文并根据编写的脚本执行特定的行为。


常用API


下面将介绍编写脚本时常用的API。


  • flow.request.headers


获取所有头信息,包含Host、User-Agent、Content-type等字段。

# 获取headers内容cookie = flow.request.headers["Cookie"]
# 修改headers内容flow.request.headers["Content-Type"] = "application/json"

(左右滑动查看完整代码)


  • flow.request.url


完整的请求地址,包含域名及请求参数,但是不包含放在body里面的请求参数。

#截取指定urlif flow.request.url.startswith("https://xxx.com/xxx"): pass

(左右滑动查看完整代码)


  • flow.request.pretty_url 

同flow.request.url。


  • flow.request.host域名


  • flow.request.method

请求方式,POST、GET等。


  • flow.request.scheme


  • flow.request.path

请求的路径,url除域名之外的内容。


  • flow.request.get_text()


修改请求中body内容,有一些http会把请求参数放在body里面,那么可通过此方法获取,返回字典类型。

body = flow.request.get_text()body_json = json.loads(flow.request.get_text())

(左右滑动查看完整代码)


  • flow.request.set_text()


修改请求中body内容,不需转码。

POST /login HTTP/1.1 HOST: www.xxx.com...

(左右滑动查看完整代码)


{"account":"abc", "passwd":"123456"}newBody = {"account":"abcd", "passwd":"123456"} flow.set_text(str(newBody))

(左右滑动查看完整代码)


  • flow.request.query


返回MultiDictView类型的数据,url直接带的键值参数。

# 请求www.xxx.com/login?account=abc&passwd=123456 account = flow.request.query["account"]

(左右滑动查看完整代码)


  • flow.request.get_content()


返回bytes格式内容,结果如flow.request.get_text() 。


  • flow.request.raw_content


返回bytes格式内容,结果如flow.request.get_content()。


  • flow.request.urlencoded_form


返回MultiDictView类型数据,content-type:

application/x-www-form-urlencoded时的请求参数,不包含url直接带的键值参数。

POST /login HTTP/1.1 HOST: www.xxx.com...content-type:application/x-www-form-urlencoded...

(左右滑动查看完整代码)


account=abc&passwd=123456account = flow.request.urlencoded_form["account"]

(左右滑动查看完整代码)


  • flow.request.multipart_form


返回MultiDictView类型数据,content-type:multipart/form-data时的请求参数,不包含url  直接带的键值参数。


以上均为获取request信息的一些常用方法,response除上述方法外,还有如下几个常用方法。

  • flow.response.status_code状态码 

  • flow.response.text返回内容,已解码

  • flow.response.content返回内容,二进制


运行脚本


# -s 指定脚本# -p 指定监听端口号>>>  mitmdump -s myScrypt.py -p 8888

(左右滑动查看完整代码)


配合其他工具食用味道更佳


了解如何编写Mitmproxy脚本后,下面将介绍实际的测试场景中如何应用Mitmproxy脚本。


假设我们的目标系统是一个采用了AES对称加密的Web或APP。


客户端将密钥硬编码在了前端,我们通过其他技术手段已经获取了AES密钥和加解密机制。现在要对查询接口https://www.example.com/queryUserInfo  uid= 进行爆破和注入测试。


……

本文为51Testing软件测试网

第六十三期电子杂志内容

剩余精彩内容请点击下方

 阅读原文 查看


-往期回顾-
//
//
“阅读原文”一起来充电吧!

作者:赵锐

公众号:51Testing软件测试网

发布时间:2021-10-15 17:30:00

发表评论

您的电子邮箱地址不会被公开。