妙用Mitmproxy实现加密加签环境下渗透测试

Posted 二 黑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了妙用Mitmproxy实现加密加签环境下渗透测试相关的知识,希望对你有一定的参考价值。

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

此时,可以引入一个开源的代理工具——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, ctx
class 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里面的请求参数。


#截取指定url
if 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=123456
account = 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= 进行爆破和注入测试。

最后也给想软件测试的朋友们分享一份测试资料:

以上内容,对于软件测试的朋友来说应该是最全面最完整的备战仓库了,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。关注我公众号:程序员二黑,免费获取!

机会只垂青有准备的人,这是一个靠本事的社会。有时候,你之所以发展得不好,不是因为没有机遇,而是因为你没有准备好,导致机遇与你擦肩而过。如果你想要学习,什么时候开始都不晚,而不是瞻前顾后,你只要用尽全力,剩下的交给时间!

加油吧,测试人!路就在脚下,成功就在明天!

推荐阅读

在职阿里6年,一个29岁女软件测试工程师的心声

当过服务员、快递员,现在年薪30W,历尽山河叛逆少年终会成长

公司新来的阿里p8,看了我做的APP和接口测试,甩给了我这份文档

以上是关于妙用Mitmproxy实现加密加签环境下渗透测试的主要内容,如果未能解决你的问题,请参考以下文章

PHP实现RSA与RSA256加密,解密,加签,验签

PHP实现RSA与RSA256加密,解密,加签,验签

PHP实现RSA与RSA256加密,解密,加签,验签

借用spring的aop思想处理接口测试中的加签

接口测试工具: 基于 mitmproxy 实现接口录制,减少写用例的成本

渗透技巧之当爆破遇到JS加密